ทำไมฉันไม่สามารถระบุรูท fs ด้วย UUID ได้?


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" 

ทำไมมันไม่ทำงาน เป็นเพราะฉันไม่ได้ใช้ initramfs หรือไม่?

นี่คือ x86_64 Gentoo Linux พร้อมเคอร์เนล 3.10.7 ฉันใช้ตารางพาร์ทิชัน MBR บนsdaและตารางพาร์ทิชัน GUID sdbบน


unknown-block(0,0)ดูเหมือนว่าอุปกรณ์ GRUB สำหรับฉัน ฉันเดาว่าด้วงไม่สามารถใช้ UUID นั้นด้วยเหตุผลบางอย่าง
strugee

@strugee ฉันไม่คิดว่า GRUB พยายามตีความบรรทัดคำสั่งเคอร์เนลเลย (ด้วงโหลดเคอร์เนลจากsda1ฉันไม่ได้แสดงเป็นส่วนหนึ่งของการตั้งค่าที่..)
CJM

ฉันอยากจะเห็นด้วย มันแปลก แต่อุปกรณ์นั้นดูเหมือนอุปกรณ์ GRUB แทนที่จะเป็นอุปกรณ์ UNIX
strugee

@Gilles คำถามไม่ได้เกี่ยวกับด้วง นั่นเป็นเพียง bootloader ที่ฉันใช้ เป็นคำถามเคอร์เนล Linux
cjm

นี้ไม่ได้เป็นคำถามเกี่ยวกับเคอร์เนลทั้ง - initนี้เป็นคำถามเกี่ยวกับ
mikeserv

คำตอบ:


22

เพื่อชี้แจงUUIDs เป็นวิธีเดียวที่เชื่อถือได้สำหรับเคอร์เนลเพื่อระบุฮาร์ดไดรฟ์ มีสองประเภท: UUID ซึ่งถูกเก็บไว้ในระบบไฟล์และไม่สามารถใช้ได้กับเคอร์เนลในเวลาบูตและ PARTUUID ซึ่งถูกเก็บไว้ในตารางพาร์ติชันและ IS พร้อมใช้งานในเวลาบูต ดังนั้นคุณต้องใช้

root=PARTUUID=SSSSSSSS-PP

เป็น/dev/sd??การเปลี่ยนแปลงสามารถกับอุปกรณ์เสียบ / ถอดสายออก

อย่าลืมใช้ประโยชน์จากตัวเลขฐานสิบหกที่SSSSSSSS-PPคุณได้รับblkid!

ยิ่งใช้งานง่าย

root=LABEL=
root=UUID=

ทำงานเฉพาะกับตัวinitramfsดึงข้อมูลที่ระบุเหล่านี้

ดังนั้นถ้าคุณใช้แบบไม่ว่างเปล่าinitramfsคุณสามารถมีได้ทั้งสามแบบ! ด้วยที่ว่างเปล่าคุณจะมีเพียงinitramfsPARTUUID


คุณต้องการอธิบายว่าใครใช้บูท = -argument แล้วเหรอ? ฉันเพิ่งใช้บรรทัดนี้สำหรับการติดตั้ง Archlinuxarm ที่ไม่มี initrd และที่ฉันไม่สามารถใช้ boot = LABEL หรือ boot = UUID
ineiti

1
คุณพูดถูก - ฉันแก้ไขการบู๊ตเป็นรูทขอโทษด้วย! หวังว่ามันจะสมเหตุสมผลมากกว่านี้
ineiti

1
ความเข้าใจของฉัน (หลังจากหนึ่งวันในฟอรัมของ archlinuxarm) คือไม่มี initrd (หรือ initramfs แต่kernel.org/doc/Documentation/kernel-parameters.txtเรียกมันว่า initrd) บน Archlinuxarm ใน Ubuntu และเช่นนั้นฉันจะให้ตัวชี้ไปยัง initrd แต่ (ตามความเข้าใจของฉัน) ไม่ได้อยู่บน Archlinuxarm
ineiti

1
การสนทนาArchlinuxarm
ineiti

