RHEL kernel-core vs kernel and kernel-modules Explained

Deepak Prasad
Tested on Red Hat Enterprise Linux 10.2
Package dnf 4.20.0
Applies to RHEL 10 and RHEL 9 where the current kernel RPM split is equivalent
Privilege sudo or root
Scope Explain RHEL kernel RPM packages (kernel, kernel-core, kernel-modules-core, kernel-modules), check installed versions, update or install a specific kernel with DNF, and verify before reboot. Does not replace a full kernel-update walkthrough, GRUB administration, or old-kernel cleanup procedures.
Related guides How to update the kernel on RHEL
Remove old kernels with DNF
Change the default boot kernel
Boot an older kernel with grubby
DNF command cheat sheet

On current RHEL releases, kernel is a meta package. The bootable kernel image is provided by kernel-core, while kernel modules are split between kernel-modules-core, kernel-modules, and optional packages such as kernel-modules-extra.

For a normal update, install or upgrade the kernel package and let DNF select the matching subpackages. You do not need to update kernel-core, kernel-modules-core, and kernel-modules one by one unless you are deliberately building a minimal package set.


Quick Reference: RHEL Kernel RPM Packages

Package Purpose
kernel Meta package that pulls the required kernel subpackages
kernel-core Provides the kernel binary such as /boot/vmlinuz-*
kernel-modules-core Core modules required for common hardware and boot functionality
kernel-modules Additional modules beyond the core module set
kernel-modules-extra Optional modules for less common hardware or features
kernel-uki-virt Unified Kernel Image for supported virtual/cloud environments
kernel-devel Headers and build files for compiling external kernel modules
kernel-headers User-space kernel interface headers
kernel-tools Kernel-related user-space utilities

kernel-tools, kernel-devel, and kernel-headers are related packages, but they are not part of the bootable kernel set in the same way as kernel-core and the module packages.


1. What Is the kernel-core Package?

kernel-core contains the actual kernel binary and the core boot files for one kernel version.

Check the installed build on the host:

bash
rpm -q kernel-core
output
kernel-core-6.12.0-211.42.1.el10_2.x86_64

The bootable image lives under /boot:

bash
rpm -ql kernel-core | grep '/boot/vmlinuz'
output
/boot/vmlinuz-6.12.0-211.42.1.el10_2.x86_64

That vmlinuz file is the compressed kernel image GRUB loads at boot. kernel-core is not simply a "minimal modules" package on current RHEL releases; module content is split into kernel-modules-core and kernel-modules.


2. kernel vs kernel-core vs kernel-modules-core

Package Contains files? Main role
kernel Normally a meta package Pulls required kernel subpackages
kernel-core Yes Bootable kernel image and core boot files
kernel-modules-core Yes Core or common loadable kernel modules
kernel-modules Yes Remaining standard modules for the release
kernel-modules-extra Yes Optional modules for less common hardware

Confirm that kernel itself does not ship file content on RHEL 10:

bash
rpm -ql kernel
output
(contains no files)

The meta package exists so administrators can install or query one package name while DNF resolves the dependent subpackages.

See what kernel-core installs under /boot and /lib/modules:

bash
rpm -ql kernel-core | head
output
/boot/.vmlinuz-6.12.0-211.42.1.el10_2.x86_64.hmac
/boot/System.map-6.12.0-211.42.1.el10_2.x86_64
/boot/config-6.12.0-211.42.1.el10_2.x86_64
/boot/initramfs-6.12.0-211.42.1.el10_2.x86_64.img
/boot/symvers-6.12.0-211.42.1.el10_2.x86_64.xz
/boot/vmlinuz-6.12.0-211.42.1.el10_2.x86_64
/lib/modules
/lib/modules/6.12.0-211.42.1.el10_2.x86_64

kernel-modules-core provides the core module tree:

bash
rpm -ql kernel-modules-core | head
output
/lib/modules
/lib/modules/6.12.0-211.42.1.el10_2.x86_64
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/build
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/arch
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/arch/x86
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/arch/x86/crypto
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/arch/x86/crypto/blowfish-x86_64.ko.xz

kernel-modules adds the remaining standard .ko modules for that kernel version:

bash
rpm -ql kernel-modules | head
output
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/drivers/acpi/video.ko.xz
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/drivers/base/regmap/regmap-sdw-mbq.ko.xz
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/drivers/base/regmap/regmap-sdw.ko.xz
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/drivers/bcma/bcma.ko.xz
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/drivers/bluetooth/ath3k.ko.xz
/lib/modules/6.12.0-211.42.1.el10_2.x86_64/kernel/drivers/bluetooth/bcm203x.ko.xz

