EFI saplama (efistub) yükleyiciyi kullanarak çekirdeği nasıl önyükleyebilirim?


14

Ubuntu 14.04 UEFI modunda sadece işletim sistemi olarak çalışıyor, burada çift önyükleme yok. Çekirdek sürümü 3.13.0-24-jeneriktir. Bir EFI bölümü var. Bu durumda EFI bölümü varsayılan olarak /dev/sda1değil, BIOS modunu/dev/sda3 aslında EFI moduna dönüştürdüğüm için . grub-efi-amd64Bu aslında UEFI ürün yazılımı önyükleme menüsünden (UEFI önyükleme yükleri \EFI\ubuntu\grubx64.efi) GRUB önyükleme menüsü yükler , paketi kullandık .

Bu çift önyükleme menüsü yükleme adımını atlamak ve doğrudan UEFI'den çekirdeğe daha hızlı önyükleme yapmak istiyorum. 12.10 "Çekirdek EFI'nin saplama yükleyicisi" beri Ubuntu çekirdekleri özelliği.

Ben Ubuntu çekirdeğini EFI bölümüne kopyalamak (muhtemelen yeniden adlandırmak) ve UEFI önyükleme menüsünde (örneğin kullanarak efibootmgr) bir giriş oluşturmak gerektiğini biliyorum . Bunu yapmak için hangi kesin terminal komutları gereklidir?

Yanıtlar:


14

Aşağıdaki komutlar yalnızca çekirdek sürüm 3.13.0-35 için olduğundan daha geneldir.

1. efi bölümünü bağlayın ve çekirdek dosyalarını buraya kopyalayın

$ 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. Çekirdek dosya adını değiştirin

Kaldırarak çekirdek dosya adını kısaltın -genericçünkü bir 39 karakterlik yolu sınırı var gibi görünüyor ve yeniden adlandır çekirdek dosya (lar) içinde sona .efiçoğu sistemleriyle bu olmasını sağlar uyumluluk

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

Yukarıdaki adı çekirdek dosya adı kısalma bir için yeterli değildir dpkgyüklü ana hat çekirdeğin örneğin, çünkü /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efiolmadan -generic40 karakter uzunluğunda hala.

3. EFI önyükleme menüsüne yeni giriş ekleyin

Değiştir 3.13.0-35belirli çekirdek sürümü ile bu örnekte

$ 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

Bu yeni önyükleme menüsü girişi varsayılan yeni önyükleme seçiminiz olacaktır.

Fazladan hata ayıklama parametreleri gerek olmayabilir debug, ignore_loglevel, libata.force=dump_idve crashkernel=384M-:128M. Initrdmevcut olmalıdır, aksi takdirde önyükleme sda1 kök aygıtı açılamadığından " Clocksource tsc'ye geçildi " durumunda asılı kalır .


Bunu nasıl çözdüğünü bilmiyorum ama harikasın. Bu düzgün özelliğin etrafında şaşırtıcı derecede küçük bir doktor var.
user3549648

Eğer işe yaramazsa, çift ​​tırnak işaretleri -lve -uçift ​​tırnak işaretleri koymaya çalışın (veya elle ters eğik çizgiden kaçın). efibootmgr -vEFI önyükleme menüsüne yeni giriş ekledikten sonra çalıştırarak sorunun bu olup olmadığını test edebilirsiniz . Ayrıca, makine birden fazla disk vardır durumunda o zaman tek belirtmek gerekir (bir SSD ve HDD demek) -dhangi varsayılan /dev/sda(bkz man efibootmgr)
Peeyush Kushwaha

5

Göre Debian wiki , bu birkaç basit adımda yapılabilir bir çekirdek güncellemesi hayatta kalacaktır .

Not: Bu, bir EFI bölümünün takılı olduğunu varsayar /boot/efi.

  1. Oluşturmak /etc/kernel/postinst.d/zz-update-efistubaşağıdaki içeriği ile:

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

    Bu, en son çekirdek görüntüsünü ve initrd'ı uygun konuma kopyalamak için çekirdek güncellemesinde çalıştırılacak bir kancadır. Sonra çalıştırılabilir yapın ve çalıştırın:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. Önyükleme girişini ekleyin:

    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"
    

    EFI sistem bölümünüzün bulunduğu yere bağlı olarak -dve -pbağımsız değişkenlerini değiştirmeyi unutmayın . Benim durumumda, / dev / sdb1, ancak bu muhtemelen sizin için farklı olacaktır. Muhtemelen root=çekirdek cmdline'ındaki değeri kök bölümünüze değiştirmeniz gerekecektir .

    ( -LParametreyi değiştirerek etiketi istediğiniz herhangi bir şeyle değiştirebilirsiniz .)

    Yeni eklediğiniz önyükleme girdisi varsayılan girdi olur. Ve bir çekirdek güncellemesinden sonra kırılmaz, çünkü kanca emin olur vmlinuzve initrd.imgher zaman güncellenir.


Bunu denediğimde HP dizüstü bilgisayarımdan beri güvenli önyükleme ile çalışmanın herhangi bir yolu güvenli bir önyükleme hatası veriyor (elbette güvenli önyüklemeyi de devre dışı bırakabilirim)
Suici Doga

İlk önce çekirdeği imzalamak için cryptboot ve bazı araçlar kullanmanız gerektiği anlaşılıyor . Özellikle Arch kullanmıyorsanız (kullanıma hazır bir araç olmadığı için) biraz güçlük, bu yüzden güvenli önyüklemeyi devre dışı bırakardım.
Léo Lam

.Signed çekirdeğini kopyalamaya ne dersiniz?
Suici Doga
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.