Recently I stumbled into a broken initrd file after the reboot of an Ubuntu server. After practicing this situation on my VMware playground, here is my tutorial for both restoring a broken initrd file and a bootloader misconfiguration.
Update Initramfs #
Prerequisites #
In order to illustrate the renewal of the intital RAM disk files, I’m going to delete the files first which makes it impossible to mount the filesystem at the system startup.
The /boot
directory should look like follows:
drwxr-xr-x 4 root root 4096 Mar 20 20:24 .
drwxr-xr-x 19 root root 4096 Nov 28 18:19 ..
-rw-r--r-- 1 root root 261842 Jan 5 11:07 config-5.15.0-58-generic
-rw-r--r-- 1 root root 261876 Jan 20 13:42 config-5.15.0-60-generic
drwxr-xr-x 5 root root 4096 Feb 14 07:14 grub
lrwxrwxrwx 1 root root 28 Feb 14 07:13 initrd.img -> initrd.img-5.15.0-60-generic
-rw-r--r-- 1 root root 107349895 Feb 14 07:15 initrd.img-5.15.0-58-generic
-rw-r--r-- 1 root root 109265198 Mar 20 20:24 initrd.img-5.15.0-58-generic
lrwxrwxrwx 1 root root 28 Feb 14 07:13 initrd.img.old -> initrd.img-5.15.0-58-generic
drwx------ 2 root root 16384 Nov 28 18:15 lost+found
-rw------- 1 root root 6250921 Jan 5 11:07 System.map-5.15.0-58-generic
-rw------- 1 root root 6252560 Jan 20 13:42 System.map-5.15.0-60-generic
lrwxrwxrwx 1 root root 25 Feb 14 07:13 vmlinuz -> vmlinuz-5.15.0-60-generic
-rw------- 1 root root 11550848 Jan 5 11:15 vmlinuz-5.15.0-58-generic
-rw------- 1 root root 11554504 Jan 20 14:16 vmlinuz-5.15.0-60-generic
lrwxrwxrwx 1 root root 25 Feb 14 07:13 vmlinuz.old -> vmlinuz-5.15.0-58-generic
Remove the initramfs files, in Ubuntu they are stored in files called initrd
:
rm initrd.img-5.15.0-58-generic initrd.img-5.15.0-58-generic
After the reboot the system get’s stuck with the following output:
error: file `/boot/initrd.img-5.15.0-71-generic' not foud.
Press any key to continue...
Unable to mount root fs on unknown-block...
In order to create new initial RAM disk files we use an Ubuntu live system.
Boot from Disk #
-
Boot into BIOS. In VMware this can be done with
F2
right after the system starts. -
Change the BIOS settings to boot from CD-Rom Drive / ISO Image.
Choose an ISO live image from the same Linux distribution, in my case it’s “ubuntu-22.04.1-live-server-amd64.iso”.
-
Save the BIOS settings and reboot
Open Rescue Shell #
- Start the Linux setup and move forward beyond the keyboard layout selection, otherwise the standard / US layout is selected.
- Press
"Strg" + "Alt" + "F1"
till the “Enter shell” submenu is available.
Mount partitions #
This is the partiton mount layout of the original system from which I’m going to to mount
the /
and /boot
partitons.
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 18.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 10G 0 lvm /
Find partitions
Use fdisk -l
to list the available disks and their partitions, the output should
look like this:
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 3719167 3715072 1.8G Linux filesystem
/dev/sda3 3719168 41940991 38221824 18.2G Linux filesystem
Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Boot partiton
In my case /dev/sda2
is the boot partition, but to be sure
mount the partition with mount /dev/sda2 /mnt
and check the
output with ls /mnt
. Unmount the boot partition with umount /mnt
.
Root partition
Use lvs -o +lv_path
to find the LVM logical volume of the root partition and
also output the path to mount it. The output should look like this:
LV VG Path
ubuntu-lv ubuntu-vg /dev/ubuntu-vg/ubuntu-lv
Mount the partitions
mkdir /mnt/boot # Create directory for boot partition
mount /dev/ubuntu-vg/ubuntu-lv /mnt # Mount root partition
mount /dev/sda2 /mnt/boot/ # Mount boot partition
# Bind the following directories from the rescue system
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
Update or create Initramfs #
# Change the root system with
chroot /mnt
#or
chroot /mnt bash
# Create new initialize ram files:
update-initramfs -k all -c
# Or update them in case they were broken:
update-initramfs -k all -u
# Exit the chroot command
exit
# Reboot
reboot
Use man update-initramfs
to get more details about the command.
Bootload Recovery #
Prerequisites #
In order to illustrate a bootloader recovery I’m going to intentionally create a bootloader failure.
Edit the boot loader configuration file with vi /boot/grub/grub.cfg
and comment out all “menuentry” sections:
#menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os ...{
#...
#}
After the reboot the system get’s stuck with the following output:
GNU GRUB version 2.06
grub>_
Previous steps #
Proceed with the previous steps “Boot from Disk”, “Open Rescue Shell” and “Mount partitions” from the Update Initramfs tutorial.
Repair Bootloader #
Change the root system with:
chroot /mnt
or chroot /mnt bash
Reinstall the Bootloder with the following command:
grub-install /dev/sda
Create a new Bootloader configuration:
grub-mkconfig -o /boot/grub/grub.cfg
Use exit
to exit the chroot command and reboot the system.