लिनक्स कर्नेल EFI बूट स्टब या "आपका अपना बूटलोडर"

यूईएफआई टिक्स लोगो

परिचय


हाल ही में एक बूट लोडर के बिना लिनक्स ओएस डाउनलोड करने के लेख को पढ़ने के बाद, मुझे दो चीजों का एहसास हुआ: कई "नवीनता" में रुचि रखते हैं जो 2011 तक वापस डेटिंग करते हैं; लेखक ने सबसे बुनियादी का वर्णन नहीं किया, जिसके बिना, वास्तव में, कुछ मामलों में कुछ भी काम नहीं करेगा। एक अन्य लेख भी था, लेकिन या तो यह पहले से ही पुराना था, या फिर एक ही समय में बहुत सारे अनावश्यक और अप्रसन्न था।

विशेष रूप से, मुख्य बिंदु छूट गया था - कर्नेल असेंबली विकल्प CONFIG_EFI_STUB । चूंकि U (lu / ku / edu / * etc *) के हाल के संस्करणों में यह विकल्प पहले से ही डिफ़ॉल्ट रूप से सक्षम है, इसलिए लेखक को कोई संदेह नहीं था।
जहां तक ​​मुझे पता है, यह वर्तमान में उपरोक्त संस्करणों के वितरण में शामिल है: आर्क लिनक्स, फेडोरा 17, ओपनसुअस 12.2 और उबंटू 12.10। टिप्पणियों में, उन्होंने यह भी उल्लेख किया कि 2.6 कर्नेल के साथ डेबियन यह कर सकता है, लेकिन यह नवीनतम संस्करणों से बैकपोर्ट से ज्यादा कुछ नहीं है। इन वितरणों को फिर से बनाने की आवश्यकता नहीं है! लेकिन अन्य CONFIG_EFI_STUB पर, सबसे अधिक संभावना है, यह या तो पूरी तरह से अनुपस्थित है, क्योंकि विकल्प केवल कर्नेल संस्करण 3.3.0 और उच्चतर से उपलब्ध है, या डिफ़ॉल्ट रूप से बंद है। तदनुसार, नीचे वर्णित सब कुछ CONFIG_EFI_STUB विकल्प के साथ संकलित कर्नेल के लिए सही है।

तो वास्तव में लिनक्स कर्नेल EFI बूट स्टब क्या है?


सामान्य जानकारी

और इससे ज्यादा कुछ नहीं ... "exe-file"! हां, "पेंच" पीई / COFF । यूईएफआई बूटलोडर को खुश करने के लिए मामूली संशोधनों के साथ अच्छी तरह से या केवल, इसके तहत केवल ज़कोस। आप कर्नेल के पहले 2 बाइट्स को पढ़कर इसे सत्यापित कर सकते हैं:
$ od /boot/vmlinuz-linux --address-radix=x --read-bytes=2 -t x1c 0000000 4d 5a MZ 0000002 

यह परिचित है, है ना? कम से कम उन लोगों के लिए जो कम से कम एक बार "मज़े के लिए" नोटपैड में एमएस-डॉस या विंडोज निष्पादन योग्य फ़ाइल खोलते हैं, एक हेक्स संपादक या कुछ शांत। ये मार्क ज़बिकोव्स्की के शुरुआती नाम हैं, जिन्होंने वास्तव में इस फ़ाइल प्रारूप को एमएस-डॉस में विकसित किया था। इस स्टब का हस्ताक्षर अभी भी आधुनिक विंडोज निष्पादन योग्य फाइलों में उल्टी में लटका हुआ है, इसके हेडर के साथ प्रति फ़ाइल 64 बाइट्स के रूप में भक्षण होता है!

