Tại sao tôi không thể chỉ định fs gốc của mình bằng UUID?


29

Hệ thống của tôi khởi động tốt với điều này trong cấu hình GRUB 2 của tôi:

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

Nhưng nếu tôi thay thế /dev/sda2bằng UUID tương ứng:

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

sau đó nó bị lỗi trong khi khởi động:

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

UUID có vẻ đúng:

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

Tại sao nó không hoạt động? Có phải vì tôi không sử dụng initramfs?

Đây là x86_64 Gentoo Linux với kernel 3.10.7. Tôi đang sử dụng bảng phân vùng MBR trên sdavà bảng phân vùng GUID trên sdb.


unknown-block(0,0)trông giống như một thiết bị GRUB đối với tôi. Tôi đoán là GRUB không thể sử dụng UUID đó vì một số lý do.
strugee

@strugee, tôi không nghĩ GRUB cố gắng diễn giải dòng lệnh kernel. (GRUB đang tải kernel từ sda1. Tôi không hiển thị phần đó của cấu hình.)
cjm

Tôi có khuynh hướng đồng ý. Tuy nhiên, điều kỳ lạ là thiết bị này trông giống như một thiết bị GRUB thay vì thiết bị UNIX.
strugee

@Gilles, câu hỏi không phải là về GRUB. Đó chỉ là bộ tải khởi động mà tôi đang sử dụng. Đó là một câu hỏi nhân Linux.
cjm

Đây cũng không phải là một câu hỏi về kernel - đây là một câu hỏi về init.
mikeerv

Câu trả lời:


22

Chỉ cần làm rõ UUIDs là cách đáng tin cậy duy nhất để kernel xác định ổ cứng. Có hai loại: UUID, được lưu trữ trong hệ thống tệp và không có sẵn cho kernel khi khởi động và PARTUUID, được lưu trữ trong bảng phân vùng và IS có sẵn khi khởi động. Vì vậy, bạn phải sử dụng

root=PARTUUID=SSSSSSSS-PP

như /dev/sd??có thể thay đổi với các thiết bị cắm / rút phích cắm.

Đừng quên viết hoa số thập lục phân SSSSSSSS-PPbạn nhận được blkid!

Càng dễ sử dụng

root=LABEL=
root=UUID=

chỉ hoạt động với một initramfstìm nạp các định danh này.

Vì vậy, nếu bạn sử dụng không trống initramfs, bạn có thể có cả ba! Với một sản phẩm nào initramfs, bạn chỉ có PARTUUID.


Tâm trí để giải thích ai đang sử dụng boot = -argument rồi? Tôi vừa sử dụng dòng này cho bản cài đặt Archlinuxarm không có initrd và tôi không thể sử dụng boot = LABEL hay boot = UUID.
ineiti

1
Bạn nói đúng - Tôi đã sửa lỗi boot thành root, xin lỗi! Hy vọng nó có ý nghĩa hơn bây giờ.
ineiti

1
Sự hiểu biết của tôi (sau một ngày trên các diễn đàn của archlinuxarm) là không có initrd (hoặc initramfs, nhưng kernel.org/doc/Documentation/kernel-parameter.txt gọi nó là initrd) trên Archlinuxarm. Trên Ubuntu và như vậy tôi đưa ra một con trỏ tới initrd, nhưng (theo cách hiểu của tôi) không phải trên Archlinuxarm.
ineiti

1
Archlinuxarm thảo luận về NO initrd: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti

1
Hãy thử liên kết này . Và này một. Và có lẽ đây là một. initramfs không phải là hình ảnh initramfs - thường là một kho lưu trữ nén chứa một cpiokho lưu trữ mà kernel giải nén để /khởi động. initramfs là một hệ thống tập tin - nó luôn /được gắn kết đầu tiên và từ đó gọi các kernel init. Bạn có thể biên dịch nội dung vào kernel hoặc giải nén chúng khi khởi động - đó là hai tùy chọn.
mikeerv

