null

Переезд с Legacy Boot на UEFI

Всем привет!

После замены NVMe накопителя в ноутбуке на более объёмный, я решил использовать старый в своём ПК. Казалось бы, нужно лишь вставить накопитель, скопировать на него / и /boot и загрузиться с него, но не тут то было! Моя материнская плата базируется на H97 чипсете, который является «переходным» для Intel`а, поэтому поддержка M.2 была добавлена в неё «бонусом» и как следствие, по крайней мере на моей материнской плате, грузиться с него нельзя sad

Не долго думая я вспомнил о функции мультибута в GRUB и том моменте, что ему безразлично на каком диске расположена ОС. Следовательно, в моём случае можно установить загрузчик на другой диск и загружать ОС, расположенную на M.2, через него.

На этом моменте стоит ещё упомянуть, что диск, который я выбрал для установки загрузчика, размечен таблицей секторов GPT, которая имеет некоторые отличия от MBR в плане загрузки:

Как всем известно старый добрый MBR выделяет свой первый сектор (чаще всего 512 байт) под «Master Boot Record», который содержит код инициализации загрузчика (сам загрузчик не помещается в этот объём, особенно учитывая различные дополнения: lvm, dm-crypt, файловые системы и т. д.). Это в свою очередь также налагает ограничение в 1 загрузчик на диск (и в принципе является некоторым костылём). При разработке GPT решили учесть этот момент (хотя 1-ый сектор также может быть использован для загрузки в legacy boot режиме) и как замена этого механизма предлагается как минимум 2 варианта того, как можно осуществлять загрузку:

1) Используя UEFI: В этом случае загрузчик записывается в память материнской платы (efivars). Этот вариант делает неудобным перенос диска с системой в другой ПК или замену материнской платы. Также в моём случае загрузчик отказался устанавливаться, возвращая ошибку ¯\_()_/¯

2) Другой способ состоит в том, чтобы использовать специальный тип раздела - «EFI System», который будет просматриваться UEFI на предмет наличия загрузчика. Этот способ обеспечивает переносимость установленной на диск системы, но возможно будут проблемы с Secure Boot. Я решил остановиться на этом варианте.

В качестве хостовой системы использовалась Ubuntu 19.04, но инструкции должны быть аналогичны и для других версий (и дистрибутивов). Подразумевается что на диске уже есть свободное место для новых разделов, а все данные забекаплены.

Для начала нужно создать EFI System Partition с помощью fdisk или другой подобной утилиты. В моём случае диск это /dev/sdc.

$ sudo fdisk /dev/sdc

В данном случае, я решил выделить 1 Гб под EFI и 5 Гб под /boot, но, как подсказывает df -h после установки загрузчика, EFI раздел занят на 3.1 Мб, а /boot на 250 Мб. Поэтому рациональнее выделить ~100 Мб под EFI и уменьшить /boot до 1-2 Гб (но это уже зависит от ваших потребностей).

После создания раздела нужно отформатировать раздел EFI в fat32:

$ sudo mkfs.fat -F32 /dev/sdc2

Если возникли проблемы, то можно попробовать использовать fat16 или fat12 (https://wiki.archlinux.org/index.php/EFI_system_partition#Format_the_partition)

После этого копируем старый раздел с /boot используя dd (новый раздел должен быть такого же объёма или больше):

$ sudo dd if=/dev/sdb1 of=/dev/sdc3 bs=100M status=progress

Иначе нужно создать новый раздел и разметить его в ext4 или другую, поддерживаемую GRUB файловую систему.

Устанавливаем пакет grub-efi:

$ sudo apt install grub-efi

Далее отмонтируем старый /boot и монтируем новые разделы:

$ sudo umount /boot
$ sudo mount /dev/sdc3 /boot
$ sudo mkdir -p /boot/efi
$ sudo mount /dev/sdc2 /boot/efi

Устанавливаем GRUB в EFI режиме:

$ sudo grub-install --removable --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB

В этом случае --removable говорит о том, что загрузчик не будет устанавливаться в память материнской платы, а будет записан полностью на EFI раздел GPT.

Делаем обновление GRUB, чтобы актуализировать информацию о разделах, с которых GRUB будет осуществлять загрузку системы:

$ sudo update-grub

Не забудьте после этого обновить /etc/fstab так, чтобы использовались новые разделы для /boot и /boot/efi (также убедитесь, что устройства указаны с помощью их UUID в виде UUID=4B…, иначе будут проблемы, если произойдёт перенумеровка дисков, например при пересборке ПК).

Также стоит учитывать что при копировании раздела с помощью dd, может копироваться и его UUID, что тоже может привести к ошибкам, т. к. будут два раздела с одинаковыми идентификаторами, а монтироваться будет первый найденный. Решить эту проблему можно удалив старый раздел или изменив UUID вручную, но это уже совсем другая история :)

Почитать подробнее о происходящем можно по ссылкам ниже:
https://en.wikipedia.org/wiki/Master_boot_record
https://wiki.archlinux.org/index.php/EFI_system_partition#GPT_partitioned_disks

https://wiki.archlinux.org/index.php/EFI_system_partition#Format_the_partition
https://wiki.archlinux.org/index.php/GRUB#Installation_2

Назад