LINUX.ORG.RU

dracut не создаёт устройства /dev/disk/by-label/…

 , ,


0

1

Пилю генту на внешний жестак. Собрал ведро, initramfs. Единственной целью для initramfs пока является возможность монтировать rootfs по LABEL, а единственным внесением в конфиг dracut было

omit_dracutmodules+="usrmount kernel-modules i18n"
Слизанное с десктопа, где всё прекрасно работает.

dracut компилирует initramfs (заметьте udev-rules в выхлопе), но при загрузке initramfs не может загрузить ядро

dracut Warning: Could not boot.
dracut Warning: /dev/disk/by-label/t_root does not exist
dracut Warning: /dev/disk/by-label/t_root does not exist

initramfs сам по себе отрабатывает, а вот как раз после строчек

Decompressing Linux... Parsing ELF... done.
Booting the kernel.


Наступает пауза в несколько секунд и диск отключается сам собой. Когда initramfs понимает, что ядра ждать бесполезно, оно выплёвывает вот эти ошибки, что были выше и вываливается в dash, где папки /dev/disk нет в принципе. Но непонятно — то ли её вообще не было, то ли она пропала, когда отключился диск.

ЧСХ диск сам никогда не отключается, а тут — стопроцентно. Ещё меня настораживает первое предупреждение в выхлопе dracut (хотя оно вроде не должно ничего ломать, но мало ли), на десктопе оно не появляется.

Ведро 3.9.11-geek, i686-generic.

Deleted

А вас не смущают строки:

Skipping program /lib/udev/... as it cannot be found and is flagged to be optional
Удостоверьтесь есть ли вообще что-либо в /lib/udev.

mdev в initramfs есть ? devtmpfs включена в ядре?

Используйте genkenel:

genkernel ramdisk --no-ramdisk-modules --disklabel

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)

fargred добрый совет - попробуй собрать initramfs самостоятельно и потребность в dracut-ах пропадет за ненадобностью и свой скилл прокачаешь.

Инфа доступна во первых самая подробная по Initramfs из старой неофициальной wiki во вторых Early Userspace Mounting из новой wiki после того как их осилишь вот тебе мой initramfs выполненный по их мотивам и как им пользоваться в общих чертах описано в README.md.

initramfs умеет: рэйды, lvm2, cryptsetup, проверять ext4, добавлять в initramfs любые {динамически,статически} собранные бинарники и потенциально вообще все что тебе угодно но только после того как ты сам исправишь под себя init.

init_6 ★★★★★
()
Ответ на: комментарий от partyzan

Никогда не понимал зачем initramfs

man thin client, man root over nfs, man lvm2, man installing gentoo on an encrypted root partition и даже если все это тебе нафиг не впало то даже просто любая фирмварь, не включенная непосредственно в само ядро, из initramfs грузится шустрее.

init_6 ★★★★★
()
Ответ на: комментарий от kostik87

Да, точно, спасибо, забыл про UUID. Просто никогда не пользовался, тем более в Gentoo

partyzan ★★★
()
Ответ на: комментарий от kostik87

А вас не смущают

Нет.

Удостоверьтесь есть ли вообще что-либо в /lib/udev.

# ls /lib/udev
ata_id
cdrom_id
rules.d
scsi_id

# ls /lib/udev/rules.d
50-firmware.rules
50-udev-default.rules
60-persistent-storage.rules
75-net-description.rules
80-drivers.rules
95-udev-late.rules

mdev в initramfs есть ?

А что это и где оно должно быть?

devtmpfs включена в ядре?

/usr/src/linux $ grep DEVTMP .config
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y

Используйте genkenel:

How about no?

Deleted
()
Ответ на: комментарий от Deleted

Да, самосборный initramfs это клёво, но мне пока лень.

Вот а меня именно лень и сподвигла на самосборный initramfs потому что со всеми этими dracut-ами, genkenel-ами и прочим дном просто лень разбираться.

init_6 ★★★★★
()
Ответ на: комментарий от Deleted

А что это и где оно должно быть?

Посмотрите это руководство: http://gentoo-en.vfose.ru/wiki/Initramfs . Ну и «погуглите», что это такое. Ну а по сути вариант udev для initramfs, отвечает за наполнение /dev в initramfs системе.

Попробуйте использовать genkernel, я уже указал как. Ну либо можете скопировать initramfs, созданный с помощью dracut, с системы, где у вас всё работает, распаковать его, положить в него модули ядра устанавливаемой системы и запаковать его.

kostik87 ★★★★★
()

Тред не читал, но у меня была трабла, когда я ставил дебиан на внешний диск, что надо было делать задержку, перед монтированием корневой ФС, иначе он не видел диска. Возможно у тебя эта же трабла. К сожалению опцию ядра сейчас не вспомню

xorik ★★★★★
()
Ответ на: комментарий от xorik

Хорошая идея, только это не опция (параметр) ядра, а параметр, который обрабатывая сценарий init в initramfs.

ТС, у genkernel этот параметр называется «scandelay=N», где N - число секунд ожидания, указывай его в параметрах, передаваемых ядру, как у dracut не знаю.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Посмотрите это руководство

Там или devtmpfs или mdev. devtmpfs уже есть.

Попробуйте использовать genkernel

No.

Ну либо можете скопировать initramfs, созданный с помощью dracut, с системы, где у вас всё работает, распаковать его

Я видимо очень криворукий, но у меня unlzma не распаковывает образ, и только утолщает его.

положить в него модули ядра устанавливаемой системы

Модули? Пока незачем.

