Як завантажувати завантаження ядра за допомогою завантажувача 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). Які саме термінальні команди необхідні для цього?

Відповіді:


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повинно бути присутнім, інакше завантажувальний пристрій висить на " Переключений на тактовий ресурс tsc. ", тому що кореневий пристрій sda1 неможливо відкрити.


Я не знаю, як ви це зрозуміли, але ви дивовижні. Навдиво мало документа в цій акуратній функції.
користувач3549648

Якщо це не працює, ви спробуйте поставити аргументи -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=значення в cmdline ядра на свій кореневий розділ.

    (Ви можете змінити мітку на все, що завгодно, змінивши -Lпараметр.)

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


Будь-який спосіб змусити його працювати із захищеним завантаженням, оскільки на моєму ноутбуці HP, коли я намагаюся це, це дає помилку в захищеному завантаженні (звичайно, я також можу відключити безпечне завантаження)
Suici Doga

Схоже, вам доведеться спочатку використовувати криптовалюту та деякі інструменти для підписання ядра . Це трохи клопоту, особливо якщо ви не використовуєте Arch (оскільки немає готового до використання інструменту), тому я просто відключую безпечне завантаження.
Лео Лам

Що з копією ядра .signed?
Suici Doga
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.