EFI स्टब (efistub) लोडर का उपयोग करके कर्नेल को कैसे लोड किया जाए?


14

मेरे पास केवल ऑपरेटिंग सिस्टम के रूप में UEFI मोड में चल रहे Ubuntu 14.04 है, यहाँ कोई ड्यूल-बूट नहीं है। कर्नेल संस्करण 3.13.0-24-जेनेरिक है। एक ईएफआई विभाजन है। इस मामले में EFI विभाजन डिफ़ॉल्ट पर नहीं है, /dev/sda1लेकिन /dev/sda3क्योंकि मैंने वास्तव में BIOS मोड को EFI मोड में परिवर्तित किया है । मैंने grub-efi-amd64पैकेज का उपयोग किया है, हालांकि यह वास्तव में UEFI फर्मवेयर बूट मेनू (UEFI बूट लोड \EFI\ubuntu\grubx64.efi) से GRUB बूट मेनू को लोड करता है ।

मैं सीधे UEFI से कर्नेल में उस डबल बूट मेनू लोडिंग कदम और तेजी से बूट करना चाहता हूं। उबंटू कर्नेल 12.10 के बाद से है "कर्नेल 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'`

उपरोक्त नाम कर्नेल फ़ाइल नाम छोटा होना एक dpkgस्थापित मेनलाइन कर्नेल के लिए पर्याप्त नहीं है , क्योंकि उदाहरण के /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efiबिना -genericअभी भी 40 वर्ण लंबा है।

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और crashkernel=384M-:128MInitrdमौजूद होना चाहिए, अन्यथा बूट " हैंगआउटसोर्स टीएससी पर स्विच किया गया " पर लटका हुआ है, क्योंकि रूट डिवाइस sda1 को खोला नहीं जा सकता है।


मुझे नहीं पता कि आपने यह कैसे पता लगाया लेकिन आप अद्भुत हैं। इस साफ-सुथरी विशेषता के आसपास आश्चर्यजनक रूप से बहुत कम डॉक्टर हैं।
user3549648

मामले में यह आपके लिए काम नहीं कर रहा है -lऔर -uदोहरे उद्धरण चिह्नों (या मैन्युअल रूप से पीछे हटना) के तर्क देने की कोशिश करता है । यदि efibootmgr -vआप EFI बूट मेनू में नई प्रविष्टि जोड़ चुके हैं तो आप इसे निष्पादित करके समस्या का परीक्षण कर सकते हैं । इसके अलावा, यदि आपकी मशीन में एक से अधिक डिस्क हैं (SSD और HDD कहें) तो आपको एक निर्दिष्ट करना होगा -dजिसके द्वारा चूक /dev/sda(देखें man efibootmgr)
पीयूष कुशवाह

5

डेबियन विकी के अनुसार , यह कुछ सरल चरणों में किया जा सकता है जो कर्नेल अपडेट से बचे रहेंगे

नोट: यह मानता है कि आपके पास एक EFI पार्टीशन है /boot/efi

  1. /etc/kernel/postinst.d/zz-update-efistubनिम्नलिखित सामग्री के साथ बनाएँ :

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

    यह एक हुक है जिसे कर्नेल अद्यतन पर नवीनतम कर्नेल छवि की प्रतिलिपि बनाने के लिए और उचित स्थान पर initrd पर चलाया जाएगा। फिर इसे निष्पादन योग्य बनाएं और इसे चलाएं:

    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"
    

    जहाँ आपका EFI सिस्टम विभाजन है, उसके आधार पर -dऔर -pतर्कों को बदलना न भूलें । मेरे मामले में, यह / dev / sdb1 है, लेकिन यह आपके लिए अलग होने की संभावना है। आपको संभवतः root=कर्नेल cmdline में अपने रूट विभाजन में मान को बदलना होगा ।

    (आप -Lपैरामीटर को बदलकर अपने इच्छित लेबल को बदल सकते हैं ।)

    आपके द्वारा अभी जोड़ा गया बूट प्रविष्टि डिफ़ॉल्ट प्रविष्टि बन जाएगा। और यह कर्नेल अपडेट के बाद नहीं टूटेगा, क्योंकि हुक सुनिश्चित करेगा vmlinuzऔर initrd.imgहमेशा अपडेट किया जाएगा।


अपने HP लैपटॉप पर सुरक्षित बूट के साथ काम करने के लिए इसे प्राप्त करने का कोई भी तरीका जब मैं यह कोशिश करता हूं तो यह एक सुरक्षित बूट त्रुटि देता है (बेशक मैं सुरक्षित बूट को भी अक्षम कर सकता हूं)
Suici Doga

ऐसा लगता है कि आपको पहले कर्नेल पर हस्ताक्षर करने के लिए क्रिप्टबूट और कुछ उपकरणों का उपयोग करना होगा । यदि आप आर्क का उपयोग नहीं कर रहे हैं (खासकर कोई रेडी-टू-यूज़ टूल नहीं है) तो यह थोड़ी परेशानी की बात है, इसलिए मैं सुरक्षित बूट को निष्क्रिय कर दूंगा।
लेओ लैम

कॉपी किए गए कर्नेल के बारे में क्या?
सुसी डोगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.