डॉस हेडर विरासत कोड पर गिरता है, जिसे कर्नेल बूट क्षेत्र के रूप में बूट करता है, और पीई फ़ाइलों को चलाते समय एमएस-डॉस के तरीके से शपथ लेता है: “प्रत्यक्ष फ्लॉपी बूट समर्थित नहीं है। इसके बजाय बूट लोडर प्रोग्राम का उपयोग करें। डिस्क निकालें और रिबूट करने के लिए किसी भी कुंजी को दबाएं ... "। इसलिए, इस हेडर की जानकारी यहाँ कचरा है, सिवाय इसके, वास्तव में, हस्ताक्षर 'एमजेड' और अगले हेडर का ऑफसेट पता।

चलिए आगे बढ़ते हैं।
PE / COFF विनिर्देश हमें बताता है कि ऑफ़सेट 0x3c पर हस्ताक्षर "PE \ 0 \ 0" के साथ दूसरे हेडर की 32-बिट ऑफ़सेट है:
 $ od /boot/vmlinuz-linux --address-radix=x --read-bytes=4 --skip-bytes=0x3c -t x4 00003c 000000b8 000040 

इसलिए, ऑफसेट 0xb8 है, जो x86_64 आर्किटेक्चर के वर्तमान स्थिर कर्नेल के लिए सही है, x86 पर यह 0xa8 होगा। हम पढ़ते हैं:
 $ od /boot/vmlinuz-linux --address-radix=x --read-bytes=4 --skip-bytes=0xb8 -t x1c 0000b8 50 45 00 00 PE \0 \0 0000bc 

और यहाँ पर दूसरे हैडर के हस्ताक्षर है! जैसा कि आप अनुमान लगा सकते हैं, यह पोर्टेबल निष्पादन योग्य वाक्यांश के लिए एक संक्षिप्त नाम है, जिसके साथ निष्पादन योग्य फ़ाइलों में पेलोड शुरू होता है।

यहां तक ​​कि विंडोज बूट लोडर ने इस हेडर के आधे क्षेत्रों की परवाह नहीं की, और यहां तक ​​कि यूईएफआई को उनकी बिल्कुल भी आवश्यकता नहीं थी, इसलिए उनमें से कुछ को सांख्यिकीय रूप से पंजीकृत किया गया था, जबकि महत्वपूर्ण लोगों को कर्नेल असेंबली के दौरान भरा जाता है। बहुत सारे "अनावश्यक" क्षेत्र, सभी प्रकार के टाइमस्टैम्प, नियंत्रण राशि, आदि बस शून्य हैं। मूल रूप से, आयाम, ऑफसेट, प्रवेश बिंदु, आदि भरे हुए हैं। इसलिए, आप इस पीई-फ़ाइल के नाम को पूरी तरह से मान्य कर सकते हैं। हालाँकि, क्लासिक लॉर्डपे या पेटोल उपयोगिताओं में हस्ताक्षर के साथ काफी सामग्री है और वे सब कुछ बताती हैं जो वे फाइल के बारे में जानते हैं:

पीई वैकल्पिक हैडर


छवि विंडोज में "वास्तविक" निष्पादन योग्य फ़ाइलों से मुख्य अंतर वैकल्पिक हैडर का सबसिस्टम ध्वज है, जो IMAGE_SUBSYSTEM_EFI_APPLICATION में सेट किया गया है, और प्रतीकात्मक या IMAGE_SUBSYSTEM_WINDOWS_CUI ग्राफ के लिए IMAGE_SUBSYSTEM_INDOWS_GUI में नहीं है।

संरचना

सामान्य तौर पर, सब कुछ एक नियमित पीई फ़ाइल के रूप में होता है। वर्तमान में, आर्क लिनक्स कर्नेल का स्थिर संस्करण 3.11.4 रिपॉजिटरी से है, इसमें 3 खंड हैं: '.set', '.reloc' और '.text'।


वास्तव में, मैं थोड़ा चालाक था, शुरुआत में कर्नेल को एक एक्स फ़ाइल कहता था। वास्तव में, यह एक सरल EFI अनुप्रयोग है जो PE32 + प्रारूप का उपयोग करता है।

