Portál AbcLinuxu, 11. května 2025 07:22
Zdravím,
stavím si takové malé liveCD na slackwaru, plánuji použít doupravené linux-live skripty ("upstream" verze je skutečně už hodně tlustá), nikdy jsem nepřišel na chuť initial ramdiskům, tak se to pokouším napravit teď.
Nakonfiguroval jsem si vlastní minimální kernel (1.1MB + 16MB moduly), filesystem drivery hodil (spolu s ATA/SATA/etc) jako moduly s tím, že je budu načítat v initrd (což je ta pointa, pokud jsem to dobře pochopil). Na samotné liveCD to asi potřeba nebude, ale rád bych byl schopen bootovat třeba z USB.
Tudíž jsem se pustil do - alespoň pro začátek - zkoušení initrd za pomoci qemu emulace. Velkou škodou je, že qemu neumí tak snadno "copy & paste", takže většinu z toho zde musím přepsat ručně (vím, jde to přes txt soubor a loop mount, ale z napůl funkčního busyboxu stěží).
lspci
mi jako IDE vyhodil
00:01.1 IDE interface: Intal Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
a po rychlém find
u v /lib/modules/
jsem usoudil, že piix.ko
modul bude ten pravý. Samotný filesystém je ext2, logicky jsem proto zkusil něco jako
mkinitrd -c -m ext2:piix -k 2.6.29.6 -o /boot/custom/initrd.gz
moduly byly přidány, lilo proběhlo úspěšně a já restartoval.
Po rebootu na nový kernel na mě čekal můj milý ash shell a busybox:
mount: mounting /dev/hda1 on /mnt failed: No such device or address
Tento error nevidím poprvé, měl jsem s ním problémy na debianu, když jsem se pokoušel udělat raid1 dualboot přes lilo (automatické nabootování z 2. disku, pokud je první kaput, bez diskety), nepamatuji si, jak jsem to tehdy vyřešil, ale příčina nalezena nebyla.
Trochu jsem se rozhlížel a vypadá to, že tenhle initrd používá mdev -s
na vytvoření blokových zařízení v /dev/
. Ten pravděpodobně prohledává /sys/block/
a vytváří zařízení podle toho, což je pěkná věc, dala by se použít jako odlehčená verze udevu na ostrém systému (/proc/sys/kernel/hotplug
), nejprve jsem myslel, že /dev/hda (3,0)
a /dev/hda1 (3,1)
má na svědomí on, ale vypadá to, že tyto zařízení tam nacpal už slackwarácký mkinitrd
("init" - který je použit místo linuxrc - je nevytváří a mdev také ne).
Příčina toho všeho je asi v neexistujícím hda/hda1 v /sys/block/
, resp. /sys/devices/virtual/block/
, v /sys/bus/ide/devices/
však obě zařízení jsou, po modprobe piix
při startu vypsal kernel dvě daná IDE zařízení (podle /sys/bus/ide/devices/*/model
jde o QEMU HARDDISK
a QEMU CD-ROM
, drivername
sedí - hda
a hdc
, modalias
je ide:m-disk
.
Nicméně ať se snažím sebevíc, kernel je prostě nedetekuje jako bloková zařízení (asi) a symlinky v /sys/block/
nevytvoří.
Stejnou chybovou hlášku (no such device or address) hází na předvytvořené /dev/hda
samozřejmě i jiné nástroje, jako hdparm
, cat
, apod. Zkusil jsem do initrd přidat další moduly, které by snad něco s IDE/ATA mohly mít společného, ale nic nepomohlo.
Tak se obracím na vás, je možné, že má chorá mysl něco triviálního zkonila, ale hledal jsem tady i na Googlu a o podobném problému se toho moc nepíše. Tutoriály o vytváření initrd jsou, vesměs typu "mkinitramfs -o /boot/initrd.gz 2.6.x.y
a je to hotovo", případně popisují tvorbu malého initial ramdisku ručně, bez modulů a mountování "skutečného" filesystému.
Tak jsem problém snad vyřešil. Byla to celkem nešťastná shoda více okolností - jednak jsem přesně nepochopil podstatu mdev z busyboxu, jednak "mkinitrd" ze Slackware nevytváří initrd, ale initramfs (tedy tmpfs), navíc tam cpe všechno tak nešikovně, ani modules.dep nevygeneruje / nepřekopíruje. To mělo za následek situaci, kdy qemu harddisk potřeboval "ide:m-disk", což je alias pro ide-disk, který je opět aliasem pro skutečný modul ide_gd_mod. To ale mdev díky chybějícímu modules.dep nemohl tušit a tak neudělal nic.
Ono by to až tak nevadilo, kdybych si tyto aliasy vygrepoval sám a přidal ide_gd_mod do initrd spolu s ext2 a piix. Totiž samotný ide_gd_mod toho moc neudělá, v tomto případě je potřeba i modul piix (což byla jedna z těch nepříjemných shod okolností, testoval jsem jednou samotný piix, pak samotný ide-disk, atp.).
Jsem rád, že mám tento případ za sebou, pro liveCD si stejně musím vytvořit initramfs "from scratch", tam by podobná situace neměla nastat.
... snad
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.