<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Rocky-Linux on Di</title>
        <link>https://dixu.ddns.net/tags/rocky-linux/</link>
        <description>Recent content in Rocky-Linux on Di</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Thu, 24 Sep 2026 12:00:00 -0400</lastBuildDate><atom:link href="https://dixu.ddns.net/tags/rocky-linux/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Configure xrdp and TigerVNC on Rocky Linux 9</title>
            <link>https://dixu.ddns.net/p/configure-xrdp-and-tigervnc-on-rocky-linux-9/</link>
            <pubDate>Wed, 05 May 2021 21:21:07 -0400</pubDate>
            <guid>https://dixu.ddns.net/p/configure-xrdp-and-tigervnc-on-rocky-linux-9/</guid>
            <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/neutrinolabs/xrdp&#34;  title=&#34;Official&#34;&#xA;     target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;xrdp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/TigerVNC/tigervnc&#34;  title=&#34;Official&#34;&#xA;     target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;TigerVNC&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/getting_started_with_the_gnome_desktop_environment/remotely-accessing-the-desktop-as-multiple-users_getting-started-with-the-gnome-desktop-environment&#34;  title=&#34;Red Hat&#34;&#xA;     target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;RHEL 9 Multiuser VNC Access&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;scope&#34;&gt;Scope&#xA;&lt;/h2&gt;&lt;p&gt;This guide configures a GNOME desktop on Rocky Linux 9 and provides two independent remote-access options:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;xrdp:&lt;/strong&gt; Connect with a standard RDP client, including Windows Remote Desktop Connection.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;TigerVNC:&lt;/strong&gt; Create a virtual desktop and reach it through an SSH tunnel with a VNC viewer.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Choose the protocol your clients require. Running both is possible, but it adds services and accounts that must be maintained.&lt;/p&gt;&#xA;&lt;p&gt;The original article targeted CentOS Linux 7 and 8. CentOS Linux 8 reached end of life in December 2021, and &lt;a class=&#34;link&#34; href=&#34;https://blog.centos.org/2024/06/june-2024-news/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;CentOS Linux 7 reached end of life in June 2024&lt;/a&gt;. Migrate those systems instead of exposing obsolete installations to a network.&lt;/p&gt;&#xA;&lt;p&gt;The commands below use a Rocky Linux 9 host, an example remote user named &lt;code&gt;remoteuser&lt;/code&gt;, and a trusted LAN subnet of &lt;code&gt;192.168.2.0/24&lt;/code&gt;. Replace those values for your environment.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prepare-the-desktop&#34;&gt;Prepare the Desktop&#xA;&lt;/h2&gt;&lt;p&gt;Update the host and install the GNOME server environment:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf upgrade --refresh -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf group install -y &lt;span class=&#34;s2&#34;&gt;&amp;#34;Server with GUI&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;List the installed desktop session names. The TigerVNC configuration later in this guide uses the &lt;code&gt;gnome&lt;/code&gt; session:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -1 /usr/share/xsessions/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Setting the graphical target is optional for a headless remote-desktop server. Enable it when the machine should also show a local graphical login after boot:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl set-default graphical.target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a dedicated account if one does not already exist, then assign a strong Linux password:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo useradd --create-home remoteuser&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo passwd remoteuser&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do not run an xrdp or VNC desktop as &lt;code&gt;root&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;option-1-configure-xrdp&#34;&gt;Option 1: Configure xrdp&#xA;&lt;/h2&gt;&lt;p&gt;xrdp listens for RDP connections on TCP 3389. Its upstream project recommends the &lt;code&gt;xorgxrdp&lt;/code&gt; backend for the best experience. On Rocky Linux 9, the packages are available from EPEL.&lt;/p&gt;&#xA;&lt;h3 id=&#34;enable-epel-and-install-xrdp&#34;&gt;Enable EPEL and Install xrdp&#xA;&lt;/h3&gt;&lt;p&gt;Enable Rocky Linux&amp;rsquo;s CodeReady Builder equivalent and EPEL, then install xrdp, its X.Org backend, and its SELinux policy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf install -y dnf-plugins-core&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf config-manager --set-enabled crb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf install -y epel-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf install -y xrdp xorgxrdp xrdp-selinux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Start xrdp and enable it at boot:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now xrdp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status xrdp --no-pager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The packaged configuration supplies the session startup scripts. Do not add &lt;code&gt;exec gnome-session&lt;/code&gt; to &lt;code&gt;/etc/xrdp/xrdp.ini&lt;/code&gt;; that file configures the RDP listener and connection modules rather than the desktop startup command.&lt;/p&gt;&#xA;&lt;h3 id=&#34;restrict-the-firewall-rule&#34;&gt;Restrict the Firewall Rule&#xA;&lt;/h3&gt;&lt;p&gt;Permit RDP only from the trusted LAN. Confirm that the active network interface uses the &lt;code&gt;public&lt;/code&gt; zone before applying this example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --get-active-zones&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --permanent --zone&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;public --add-rich-rule&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;rule family=&amp;#34;ipv4&amp;#34; source address=&amp;#34;192.168.2.0/24&amp;#34; port port=&amp;#34;3389&amp;#34; protocol=&amp;#34;tcp&amp;#34; accept&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --reload&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --zone&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;public --list-rich-rules&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do not forward TCP 3389 directly from the public internet. Use a VPN, an RD Gateway, or another authenticated access layer for connections from outside the trusted network.&lt;/p&gt;&#xA;&lt;h3 id=&#34;connect-with-rdp&#34;&gt;Connect with RDP&#xA;&lt;/h3&gt;&lt;p&gt;On Windows, open Remote Desktop Connection:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mstsc.exe&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enter the Rocky Linux host&amp;rsquo;s private address and sign in as &lt;code&gt;remoteuser&lt;/code&gt;. Select &lt;strong&gt;Xorg&lt;/strong&gt; on the xrdp login screen if the session type is shown. Use the Linux account password, not a VNC password.&lt;/p&gt;&#xA;&lt;p&gt;Avoid signing in to the local GNOME console and xrdp with the same account at the same time. GNOME services tied to one user session can conflict and produce an immediate disconnect or a blank desktop.&lt;/p&gt;&#xA;&lt;p&gt;Verify that the server is listening:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ss -lntp &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep &lt;span class=&#34;s1&#34;&gt;&amp;#39;:3389&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;option-2-configure-tigervnc&#34;&gt;Option 2: Configure TigerVNC&#xA;&lt;/h2&gt;&lt;p&gt;TigerVNC creates a separate virtual desktop. The current service uses &lt;code&gt;/etc/tigervnc/vncserver.users&lt;/code&gt; to map display numbers to Linux users. Do not copy or edit the vendor &lt;code&gt;vncserver@.service&lt;/code&gt; unit.&lt;/p&gt;&#xA;&lt;h3 id=&#34;install-tigervnc&#34;&gt;Install TigerVNC&#xA;&lt;/h3&gt;&lt;p&gt;Install the server package:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf install -y tigervnc-server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If this host has an old custom unit from an earlier CentOS guide, preserve it as a backup so the packaged unit takes precedence:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; ! -e /etc/systemd/system/vncserver@.service &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; sudo mv /etc/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service.legacy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl daemon-reload&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;map-the-user-to-a-display&#34;&gt;Map the User to a Display&#xA;&lt;/h3&gt;&lt;p&gt;Open the user-mapping file:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudoedit /etc/tigervnc/vncserver.users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Map display &lt;code&gt;:1&lt;/code&gt; to the example user:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;:1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;remoteuser&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Display &lt;code&gt;:1&lt;/code&gt; normally uses TCP port 5901. Each additional user needs a unique display number.&lt;/p&gt;&#xA;&lt;h3 id=&#34;configure-the-virtual-desktop&#34;&gt;Configure the Virtual Desktop&#xA;&lt;/h3&gt;&lt;p&gt;Open the default configuration:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudoedit /etc/tigervnc/vncserver-config-defaults&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add these settings:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;gnome&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;geometry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;1920x1080&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;localhost&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;alwaysshared&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;session&lt;/code&gt; must match a desktop file in &lt;code&gt;/usr/share/xsessions&lt;/code&gt; without the &lt;code&gt;.desktop&lt;/code&gt; suffix. The &lt;code&gt;localhost&lt;/code&gt; setting prevents direct network connections to the VNC port; clients will use an encrypted SSH tunnel.&lt;/p&gt;&#xA;&lt;p&gt;Set the VNC password as the mapped user and restore the expected SELinux labels:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -iu remoteuser vncpasswd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo restorecon -RFv /home/remoteuser/.vnc /etc/tigervnc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The VNC password is separate from the Linux login password. Decline a view-only password unless it is specifically required.&lt;/p&gt;&#xA;&lt;h3 id=&#34;start-the-vnc-service&#34;&gt;Start the VNC Service&#xA;&lt;/h3&gt;&lt;p&gt;Enable the service for display &lt;code&gt;:1&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now vncserver@:1.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status vncserver@:1.service --no-pager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ss -lntp &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep &lt;span class=&#34;s1&#34;&gt;&amp;#39;:5901&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because the server accepts VNC connections only on loopback, do not open TCP 5901 in firewalld.&lt;/p&gt;&#xA;&lt;h3 id=&#34;connect-through-ssh&#34;&gt;Connect Through SSH&#xA;&lt;/h3&gt;&lt;p&gt;From the client computer, create an SSH tunnel and leave the command running:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh -N -L 5901:127.0.0.1:5901 remoteuser@server.example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;server.example.com&lt;/code&gt; with the server&amp;rsquo;s address. In the VNC viewer, connect to &lt;code&gt;127.0.0.1:5901&lt;/code&gt;. The SSH session encrypts the network traffic and forwards it to the VNC listener on the server.&lt;/p&gt;&#xA;&lt;h2 id=&#34;verification&#34;&gt;Verification&#xA;&lt;/h2&gt;&lt;p&gt;Check the enabled services and their current state:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl is-enabled xrdp vncserver@:1.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl is-active xrdp vncserver@:1.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Display the listening ports:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ss -lntp &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -E &lt;span class=&#34;s1&#34;&gt;&amp;#39;:(3389|5901)\b&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the configuration in this guide, xrdp should listen on the host network and VNC should listen only on &lt;code&gt;127.0.0.1&lt;/code&gt; or &lt;code&gt;::1&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&#xA;&lt;/h2&gt;&lt;h3 id=&#34;xrdp-shows-a-black-screen-or-disconnects&#34;&gt;xrdp Shows a Black Screen or Disconnects&#xA;&lt;/h3&gt;&lt;p&gt;Confirm that the packages and services are healthy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rpm -q xrdp xorgxrdp xrdp-selinux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl -u xrdp -u xrdp-sesman -b --no-pager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Log the same user out of the local graphical console, then try again. Also confirm that &lt;strong&gt;Xorg&lt;/strong&gt; is selected at the xrdp login screen and that the user&amp;rsquo;s home directory is writable.&lt;/p&gt;&#xA;&lt;h3 id=&#34;tigervnc-fails-to-start&#34;&gt;TigerVNC Fails to Start&#xA;&lt;/h3&gt;&lt;p&gt;Inspect the service and user-session logs:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status vncserver@:1.service --no-pager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl -u vncserver@:1.service -b --no-pager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Confirm that &lt;code&gt;:1=remoteuser&lt;/code&gt; exists in &lt;code&gt;/etc/tigervnc/vncserver.users&lt;/code&gt;, the user has run &lt;code&gt;vncpasswd&lt;/code&gt;, and the configured session exists:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -F &lt;span class=&#34;s1&#34;&gt;&amp;#39;:1=remoteuser&amp;#39;&lt;/span&gt; /etc/tigervnc/vncserver.users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -f /usr/share/xsessions/gnome.desktop &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;GNOME session found&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -iu remoteuser &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -r /home/remoteuser/.vnc/passwd &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;VNC password found&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TigerVNC cannot start a virtual desktop for a user who is already logged in to another graphical session. Use a dedicated remote account or log that user out before starting the service.&lt;/p&gt;&#xA;&lt;h3 id=&#34;selinux-blocks-a-service&#34;&gt;SELinux Blocks a Service&#xA;&lt;/h3&gt;&lt;p&gt;Keep SELinux enforcing. Inspect recent denials before changing policy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ausearch -m AVC,USER_AVC -ts recent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First restore file labels and confirm that &lt;code&gt;xrdp-selinux&lt;/code&gt; is installed. Do not disable SELinux or generate a broad local policy merely to hide a configuration error.&lt;/p&gt;&#xA;&lt;h2 id=&#34;remove-access&#34;&gt;Remove Access&#xA;&lt;/h2&gt;&lt;p&gt;Disable the services when remote desktop access is no longer required:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl disable --now xrdp vncserver@:1.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remove the restricted xrdp firewall rule:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --permanent --zone&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;public --remove-rich-rule&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;rule family=&amp;#34;ipv4&amp;#34; source address=&amp;#34;192.168.2.0/24&amp;#34; port port=&amp;#34;3389&amp;#34; protocol=&amp;#34;tcp&amp;#34; accept&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --reload&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Safely Update the Linux Kernel on Rocky Linux 9</title>
            <link>https://dixu.ddns.net/p/safely-update-the-linux-kernel-on-rocky-linux-9/</link>
            <pubDate>Sat, 11 Jul 2020 22:14:00 -0400</pubDate>
            <guid>https://dixu.ddns.net/p/safely-update-the-linux-kernel-on-rocky-linux-9/</guid>
            <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/managing_monitoring_and_updating_the_kernel/index&#34;  title=&#34;Red Hat&#34;&#xA;     target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;RHEL 9 Kernel Management&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://elrepo.org/wiki/doku.php?id=start&#34;  title=&#34;Official&#34;&#xA;     target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ELRepo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://elrepo.org/wiki/doku.php?id=kernel-ml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ELRepo kernel-ml&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://elrepo.org/wiki/doku.php?id=kernel-lt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ELRepo kernel-lt&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;scope&#34;&gt;Scope&#xA;&lt;/h2&gt;&lt;p&gt;This guide updates the kernel on Rocky Linux 9 and other compatible Enterprise Linux 9 rebuilds. The normal and preferred method is to install the distribution kernel from the standard repositories. An optional section covers ELRepo&amp;rsquo;s &lt;code&gt;kernel-lt&lt;/code&gt; and &lt;code&gt;kernel-ml&lt;/code&gt; packages for testing hardware that the distribution kernel does not support.&lt;/p&gt;&#xA;&lt;p&gt;The original article targeted CentOS Linux 8, which reached end of life in December 2021. Migrate unsupported systems before changing their kernels.&lt;/p&gt;&#xA;&lt;p&gt;Enterprise Linux kernels retain a stable version family while backporting security fixes and drivers. A higher upstream version number does not by itself mean that the system is more secure, stable, or supported.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prepare-for-the-update&#34;&gt;Prepare for the Update&#xA;&lt;/h2&gt;&lt;p&gt;Identify the distribution, running kernel, architecture, and default boot kernel:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/os-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -r&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -m&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --default-kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;List installed kernel packages and boot entries:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rpm -q kernel kernel-core --last&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ALL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check available space in the boot filesystems:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df -h /boot /boot/efi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;/boot/efi&lt;/code&gt; path might not be a separate filesystem on a BIOS-based installation. Resolve a nearly full &lt;code&gt;/boot&lt;/code&gt; before installing another kernel, but keep at least one known-good older kernel.&lt;/p&gt;&#xA;&lt;p&gt;Before updating a remote server:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Confirm that a hypervisor console, physical console, or other out-of-band recovery method is available.&lt;/li&gt;&#xA;&lt;li&gt;Back up important data and boot configuration.&lt;/li&gt;&#xA;&lt;li&gt;Record the current kernel path reported by &lt;code&gt;grubby --default-kernel&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Check whether storage, networking, GPU, security, or virtualization depends on an out-of-tree module.&lt;/li&gt;&#xA;&lt;li&gt;Take a tested virtual-machine snapshot when the platform supports it and the storage design makes snapshots safe.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Inspect DKMS and installed third-party kernel modules when those tools are present:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;command&lt;/span&gt; -v dkms &amp;gt;/dev/null &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dkms status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rpm -qa &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -E &lt;span class=&#34;s1&#34;&gt;&amp;#39;^(kmod-|akmod-)&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Confirm that required module packages have a build compatible with the new kernel before rebooting.&lt;/p&gt;&#xA;&lt;h2 id=&#34;install-the-supported-distribution-kernel&#34;&gt;Install the Supported Distribution Kernel&#xA;&lt;/h2&gt;&lt;p&gt;Refresh metadata and review all available updates:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf check-update --refresh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The safest routine update keeps the kernel and related userspace packages at a consistent supported level:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf upgrade --refresh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For a maintenance window intentionally limited to kernel packages, use the documented kernel update command:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf update kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DNF treats kernels as install-only packages. It installs the new kernel alongside older versions instead of replacing the running kernel immediately.&lt;/p&gt;&#xA;&lt;p&gt;List the installed kernels again and confirm that the new boot files exist:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rpm -q kernel-core --last&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -lh /boot/vmlinuz-* /boot/initramfs-*.img&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ALL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The new distribution kernel normally becomes the default automatically. Confirm the selection:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --default-kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the default is incorrect, copy the exact desired &lt;code&gt;/boot/vmlinuz-...&lt;/code&gt; path from &lt;code&gt;grubby --info=ALL&lt;/code&gt; and set it explicitly:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --set-default /boot/vmlinuz-VERSION.ARCH&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --default-kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;VERSION.ARCH&lt;/code&gt; with an installed kernel filename. Do not use &lt;code&gt;grub2-set-default 0&lt;/code&gt;; numeric positions can change when another kernel is installed.&lt;/p&gt;&#xA;&lt;h2 id=&#34;reboot-and-verify&#34;&gt;Reboot and Verify&#xA;&lt;/h2&gt;&lt;p&gt;Schedule the interruption, then reboot:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl reboot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After the system returns, verify the running kernel and boot state:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -r&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --default-kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl --failed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl -b -p err..alert --no-pager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Test storage, networking, firewall rules, virtualization, containers, monitoring, and application services that depend on kernel features. Confirm that required modules loaded:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lsmod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dmesg --level&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;err,warn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Warnings are not automatically failures. Compare them with the previous boot and investigate messages related to required hardware or services.&lt;/p&gt;&#xA;&lt;h2 id=&#34;roll-back-to-an-older-distribution-kernel&#34;&gt;Roll Back to an Older Distribution Kernel&#xA;&lt;/h2&gt;&lt;p&gt;If the new kernel cannot boot, display the GRUB menu during startup by pressing &lt;strong&gt;Esc&lt;/strong&gt; repeatedly and select a known-good older kernel. Console access is essential when the machine cannot reach the network.&lt;/p&gt;&#xA;&lt;p&gt;If the system boots but the new kernel causes a problem, list the installed entries:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ALL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Set the exact older kernel path as the default and reboot:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --set-default /boot/vmlinuz-OLD_VERSION.ARCH&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --default-kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl reboot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After rebooting, verify that &lt;code&gt;uname -r&lt;/code&gt; reports the selected version. Keep the failed kernel installed until logs and package state have been reviewed; removing it immediately can discard evidence needed for diagnosis.&lt;/p&gt;&#xA;&lt;h2 id=&#34;manage-retained-kernels&#34;&gt;Manage Retained Kernels&#xA;&lt;/h2&gt;&lt;p&gt;DNF&amp;rsquo;s &lt;code&gt;installonly_limit&lt;/code&gt; controls how many versions of install-only packages are retained. Inspect the configured value:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grep -R &lt;span class=&#34;s1&#34;&gt;&amp;#39;^installonly_limit&amp;#39;&lt;/span&gt; /etc/dnf/dnf.conf /etc/dnf/dnf.conf.d 2&amp;gt;/dev/null&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DNF normally keeps three versions. A value of at least &lt;code&gt;2&lt;/code&gt; preserves a rollback kernel; &lt;code&gt;1&lt;/code&gt; is not permitted. Do not manually remove the running kernel or every older kernel.&lt;/p&gt;&#xA;&lt;p&gt;After the new kernel has passed testing and a known-good rollback kernel remains, preview obsolete install-only packages:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf remove --oldinstallonly --setopt &lt;span class=&#34;nv&#34;&gt;installonly_limit&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; --assumeno&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Review the proposed transaction. If it preserves the running kernel, the default kernel, and a tested fallback, run it interactively without &lt;code&gt;--assumeno&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf remove --oldinstallonly --setopt &lt;span class=&#34;nv&#34;&gt;installonly_limit&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do not remove kernels by copying a version prefix into a broad wildcard command. That can remove the active kernel, dependencies, or the only bootable fallback.&lt;/p&gt;&#xA;&lt;h2 id=&#34;optional-test-an-elrepo-kernel&#34;&gt;Optional: Test an ELRepo Kernel&#xA;&lt;/h2&gt;&lt;p&gt;Use the distribution kernel whenever it supports the hardware. ELRepo describes its alternative kernels as a last resort for hardware testing and provides them without distribution support. They can expose the system to compatibility, security, performance, or data-integrity problems.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;kernel-lt&lt;/code&gt; follows an upstream long-term-support branch.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;kernel-ml&lt;/code&gt; follows the upstream mainline stable branch.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Both install alongside the Rocky Linux kernel. Keep the Rocky Linux kernel and its boot entry intact.&lt;/p&gt;&#xA;&lt;h3 id=&#34;check-secure-boot&#34;&gt;Check Secure Boot&#xA;&lt;/h3&gt;&lt;p&gt;Check the firmware state before installing an ELRepo kernel:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf install -y mokutil&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mokutil --sb-state&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ELRepo states that &lt;code&gt;kernel-lt&lt;/code&gt; and &lt;code&gt;kernel-ml&lt;/code&gt; are not signed for Secure Boot. They will not boot under a standard Secure Boot policy. Do not disable Secure Boot merely to obtain a newer version number; use the supported distribution kernel unless there is a tested requirement and an approved signing or firmware policy.&lt;/p&gt;&#xA;&lt;h3 id=&#34;install-the-elrepo-repository&#34;&gt;Install the ELRepo Repository&#xA;&lt;/h3&gt;&lt;p&gt;Import both current ELRepo RPM signing keys and install the EL9 repository package from its stable URL:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-v2-elrepo.org&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf update elrepo-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Display the enabled repository definition and available alternative kernels:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf repolist elrepo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf --disablerepo&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;*&amp;#39;&lt;/span&gt; --enablerepo&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;elrepo-kernel list available &lt;span class=&#34;s1&#34;&gt;&amp;#39;kernel-lt*&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;kernel-ml*&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;install-one-kernel-family&#34;&gt;Install One Kernel Family&#xA;&lt;/h3&gt;&lt;p&gt;Install the long-term kernel for a conservative hardware test:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf --enablerepo&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;elrepo-kernel install kernel-lt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternatively, install the mainline stable kernel when the required support is unavailable in &lt;code&gt;kernel-lt&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf --enablerepo&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;elrepo-kernel install kernel-ml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do not install both without a specific test plan. If an out-of-tree module must be compiled, install the matching &lt;code&gt;kernel-lt-devel&lt;/code&gt; or &lt;code&gt;kernel-ml-devel&lt;/code&gt; package rather than the similarly named headers package:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf --enablerepo&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;elrepo-kernel install kernel-lt-devel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;kernel-lt-devel&lt;/code&gt; with &lt;code&gt;kernel-ml-devel&lt;/code&gt; when testing &lt;code&gt;kernel-ml&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;select-and-test-the-elrepo-kernel&#34;&gt;Select and Test the ELRepo Kernel&#xA;&lt;/h3&gt;&lt;p&gt;List the new boot entry and copy its exact kernel path:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ALL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Set the selected ELRepo kernel as the default:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --set-default /boot/vmlinuz-ELREPO_VERSION.ARCH&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --default-kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;ELREPO_VERSION.ARCH&lt;/code&gt; with the exact installed filename. Reboot and verify:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl reboot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After the host returns:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -r&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl --failed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl -b -p err..alert --no-pager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;An ELRepo kernel version normally contains &lt;code&gt;.el9.elrepo&lt;/code&gt;. Test every required service and device before considering it usable.&lt;/p&gt;&#xA;&lt;h2 id=&#34;return-from-elrepo-to-the-distribution-kernel&#34;&gt;Return from ELRepo to the Distribution Kernel&#xA;&lt;/h2&gt;&lt;p&gt;List the boot entries, select the exact Rocky Linux kernel path, and reboot:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ALL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --set-default /boot/vmlinuz-ROCKY_VERSION.ARCH&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --default-kernel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl reboot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Confirm that the running kernel is the distribution build before removing ELRepo packages:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -r&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rpm -qf /boot/vmlinuz-&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;uname -r&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remove only the ELRepo kernel family that is no longer required:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf remove &lt;span class=&#34;s1&#34;&gt;&amp;#39;kernel-lt*&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For a mainline test, use:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf remove &lt;span class=&#34;s1&#34;&gt;&amp;#39;kernel-ml*&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Review the removal transaction before accepting it. Never remove the ELRepo kernel while it is still running, and never remove the remaining distribution kernel packages.&lt;/p&gt;&#xA;&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&#xA;&lt;/h2&gt;&lt;h3 id=&#34;the-new-kernel-does-not-appear-in-grub&#34;&gt;The New Kernel Does Not Appear in GRUB&#xA;&lt;/h3&gt;&lt;p&gt;Confirm that the package and boot files exist:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rpm -q kernel-core --last&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -l /boot/vmlinuz-* /boot/loader/entries/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grubby --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ALL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Inspect the package transaction and kernel installation logs before manually rebuilding GRUB:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf &lt;span class=&#34;nb&#34;&gt;history&lt;/span&gt; info last&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl -b --no-pager &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -Ei &lt;span class=&#34;s1&#34;&gt;&amp;#39;kernel-install|grub|dracut&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enterprise Linux 9 normally manages Boot Loader Specification entries automatically. Do not overwrite EFI loader files with commands copied from older RHEL or CentOS releases.&lt;/p&gt;&#xA;&lt;h3 id=&#34;a-required-module-is-missing&#34;&gt;A Required Module Is Missing&#xA;&lt;/h3&gt;&lt;p&gt;Identify the device and expected module:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;lspci -nnk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;modinfo MODULE_NAME&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;MODULE_NAME&lt;/code&gt; with the required module. Boot the known-good kernel, then install or rebuild the matching signed module package. Do not force-load an incompatible module.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-system-boots-but-networking-or-storage-fails&#34;&gt;The System Boots but Networking or Storage Fails&#xA;&lt;/h3&gt;&lt;p&gt;Boot the previous kernel from GRUB, make it the default with &lt;code&gt;grubby&lt;/code&gt;, and collect logs from the failed boot:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl --list-boots&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl -b -1 -k --no-pager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;-1&lt;/code&gt; boot is usually the immediately previous boot, but confirm the boot list before relying on that index.&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