बुनियादी आवश्यकताओं


छवि सबसे पहले, आपको ईएफआई-मोड बूट मोड को सक्रिय करने की आवश्यकता है। एक आइटम को एक विक्रेता के रूप में कहा जा सकता है, आमतौर पर बूट विकल्प टैब में स्थित होता है। यदि आपने वहाँ कुछ देखा जैसे कि लेगेसी मोड या CSM (कम्पेटिबिलिटी सपोर्ट मोड), या केवल BOIS मोड, तो इसे कुछ इसी तरह बदलें: (U) EFI मोड, एन्हांस्ड मोड या एडवांस्ड मोड।

अगर मदरबोर्ड में "विंडोज 8 रेडी" लोगो है, तो सबसे अधिक संभावना है कि ईएफआई बूट मोड पहले से ही डिफ़ॉल्ट रूप से सक्रिय है।

ज्यादातर मामलों में, लिनक्स कर्नेल को EFI- मोड में बूट करने के लिए, आपको सुरक्षित बूट विकल्प को निष्क्रिय करना होगा।

डिस्क लेआउट

कई स्रोतों से संकेत मिलता है कि जीपीटी विभाजन की आवश्यकता है, एमबीआर नहीं, लेकिन यह मामला नहीं है। UEFI MBR के लिए काफी सक्षम है। एक और बात, उदाहरण के लिए, विंडोज जबरन एक डिस्क को ईएफआई मोड में बूट करने के लिए एक नए तरीके से तोड़ने के लिए मजबूर करता है और मास्टर बूट रिकॉर्ड की प्राचीनता की कसम खाता है। और ठीक ही तो है! डिस्क को अप-टू-डेट करने के बाद, हम कुछ भी नहीं खोएंगे, लेकिन केवल जीत।
सबसे पहले, सभी प्रकार के प्राथमिक / तार्किक विभाजन के साथ कोई समस्या नहीं होगी, "वहाँ मत जाओ - यहाँ जाओ" और अन्य अशिष्टताएं।
दूसरे, हालांकि सॉलिडस्टेट डिस्क्स बड़ी मात्रा में आगे बढ़ रहे हैं, जिनके वॉल्यूम बहुत आश्चर्यजनक नहीं हैं, कुछ टेराबाइट्स के एक साधारण "टर्नटेबल" का आकार अब किसी को आश्चर्यचकित नहीं करेगा। लेकिन एमबीआर के तहत आप अधिकतम 2TB के साथ एक विभाजन को चिह्नित कर सकते हैं। दूसरी ओर, GPT, बहुत कुछ देखता है , आप एक नंबर भी नहीं लिख सकते हैं - ऐसे आकारों के डिस्क जल्द ही प्रदर्शित नहीं होंगे।
खैर, प्लस सभी प्रकार के बोनस, जैसे कि डिस्क की शुरुआत और अंत में GPT रिकॉर्ड को डुप्लिकेट करना, अखंडता चेकसमेट्स, आदि, GPT के लिए एक डिस्क नामित करने के लिए बिना किसी हिचकिचाहट के इच्छा जोड़ें।

जीएनयू / लिनक्स में विभिन्न उपयोगिताओं का उपयोग करके डिस्क को कैसे विभाजित किया जाए, इस पर बहुत सारे लेख हैं।

अलग खंड

अनुभाग प्रकार

मानकों के विकास के nn-tat वर्षों के बाद, इंजीनियरों ने अभी भी तय किया कि हार्डकोड अच्छा नहीं है। अब यह महत्वपूर्ण नहीं है कि हमारा बूट विभाजन कहाँ स्थित है, UEFI बूटलोडर इसे बहुत सरलता से करता है: यह सभी विभाजनों से गुजरता है और एक पंक्ति में डिस्क और एक विशेष के लिए दिखता है। इसकी ख़ासियत इस तथ्य में निहित है कि एमबीआर मार्कअप के मामले में, इसका कोड 0xEF के साथ एक प्रकार है (जैसा कि आप अनुमान लगा सकते हैं, ईएफआई से)। GPT मार्कअप के मामले में, GUID वाला एक खंड C12A7328-F81F-11D2-BA4B-00A0C93EC93B के बराबर है

