Что делать, если вместо загрузки системы вы видите приглашение grub shell или initramfs shell.
GRUB
В командной оболочке grub shell нам нужно сделать три вещи:
- Выбрать раздел откуда будем загружаться
- Выбрать ядро
- Выбрать ram-диск initrd
А потом выполнить команду boot.
grub> set root=(hd1,gpt3) grub> linux /boot/vmlinuz... grub> initrd /boot/initrd... grub> boot
initramfs
Если после этого, система загружается, но не может смонтировать root и вываливается в initramfs shell, то нужно:
- Смонтировать root вручную
- Подмонтиовать (перенести) в смонтированный root директории /dev, /proc и /sys
- Переключиться в смонтированный root и запустить /sbin/init
# First, find and mount the new filesystem. mkdir /newroot mount /dev/whatever /newroot # Unmount everything else you've attached to rootfs. (Moving the filesystems # into newroot is something useful to do with them.) mount --move /sys /newroot/sys mount --move /proc /newroot/proc mount --move /dev /newroot/dev # Now switch to the new filesystem, and run /sbin/init out of it. Don't # forget the "exec" here, because you want the new init program to inherit # PID 1. exec switch_root /newroot /sbin/init
ИЛИ
В случае с Ubuntu дефолтным рутом является директория /root, поэтому можно делать так:
# Обнаружим тома LVM vgchamge -ay mount /dev/mapper/ubuntu-root /root mount --bind /dev /root/dev mount --bind /proc /root/proc mount --bind /sys /root/sys exit
Чиним GRUB и initramfs
После того, как система нормально загрузилась восстанавливаем GRUB и initramfs:
sudo grub-install --target=x86_64-efi --recheck --efi-directory=/boot/efi --boot-directory=/boot /dev/nvme0n1 sudo update-initramfs -u sudo update-grub sudo reboot
Live-CD
Если есть возможность загрузиться с Live-CD, то починить загрузчик GRUB можно так:
- Смонтировать root (и /boot при необходимости)
- Подмонтировать в смонтированный root директории /dev, /proc и /sys
- Выполнить chroot в смонтированный root
- Починить grub и initramfs
- Отмонтировать все и перезагрузиться
mount /dev/sdb3 /mnt/ -o subvol=@ mount --bind /dev /mnt/dev mount --bind /sys /mnt/sys mount --bind /proc /mnt/proc mount /dev/sdb1 /mnt/boot/efi/ chroot /mnt/ grub-install /dev/sdb update-initramfs -u update-grub exit umount /mnt/boot/efi/ umount /mnt/dev umount /mnt/sys umount /mnt/proc umount /mnt
Fix GRUB MBR -> GPT
Однажды мне понадобилось расширить диск в виртуалке. Объем существующего диска был увеличен, но диск имел таблицу разделов MBR и основных разделов на нем было уже 4. То есть нужно было конвертить таблицу раздело в GPT. Кроме того, все разделы этого диска были в LVM и загрузка происходила непосредственно с LVM-тома (в случае с MBR GRUB такое позволяет).
Конвертация происходила с помощью gdisk. Он ругнулся при запуске на таблицу MBR, а затем - я просто нажал w, подтверждение - и всё - таблица разделов сконвертирована в GPT. Затем - еще раз запустил gdisk, создал новый раздел, на нем создал PhysicalVolume ну и так далее.
При перезагрузке этого сервака выяснилось, что он не грузится.
Оказалось, что в случае, когда таблица разделов GPT, а загрузка происходит с помощью BIOS (не EFI) - grub нуждается в малюсеньком разделе (1-2Мб) BIOS boot partition.
В итоге пришлось:
- раcширить диск еще немного (на 0.1Gi)
- загрузиться с LiveCD
- сделать малюсенький раздел (с помощью gdisk), дать ему тип EF02. Примерно так:
#перемещаем таблицу разделов в конец диска sgdisk -e -g /dev/sda #перечитываем таблицу разделов partx -u #создаем новый раздельчик: sgdisk -n 4:293605246:293609946 -t 4:EF02 /dev/sda
- перезагрузиться с LiveCD еще раз, чтобы обнаружились партиции (у меня почему-то не сработали ни partprobe, ни kpartx)
- смонтировать корневой раздел (он в LVM и /boot с ядром тоже на нем же), например в /mnt
- переустановить grub:
grub-install /dev/sda --root-directory=/mnt
Всё. В итоге система поднялась.
Real Fix
/usr/sbin/grub-probe: error: disk `lvmid/N3HVdL-143p-0oFW-Gx6d-SroA-tA8e-1Icrfe/wpdsZY-qoqU-j7M1-LGSL-IA2p-hK6I-brvC9D' not found.
смотрим диски
root@rescue ~ # lsscsi [N:0:1:1] disk Micron_7300_MTFDHBE3T8TDF__1 /dev/nvme0n1 [N:1:1:1] disk Micron_7300_MTFDHBE3T8TDF__1 /dev/nvme1n1 [N:2:1:1] disk Micron_7300_MTFDHBE3T8TDF__1 /dev/nvme2n1 [N:3:1:1] disk Micron_7300_MTFDHBE3T8TDF__1 /dev/nvme3n1 [N:4:1:1] disk Micron_7300_MTFDHBE3T8TDF__1 /dev/nvme4n1 [N:5:1:1] disk Micron_7300_MTFDHBE3T8TDF__1 /dev/nvme5n1 [N:6:1:1] disk Micron_7300_MTFDHBE3T8TDF__1 /dev/nvme6n1 [N:7:1:1] disk Micron_7300_MTFDHBE3T8TDF__1 /dev/nvme7n1
Я знаю, что EFI находится на (hd1,gpt2), а / и /boot - на LVM-томе /dev/pve/root
Монтируем root и биндим все что надо:
root@rescue ~ # blkid /dev/pve/root /dev/pve/root: UUID="507da6be-c993-414a-91c1-fee245500c4d" BLOCK_SIZE="4096" TYPE="ext4" root@rescue ~ # lsblk /dev/pve/root NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT pve-root 253:0 0 96G 0 lvm root@rescue ~ # resize2fs /dev/pve/root 95G resize2fs 1.46.2 (28-Feb-2021) Please run 'e2fsck -f /dev/pve/root' first. root@rescue ~ # e2fsck -f /dev/pve/root e2fsck 1.46.2 (28-Feb-2021) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/pve/root: 60013/6291456 files (0.2% non-contiguous), 1830899/25165824 blocks root@rescue ~ # resize2fs /dev/pve/root 95G resize2fs 1.46.2 (28-Feb-2021) Resizing the filesystem on /dev/pve/root to 24903680 (4k) blocks. The filesystem on /dev/pve/root is now 24903680 (4k) blocks long. root@rescue ~ # lvreduce -L -1G /dev/pve/root WARNING: Reducing active logical volume to 95.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce pve/root? [y/n]: y Size of logical volume pve/root changed from 96.00 GiB (24576 extents) to 95.00 GiB (24320 extents). Logical volume pve/root successfully resized. root@rescue ~ # e2fsck -f /dev/pve/root e2fsck 1.46.2 (28-Feb-2021) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/pve/root: 60013/6225920 files (0.2% non-contiguous), 1826787/24903680 blocks root@rescue ~ # mount /dev/mapper/pve-root /mnt root@rescue ~ # mount -t proc proc /mnt/proc root@rescue ~ # mount -t sysfs sys /mnt/sys root@rescue ~ # mount -o bind /dev /mnt/dev root@rescue ~ # mount -t devpts pts /mnt/dev/pts/ root@rescue ~ # chroot /mnt root@rescue:/# mount /dev/nvme0n1p2 /boot/efi/ root@rescue:/# update-grub Generating grub configuration file ... Found linux image: /boot/vmlinuz-5.13.19-1-pve Found initrd image: /boot/initrd.img-5.13.19-1-pve Found memtest86+ image: /boot/memtest86+.bin Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin done root@rescue:/# grub-install /dev/nvme0n1 Installing for i386-pc platform. Installation finished. No error reported. root@rescue:/# exit exit root@rescue ~ # umount /mnt/proc root@rescue ~ # umount /mnt/sys root@rescue ~ # umount /mnt/dev/pts root@rescue ~ # umount /mnt/dev root@rescue ~ # umount /mnt/boot/efi root@rescue ~ # umount /mnt
Discussion