Jak uruchomić ładowanie jądra za pomocą modułu ładującego EFI stub (efistub)?


14

Mam Ubuntu 14.04 działający w trybie UEFI jako jedyny system operacyjny, tutaj nie ma podwójnego rozruchu. Wersja jądra to 3.13.0-24-generic. Istnieje partycja EFI. W tym przypadku partycja EFI nie jest ustawiona domyślnie, /dev/sda1ale na, /dev/sda3ponieważ faktycznie przekonwertowałem tryb BIOS na tryb EFI . Użyłem tego grub-efi-amd64pakietu, ale tak naprawdę ładuje menu rozruchowe GRUB z menu rozruchowego oprogramowania układowego UEFI (ładowanie rozruchowe UEFI \EFI\ubuntu\grubx64.efi).

Chcę pominąć ten krok ładowania menu podwójnego rozruchu i uruchomić się szybciej, bezpośrednio z UEFI do jądra. Ubuntu jądra od 12.10 mają "kernel EFI stub Loader" funkcję.

Wiem, że muszę skopiować jądro Ubuntu na partycję EFI (ewentualnie zmienić nazwę) i utworzyć pozycję w menu rozruchowym UEFI (na przykład za pomocą efibootmgr). Jakie dokładne polecenia terminalowe są w tym celu potrzebne?

Odpowiedzi:


14

Poniższe polecenia są bardziej ogólne niż tylko dla jądra w wersji 3.13.0-35.

1. Zamontuj partycję efi i skopiuj tam pliki jądra

$ 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. Zmień nazwę pliku jądra

Skróć nazwę pliku jądra, usuwając go, -genericponieważ wydaje się, że istnieje ograniczenie długości ścieżki do 39 znaków i Zmień nazwę pliku (plików) jądra na koniec .efi, co zapewnia zgodność z większością systemów

$ 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'`

Skracanie nazwy pliku jądra powyższej nazwy nie jest wystarczające dla dpkgzainstalowanego jądra głównego , ponieważ na przykład /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efibez -genericma wciąż 40 znaków.

3. Dodaj nowy wpis do menu rozruchu EFI

Zamień 3.13.0-35w tym przykładzie na określoną wersję jądra

$ 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

Ta nowa pozycja menu rozruchu stanie się domyślnym nowym wyborem rozruchu.

Może nie trzeba dodatkowych parametrów debugowania debug, ignore_loglevel, libata.force=dump_idi crashkernel=384M-:128M. Initrdmusi być obecny, w przeciwnym razie rozruch zawiesza się w „ Switched to clocksource tsc. ”, ponieważ urządzenia głównego sda1 nie można otworzyć.


Nie wiem, jak to wymyśliłeś, ale jesteś niesamowity. Jest zaskakująco mało dokumentów dotyczących tej schludnej funkcji.
— user3549648

W przypadku, gdy to nie działa, spróbuj wstawić argumenty -li -ucudzysłowy (lub ręcznie odwróć ukośnik odwrotny). Możesz sprawdzić, czy jest to problem, wykonując efibootmgr -vpo dodaniu nowego wpisu do menu rozruchowego EFI. Ponadto, jeśli twój komputer ma więcej niż jeden dysk (powiedzmy SSD i HDD), musisz określić jeden, dla -dktórego domyślnie /dev/sda(patrz man efibootmgr)
— Peeyush Kushwaha

5

Według wiki Debiana można to zrobić w kilku prostych krokach, które przetrwają aktualizację jądra .

Uwaga: zakłada się, że masz partycję EFI zamontowaną na /boot/efi.

  1. Utwórz /etc/kernel/postinst.d/zz-update-efistubz następującą zawartością:

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

    Jest to haczyk, który zostanie uruchomiony przy aktualizacji jądra w celu skopiowania najnowszego obrazu jądra i initrd do odpowiedniej lokalizacji. Następnie uczyń go wykonywalnym i uruchom:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Dodaj pozycję rozruchową:

    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"
    

    Nie zapomnij zmienić argumentów -di w -pzależności od tego, gdzie znajduje się partycja systemowa EFI. W moim przypadku jest to / dev / sdb1, ale prawdopodobnie będzie inaczej. Prawdopodobnie będziesz także musiał zmienić root=wartość w cmdline jądra na partycję root.

    (Możesz zmienić etykietę na dowolną, zmieniając -Lparametr.)

    Wpis dodany właśnie przez Ciebie stanie się domyślnym wpisem. I nie zepsuje się po aktualizacji jądra, ponieważ hook upewni się vmlinuzi initrd.imgbędzie zawsze aktualizowany.


Jakikolwiek sposób, aby działał z bezpiecznym uruchomieniem, ponieważ na moim laptopie HP, gdy próbuję, daje to bezpieczny błąd rozruchu (oczywiście mogę również wyłączyć bezpieczne uruchamianie)
— Suici Doga

Wygląda na to, że będziesz musiał najpierw użyć cryptboot i niektórych narzędzi do podpisania jądra . Jest to trochę kłopotliwe, szczególnie jeśli nie używasz Arch (ponieważ nie ma gotowego narzędzia), więc po prostu wyłączę bezpieczny rozruch.
— Léo Lam

Co powiesz na skopiowanie jądra .signed?
— Suici Doga
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.