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


Saya memiliki Ubuntu 14.04 berjalan dalam mode UEFI sebagai hanya sistem operasi, tidak ada dual-boot di sini. Versi kernel adalah 3.13.0-24-generik. Ada partisi EFI. Dalam hal ini partisi EFI tidak di default /dev/sda1 tetapi pada /dev/sda3 karena saya sebenarnya mengkonversi mode BIOS ke mode EFI. Saya telah menggunakan grub-efi-amd64 paket, meskipun itu sebenarnya memuat menu boot GRUB dari menu boot UEFI firmware (beban boot UEFI \EFI\ubuntu\grubx64.efi).

Saya ingin melewatkan langkah pemuatan menu boot ganda, dan boot lebih cepat, langsung dari UEFI ke kernel. Itu Kernel Ubuntu sejak 12.10 memiliki "Kernel EFI stub loader" fitur.

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


12
2017-08-13 14:58


asal




Jawaban:


Perintah di bawah ini lebih generik dari 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

Mempersingkat nama file kernel dengan menghapus -generic karena tampaknya ada batas 39 karakter panjang jalan dan Ganti nama file kernel (s) 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'`

Nama file kernel di atas nama shortening tidak cukup untuk a dpkg diinstal kernel utama, karena misalnya /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi tanpa -generic masih memiliki 40 karakter.

3. Tambahkan entri baru ke menu boot EFI

Menggantikan 3.13.0-35 dalam 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 membutuhkan parameter debug tambahan debug, ignore_loglevel, libata.force=dump_id dan crashkernel=384M-:128M. Initrd harus ada, jika tidak boot hang di "Beralih ke sumber daya tsc."karena perangkat root sda1 tidak dapat dibuka.


14
2017-08-13 21:53



Saya tidak tahu bagaimana Anda mengetahuinya tetapi Anda luar biasa. Ada sedikit dokumentasi yang mengejutkan di sekitar fitur yang rapi ini. - user3549648
Dalam hal ini tidak berhasil untuk Anda mencoba untuk menempatkan argumen -l dan -u dalam tanda kutip ganda (atau melarikan diri backslash secara manual). Anda dapat menguji apakah ini masalah dengan mengeksekusi efibootmgr -v setelah Anda menambahkan entri baru ke menu boot EFI. Juga, jika mesin Anda memiliki lebih dari satu disk (misalnya SSD dan HDD) maka Anda harus menentukannya satu per satu -d yang default ke /dev/sda (Lihat man efibootmgr) - Peeyush Kushwaha


Menurut Wiki Debian, ini bisa dilakukan dalam beberapa langkah sederhana itu akan bertahan dengan pembaruan kernel.

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

  1. Membuat /etc/kernel/postinst.d/zz-update-efistub dengan isi sebagai 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 membuatnya 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 -d dan -p argumen tergantung di mana partisi sistem EFI Anda berada. Dalam kasus saya, itu 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 ke apa pun yang Anda inginkan dengan mengubah -L parameter.)

    Entri boot yang baru saja Anda tambahkan akan menjadi entri default. Dan itu tidak akan pecah setelah pembaruan kernel, karena hook akan memastikan vmlinuz dan initrd.img selalu diperbarui.


5
2018-03-04 18:49



Cara apa pun untuk membuatnya bekerja dengan boot aman sejak di laptop HP saya ketika saya mencoba ini memberikan kesalahan boot yang aman (tentu saja saya dapat menonaktifkan boot aman juga) - Suici Doga
Sepertinya Anda harus melakukannya gunakan cryptboot dan beberapa alat untuk masuk kernel terlebih dahulu. Ini sedikit 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