Как загрузить загрузку ядра с помощью загрузчика EFI stub (efistub)?

10

У меня Ubuntu 14.04 работает в режиме UEFI как только операционная система, без двойной загрузки. Версия ядра - 3.13.0-24-generic. Существует раздел EFI. В этом случае раздел EFI не имеет значения по умолчанию /dev/sda1 , но в /dev/sda3 , потому что я действительно преобразует режим BIOS в режим EFI . Я использовал пакет grub-efi-amd64 , хотя на самом деле загружает меню загрузки GRUB из меню загрузки прошивки UEFI (загрузка UEFI загружается \EFI\ubuntu\grubx64.efi ).

Я хочу пропустить этот шаг загрузки загрузки с двойной загрузкой и быстрее загружаться непосредственно из UEFI в ядро. ядра Ubuntu с 12.10 имеют "загрузчик ядра EFI", .

Я знаю, что мне нужно скопировать ядро ​​Ubuntu в раздел EFI (возможно, переименовать) и создать запись в меню загрузки UEFI (например, используя efibootmgr ). Какие именно команды терминала необходимы для этого?

    
задан Pro Backup 13.08.2014 в 14:58
источник

2 ответа

13

Ниже приведены более общие команды для версии ядра 3.13.0-35.

1. Смонтируйте раздел efi и скопируйте файлы ядра там

  

$ mount /dev/sda3 /boot/efi      

$ mkdir -pv /boot/efi/EFI/ubuntu/

$ cp -uv /boot/vmlinuz-* /boot/initrd.img-* /boot/efi/EFI/ubuntu/
'/boot/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic'
'/boot/initrd.img-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/initrd.img-3.13.0-35-generic'

2. Измените имя файла ядра

Сократите имя файла ядра, удалив -generic , потому что существует предел пути длины в 39 символов и переименовать файлы ядра для завершения в .efi , что обеспечивает совместимость с большинством систем

$ for f in /boot/efi/EFI/ubuntu/vmlinuz-*-generic; do mv -uv -- "$f" "${f//-generic/}.efi"; done
'/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic.efi''

Сокращенное имя имени файла имени ядра недостаточно для установленного основного ядра dpkg , потому что, например, /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi без -generic остается длиной до 40 символов.

3. Добавить новую запись в меню загрузки EFI

Замените 3.13.0-35 в этом примере на вашу конкретную версию ядра

  

$ kv=3.13.0-35;efibootmgr -c -p 3 -L $kv -l \EFI\ubuntu\vmlinuz-$kv.efi -u root=/dev/sda1 initrd=\EFI\ubuntu\initrd.img-$kv-generic ro rootfstype=ext4 debug ignore_loglevel libata.force=dump_id crashkernel=384M-:128M

Эта новая позиция меню загрузки станет вашим новым выбором для загрузки по умолчанию.

Вам могут не потребоваться дополнительные параметры отладки debug , ignore_loglevel , libata.force=dump_id и crashkernel=384M-:128M . Initrd должно присутствовать, в противном случае загрузка зависает при « Переключается на clocksource tsc. », поскольку корневое устройство sda1 не может быть открыто.

    
ответ дан Pro Backup 13.08.2014 в 21:53
источник
4

В соответствии с Debian wiki это можно сделать несколькими простыми шагами, которые выдержат обновление ядра .

Примечание. Предполагается, что у вас есть раздел EFI, установленный на /boot/efi .

  1. Создайте /etc/kernel/postinst.d/zz-update-efistub со следующим содержимым:

    #!/bin/sh
    cp /vmlinuz /initrd.img /boot/efi/EFI/ubuntu/
    

    Это крючок, который будет запущен при обновлении ядра, чтобы скопировать последний образ ядра и initrd в соответствующее место. Затем сделайте его выполнимым и запустите:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Добавьте загрузочную запись:

    sudo efibootmgr -c -d /dev/sdb -p 1 -L "Ubuntu (efistub)" -l /EFI/ubuntu/vmlinuz -u "root=/dev/sdb2 rw initrd=/EFI/ubuntu/initrd.img quiet splash"
    

    Не забудьте изменить аргументы -d и -p в зависимости от того, где находится системный раздел EFI. В моем случае это / dev / sdb1, но это, вероятно, будет отличаться для вас. Вероятно, вам также придется изменить значение root= в ядре cmdline на ваш корневой раздел.

    (Вы можете изменить метку на все, что хотите, изменив параметр -L .)

    Добавленная запись загрузки станет стандартной. И он не сломается после обновления ядра, так как крючок будет проверять, что vmlinuz и initrd.img всегда обновляются.

ответ дан Léo Lam 04.03.2016 в 18:49