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=UUID것 root=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.