Чому я не можу вказати свій root fs за допомогою UUID?


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?

Це x86_64 Gentoo Linux з ядром 3.10.7. Я використовую таблицю розділів MBR sdaта таблицю розділів GUID sdb.


unknown-block(0,0)мені схоже на пристрій GRUB. я гадаю, що GRUB чомусь не може використовувати цей UUID.
strugee

@strugee, я не думаю, що GRUB взагалі намагається інтерпретувати командний рядок ядра. (GRUB завантажує ядро ​​з sda1. Я не показав цю частину конфігурації.)
cjm

Я схильний погодитися. дивно, але пристрій виглядає як пристрій GRUB замість пристрою UNIX.
strugee

@Gilles, питання не про GRUB. Це просто буває завантажувач, який я використовую. Це питання ядра Linux.
cjm

Це не питання про ядро ​​- це питання init.
mikeserv

Відповіді:


22

Просто для з'ясування UUIDs - це єдиний надійний спосіб ядра для ідентифікації жорстких дисків. Існує два типи: UUID, який зберігається у файловій системі та недоступний для ядра під час завантаження, та PARTUUID, який зберігається в таблиці розділів та IS, доступний під час завантаження. Тож вам доведеться користуватися

root=PARTUUID=SSSSSSSS-PP

як це /dev/sd??можна змінити з підключеними / відключеними пристроями.

Не забувайте використовувати великі шістнадцяткові цифри, які SSSSSSSS-PPви отримуєте blkid!

Чим простіше у використанні

root=LABEL=
root=UUID=

працювати лише з тим, initramfsхто отримує ці ідентифікатори.

Отже, якщо ви використовуєте не порожній initramfs, ви можете мати усі три! З порожнім initramfs, у вас тільки PARTUUID.


Зрозумійте, хто тоді використовує boot = -argument? Я просто використав цей рядок для установки Archlinuxarm, яка не має initrd, і де я не можу використовувати boot = LABEL niti boot = UUID.
ineiti

1
Ви маєте рацію - я виправив завантаження до root, вибачте! Сподіваюсь, зараз це має більше сенсу.
ineiti

1
Моє розуміння (після одного дня на форумах archlinuxarm) полягає в тому, що в Archlinuxarm немає initrd (або initramfs, але kernel.org/doc/Documentation/kernel-parameters.txt називає його initrd). На Ubuntu і подібних я даю вказівник на initrd, але (наскільки я розумію) не на Archlinuxarm.
ineiti

1
Archlinuxarm обговорення NO INITRD: 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):

ядро-параметри.txt :

    root = [KNL] коренева файлова система
            Дивіться коментар name_to_dev_t в init / do_mounts.c.

init / do_mounts.c :

/ *
 * Перетворення імені в номер пристрою. Ми приймаємо такі варіанти:
 *
 * 1) номер пристрою в шістнадцятковій формі представляє себе
 * 2) / dev / nfs представляє Root_NFS (0xff)
 * 3) / dev / <ім'я_диска> представляє номер пристрою диска
 * 4) / dev / <ім'я_диска> <децимальний> представляє номер пристрою
 * of partition - номер пристрою диска плюс номер розділу
 * 5) / dev / <ім'я_дідсказка> p <децимальний> - те саме, що вище, така форма є
 * використовується, коли назва диска розділеного диска закінчується цифрою.
 * 6) PARTUUID = 00112233-4455-6677-8899-AABBCCDDEEFF, що представляє
 * унікальний ідентифікатор розділу, якщо його надає таблиця розділів.
 * UUID може бути або UIID EFI / GPT, або посилатися на MSDOS
 * розділ, використовуючи формат SSSSSSSS-PP, де SSSSSSSS - нульовий-
 * заповнене шістнадцяткове представлення 32-розрядного "підпису NT диска" та PP
 * - це заповнене нулем шістнадцяткове представлення номера на основі 1 розділу.
 * 7) PARTUUID = <UUID> / PARTNROFF = <int>, щоб вибрати розділ стосовно
 * розділ з відомим унікальним ідентифікатором.
 *
 * Якщо ім'я не належить до вищезазначених категорій, повертаємось (0,0).
 * block_class використовується для перевірки, чи є щось назвою диска. Якщо диск
 * ім'я містить косої риси, ім'я пристрою замінено на
 * чубчик.
 * /

Останній біт наприкінці говорить, що якщо він не може зрозуміти значення, він повертається (0,0), отже, і ваша помилка.


1
Це лише частково правильно. UUID розділу не зовсім відрізняється від UUID файлової системи, тому PARTUUID=666c2eee-193d-42db-a490-4c444342bd4eне працює. Однак мені вдалося використати PARTUUID=SSSSSSSS-02(де SSSSSSSS - це підпис NT-диска, показаний перед повідомленням про помилку).
cjm

6
Тому я здогадуюсь, що справжня відповідь полягає в тому, що ядро ​​не підтримує root=UUIDлише root=PARTUUID. Якщо ви хочете використовувати файлову систему UUID, я думаю, вам потрібна initramfs, яка може обробляти монтаж файлових систем UUID.
cjm

@cjm мої grubчоботи цілком задоволено root=UUID.
тердон

3
@terdon, я думаю, у вас є initramfs або initrd. (Це може бути пов'язано з вашим ядром, а не окремим файлом.)
cjm

4

Це 5-річна нитка. Але все ще на це не повністю відповіли. Немає невеликого прикладу. Ось:

У цьому прикладі:

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

... за допомогою розділу GPT. З MBR (дос-розділ) 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), але я думаю, що він повинен працювати і з більшістю інших ядер (старші та новіші ...)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.