Bagaimana cara membuat ulang partisi boot EFI?

10

Saya telah menginstal Fedora di komputer saya dengan /partisi, swappartisi , dan ESPpartisi untuk booting EFI.

Sekarang, saya menginstal Elementary OS, bukan Fedora.

  1. Saya telah memformat /partisi (/ dev / sda3)
  2. Memformat partisi swap (/ dev / sda4)
  3. Tetapi tidak memformat partisi boot EFI (/ dev / sda1)

Sekarang ketika saya boot, saya mendapatkan menu grub lama saya yang diinstal oleh Fedora. Saya hanya bisa boot ke OS Dasar dengan:

  1. Memasuki menu boot.
  2. Memilih boot dari file EFI
  3. Menavigasi /dev/sda1/, untuk mendapatkan elementarydirektori yang berisi grubx64.efifile. Yang mana /boot/efi/EFI/elementary/grubx64.efi.

Bagaimana saya bisa memperbaikinya? Saya berpikir untuk memformat partisi boot /dev/sda1/dengan fat16atau sesuatu kemudian menginstal ulang grub di atasnya.

/dev/sda1Sekarang saya mengandung ini:

root@rafael:/home/rafael# ls /boot/efi/
EFI  mach_kernel  System

root@rafael:/home/rafael# ls /boot/efi/EFI/
BOOT/       elementary/ fedora/     

root@rafael:/home/rafael# ls /boot/efi/EFI/fedora/
BOOT.CSV  fonts  gcdx64.efi  grub.cfg  grubx64.efi  MokManager.efi  shim.efi  shim-fedora.efi

root@rafael:/home/rafael# ls /boot/efi/EFI/elementary/
grubx64.efi

Inilah efibootmgrhasil saya :

BootCurrent: 003D
Timeout: 0 seconds
BootOrder: 2001,2002,2003
Boot0000* Notebook Hard Drive
Boot0010* Internal CD/DVD ROM Drive
Boot0011* Internal CD/DVD ROM Drive (UEFI)
Boot0012* Fedora
Boot0013* Fedora
Boot0014* Fedora
Boot0015* Fedora
Boot0016* Fedora
Boot0017* Fedora
Boot0018* Fedora
Boot0019* Fedora
Boot001A* Fedora
Boot001B* Fedora
Boot001C* Fedora
Boot001D* Fedora
Boot001E* Fedora
Boot001F* elementary
Boot2001* USB Drive (UEFI)
Boot2002* Internal CD/DVD ROM Drive (UEFI)

Bantuan apa pun akan dihargai.

Rafael Adel
sumber
1
Saya hanya dapat menyarankan set artikel ini, tidak pernah menggunakan EFI sendiri: rodsbooks.com/efi-bootloaders/index.html , rodsbooks.com/efi-bootloaders/index.html , rodsbooks.com/gdisk/whatsgpt.html .
Boris Burkov
1
Apakah implementasi UEFI Anda memiliki menu pilihan boot seperti F8 atau lebih? Tolong poskan efibootmgroutput sehingga dapat dilihat apakah entri SD ada di sana (sepertinya bukan tapi untuk memastikan). Anda mungkin juga suka refind sebagai boot manager Anda. Kalau-kalau Anda ingin mengintip cepat pada E17 pada sistem itu ada gambar yang hanya berfungsi (490M ISO link) serta snapshot mingguan . Mungkin lebih rendah dari E polis
Michael Shigorin
@MichaelShigorin Ok, saya sudah menambahkan efibootmgroutput.
Rafael Adel

Jawaban:

5

Saya tidak tahu mengapa Anda menggunakan grub. UEFI bertindak sebagai boot loader dan memungkinkan untuk memilih sistem operasi atau kernel yang berbeda dari menu boot. Meskipun ada beberapa pengecualian, biasanya tidak diperlukan untuk mem-boot loader boot kedua, grub dalam hal ini.

Anda menyebutkan, Anda menginstal OS dasar bukan Fedora, yang berarti Anda hanya perlu memuat satu sistem operasi. Di sini saya menyajikan cara untuk melakukannya tanpa menggunakan grub. Kernel perlu dikompilasi dengan EFI_STUB, jika itu yang Anda bisa tanyakan