1
ลองนี้การเชื่อมโยง และนี้อย่างใดอย่างหนึ่ง และอาจนี้อย่างใดอย่างหนึ่ง initramfs ไม่ใช่อิมเมจ initramfs ซึ่งโดยปกติจะเป็นไฟล์บีบอัดที่เก็บถาวรซึ่งมีcpioไฟล์เก็บถาวรที่เคอร์เนลจะคลายการบีบอัด/เมื่อบูต initramfs เป็นระบบแฟ้ม - มันอยู่เสมอคนแรกที่ติดตั้งและมาจากไหนโทรเคอร์เนล/ initคุณสามารถคอมไพล์เนื้อหาลงในเคอร์เนลหรือแกะมันออกตอนบู๊ตซึ่งเป็นสองตัวเลือก
mikeserv

16

พารามิเตอร์ที่ต้องผ่านการบูตจาก UUID PARTUUIDเป็น root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4eดังนั้นมันควรจะเป็น

เอกสารอธิบายว่าทำไมมันกลับมาพร้อมกับunknown-block(0,0):

kernel-parameters.txt :

    root = [KNL] ระบบไฟล์รูท
            ดู name_to_dev_t แสดงความคิดเห็นใน init / do_mounts.c

init / do_mounts.c :

/ *
 * แปลงชื่อเป็นหมายเลขอุปกรณ์ เรายอมรับความหลากหลายดังต่อไปนี้:
 * * * *
 * 1) หมายเลขอุปกรณ์เป็นเลขฐานสิบหกแสดงถึงตัวมันเอง
 * 2) / dev / nfs แสดงถึง Root_NFS (0xff)
 * 3) / dev / <disk_name> หมายถึงหมายเลขอุปกรณ์ของดิสก์
 * 4) / dev / <disk_name> <decimal> หมายถึงหมายเลขอุปกรณ์
 * of partition - หมายเลขอุปกรณ์ของดิสก์บวกกับจำนวนพาร์ติชัน
 * 5) / dev / <disk_name> p <decimal> - เหมือนกับข้างบนฟอร์มนั้นคือ
 * ใช้เมื่อชื่อดิสก์ของดิสก์ที่แบ่งพาร์ติชันสิ้นสุดด้วยตัวเลข
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF ที่เป็นตัวแทนของ
 * id ที่ไม่ซ้ำกันของพาร์ติชันหากตารางพาร์ติชันระบุ
 * UUID อาจเป็น EFI / GPT UUID หรืออ้างถึง MSDOS
 * พาร์ติชันที่ใช้รูปแบบ SSSSSSSS-PP โดยที่ SSSSSSSS เป็นศูนย์ -
 * เป็นตัวแทนฐานสิบหกแบบเต็มของ "ลายเซ็นดิสก์ NT 32" และ PP
 * คือการแสดงเลขฐานสิบหกที่ไม่เติมศูนย์ของหมายเลขพาร์ติชันที่ใช้ 1
 * 7) PARTUUID = <UUID> / PARTNROFF = <int> เพื่อเลือกพาร์ติชันที่เกี่ยวข้องกับ
 * พาร์ติชันที่มีรหัสเฉพาะที่เป็นที่รู้จัก
 * * * *
 * หากชื่อไม่ได้อยู่ในหมวดหมู่ด้านบนเราจะส่งคืน (0,0)
 * block_class ใช้เพื่อตรวจสอบว่ามีชื่อดิสก์อยู่หรือไม่ ถ้าเป็นดิสก์
 * ชื่อมีเครื่องหมายทับชื่ออุปกรณ์ได้ถูกแทนที่ด้วย
 * เรียบ
 * /

บิตสุดท้ายในตอนท้ายบอกว่าถ้ามันไม่เข้าใจค่ามันจะกลับ(0,0)มาดังนั้นข้อผิดพลาดของคุณ


1
สิ่งนี้ถูกต้องเพียงบางส่วนเท่านั้น UUID ของพาร์ติชันนั้นแตกต่างจาก UUID ของระบบไฟล์อย่างสิ้นเชิงดังนั้นจึง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 (พาร์ติชัน DOS) ส่วนของ PARTUUID จะสั้นกว่า แต่ขั้นตอนเหมือนกัน ...

รับ PARTUUID ด้วย blkid:

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) แต่ฉันคิดว่ามันควรจะทำงานกับเมล็ดอื่น ๆ ส่วนใหญ่เช่นกัน (เก่าและใหม่กว่า ... )

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