จะทำการโหลดเคอร์เนลโดยใช้ตัวโหลด EFI stub (efistub) ได้อย่างไร?


14

ฉันมี Ubuntu 14.04 ที่ทำงานในโหมด UEFI เป็นระบบปฏิบัติการเท่านั้นไม่มีการบูตคู่ที่นี่ รุ่นเคอร์เนลคือ 3.13.0-24-generic มีพาร์ติชัน EFI ในกรณีนี้พาร์ติชัน EFI ไม่ได้เป็นค่าเริ่มต้น/dev/sda1แต่เป็น/dev/sda3เพราะฉันได้แปลงโหมด BIOS เป็นโหมด EFIจริง ฉันใช้grub-efi-amd64แพคเกจแล้ว แต่จริง ๆ แล้วโหลดเมนูการบูต GRUB จากเมนูการบูตเฟิร์มแวร์ UEFI (โหลดการบูต UEFI \EFI\ubuntu\grubx64.efi)

ฉันต้องการข้ามขั้นตอนการโหลดเมนูการบู๊ตสองครั้งและบูตเร็วขึ้นโดยตรงจาก UEFI ไปยังเคอร์เนล อูบุนตูเมล็ดตั้งแต่ 12.10 มี "Kernel EFI ต้นขั้วรถตักดิน"คุณลักษณะ

ฉันรู้ว่าฉันต้องคัดลอกเคอร์เนล Ubuntu ไปยังพาร์ติชัน EFI (อาจจะเปลี่ยนชื่อ) และสร้างรายการในเมนูการบูต UEFI (ตัวอย่างเช่นการใช้efibootmgr) คำสั่งเทอร์มินัลใดที่จำเป็นในการทำเช่นนี้?

คำตอบ:


14

คำสั่งด้านล่างเป็นคำทั่วไปสำหรับเคอร์เนลเวอร์ชัน 3.13.0-35 เท่านั้น

1. เมานต์พาร์ติชัน efi และคัดลอกไฟล์เคอร์เนลที่นั่น

$ 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. เปลี่ยนชื่อไฟล์เคอร์เนล

ทำให้ชื่อไฟล์เคอร์เนลสั้นลงโดยการลบออก-genericเนื่องจากดูเหมือนว่าจะมีขีดจำกัดความยาวพา ธ 39 ตัวอักษรและเปลี่ยนชื่อไฟล์เคอร์เนลให้สิ้นสุด.efiซึ่งจะช่วยให้มั่นใจได้ถึงความเข้ากันได้กับระบบส่วนใหญ่

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

ชื่อไฟล์เคอร์เนลชื่อด้านบนการตัดทอนไม่เพียงพอสำหรับเคอร์เนล mainline ที่dpkgติดตั้งเนื่องจากตัวอย่างเช่นไม่มีความยาว 40 ตัวอักษร/EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi-generic

3. เพิ่มรายการใหม่ลงในเมนูการบูตของ EFI

แทนที่3.13.0-35ในตัวอย่างนี้ด้วยเคอร์เนลเวอร์ชันเฉพาะของคุณ

$ 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

รายการเมนูการเริ่มระบบใหม่นี้จะกลายเป็นตัวเลือกการบูตใหม่ของคุณ

คุณอาจไม่จำเป็นต้องแก้จุดบกพร่องพารามิเตอร์พิเศษdebug, ignore_loglevel, และlibata.force=dump_id ต้องมีอยู่มิฉะนั้นบูตจะหยุดทำงานที่ " Switched to clockource tsc. " เนื่องจากอุปกรณ์รูท sda1 ไม่สามารถเปิดได้crashkernel=384M-:128MInitrd


ฉันไม่รู้ว่าคุณคิดออกยังไง แต่คุณน่าทึ่งมาก มีเอกสารเล็ก ๆ น้อย ๆ ที่น่าแปลกใจเกี่ยวกับคุณลักษณะที่ประณีตนี้
user3549648

ในกรณีที่มันไม่ทำงานให้คุณลองใส่อาร์กิวเมนต์ของ-lและ-uในเครื่องหมายคำพูดคู่ (หรือ escape backslash ด้วยตนเอง) คุณสามารถทดสอบว่านี่เป็นปัญหาหรือไม่โดยดำเนินการefibootmgr -vหลังจากที่คุณได้เพิ่มรายการใหม่ลงในเมนูการบูตของ EFI นอกจากนี้ในกรณีที่เครื่องของคุณมีดิสก์มากกว่าหนึ่งแผ่น (เช่น SSD และ HDD) คุณจะต้องระบุหนึ่ง-dค่าเริ่มต้นที่จะใช้/dev/sda(ดูman efibootmgr)
Peeyush Kushwaha

5

ตามที่วิกิพีเดีย Debianนี้สามารถทำได้ในขั้นตอนง่ายๆไม่กี่คนที่จะอยู่รอดปรับปรุงเคอร์เนล

หมายเหตุ: นี้อนุมานว่าคุณมีพาร์ติชัน EFI /boot/efiติดตั้งที่

  1. สร้าง/etc/kernel/postinst.d/zz-update-efistubด้วยเนื้อหาดังต่อไปนี้:

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

    นี่เป็นตะขอที่จะรันในการอัพเดตเคอร์เนลเพื่อคัดลอกเคอร์เนลอิมเมจล่าสุดและเริ่มไปยังตำแหน่งที่เหมาะสม จากนั้นให้เรียกใช้งานได้และเรียกใช้:

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. เพิ่มรายการบูต:

    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"
    

    อย่าลืมเปลี่ยน-dและ-pข้อโต้แย้งขึ้นอยู่กับว่าพาร์ติชันระบบ EFI ของคุณอยู่ที่ไหน ในกรณีของฉันมันคือ / dev / sdb1 แต่นี่น่าจะแตกต่างสำหรับคุณ คุณอาจจะต้องเปลี่ยนroot=ค่าในเคอร์เนล cmdline เป็นพาร์ติชันรูทของคุณ

    (คุณสามารถเปลี่ยนป้ายกำกับเป็นอะไรก็ได้ที่คุณต้องการโดยเปลี่ยน-Lพารามิเตอร์)

    รายการบูตที่คุณเพิ่งเพิ่มจะกลายเป็นรายการเริ่มต้น และมันจะไม่แตกหลังจากอัปเดตเคอร์เนลเนื่องจากฮุกจะทำให้แน่ใจvmlinuzและinitrd.imgอัปเดตอยู่เสมอ


ทางใดทางหนึ่งที่จะได้ไปทำงานร่วมกับการบูตที่เชื่อถือได้ตั้งแต่แล็ปท็อป HP ของฉันเมื่อฉันลองนี้มันจะช่วยให้ข้อผิดพลาดที่เชื่อถือบูต (แน่นอนผมสามารถปิดการบูตที่เชื่อถือได้มากเกินไป)
Suici Doga

ดูเหมือนว่าคุณจะต้องใช้ cryptboot และเครื่องมือบางอย่างที่จะลงนามเคอร์เนลแรก มันค่อนข้างยุ่งยากโดยเฉพาะถ้าคุณไม่ได้ใช้ Arch (เนื่องจากไม่มีเครื่องมือที่พร้อมใช้งาน) ดังนั้นฉันจะปิดใช้งานการบูตที่ปลอดภัย
Léo Lam

สิ่งที่เกี่ยวกับการคัดลอกเคอร์เนล. signed?
Suici Doga
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.