Dlaczego nie mogę określić mojego katalogu głównego z UUID?

29

Mój system uruchamia się OK z tym w mojej konfiguracji GRUB 2:

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

Ale jeśli /dev/sda2zastąpię odpowiednim UUID:

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

następnie kończy się niepowodzeniem podczas rozruchu:

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

UUID wydaje się być poprawny:

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

Dlaczego to nie działa? Czy to dlatego, że nie używam initramfs?

To jest Gentoo Linux x86_64 z jądrem 3.10.7. Korzystam z tabeli partycji MBR sdai tabeli partycji GUID sdb.

cjm
źródło
unknown-block(0,0)dla mnie wygląda jak urządzenie GRUB. zgaduję, że GRUB z jakiegoś powodu nie może użyć tego UUID.
strugee
@strugee, nie sądzę, aby GRUB w ogóle próbował interpretować wiersz poleceń jądra. (GRUB ładuje jądro sda1. Nie
pokazałem
Jestem skłonny się zgodzić. dziwne jest to, że urządzenie wygląda jak urządzenie GRUB zamiast urządzenia UNIX.
strugee
@Gilles, pytanie nie dotyczy GRUB-a. Tak się składa, że ​​używam bootloadera. To pytanie o jądro Linuksa.
cjm
To też nie jest pytanie o jądro - to jest pytanie init.
mikeserv

Odpowiedzi:

22

Dla wyjaśnienia UUIDs to jedyny niezawodny sposób na identyfikację dysków twardych przez jądro. Istnieją dwa typy: UUID, który jest przechowywany w systemie plików i nie jest dostępny dla jądra podczas rozruchu, oraz PARTUUID, który jest przechowywany w tablicy partycji i jest dostępny w czasie uruchamiania. Więc musisz użyć

root=PARTUUID=SSSSSSSS-PP

co /dev/sd??może się zmienić w przypadku urządzeń podłączonych / odłączonych.

Nie zapomnij wykorzystać liczbę szesnastkową SSSSSSSS-PPotrzymasz od blkid!

Łatwiejszy w użyciu

root=LABEL=
root=UUID=

działa tylko z tym, initramfsktóry pobiera te identyfikatory.

Jeśli więc użyjesz niepustego initramfs, możesz mieć wszystkie trzy! Z pustym initramfsmasz tylko PARTUUID.

ineiti
źródło
Zastanów się zatem, kto używa boot = -argument? Właśnie użyłem tej linii do instalacji Archlinuxarm, która nie ma initrd i gdzie nie mogę użyć boot = LABEL ani boot = UUID.
ineiti
1
Masz rację - poprawiłem bootowanie do rootowania, przepraszam! Mam nadzieję, że teraz ma to większy sens.
ineiti,
1
Rozumiem (po jednym dniu na forach archlinuxarm), że nie ma initrd (lub initramfs, ale kernel.org/doc/Documentation/kernel-parameters.txt nazywa to initrd). Na Ubuntu i tym podobnych wskazuję initrd, ale (o ile mi wiadomo) nie na Archlinuxarm.
ineiti
1
Dyskusja Archlinuxarm o NO initrd: archlinuxarm.org/forum/viewtopic.php?f=23&t=6652
ineiti
1
Wypróbuj ten link. I ten jeden. A może ten . initramfs nie jest obrazem initramfs - zwykle jest to skompresowane archiwum zawierające cpioarchiwum, do którego jądro rozpakowuje się /przy starcie systemu. initramfs jest systemem plików - zawsze jest pierwszym /montowanym i skąd wywołuje jądro init. Możesz skompilować zawartość do jądra lub rozpakować ją przy starcie systemu - są to dwie opcje.
mikeserv
16

Parametrem, który musisz przekazać, aby uruchomić z UUID, jest PARTUUID. Tak powinno być root=PARTUUID=666c2eee-193d-42db-a490-4c444342bd4e.

Dokumentacja wyjaśnia, dlaczego wraca z unknown-block(0,0):

kernel-parameters.txt :

    root = [KNL] Główny system plików
            Patrz komentarz name_to_dev_t w init / do_mounts.c.

init / do_mounts.c :

/ *
 * Konwertuj nazwę na numer urządzenia. Akceptujemy następujące warianty:
 *
 * 1) numer urządzenia w systemie szesnastkowym reprezentuje siebie
 * 2) / dev / nfs oznacza Root_NFS (0xff)
 * 3) / dev / <nazwa_dysku> reprezentuje numer urządzenia na dysku
 * 4) / dev / <nazwa_dysku> <decimal> oznacza numer urządzenia
 * partycji - numer urządzenia dysku plus numer partycji
 * 5) / dev / <nazwa_dysku> p <decimal> - taka sama jak powyżej, ta forma to
 * używane, gdy nazwa dysku podzielonego na partycje kończy się cyfrą.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF reprezentujący
 * Unikalny identyfikator partycji, jeśli tabela partycji ją udostępnia.
 * UUID może być UUID EFI / GPT lub może odnosić się do MSDOS
 * partycja w formacie SSSSSSSS-PP, gdzie SSSSSSSS ma wartość zerową
 * wypełniona reprezentacja szesnastkowa 32-bitowej „sygnatury dysku NT” i PP
 * jest zerową liczbą szesnastkową reprezentacji numeru partycji opartego na 1.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int>, aby wybrać partycję w odniesieniu do
 * partycja o znanym unikalnym identyfikatorze.
 *
 * Jeśli nazwa nie mieści się w powyższych kategoriach, zwracamy (0,0).
 * block_class służy do sprawdzania, czy coś jest nazwą dysku. Jeśli dysk
 * nazwa zawiera ukośniki, nazwa urządzenia zastąpiła je
 * grzywka.
 * /

Ostatni bit na końcu mówi, że jeśli nie może zrozumieć wartości, zwraca (0,0), stąd błąd.

Patrick
źródło
1
Jest to tylko częściowo poprawne. UUID partycji jest zupełnie inny niż UUID systemu plików, więc PARTUUID=666c2eee-193d-42db-a490-4c444342bd4enie działa. Byłem jednak w stanie użyć PARTUUID=SSSSSSSS-02(gdzie SSSSSSSS jest sygnaturą dysku NT pokazaną tuż przed komunikatem o błędzie).
cjm
6
Sądzę więc, że prawdziwą odpowiedzią jest to, że jądro nie obsługuje root=UUID, tylko root=PARTUUID. Jeśli chcesz użyć UUID systemu plików, myślę, że potrzebujesz initramfs, który może obsługiwać montowanie systemów plików przez UUID.
cjm
@cjm moje grubbuty całkiem szczęśliwie root=UUID.
terdon
3
@terdon, założę się, że masz initramfs lub initrd. (Może być połączony z twoim jądrem zamiast być osobnym plikiem.)
cjm
4

To jest 5-letni wątek. Ale wciąż nie ma pełnej odpowiedzi. Brakuje małego przykładu. Oto on:

W tym przykładzie:

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

... za pomocą partycji GPT. W przypadku MBR (partycja dos) PARTUUID są krótsze, ale procedura jest taka sama ...

zdobądź PARTUUID z 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

Jest to znane z tego, że DZIAŁA z lfs8.1 (jądro 4.12.7). Ale myślę, że powinien on działać również z większością innych jąder (starszych i nowszych ...)

Michael HG Schmidt
źródło