Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Last revisionBoth sides next revision
linux_faq:fix_grub_initramfs_boot [2019/09/03 15:24] – created adminlinux_faq:fix_grub_initramfs_boot [2022/01/14 20:38] – [Real Fix] admin
Line 1: Line 1:
 +Что делать, если вместо загрузки системы вы видите приглашение **grub shell** или **initramfs shell**.
 +====== GRUB ======
 +В командной оболочке **grub shell** нам нужно сделать три вещи:
 +  * Выбрать раздел откуда будем загружаться
 +  * Выбрать ядро
 +  * Выбрать ram-диск initrd
 +А потом выполнить команду **boot**.
 +<code>
 +grub> set root=(hd1,gpt3)
 +grub> linux /boot/vmlinuz...
 +grub> initrd /boot/initrd...
 +grub> boot
 +</code>
 +====== initramfs ======
 +Если после этого, система загружается, но не может смонтировать **root** и вываливается в **initramfs shell**, то нужно:
 +  * Смонтировать **root** вручную
 +  * Подмонтиовать (перенести) в смонтированный **root** директории **/dev**, **/proc** и **/sys**
 +  * Переключиться в смонтированный **root** и запустить **/sbin/init**
 +<code>
 +# 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
 +</code>
 +ИЛИ \\
 +В случае с **Ubuntu** дефолтным рутом является директория **/root**, поэтому можно делать так:
 +<code>
 +# Обнаружим тома 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
 +</code>
 +====== Чиним GRUB и initramfs ======
 +После того, как система нормально загрузилась восстанавливаем **GRUB** и **initramfs**:
 +<code>
 +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
 +</code>
 +====== Live-CD ======
 +Если есть возможность загрузиться с Live-CD, то починить загрузчик GRUB можно так:
 +  * Смонтировать **root** (и **/boot** при необходимости)
 +  * Подмонтировать в смонтированный **root** директории **/dev**, **/proc** и **/sys**
 +  * Выполнить **chroot** в смонтированный **root**
 +  * Починить **grub** и **initramfs**
 +  * Отмонтировать все и перезагрузиться
 +<code>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</code>
 +
 +====== 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**. Примерно так:<code>#перемещаем таблицу разделов в конец диска
 +sgdisk -e -g /dev/sda
 +#перечитываем таблицу разделов
 +partx -u
 +#создаем новый раздельчик:
 +sgdisk -n 4:293605246:293609946 -t 4:EF02 /dev/sda
 +</code> 
 +  * перезагрузиться с **LiveCD** еще раз, чтобы обнаружились партиции (у меня почему-то не сработали ни **partprobe**, ни **kpartx**)
 +  * смонтировать корневой раздел (он в **LVM** и **/boot** с ядром тоже на нем же), например в **/mnt**
 +  * переустановить **grub**: <code>grub-install /dev/sda --root-directory=/mnt</code>
 +Всё. В итоге система поднялась.
 +
 +
 +====== Real Fix ======
 +смотрим диски
 +<code>
 +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
 +</code>
 +Я знаю, что EFI находится на (hd1,gpt2), а / и /boot - на LVM-томе **/dev/pve/root** \\
 +Монтируем root и биндим все что надо:
 +<code>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
 +</code>
 +
  
  • linux_faq/fix_grub_initramfs_boot.txt
  • Last modified: 2022/01/14 20:39
  • by admin