Updating the kernel looks like updating any other package, but behaves differently in one important way: the change is inert until reboot, because the currently running kernel is loaded into memory and keeps running exactly as it was, untouched by whatever gets written to disk.

Checking what's running vs. what's installed

uname -r
6.8.0-45-generic

This is the kernel actively running right now - not necessarily the newest one installed. Compare against what's actually on disk:

dpkg -l | grep linux-image      # Debian/Ubuntu
rpm -qa | grep kernel           # Fedora/RHEL

A mismatch between the newest installed kernel and uname -r almost always means a pending update hasn't been activated with a reboot yet.

The kernel is just a package

sudo apt install linux-image-generic    # Debian/Ubuntu
sudo dnf install kernel                  # Fedora/RHEL

Ordinary apt upgrade / dnf upgrade pulls in kernel updates the same way as anything else - there's usually no separate step, just the requirement to reboot afterward for it to matter. See APT and dpkg and DNF and RPM for the package managers themselves.

Multiple kernels, kept side by side

Installing a new kernel doesn't remove the old one immediately - most distributions keep a small number of previous kernel versions installed specifically so there's a known-good fallback. GRUB (the boot loader) presents them as separate boot menu entries:

sudo update-grub                # Debian/Ubuntu: regenerate the boot menu after a kernel change

If a new kernel fails to boot, or boots but breaks a driver (a common symptom: a GPU or Wi-Fi adapter that worked before an update stops working), reboot and select the previous kernel version from the GRUB menu (usually reachable by holding Shift, or Esc on some systems, during boot) to get back to a working state while investigating.

Pinning a kernel version deliberately

Occasionally a specific kernel needs to be held in place - a known driver incompatibility with a newer version, for instance:

sudo apt-mark hold linux-image-generic     # Debian/Ubuntu
sudo dnf versionlock add kernel            # Fedora/RHEL, needs python3-dnf-plugin-versionlock

See APT and dpkg for more on holding packages generally.

Checking whether a reboot is actually needed

cat /var/run/reboot-required          # Debian/Ubuntu: exists if a reboot is pending
needs-restarting -r                    # RHEL/Fedora (dnf-utils package), exit code signals status

Useful on servers where rebooting isn't something to do casually - these let you confirm a pending kernel update is actually why a reboot is being requested, rather than assuming.

Live patching: updating without rebooting

For situations where even a brief reboot is unacceptable (critical security patches on a system with strict uptime requirements), kernel live patching applies specific fixes - almost always security-related, not full version upgrades - to a running kernel without restarting it. Canonical's livepatch service (Ubuntu) and Red Hat's kpatch are the two mainstream implementations. This covers a narrow set of patches, not a substitute for eventually rebooting into a current kernel - live patches accumulate as a stopgap, not a permanent alternative to updating.