All subpackages for one kernel release share the same version string, such as 6.12.0-211.42.1.el10_2.


3. Which RHEL Kernel Packages Do You Need?

Standard RHEL system

On a normal server or workstation, manage the meta package:

bash
kernel

DNF resolves the matching kernel-core, kernel-modules-core, and kernel-modules builds. You do not need to assemble those RPMs manually for a standard installation.

Minimal or virtual system

Some virtual or cloud images use a reduced kernel package combination. In those cases kernel-core plus kernel-modules-core can be enough for the intended environment, but the exact package set depends on the image and hardware requirements. Do not assume every cloud VM needs only kernel-core with no module packages.

Current RHEL releases also provide kernel-uki-virt, a Unified Kernel Image (UKI) for supported virtual and cloud environments. It combines the kernel, initramfs, and kernel command line in one signed image and can be used instead of kernel-core for supported deployments.

It is separate from the traditional kernel-core plus module package layout described above. RHEL 10 documentation confirms the same behavior.

kernel-modules-extra

kernel-modules-extra is optional. Install it when hardware or a feature you need is provided by that package, not because every bare-metal host should carry it by default. On the lab host it was not installed:

bash
rpm -q kernel-modules-extra
output
package kernel-modules-extra is not installed

4. Check Installed Kernel Packages

List the main kernel RPMs for the running release:

bash
rpm -q kernel kernel-core kernel-modules-core kernel-modules kernel-modules-extra
output
kernel-6.12.0-211.42.1.el10_2.x86_64
kernel-core-6.12.0-211.42.1.el10_2.x86_64
kernel-modules-core-6.12.0-211.42.1.el10_2.x86_64
kernel-modules-6.12.0-211.42.1.el10_2.x86_64
package kernel-modules-extra is not installed

Compare that with the kernel that is actually running:

bash
uname -r
output
6.12.0-211.42.1.el10_2.x86_64

Installed kernel versions and the running kernel are not always the same immediately after an update. RHEL keeps multiple kernel builds installed because kernel packages use DNF install-only handling instead of replacing the previous RPM in place.


5. Check Available Kernel and kernel-core Versions

List installed and available kernel builds:

bash
dnf --showduplicates list kernel
output
Installed Packages
kernel.x86_64       6.12.0-211.42.1.el10_2       @rhel-10-for-x86_64-baseos-rpms
Available Packages
kernel.x86_64       6.12.0-211.43.1.el10_2       rhel-10-for-x86_64-baseos-rpms
kernel.x86_64       6.12.0-211.44.1.el10_2       rhel-10-for-x86_64-baseos-rpms
kernel.x86_64       6.12.0-211.46.1.el10_2       rhel-10-for-x86_64-baseos-rpms
kernel.x86_64       6.12.0-211.47.1.el10_2       rhel-10-for-x86_64-baseos-rpms

You can inspect kernel-core the same way when you want to confirm the matching subpackage versions:

bash
dnf --showduplicates list kernel-core
output
Installed Packages
kernel-core.x86_64  6.12.0-211.42.1.el10_2     @rhel-10-for-x86_64-baseos-rpms
Available Packages
kernel-core.x86_64  6.12.0-211.47.1.el10_2     rhel-10-for-x86_64-baseos-rpms

Matching kernel subpackages use the same version-release string. To see which repository provides a package name:

bash
dnf repoquery kernel-core

That query is useful when you need to confirm package availability without starting an install transaction.


6. Update kernel-core Safely with DNF

For a normal kernel update on RHEL, upgrade the meta package:

bash
sudo dnf upgrade kernel

DNF resolves the matching kernel-core, kernel-modules-core, and kernel-modules packages for the new version. Preview the transaction first when you want to see the exact RPM set:

bash
sudo dnf upgrade kernel --assumeno
output
Installing:
 kernel                x86_64  6.12.0-211.47.1.el10_2 rhel-10-for-x86_64-baseos-rpms  1.6 M
Installing dependencies:
 kernel-core           x86_64  6.12.0-211.47.1.el10_2 rhel-10-for-x86_64-baseos-rpms   19 M
 kernel-modules        x86_64  6.12.0-211.47.1.el10_2 rhel-10-for-x86_64-baseos-rpms   42 M
 kernel-modules-core   x86_64  6.12.0-211.47.1.el10_2 rhel-10-for-x86_64-baseos-rpms   31 M

Transaction Summary
===========================================================================================
Install  4 Packages

The new kernel is installed alongside existing kernel versions. You do not need to run separate dnf upgrade commands for kernel-core, kernel-modules-core, and kernel-modules during a standard update.

For the full operational kernel-update workflow, see how to update the kernel on RHEL.


