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.