Bagaimana cara boot memuat kernel menggunakan loader EFI stub (efistub)?

14

Saya menjalankan Ubuntu 14.04 dalam mode UEFI sebagai satu-satunya sistem operasi, tidak ada dual-boot di sini. Versi kernel adalah 3.13.0-24-generik. Ada partisi EFI. Dalam hal ini partisi EFI bukan pada default /dev/sda1tetapi pada /dev/sda3karena saya benar-benar mengubah mode BIOS ke mode EFI . Saya telah menggunakan grub-efi-amd64paket tersebut, walaupun itu sebenarnya memuat menu boot GRUB dari menu boot firmware UEFI (UEFI bootload \EFI\ubuntu\grubx64.efi).

Saya ingin melewatkan langkah memuat menu boot ganda, dan boot lebih cepat, langsung dari UEFI ke dalam kernel. The Ubuntu kernel sejak 12.10 memiliki "loader Kernel EFI rintisan" fitur.

Saya tahu saya perlu menyalin kernel Ubuntu ke partisi EFI (mungkin mengganti nama) dan membuat entri dalam menu boot UEFI (misalnya menggunakan efibootmgr). Perintah terminal mana yang diperlukan untuk melakukan ini?

Pro Backup
sumber

Jawaban:

14

Perintah di bawah ini lebih umum daripada untuk versi kernel 3.13.0-35 saja.

1. Pasang partisi efi dan salin file kernel di sana

$ 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. Ubah nama file kernel

Persingkat nama file kernel dengan menghapus -generickarena tampaknya ada batas jalur panjang karakter 39 dan Ganti nama file kernel untuk diakhiri .efi, ini memastikan kompatibilitas dengan sebagian besar sistem

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

Pemendekan nama file nama kernel di atas tidak cukup untuk kernel arus utama yangdpkg diinstal , karena misalnya tanpa panjang masih 40 karakter./EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi-generic

3. Tambahkan entri baru ke menu boot EFI

Ganti 3.13.0-35dalam contoh ini dengan versi kernel spesifik Anda

$ 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

Entri menu boot baru ini akan menjadi pilihan boot default baru Anda.

Anda mungkin tidak perlu parameter debugging ekstra debug, ignore_loglevel, libata.force=dump_iddan crashkernel=384M-:128M. Initrdharus ada, jika tidak boot hang di " Switched to clocksource tsc. " karena perangkat root sda1 tidak dapat dibuka.

Pro Backup
sumber
Saya tidak tahu bagaimana Anda mengetahuinya tetapi Anda luar biasa. Ada sangat sedikit dokumen di sekitar fitur rapi ini.
user3549648
Dalam kasus itu tidak berfungsi untuk Anda mencoba untuk menempatkan argumen -ldan -udalam tanda kutip ganda (atau melarikan diri backslash secara manual). Anda dapat menguji apakah ini masalah dengan mengeksekusi efibootmgr -vsetelah Anda menambahkan entri baru ke menu boot EFI. Juga, seandainya mesin Anda memiliki lebih dari satu disk (katakanlah SSD dan HDD) maka Anda harus menentukan satu di -dmana defaultnya adalah /dev/sda(lihat man efibootmgr)
Peeyush Kushwaha
5

Menurut wiki Debian , ini dapat dilakukan dalam beberapa langkah sederhana yang akan bertahan dari pembaruan kernel .

Catatan: ini mengasumsikan bahwa Anda memiliki partisi EFI yang dipasang di /boot/efi.

  1. Buat /etc/kernel/postinst.d/zz-update-efistubdengan konten berikut:

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

    Ini adalah hook yang akan dijalankan pada pembaruan kernel untuk menyalin imej kernel terbaru dan initrd ke lokasi yang sesuai. Kemudian buat itu dapat dieksekusi dan jalankan:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Tambahkan entri boot:

    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"
    

    Jangan lupa untuk mengubah -ddan -pargumen tergantung di mana partisi sistem EFI Anda. Dalam kasus saya, ini adalah / dev / sdb1, tetapi ini mungkin berbeda untuk Anda. Anda mungkin juga harus mengubah root=nilai di cmdline kernel ke partisi root Anda.

    (Anda dapat mengubah label menjadi apa pun yang Anda inginkan dengan mengubah -Lparameter.)

    Entri boot yang baru Anda tambahkan akan menjadi entri default. Dan itu tidak akan rusak setelah pembaruan kernel, karena hook akan memastikan vmlinuzdan initrd.imgselalu diperbarui.

Léo Lam
sumber
Cara apa pun untuk membuatnya bekerja dengan boot aman karena pada laptop HP saya ketika saya mencoba ini memberikan kesalahan boot aman (tentu saja saya dapat menonaktifkan boot aman juga)
Suici Doga
Sepertinya Anda harus menggunakan cryptboot dan beberapa alat untuk menandatangani kernel terlebih dahulu . Ini agak merepotkan terutama jika Anda tidak menggunakan Arch (karena tidak ada alat yang siap digunakan), jadi saya hanya menonaktifkan boot aman.
Léo Lam
Bagaimana dengan menyalin kernel .signed?
Suici Doga