Differences

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

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
linux_faq:fix_grub_initramfs_boot [2019/09/03 15:24] – created adminlinux_faq:fix_grub_initramfs_boot [2020/09/26 14:55] – [Live-CD] 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>
 +Всё. В итоге система поднялась.
  • linux_faq/fix_grub_initramfs_boot.txt
  • Last modified: 2022/01/14 20:39
  • by admin