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" 

왜 작동하지 않습니까? initramfs를 사용하지 않기 때문입니까?

커널 3.10.7이 설치된 x86_64 젠투 리눅스입니다. 에 MBR 파티션 테이블을 사용 sda하고에 GUID 파티션 테이블을 사용하고 sdb있습니다.


unknown-block(0,0)GRUB 장치처럼 보입니다. 내 생각에 GRUB은 어떤 이유로 UUID를 사용할 수 없습니다.
strugee

@strugee, GRUB이 커널 명령 줄을 전혀 해석하려고 시도하지 않는다고 생각합니다. (GRUB은에서 커널을로드하고 있습니다 sda1. 구성 부분을 보여주지 않았습니다.)
cjm

나는 동의하는 경향이있다. 그러나 장치가 UNIX 장치 대신 GRUB 장치처럼 보이는 것이 이상합니다.
strugee

@Gilles, GRUB에 관한 질문은 아닙니다. 그건 내가 사용하는 부트 로더 일뿐입니다. Linux 커널 질문입니다.
cjm 2009 년

이것은 커널에 대한 질문이 아닙니다. 이것은 질문에 대한 것 init입니다.
mikeserv

답변:


22

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

root=PARTUUID=SSSSSSSS-PP

같은 /dev/sd??장치를 변경할 수는 연결 / 분리.

잊지 말고 투자 16 진수 SSSSSSSS-PP당신이에서 얻을를 blkid!

사용하기 쉬움

root=LABEL=
root=UUID=

initramfs이 식별자를 가져 오는와 만 작동 합니다.

따라서 비어 있지 않은을 사용하면 initramfs세 가지를 모두 가질 수 있습니다! 비어 initramfs있으면 PARTUUID.


그렇다면 누가 boot = -argument를 사용하는지 설명 할 수 있습니까? initrd가없는 archlinuxarm 설치에 boot = LABEL이나 boot = UUID를 사용할 수없는 곳에이 라인을 사용했습니다.
ineiti

1
네 말이 맞아-나는 부팅을 루트로 수정했다. 죄송합니다! 더 이해가 되길 바랍니다.
ineiti

1
Archlinuxarm 포럼에서 하루를 보낸 후 나의 이해는 Archlinuxarm에 initrd (또는 initramfs이지만 kernel.org/doc/Documentation/kernel-parameters.txt 는 initrd라고 함)가 없다는 것입니다 . 우분투와 그와 같은 것에 대해서는 initrd에 대한 포인터를 제공하지만 Archlinuxarm에는 없습니다 (내 이해에 관해서는).
ineiti

1
NO initrd에 관한 Archlinuxarm 토론 : archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
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] 루트 파일 시스템
            init / do_mounts.c의 name_to_dev_t 주석을 참조하십시오.

init / 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-PP 형식을 사용하는 파티션. 여기서 SSSSSSSS는 0입니다.
 * 32 비트 "NT 디스크 서명"으로 채워진 16 진 표현 및 PP
 *는 1 기반 파티션 번호의 0으로 채워진 16 진 표현입니다.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int>와 관련하여 파티션을 선택합니다
 * 알려진 고유 ID를 가진 파티션.
 *
 * 이름이 위의 범주에 속하지 않으면 (0,0)을 반환합니다.
 * block_class는 디스크 이름인지 확인하는 데 사용됩니다. 디스크가
 * 이름에는 슬래시가 포함되어 있으며 장치 이름은 슬래시로 대체되었습니다.
 앞머리.
 * /

마지막 부분은 값을 이해할 수 (0,0)없으면를 반환 하므로 오류가 발생 한다고 말합니다 .


1
이것은 부분적으로 만 정확합니다. 파티션 UUID는 파일 시스템의 UUID와 완전히 다르므로 PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e작동하지 않습니다. 그러나 PARTUUID=SSSSSSSS-02SSSSSSSS는 오류 메시지 바로 앞에 표시된 NT 디스크 서명입니다.
cjm

6
따라서 정답은 커널이 지원하지 않는다는 root=UUIDroot=PARTUUID입니다. 파일 시스템 UUID를 사용하려면 UUID로 파일 시스템 마운트를 처리 할 수있는 initramfs가 필요하다고 생각합니다.
cjm

@cjm 내 grub부츠와 함께 아주 행복합니다 root=UUID.
terdon

3
@ terdon, 나는 당신이 initramfs 또는 initrd를 가지고 내기합니다. (별도의 파일이 아닌 커널에 연결될 수 있습니다.)
cjm

4

이것은 5 살짜리 실입니다. 그러나 여전히 완전한 답이 아닙니다. 몇 가지 빠진 예가 있습니다. 여기있어:

이 예에서 :

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

... GPT 파티션을 사용합니다. MBR (dos partition)을 사용하면 PARTUUID가 짧아 지지만 절차는 동일합니다 ...

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.