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

14

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

Я хочу пропустить этот шаг загрузки меню двойной загрузки и ускорить загрузку непосредственно из UEFI в ядро. Ubuntu ядер , так как 12,10 есть «Kernel EFI STUB загрузчик» функция.

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

Pro Backup
источник

Ответы:

14

Приведенные ниже команды являются более общими, чем только для версии ядра 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должен присутствовать, иначе загрузка зависает на « Switched to clocksource tsc. », потому что корневое устройство sda1 не может быть открыто.

Pro Backup
источник
Я не знаю, как ты это понял, но ты потрясающий. Вокруг этой аккуратной функции есть удивительно маленький документ.
user3549648 27.02.15
Если это не работает, попробуйте поместить аргументы -lи -uв двойные кавычки (или избежать обратной косой черты вручную). Вы можете проверить, является ли это проблемой, выполнив efibootmgr -vпосле добавления новой записи в меню загрузки EFI. Кроме того, в случае, если на вашей машине более одного диска (скажем, SSD и HDD), вам нужно указать один, по -dумолчанию /dev/sda(см. man efibootmgr)
Peeyush Kushwaha
5

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

Примечание: это предполагает, что у вас есть раздел 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=значение в командной строке ядра на ваш корневой раздел.

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

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

Лео Лам
источник
Любой способ заставить его работать с безопасной загрузкой, поскольку на моем ноутбуке HP, когда я пытаюсь это сделать, это дает ошибку безопасной загрузки (конечно, я могу также отключить безопасную загрузку)
Suici Doga
Похоже, что вы должны использовать cryptboot и некоторые инструменты, чтобы подписать ядро ​​в первую очередь . Это немного хлопотно, особенно если вы не используете Arch (так как нет готового инструмента), поэтому я бы просто отключил безопасную загрузку.
Лео Лам
Как насчет копирования ядра .signed?
Суичи Дога