UUID를 사용하여 루트 파일 시스템을 지정할 수 없는 이유는 무엇입니까?

UUID를 사용하여 루트 파일 시스템을 지정할 수 없는 이유는 무엇입니까?

내 시스템은 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를 사용하지 않기 때문입니까?

이것은 커널 3.10.7을 사용하는 x86_64 Gentoo Linux입니다. 내 컴퓨터에서는 MBR 파티션 테이블을 사용 sda하고 내 컴퓨터에서는 GUID 파티션 테이블을 사용합니다 sdb.

답변1

명확히 하자면 UUID커널이 하드 드라이브를 식별하는 신뢰할 수 있는 유일한 방법입니다. 두 가지 유형이 있습니다. 파일 시스템에 저장되고 부팅 시 커널에서 사용할 수 없는 UUID와 파티션 테이블에 저장되고 부팅 시 사용할 수 있는 PARTUUID입니다. 그래서 당신은 사용해야합니다

root=PARTUUID=SSSSSSSS-PP

/dev/sd??장치가 연결/분리되면 변경 될 수 있습니다 .

잊지 마요수도SSSSSSSS-PP당신이 얻는 16진수 blkid!

사용하기 더 쉽다

root=LABEL=
root=UUID=

initramfs이러한 식별자를 검색하는 데에만 사용할 수 있습니다 .

따라서 null이 아닌 것을 사용하면 initramfs세 가지를 모두 가질 수 있습니다! 공허함으로 initramfs당신은 남게 됩니다 PARTUUID.

답변2

UUID에서 시작할 때 전달해야 하는 매개변수는 입니다 PARTUUID. 그래야 합니다 root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

문서에서는 다음을 반환하는 이유를 설명합니다 unknown-block(0,0).

커널 매개변수.txt:

    root= [KNL] 루트 파일 시스템
            init/do_mounts.c의 name_to_dev_t 주석을 참조하세요.

초기화/do_mounts.c:

/*
 * 이름을 장치 번호로 변환합니다. 우리는 다음과 같은 변형을 허용합니다:
 *
 * 1) 디바이스 번호는 16진수로 표시됩니다.
 * 2) /dev/nfs는 Root_NFS(0xff)를 나타냅니다.
 * 3) /dev/<disk_name>은 디스크의 장치 번호를 나타냅니다.
 * 4) /dev/<disk_name><decimal>은 장치 번호를 나타냅니다.
 * 파티션 - 디스크의 장치 번호에 파티션 번호를 더한 값
 * 5) /dev/<disk_name>p<decimal> - 위와 동일 형식
 * 파티션 디스크의 디스크 이름이 숫자로 끝나는 경우에 사용됩니다.
 * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF는 다음을 나타냅니다.
 * 파티션의 고유 ID입니다(파티션 테이블에서 제공한 경우).
 * UUID는 EFI/GPT UUID 또는 MSDOS일 수 있습니다.
 * 분할을 위해 SSSSSSSS가 0인 SSSSSSSS-PP 형식을 사용합니다.
 * 32비트 "NT 디스크 서명" 및 PP의 패딩된 16진수 표현
 *는 1부터 시작하는 파티션 번호를 0으로 채운 16진수 표현입니다.
 * 7) PARTUUID=<UUID>/PARTNROFF=<int> 다음과 관련된 파티션을 선택합니다.
 * 알려진 고유 ID를 가진 파티션.
 *
 * 이름이 위 카테고리에 속하지 않는 경우 (0,0)을 반환합니다.
 * block_class는 디스크 이름인지 확인하는 데 사용됩니다. 디스크의 경우
 * 이름에 슬래시가 포함되어 있으며 장치 이름은 슬래시로 대체되었습니다.
 *앞머리.
 */

마지막 비트는 값을 이해할 수 없으면 반환할 것이므로 (0,0)오류가 발생함을 의미합니다.

답변3

5년전 포스팅이네요. 그러나 IMHO는 아직 완전히 답변되지 않았습니다. 작은 예가 누락되었습니다. 여기있어:

이 예에서는 다음과 같습니다.

/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)에서 작동하는 것으로 알려져 있지만 대부분의 다른 커널에서도 작동해야 한다고 생각합니다(이전 및 최신...).

관련 정보