grep EFI_STUB /boot/config-<version>

Salin kernel dan initramfs ke ESP (partisi sistem EFI)

cp /boot/vmlinuz-<version> /boot/efi/EFI/elementary/vmlinuz-<version>.efi
cp /boot/initrd.img-<version> /boot/efi/EFI/elementary/initrd.img-<version>

Daftarkan kernel sebagai opsi boot di UEFI

echo "root=UUID=<disk_uuid> ro quiet rootfstype=ext4 add_efi_memmap initrd=\\EFI\\elementary\\initrd.img-<version>" |
  iconv -f ascii -t ucs2 |
  efibootmgr \
    --create --gpt \
    --disk /dev/<disk> --part <partition_number> \
    --label "Elementary OS" \
    --loader "\\EFI\\elementary\\vmlinuz-<version>.efi" \
    --write-signature --append-binary-args -

The --diskArgumen mengambil nama perangkat disk, misalnya --disk /dev/sda, yang --partargumen mengambil jumlah partisi dari ESP, misalnya 4. Anda dapat menemukan nomor partisi ESP dengan perintah berikut:

gdisk -l /dev/sda | awk '$6=="EF00" {print $1}'

Pastikan Anda mengulangi langkah-langkah setelah setiap pembaruan kernel

Baik Anda melakukan ini secara manual (cukup ulangi langkah-langkah di atas) atau Anda menulis skrip kecil yang berfungsi. Untuk sepenuhnya mengotomatiskannya, skrip dapat dihubungkan ke prosedur pasca-pemasangan kernel, ke dalam prosedur pasca-pembaruan initramfs dan ke dalam prosedur postrm kernel (untuk menghapus entri boot UEFI). Sebenarnya, saya tidak tahu mengapa ini tidak dilakukan secara default dalam distribusi, itu hanya beberapa baris kode.

Marco
sumber
Hmmm, saya tidak grep EFI_STUB /boot/config-3.2.0-49-genericmendapat apa-apa.
Rafael Adel
kernel 3.2 terlalu tua (sejak Januari 2012) untuk mendukung EFI_STUB. Anda membutuhkan paling tidak kernel 3.3.
Marco
@ RafaelAdel Jika Anda tidak ingin membangun kernel Anda sendiri, Anda dapat memeriksa versi kernel yang lebih baru di repositori perangkat lunak. Dasar tampaknya berbasis pada Ubuntu dan kernel 3.5 atau 3.8 harus tersedia. Yang lebih baru cenderung mengaktifkan EFI_STUB.
Marco
Sebenarnya ada kernel 3.10.1 sekarang. Akan mencobanya.
Rafael Adel
2
Marco, menyarankan penggunaan rintisan tidak bertanggung jawab kecuali Anda ingin membimbing setiap pengguna melalui apa yang tidak didukung oleh distribusinya dan tidak meneruskannya seperti "lakukan setelah setiap peningkatan kernel". Tidak masalah untuk mengotomatisasi, saya mengatakan ini sebagai orang yang bertanggung jawab atas dukungan UEFI di ALT Linux.
Michael Shigorin
2

Saya melakukannya !

Pertama-tama, saya menghapus semua entri boot yang tidak perlu dengan:

efibootmgr -b <entry_hex_number> -B

Kemudian, Memformat ulang partisi ESP dengan FAT32sistem file.

mkfs.vfat -F32 /dev/sda1

Kemudian instal grub ke /dev/sdaNOT/dev/sda1

grub-install /dev/sda
Rafael Adel
sumber
3
Anda tidak perlu menginstal-grub yang menulis MBR. Saya tidak tahu apakah Anda distro's grub melakukan dua hal bersama-sama, tetapi yang Anda butuhkan adalah menyalin grubx64.efi (atau shim.efi) ke / boot / efi / EFI / $ distro / dan efibootmgr -c -l / boot /efi/EFI/$distro/grubx64.efi.
Lingzhu Xiang
1
grub-install telah belajar untuk melakukan grok EFI (Anda dapat memaksakannya dengan --target = x86_64-efi tetapi efivars.ko harus dimuat saat itu).
Michael Shigorin