यहाँ कुछ साक्षी है। उदाहरण के लिए, सभी मार्कअप उपयोगिताओं में, "बूट" ध्वज को सेट और प्रदर्शित करने की क्षमता है, जो विभाजन पर लागू होती है। तो, एमबीआर के मामले में, ऐसी संभावना वास्तव में मौजूद है, अर्थात, एक वास्तविक बाइट है जो BIOS को इंगित करता है कि विभाजन "बूट करने योग्य" है। यह ध्वज किसी भी विभाजन पर लगाया जा सकता है जिसका एमबीआर, हम डाउनलोड के लिए BIOS को खिलाना चाहते हैं। लेकिन जब हम GPT के साथ काम कर रहे हैं, तो वास्तव में कोई झंडा नहीं है! इस ध्वज के द्वारा, जुदा का मतलब उपरोक्त के बराबर केवल GUID है। वह वास्तव में GPT बूट फ्लैग = GPT EFI विभाजन है!
जुदा
 # parted /dev/sda -l : ATA ST3750330AS (scsi)  /dev/sda: 750GB   (./.): 512B/512B  : gpt Disk Flags:         1 1049kB 135MB 134MB fat32 EFI System  2 135MB 269MB 134MB ext2 Linux filesystem 3 269MB 8859MB 8590MB linux-swap(v1) Linux swap 4 8859MB 30,3GB 21,5GB ext4 Linux filesystem 5 30,3GB 46,4GB 16,1GB ext4 Linux filesystem 6 46,4GB 67,9GB 21,5GB ext4 Linux filesystem 7 67,9GB 750GB 682GB xfs Linux filesystem 
gdisk इससे ग्रस्त नहीं है:
gdisk
 # gdisk /dev/sda -l GPT fdisk (gdisk) version 0.8.7 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Disk /dev/sda: 1465149168 sectors, 698.6 GiB Logical sector size: 512 bytes Disk identifier (GUID): 02D11900-D331-4114-A3D7-8493969EF533 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 1465149134 Partitions will be aligned on 2048-sector boundaries Total free space is 2014 sectors (1007.0 KiB) Number Start (sector) End (sector) Size Code Name 1 2048 264191 128.0 MiB EF00 EFI System 2 264192 526335 128.0 MiB 8300 Linux filesystem 3 526336 17303551 8.0 GiB 8200 Linux swap 4 17303552 59246591 20.0 GiB 8300 Linux filesystem 5 59246592 90703871 15.0 GiB 8300 Linux filesystem 6 90703872 132646911 20.0 GiB 8300 Linux filesystem 7 132646912 1465149134 635.4 GiB 8300 Linux filesystem 


निष्कर्ष: यदि हमारा EFI विभाजन MBR पर है, तो विभाजन प्रकार को EFI विभाजन और बूट ध्वज पर सेट करें। यदि GPT एक EFI विभाजन प्रकार या बूट ध्वज है, क्योंकि वे एक ही चीज हैं।

सभी प्रकार की चीजें हैं, जैसे कि GPT विरासत बूट ध्वज, जो कि प्रोटेक्टिव एमबीआर में स्थापित है, और इसी तरह, लेकिन ये सभी बैसाखी हैं जो केवल संगतता मोड में उपयोग किए जाते हैं। GPT मोड में, UEFI बूट को अनदेखा किया जाना चाहिए।

फाइल सिस्टम