16

Tham số bạn phải vượt qua để khởi động từ UUID là PARTUUID. Vì vậy, nó nên được root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

Tài liệu giải thích lý do tại sao nó trở lại với unknown-block(0,0):

kernel-tham số.txt :

    root = [KNL] Hệ thống tập tin gốc
            Xem bình luận name_to_dev_t trong init / do_mounts.c.

init / do_mounts.c :

/ *
 * Chuyển đổi tên thành số thiết bị. Chúng tôi chấp nhận các biến thể sau:
 *
 * 1) số thiết bị ở dạng thập lục phân thể hiện chính nó
 * 2) / dev / nfs đại diện cho Root_NFS (0xff)
 * 3) / dev / <drive_name> thể hiện số lượng thiết bị của đĩa
 * 4) / dev / <drive_name> <binary> thể hiện số thiết bị
 * của phân vùng - số thiết bị của đĩa cộng với số phân vùng
 * 5) / dev / <drive_name> p <binary> - giống như trên, hình thức đó là
 * được sử dụng khi tên đĩa của phân vùng kết thúc trên một chữ số.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF đại diện cho
 * id duy nhất của một phân vùng nếu bảng phân vùng cung cấp nó.
 * UUID có thể là UFI EFI / GPT hoặc tham chiếu đến MSDOS
 * phân vùng sử dụng định dạng SSSSSSSS-PP, trong đó SSSSSSSS là zero-
 * biểu diễn hex đầy của "chữ ký đĩa NT" 32 bit và PP
 * là biểu diễn hex chứa đầy số 0 của số phân vùng dựa trên 1.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int> để chọn phân vùng liên quan đến
 * một phân vùng với một id duy nhất được biết đến.
 *
 * Nếu tên không thuộc các loại trên, chúng tôi sẽ trả về (0,0).
 * block_group được sử dụng để kiểm tra xem có thứ gì đó là tên đĩa không. Nếu đĩa
 * tên chứa dấu gạch chéo, tên thiết bị đã được thay thế bằng
 * bangs.
 * /

Bit cuối cùng ở cuối nói rằng nếu nó không thể hiểu giá trị, nó sẽ trả về (0,0), do đó là lỗi của bạn.


1
Điều này chỉ đúng một phần. UUID phân vùng hoàn toàn khác với UUID của hệ thống tệp, do PARTUUID=666c2eee-193d-42db-a490-4c444342bd4eđó không hoạt động. Tuy nhiên, tôi đã có thể sử dụng PARTUUID=SSSSSSSS-02(trong đó SSSSSSSS là chữ ký đĩa NT hiển thị ngay trước thông báo lỗi).
cjm

6
Vì vậy, tôi đoán rằng câu trả lời thực sự là hạt nhân không hỗ trợ root=UUID, chỉ root=PARTUUID. Nếu bạn muốn sử dụng UUID hệ thống tập tin, tôi đoán bạn cần một initramfs có thể xử lý việc gắn hệ thống tập tin bằng UUID.
cjm

@cjm grubđôi bốt của tôi khá vui vẻ với root=UUID.
terdon

3
@terdon, tôi cá là bạn có initramfs hoặc initrd. (Nó có thể được liên kết vào kernel của bạn thay vì là một tệp riêng biệt.)
cjm

4

Đây là một chủ đề 5 năm tuổi. Nhưng vẫn là imho không được trả lời đầy đủ. Có một ví dụ nhỏ bị thiếu. Đây là:

Trong ví dụ này:

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

... sử dụng phân vùng GPT. Với MBR (phân vùng dos), các PHẦN MỀM ngắn hơn nhưng quy trình thì giống nhau ...

nhận được PHẦN MỀM với 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

Điều này được biết đến với CÔNG VIỆC với lfs8.1 (kernel 4.12.7) Nhưng tôi nghĩ nó cũng nên hoạt động với hầu hết các hạt nhân khác (người cũ và người mới ...)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.