मैं UUID के साथ अपनी मूल fs क्यों निर्दिष्ट नहीं कर सकता?


29

मेरा सिस्टम मेरे GRUB 2 विन्यास में इसके साथ ठीक है:

linux   /bzImage root=/dev/sda2 init=/usr/lib/systemd/systemd ro

लेकिन अगर मैं /dev/sda2इसी UUID से प्रतिस्थापित करता हूं :

linux   /bzImage root=UUID=666c2eee-193d-42db-a490-4c444342bd4e init=/usr/lib/systemd/systemd ro

तो यह बूट के दौरान विफल रहता है:

kernel panic - not syncing: VFS: unable to mount root fs on unknown-block(0,0)

UUID सही प्रतीत होता है:

# blkid
/dev/sda1: UUID="97ac3744-39de-4d6d-9a81-e3a3ea08a8bb" TYPE="ext2" 
/dev/sda2: UUID="666c2eee-193d-42db-a490-4c444342bd4e" TYPE="ext4" 

यह काम क्यों नहीं करता है? क्या ऐसा इसलिए है क्योंकि मैं इनट्रामरफ का उपयोग नहीं कर रहा हूं?

यह x86_64 Gentoo Linux कर्नेल 3.10.7 के साथ है। मैं MBR विभाजन तालिका चालू sdaऔर GUID विभाजन तालिका का उपयोग कर रहा हूं sdb


unknown-block(0,0)मुझे GRUB डिवाइस की तरह लगता है। मेरा अनुमान है कि GRUB किसी कारण से उस UUID का उपयोग नहीं कर सकता है।
स्ट्रगलर

@strugee, मुझे नहीं लगता कि GRUB कर्नेल कमांड लाइन की व्याख्या करने का प्रयास करता है। (GRUB कर्नेल को लोड कर sda1रहा है। मैंने उस हिस्से को नहीं दिखाया।)
cjm

मैं सहमत हूँ। यह अजीब है, हालांकि, यह डिवाइस UNIX डिवाइस के बजाय GRUB डिवाइस की तरह दिखता है।
स्ट्रूजी

@ दोस्तों, सवाल GRUB के बारे में नहीं है। मैं बस बूटलोडर होने का उपयोग करता हूं। यह एक लिनक्स कर्नेल प्रश्न है।
cjm

यह कर्नेल के बारे में सवाल नहीं है - यह एक सवाल है init
mikeserv

जवाबों:


22

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

root=PARTUUID=SSSSSSSS-PP

के रूप में /dev/sd??उपकरणों के साथ बदल सकते हैं खामियों को दूर / अनप्लग।

आप से प्राप्त हेक्साडेसिमल संख्या को भुनाने के लिए मत भूलना !SSSSSSSS-PPblkid

उपयोग करने के लिए अधिक आसान है

root=LABEL=
root=UUID=

केवल उसी के साथ काम करने से initramfsइन पहचानकर्ताओं को प्राप्त होता है।

इसलिए, यदि आप एक गैर-खाली का उपयोग करते हैं, तो आपके initramfsपास तीनों हो सकते हैं! एक खाली के साथ initramfs, आपके पास केवल है PARTUUID


यह समझाने के लिए कि बूट का उपयोग कौन कर रहा है? मैंने सिर्फ इस लाइन का उपयोग आर्किलिनक्सआर्म इंस्टॉलेशन के लिए किया है जिसमें इन्राइटर नहीं है, और जहाँ मैं बूट = LABEL और बूट का उपयोग नहीं कर सकता / रही हूँ = UUID।
ineiti

1
आप सही हैं - मैंने बूट को रूट करने के लिए ठीक किया, क्षमा करें! आशा है कि यह अब और अधिक समझ में आता है।
ineiti

1
मेरी समझ (आर्च्लिनएक्ज़रम के मंचों पर एक दिन के बाद) यह है कि अर्चलिनक्सवर्म में कोई initrd (या initramfs नहीं है, लेकिन kernel.org/doc/Documentation/kernel-parameters.txt इसे initrd कहते हैं)। उबंटू और इस तरह मैं एक सूचक को initrd देता हूं, लेकिन (मेरी समझ के अनुसार) Archlinuxarm पर नहीं।
ineiti

1
NOitrd के बारे में Archlinuxarm चर्चा: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti

1
इस लिंक को आज़माएं । और यह एक। और शायद यह एक। initramfs है नहीं initramfs छवि - जो आम तौर पर एक संकुचित संग्रह एक युक्त cpioगिरी unpacks करने के लिए है कि संग्रह /बूट पर। initramfs एक फाइलसिस्टम है - यह हमेशा पहले /माउंट होता है और कर्नेल कॉल से होता है init। आप सामग्री को कर्नेल में संकलित कर सकते हैं या उन्हें बूट पर अनपैक कर सकते हैं - वे दो विकल्प हैं।
mikeserv

16

UUID से बूट करने के लिए आपको जो पैरामीटर देना होता है, वह है PARTUUID। तो यह होना चाहिए root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e

प्रलेखन बताता है कि यह वापस क्यों आ रहा है unknown-block(0,0):

कर्नेल-पैरामीटर

    रूट = [केएनएल] रूट फाइलसिस्टम
            Init / do_mounts.c पर name_to_dev_t टिप्पणी देखें।

init / do_mounts.c :

