How update-initramfs Updates Debian Boot Images
Following a Linux kernel upgrade in Debian,
update-initramfs automates the regeneration of the initial
RAM filesystem (initrd.img) required to boot the system.
This article explains how Debian triggers this utility through package
management hooks, how update-initramfs gathers required
system modules and scripts, and how it safely compiles and installs the
refreshed boot archive into the /boot partition.
The Trigger Mechanism: Package Hooks
When a new kernel package such as
linux-image-<version> is installed or updated via APT
or dpkg, the package's post-installation script
(postinst) executes kernel hooks located in the
/etc/kernel/postinst.d/ directory.
Among these scripts is
/etc/kernel/postinst.d/initramfs-tools. This hook
automatically executes update-initramfs with the
appropriate flags—typically -c (create) for a newly
installed kernel version, or -u (update) when an existing
installation is reconfigured.
Configuration and Module Gathering
update-initramfs serves as a front-end management script
for the low-level builder utility, mkinitramfs. Once
invoked, it loads system configurations to determine what files, tools,
and drivers are required for early boot:
- Core Configuration: It reads
/etc/initramfs-tools/initramfs.confto identify core parameters such as the compression algorithm (e.g.,zstd,gzip), network booting options, and module inclusion policy (such asMODULES=mostorMODULES=dep). - Explicit Modules: It checks
/etc/initramfs-tools/modulesfor user-defined kernel modules that must be forcefully included in the archive. - Hook Scripts: It processes hook scripts located in
/usr/share/initramfs-tools/hooks/and/etc/initramfs-tools/hooks/. These scripts check for installed services—such as disk encryption (cryptsetup), software RAID (mdadm), or logical volume management (lvm2)—and bundle their respective binaries and dependencies into the target image.
Archive Compilation via mkinitramfs
After compiling the manifest of necessary files,
update-initramfs calls mkinitramfs to assemble
the environment:
- Temporary Root Creation:
mkinitramfsbuilds a temporary directory structure mimicking a standard root filesystem containing early-stage binaries, shared libraries, device nodes, and kernel modules matching the targeted kernel version (/lib/modules/<version>). - Init Executable: A custom initialization script (or
systemdinit if configured) is placed at the root of this structure to manage early boot operations, load essential storage drivers, and pivot to the real root storage drive. - CPIO Packaging and Compression: The assembled
directory tree is packed into a
cpioarchive and compressed using the algorithm specified in the configuration file.
Safe Image Replacement in /boot
To prevent system corruption in the event of an interruption or power
failure, update-initramfs writes the output to a temporary
file (e.g., /boot/initrd.img-<version>.new).
Once the compilation completes successfully, the utility performs an
atomic rename, replacing the existing
/boot/initrd.img-<version> with the newly compiled
image. If symlink management is enabled, it also updates system symlinks
(such as /initrd.img) pointing to the primary kernel
image.
Handoff to the Bootloader
Once update-initramfs exits cleanly, control returns to
the /etc/kernel/postinst.d/ pipeline. A subsequent hook
script—typically /etc/kernel/postinst.d/zz-update-grub—runs
update-grub. This scans /boot, detects the
newly generated vmlinuz and initrd.img pair,
and updates the GRUB boot menu configuration
(/boot/grub/grub.cfg) to ensure the refreshed boot image is
available on the next reboot.