Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
linux_faq:fix_grub_initramfs_boot [2019/09/03 17:41] adminlinux_faq:fix_grub_initramfs_boot [2020/09/17 10:57] – [Fix GRUB MBR -> GPT] 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>
 +====== 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-grub
 +update-initramfs -u
 +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