Почему я не могу указать свою корневую файловую систему с помощью 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?

Это x86_64 Gentoo Linux с ядром 3.10.7. Я использую таблицу разделов MBR на sdaи таблицу разделов GUID на sdb.

решение1

Просто для ясности UUIDs — единственный надежный способ для ядра идентифицировать жесткие диски. Существует два типа: UUID, который хранится в файловой системе и недоступен ядру во время загрузки, и PARTUUID, который хранится в таблице разделов и доступен во время загрузки. Поэтому вам нужно использовать

root=PARTUUID=SSSSSSSS-PP

так как /dev/sd??может меняться при подключении/отключении устройств.

Не забудьтекапитализироватьшестнадцатеричное число, SSSSSSSS-PPкоторое вы получаете из blkid!

Чем проще в использовании

root=LABEL=
root=UUID=

работать только с тем initramfs, который извлекает эти идентификаторы.

Итак, если вы используете непустой initramfs, вы можете иметь все три! С пустым initramfsу вас есть только PARTUUID.

решение2

Параметр, который нужно передать для загрузки с 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/<disk_name> представляет номер устройства диска
 * 4) /dev/<disk_name><decimal> представляет номер устройства
 * раздела - номер устройства диска плюс номер раздела
 * 5) /dev/<disk_name>p<decimal> - то же, что и выше, эта форма
 * используется, когда имя диска, разбитого на разделы, заканчивается на цифру.
 * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF, представляющий
 * уникальный идентификатор раздела, если он указан в таблице разделов.
 * UUID может быть либо EFI/GPT UUID, либо ссылаться на MSDOS
 * раздел с использованием формата SSSSSSSS-PP, где SSSSSSSS — это нуль-
 * заполненное шестнадцатеричное представление 32-битной «подписи диска NT» и PP
 * — это шестнадцатеричное представление номера раздела, начинающегося с 1, заполненное нулями.
 * 7) PARTUUID=<UUID>/PARTNROFF=<int> для выбора раздела относительно
 * раздел с известным уникальным идентификатором.
 *
 * Если имя не попадает ни в одну из категорий выше, мы возвращаем (0,0).
 * block_class используется для проверки, является ли что-то именем диска. Если диск
 * имя содержит слеши, в имени устройства они заменены на
 * челка.
 */

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

решение3

Этой теме уже 5 лет. Но, имхо, она все еще не полностью решена. Не хватает небольшого примера. Вот он:

В этом примере:

/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), но я думаю, что это должно работать и с большинством других ядер (старых и новых...)

Связанный контент