Deleted
()
Ответ на: комментарий от xorik

Опция называется rootwait и у меня она есть. Она важна, но не на этом этапе, а на предыдущем, когда BIOS ищет диск (ещё до граба). А хотя стоп. Не-не, на этом. Это когда ядро прогрузилось, оно ждёт 30с появления рутовой партиции в /dev/ и тогда стартует.

Deleted
()
Последнее исправление: fargred (всего исправлений: 1)
Ответ на: комментарий от Deleted

No.

Почему ? Это связано с религиозными взглядами ? Зачем использовать dracut, если вы не можете его настроить и отказываться от рабочего genkernel? Не понимаю.

Я видимо очень криворукий, но у меня unlzma не распаковывает образ, и только утолщает его.

А вы уверены, что алгоритм сжатия initramfs lzma ? Попробуйте unxz:

unxz -c /boot/initramfs... | cpio -i -d -H newc
Ну либо в начале воспользуйтесь утилитой 'file' для определения метода сжатия.

Модули? Пока незачем.

Ну тогда просто используйте тот initramfs .

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Почему

Не нужно. Я потихоньку двигался в сторону самописного init, откатывание на genkernel было бы шагом назад.

А вы уверены, что алгоритм сжатия initramfs lzma

Да.

Попробуйте unxz:

$ unxz -c initramfs-3.9.11-geek-rescue.img | cpio -i -d -H newc
12592 blocks

Ну либо в начале воспользуйтесь утилитой 'file' для определения метода сжатия.

$ file initramfs-3.9.11-geek-rescue.img 
initramfs-3.9.11-geek-rescue.img: LZMA compressed data, streamed

Ну тогда просто используйте тот initramfs .

Мхмм… Попробую. Не думал, что он может подойти.

Deleted
()
Ответ на: комментарий от Deleted
$ unxz -c initramfs-3.9.11-geek-rescue.img | cpio -i -d -H newc
12592 blocks

Всё распаковано. Только вы распаковали initramfs в текущую директорию. К тому же распаковывать нужно с правами root, да и запаковывать тоже.

Не думал, что он может подойти.

Ну а если подумать, если вам модули ядра в initramfs не нужны, то что там ещё может отличаться ? Да ничего. К тому же, если вы не используете RAID или шифрование корневого раздела.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Всё распаковано.

О, правда. Странно, это ж синонимы к одному бинарнику.

Только вы распаковали initramfs в текущую директорию.

Ну и ок.

К тому же распаковывать нужно с правами root, да и запаковывать тоже.

Не вижу проблем.

то что там ещё может отличаться

Архитектура, на которой ramfs собран?

Deleted
()
Ответ на: комментарий от Deleted

Не вижу проблем.

Если распаковывать и запаковывать под пользователем, то слетят права на файлы.

Архитектура, на которой ramfs собран?

Там из бианрников в самом простом случае только busybox, а все остальные «бинарники» ссылки к нему. А остальное это init сценарий, конфиги, прочие файлы для него. Если используете LVM, то может быть так же статически слинковынный бинарник lvm с некоторым количеством символичесих ссылок на него:

vgcfgbackup  -> lvm  
vgconvert  -> lvm
vgextend  -> lvm
vgmknodes  -> lvm
vgs  -> lvm
vgcfgrestore  -> lvm
vgcreate  -> lvm
vgimport  -> lvm
vgreduce  -> lvm
vgscan  -> lvm
vgchange  -> lvm
vgdisplay  -> lvm
...

Если ядро 64 битное и с поддержкой выполнения 32 битных бинарников, то без разницы какой архитектуры ( x86 || x86_64 ) бинариники в initramfs, они всё равно статические. Если ядро 32 битное, а бинарники 64 битные, то из системы можно скопировать статический бинарник busybox и lvm (должен быть собран с флагом static). Всё, можно запаковывать.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)
Ответ на: комментарий от partyzan

Никогда не понимал зачем initramfs

Есть мнение, что в некоторых условиях оно может ускорить загрузку.

anonymous
()
Ответ на: комментарий от kostik87

Собссно при использовании initrd с десктопа (x86_64) ядро стартует, но не может запустить init:

Failed to execute /init
…
Kernel panic — not syncing: No init found.  Try passing init= option to kernel. See Linux Documentaion/init.txt for guidance.
init=/sbin/init также не катит.

Если ядро 64 битное

Ведро 3.9.11-geek, i686-generic.
kernel /vmlinuz-3.9.11-geek-rescue32

Вроде можно было догадаться.

Deleted
()
Ответ на: комментарий от init_6

Ещё раз спасибо, я всё прочитал и оно оказалось проще, чем я думал.
Хотел спросить, а почему ash? В бизибоксе есть sh, да и bash весит килобайт 170 с хвостиком, так что дело не в размере. Так почему ash?
Если завернуть ядро и initrd в один образ, он получится одним cpio-архивом, который сначала распаковывается, из него запускается initrd, который пинает ядро, или же ядро пинает initrd и потом в него грузится?
Пробовал собирать busybox через menuconfig? А то я б сетевые шняги для дома повыкидывал.
У тебя init в шебанге запускает /bin/bash, которого нет. Откуда он берётся?

Deleted
()
Ответ на: комментарий от Deleted

init=/sbin/init также не катит.

Корень у вас на чём ?

Вроде можно было догадаться.

Я описал возможные варианты, а не рассматривал ваш конкретный. Если ваша цель найти ошибку в моём сообщении, то нет, у вас не получилось.

kostik87 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.