Моя система нормально загружается со следующими настройками 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
Просто для ясности UUID
s — единственный надежный способ для ядра идентифицировать жесткие диски. Существует два типа: 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), но я думаю, что это должно работать и с большинством других ядер (старых и новых...)