/ *
 * एक नाम को डिवाइस नंबर में बदलें। हम निम्नलिखित वेरिएंट स्वीकार करते हैं:
 *
 * 1) हेक्साडेसिमल में डिवाइस नंबर स्वयं का प्रतिनिधित्व करता है
 * 2) / dev / nfs Root_NFS (0xff) का प्रतिनिधित्व करता है
 * 3) / dev / <disk_name> डिस्क की डिवाइस संख्या का प्रतिनिधित्व करता है
 * 4) / dev / <disk_name> <दशमलव> डिवाइस नंबर का प्रतिनिधित्व करता है
 * विभाजन की - डिस्क की डिवाइस संख्या और विभाजन की संख्या
 * 5) / देव / <disk_name> p <दशमलव> - जैसा कि ऊपर, वैसा ही है
 * विभाजन के समय डिस्क का नाम एक अंक पर समाप्त होता है।
 * 6) PARTUUID = 00112233-4455-6677-8899- AABBCCDDEFFF का
 * यदि विभाजन तालिका इसे उपलब्ध कराती है तो विभाजन की अद्वितीय आईडी।
 * UUID या तो एक EFI / GPT UUID हो सकता है, या एक MSDOS को संदर्भित कर सकता है
 * SSSSSSSS-PP प्रारूप का उपयोग कर विभाजन, जहां SSSSSSSS एक शून्य है-
 * 32-बिट "NT डिस्क हस्ताक्षर", और पीपी का हेक्स प्रतिनिधित्व भरा
 * 1-आधारित विभाजन संख्या का शून्य-भरा हेक्स प्रतिनिधित्व है।
 * 7) PARTUUID = <UUID> / PARTNROFF = <int> के संबंध में विभाजन का चयन करने के लिए
 * एक ज्ञात अद्वितीय आईडी के साथ एक विभाजन।
 *
 * यदि नाम ऊपर की श्रेणियों में नहीं आता है, तो हम लौटते हैं (0,0)।
 * ब्लॉक_क्लास का उपयोग यह जांचने के लिए किया जाता है कि क्या कोई डिस्क नाम है। अगर डिस्क
 * नाम में स्लैश होते हैं, डिवाइस का नाम उनके साथ बदल दिया गया है
 * बैंग्स।
 * /

अंत में अंतिम बिट कहता है कि यदि यह मूल्य नहीं समझ सकता है, तो यह वापस आ जाता है (0,0), इसलिए आपकी त्रुटि।


1
यह केवल आंशिक रूप से सही है। एक विभाजन यूयूआईडी फाइल सिस्टम के यूयूआईडी से पूरी तरह से अलग है, इसलिए PARTUUID=666c2eee-193d-42db-a490-4c444342bd4eकाम नहीं करता है। हालाँकि, मैं उपयोग करने में सक्षम था PARTUUID=SSSSSSSS-02(जहाँ SSSSSSSS NT डिस्क हस्ताक्षर त्रुटि संदेश से ठीक पहले दिखाया गया है)।
cjm

6
इसलिए मुझे लगता है कि असली जवाब यह है कि कर्नेल समर्थन नहीं करता है root=UUID, केवल root=PARTUUID। यदि आप एक फाइल सिस्टम UUID का उपयोग करना चाहते हैं, तो मुझे लगता है कि आपको एक initramfs की आवश्यकता है जो UUID द्वारा बढ़ते फाइल सिस्टम को संभाल सकता है।
cjm

@cjm मेरे बूब्स को grubबहुत ख़ुशी के साथ root=UUID
terdon

3
@terdon, मुझे यकीन है कि आपके पास एक initramfs या initrd होगा। (यह एक अलग फ़ाइल होने के बजाय आपके कर्नेल में जोड़ा जा सकता है।)
cjm

4

यह 5 साल पुराना धागा है। लेकिन फिर भी यह पूरी तरह से उत्तर नहीं दिया गया है। एक छोटा सा उदाहरण याद आ रहा है। यह रहा:

इस उदाहरण में:

/dev/sda3 = /
/dev/sda2 = swap

... एक GPT विभाजन का उपयोग करना। MBR (डॉस विभाजन) के साथ PARTUUID छोटे हैं, लेकिन प्रक्रिया समान है ...

PARTUUID को ब्लकिड के साथ प्राप्त करें:

blkid -s PARTUUID -o value /dev/sda3 # root
77fd7830-faa2-4e99-a48b-337ad9eded28
blkid -s PARTUUID -o value /dev/sda2 # swap
5b63167a-6fd2-4e72-948c-90832372956c

/boot/grub/grub.cfg:

search --no-floppy --part-uuid --set=root 77fd7830-faa2-4e99-a48b-337ad9eded28

menuentry "GNU/Linux, KERNEL 4.12.7-lfs-8.1" {
  linux /boot/vmlinuz-4.12.7-lfs-8.1 root=PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 net.ifnames=0 ipv6.disable=1 ro rootwait rootfstype=ext4
}

/ Etc / fstab /:

PARTUUID=77fd7830-faa2-4e99-a48b-337ad9eded28 / ext4 noatime,nodiratime,errors=remount-ro 0 1
PARTUUID=5b63167a-6fd2-4e72-948c-90832372956c swap swap pri=1 0 0

यह lfs8.1 (कर्नेल 4.12.7) के साथ काम करने के लिए जाना जाता है, लेकिन मुझे लगता है कि इसे अधिकांश अन्य कर्नेल के साथ भी काम करना चाहिए (पुराने और नए ...)

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