7. Install a Specific Kernel Version

When you need one build rather than the latest available kernel, list versions first:

bash
dnf --showduplicates list kernel

Install the required kernel version-release from the repository:

bash
sudo dnf install kernel-6.12.0-211.47.1.el10_2

DNF installs the matching dependent kernel packages in the same transaction:

output
Installing:
 kernel                x86_64  6.12.0-211.47.1.el10_2 rhel-10-for-x86_64-baseos-rpms  1.6 M
Installing dependencies:
 kernel-core           x86_64  6.12.0-211.47.1.el10_2 rhel-10-for-x86_64-baseos-rpms   19 M
 kernel-modules        x86_64  6.12.0-211.47.1.el10_2 rhel-10-for-x86_64-baseos-rpms   42 M
 kernel-modules-core   x86_64  6.12.0-211.47.1.el10_2 rhel-10-for-x86_64-baseos-rpms   31 M

You normally do not specify every dependent RPM manually. For broader package-version selection patterns, see install or downgrade a specific RPM version.


8. Verify the New Kernel Before Reboot

After installation, confirm the new kernel RPMs are on disk:

bash
rpm -q kernel kernel-core | sort
output
kernel-6.12.0-211.42.1.el10_2.x86_64
kernel-6.12.0-211.47.1.el10_2.x86_64
kernel-core-6.12.0-211.42.1.el10_2.x86_64
kernel-core-6.12.0-211.47.1.el10_2.x86_64

The older kernel remaining installed is expected. It provides a fallback if the new kernel fails to boot.

Check which kernel GRUB will boot by default:

bash
grubby --default-kernel
output
/boot/vmlinuz-6.12.0-211.47.1.el10_2.x86_64

That shows the new kernel is selected for the next boot. The running kernel does not change until you reboot:

bash
uname -r
output
6.12.0-211.42.1.el10_2.x86_64

Reboot when you are ready to start running the new build:

bash
sudo reboot

After login, uname -r should match the newly installed kernel version. For default-kernel changes without a full operational walkthrough here, see change the default boot kernel.


9. kernel-tools, kernel-devel and kernel-headers Are Different

Not every RPM whose name starts with kernel is part of the bootable kernel stack.

kernel-tools provides kernel-related user-space utilities and supporting documentation. On the lab host:

bash
rpm -q kernel-tools
output
kernel-tools-6.12.0-211.42.1.el10_2.x86_64

kernel-devel contains the files needed to compile out-of-tree kernel modules against a specific kernel version. kernel-headers provides user-space headers used when building software that interfaces with kernel APIs.

For a normal kernel install or upgrade, let DNF resolve dependencies. You do not need to manually synchronize every kernel-* RPM to the same version on every host. Match kernel-devel to the target kernel only when you are building an external module for that kernel.


10. What About Old kernel-core Packages?

RHEL intentionally keeps older kernel builds installed as fallback boot options. List what is present:

bash
rpm -q kernel kernel-core | sort

When /boot fills up or you need to remove excess kernels, use DNF-based cleanup instead of direct rpm -e removal. See remove old kernels on RHEL with DNF.


Common Problems

Problem Likely reason
kernel-core updated but running version unchanged Reboot has not happened yet
New kernel installed but old one remains Normal install-only behavior
Hardware missing after minimal kernel install Required module may be in kernel-modules or kernel-modules-extra
External module will not build Matching kernel-devel may be missing for the target kernel
/boot fills with old kernels Review installonly_limit and old-kernel cleanup
New kernel fails to boot Boot a known-working fallback kernel and investigate

Summary

On current RHEL releases, kernel is the package administrators normally manage, while kernel-core contains the bootable kernel image. kernel-modules-core carries the core module set, kernel-modules supplies additional standard modules, and kernel-modules-extra is optional.

DNF installs new kernel versions alongside existing ones because kernel RPMs are handled as install-only packages. A reboot is required before uname -r reflects a newly installed kernel, even when kernel-core and the module packages are already on disk.

Use dnf upgrade kernel or dnf install kernel-VERSION and let DNF resolve the matching subpackages. For full kernel-update operations, boot management, and safe old-kernel removal, use the dedicated guides linked above rather than treating this page as a second generic kernel-update tutorial.


References

Omer Cakmak

Linux Administrator

Highly skilled at managing Debian, Ubuntu, CentOS, Oracle Linux, and Red Hat servers. Proficient in bash scripting, Ansible, and AWX central server management, he handles server operations on OpenStack, KVM, Proxmox, and VMware.

  • Debian
  • Ubuntu
  • Linux
  • Red Hat Enterprise Linux
  • Shell Script
  • System Administration