अलग-अलग स्रोत अलग-अलग लिखते हैं। कोई कहता है कि FAT16 का उपयोग किया जा सकता है, कोई भी FAT12 की सिफारिश करता है। लेकिन क्या आधिकारिक विनिर्देश की सलाह का पालन करना बेहतर नहीं है? और वह कहती है कि सिस्टम विभाजन FAT32 में होना चाहिए। हटाने योग्य-मीडिया (USB HDD, USB फ्लैश) के लिए - FAT32 के अलावा FAT12 / FAT16 भी।
विभाजन के आकार के बारे में कुछ नहीं कहा गया है। हालांकि, बूट लोडर और फर्मवेयर के प्रारंभिक बैसाखी और छोटी गाड़ी के कार्यान्वयन के कारण, प्रयोगात्मक रूप से, लोगों ने पाया कि विभिन्न "आश्चर्य" से बचने के लिए , कम से कम 520MiB (546MB) के आकार की सिफारिश की जाती है । यहां, भाग्य के साथ, 32-एमबी विभाजन के साथ समस्या नहीं हो सकती है।

निर्देशिका संरचना

लोडर ने अपने "लेबल" विभाजन को ढूंढने के बाद और यह सुनिश्चित किया कि यह फ़ाइल सिस्टम का समर्थन करता है, यह विभाजन के रूट के सापेक्ष पथ के साथ सभी क्रियाओं को करना शुरू करता है। इसके अलावा, इस खंड की सभी फाइलें \ EFI \ निर्देशिका में होनी चाहिए, जो बदले में, अनुभाग की जड़ में एकमात्र है। अधिवेशन द्वारा, प्रत्येक विक्रेता को एक अद्वितीय नाम के साथ एक फ़ोल्डर का चयन करने और उसे \ _ "EFI \" में रखने की सलाह दी जाती है , उदाहरण के लिए: \ EFI \ redhat \ , \ EFI \ microsoft \ , \ EFI \ archlinux \ । विक्रेता की निर्देशिका में सीधे निष्पादन योग्य एफ़आईआई अनुप्रयोग होते हैं। प्रति आर्किटेक्चर की एक फ़ाइल की सिफारिश की जाती है। फाइलों में एक्सटेंशन .efi होना चाहिए।

हटाने योग्य उपकरणों के लिए, \ EFI \ BOOT \ निर्देशिका का उद्देश्य है। यह भी प्रत्येक वास्तुकला के लिए एक से अधिक फ़ाइल की सिफारिश नहीं करता है। इसके अतिरिक्त, फ़ाइल को बूट {आर्क} .efi कहा जाना चाहिए। उदाहरण के लिए, \ EFI \ BOOT \ bootx64.efi । उपलब्ध आर्किटेक्चर: ia32, x64, ia64, arm, aa64

एनवीआरएएम एक्सेस

डिफ़ॉल्ट रूप से, यदि गैर-वाष्पशील UEFI मेमोरी में कुछ भी नहीं लिखा है, तो \ EFI \ BOOT \ bootx64.efi लोड हो जाएगा। NVRAM में आवश्यक एप्लिकेशन के लिए पथ लिखने के लिए, आप efibootmgr उपयोगिता का उपयोग कर सकते हैं। आइए वर्तमान प्रविष्टियों को प्रदर्शित करने का प्रयास करें:
 # efibootmgr -v 

कुछ वितरणों में काम करने के लिए इस उपयोगिता के लिए शामिल कर्नेल विकल्प CONFIG_EFI_VARS की आवश्यकता होती है।

नीचे उतर रहा है


छवि इसलिए, हमने 550 MiB FAT32 EFI सिस्टम विभाजन (ESP) को चिह्नित किया है। या, हमारे पास दूसरी प्रणाली के साथ विंडोज है और पहले से ही इसे स्वयं बनाया है। सच है, वह आमतौर पर लगभग 100 एमबी के आकार के साथ इसे बनाता है, लेकिन व्यक्तिगत रूप से, मुझे कभी भी समस्या नहीं हुई।
EFI बूट STUB के लिए समर्थन के साथ पहले से ही एक कर्नेल / बूट है।
सत्यापित करें
यह जाँचने के लिए कि कर्नेल बनाते समय विकल्प सक्षम था, निष्पादित करें:
 $ zgrep CONFIG_EFI_STUB /proc/config.gz 
या
 $ zgrep CONFIG_EFI_STUB /boot/config-`uname -r` 

CONFIG_EFI_STUB = y का अर्थ है कि विकल्प सक्रिय है।

अगला, हमारे पास परिदृश्यों का एक समूह है:

अब आपको किसी तरह बूट प्वाइंट को एनवीआरएएम यूईएफआई से जोड़ने की जरूरत है। यहाँ फिर से, कई विकल्प हैं:

यदि हम बूट लोडर GRUB2, rEFInd इत्यादि का उपयोग करके पहले से ही EFI मोड में लोड होते हैं (efibootmgr -v शपथ नहीं लेता है), तो सब कुछ ठीक है:
यदि हमें EFI बूट मोड के बारे में अभी पता चला है और बूट बिंदुओं को जोड़ने के लिए इसे स्विच करना चाहते हैं, तो आपको पहले से ही इस मोड में होना चाहिए, और फिर हम अभी भी संगतता मोड में हैं ... दो मुख्य समाधान हैं:

बूटलोडर के बिना ड्यूलबूट


यदि आपके पास एक ही समय में 2 सिस्टम स्थापित हैं, और फिर भी एक तृतीय-पक्ष बूटलोडर स्थापित नहीं करना चाहते हैं, तो आप दोनों यूईएफआई बूट बिंदुओं को जोड़ सकते हैं और अपने पसंदीदा बूट क्रम को समायोजित कर सकते हैं। Windows बूट लोडर आमतौर पर \ EFI \ Microsoft \ BOOT \ bootmgfw.efi में स्थित होता है

कुल मिलाकर


यदि सब कुछ सही ढंग से किया जाता है, तो हम बूट मेनू को रिबूट करते हैं, हमारे द्वारा जोड़े गए आइटम का चयन करें और लगभग तुरंत बूट देखें। एसएसडी के मामले में, फास्टबूट, रीडहेड और आर्क लिनक्स - लगभग 3-4 सेकंड। अब एक साल के लिए, होम सर्वर ईएफआई बूट स्टब का उपयोग करके किसी भी तीसरे पक्ष के बूटलोडर्स के बिना लोड हो रहा है।
बेशक, यहां गति में लाभ कम से कम है, लेकिन, जैसा कि रॉड्रिक स्मिथ जैसे जानकार लिखते हैं, कभी-कभी ईएफआई बूट मोड में संगतता मोड की तुलना में उपकरण का "अधिक पर्याप्त" इनिशियलाइज़ेशन होता है।

निष्कर्ष


यूईएफआई फर्मवेयर के सापेक्ष नमी और पूरी तरह से अलग कार्यान्वयन के कारण, मैंने कोड उदाहरण नहीं दिए। प्रत्येक मामले में, एक समस्या हो सकती है। मुझे आशा है कि मैंने जो वर्णन किया है वह सामान्य सिद्धांत को समझने और मेरे मामले पर लागू होने में मदद करेगा।
मैं मदरबोर्ड निर्माता की वेबसाइट से यूईएफआई के नवीनतम संस्करण को चमकाने की भी सलाह देता हूं।

साहित्य


यूईएफआई आधिकारिक विनिर्देश
रोडरिक डब्ल्यू। स्मिथ का वेब पेज ईएफआई, बूटलोडर्स और डिस्क विभाजन से संबंधित कई उपयोगिताओं के लेखक का काम है।
आर्चीविकी: यूईएफआई बूटलोडर्स - अपरिवर्तित और वितरण में से एक का सबसे अच्छा और सबसे पूर्ण जीएनयू / लिनक्स विकी।
आधिकारिक पीई / COFF विशिष्टता

Source: https://habr.com/ru/post/In197438/


All Articles