LINUX.ORG.RU

Мучения с initrd или мучения initrd

 ,


0

2

Здравствуйте, коллеги!

Злая судьбина вынудила меня переделывать initrd. Я давно тому назад занимался подобным, но с тех пор все уверенно забыл.

Есть рабочий initrd в нем нужно перепахать скрипт /init под собственные нужды.

Давайте, что бы проще, будем считать, что /init я очистил, есть лишь:

#!/bin/bash
PATH=/bin:/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin
/bin/mount -t proc none /proc
/bin/mount -t sysfs none /sys
/bin/mount -t devtmpfs none /dev
/bin/bash

Да-да! /bin/bash уже есть. Впрочем… Наверное я его уберу. Останется /bin/sh из бизибокса.

Проблемма первая:

Как запустить все это в виртуалке (qemu), что бы initrd в теории видел один подсунутый ему диск?

Я сделал так:

qemu-system-x86_64 -enable-kvm -m 4096M -kernel vmlinuz -initrd /initrd-new.img -append 'ip=192.168.122.54' -hda /home/images/debian11-1.qcow2

В виртуалке все запускается, но перед приглашением bash выдает:

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

Собственно, это не мешает, но! На реальной машине, я получаю то же сообщение, только не работает клавиатурный ввод. На виртуалке клавиатурный ввод работает. Что нужно прописать, что бы клавиатурный ввод заработал в реальной машине?

Это сильно бы упростило разработку конечного скрипта.

Будем считать, что пока ковыряемся в виртуалке.

ls /dev/s*
/dev/snapshot

Дисков никаких нет! Как на реальной машине, у которой есть HDD, так и на виртуалке.

Что нужно сделать, что бы появились диски?

Запускаю udev, но диски не появляются. В обоих случаях.

Подскажите, куда копать дальше?


У тебя нет модулей ядра в initrd или есть, но они не подгружаются.

$ cat /boot/initrd-tree/load_kernel_modules
# This is a script used to load the kernel modules.
# To use it, chmod it 755, and then add the insmod
# lines needed to load your modules, like this:

modprobe -v jbd2
modprobe -v mbcache
modprobe -v ext4

Вот например у меня такой скрипт есть. Вообще если бы в kernel-generic вкомпилили хотя бы ext4, мне был бы не нужен initrd вообще.

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

Скорее всего вы правы.

Я очень слабо разбираюсь в модулях.

Имею очень слабое представление какие и для чего нужны.

Поковыряв inird от установленного Debian 11, я обнаружил таки диски, после запуска udev и небольшого шаманства с udevadm.

Вот только в нужном мне initrd от Altlinux 8 SP, те же действия не привели ни к какому результату. Дисков как не было так и нет.

Вообще, насколько я понимаю, udev не обязателен для обнаружения дисков.

Когда я давно тому назад возился с initrd, там не приходилось прилагать ни каких усилий по обнаружению дисков.

Udev добавлял лишь /dev/disks/… Но сами устройства /dev/sda и т.д. были с самого начала.

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

Добавь в свой скрипт вывод загруженных модулей.

Вообще, ядро должно само грузить свои модули даже в initrd, но либо что-то поменялось, либо я ошибался, но сейчас в initrd / initramfs добавляют скрипт, который загружает модули с драйверами блочных устройств, дисков, файловых систем и устройств ввода (клавиатура).

Сделай так же.

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

Кое что стало проясняться….

В оригинальном initrd есть /etc/rc.d/rc3.d/S80udev

В общем, ни чего интересного.

При его запуске из терминала ни чего не происходит.

Но идея с модулями меня толкнула на эксперименты и я попытался доставить модули, которые считал нужным. Напаример, ahci.

Грузиться он отказался, выдавая нагора кучу ашыпок.

Меня сие разозлило и я залез на живую машину с работающим Altlinux 8 SP и просто передрал скаталог /lib/modules/5.10.144-std-def-alt0.c9f.2/ из / рабочей машины, в директорию, где я мучаю initrd.

Варварство, конечно. Тем не менее, теперь вызов /etc/rc.d/rc3.d/S80udev выдает много строк, среди которых нужные мне диски!

ls /dev/sd*
/dev/sda /dev/sad1 /dev/sda2

udev загрузил самостоятельно еще кучку модов:

Module                  Size  Used by
ext2                   94208  1
cirrus                 16384  0
sr_mod                 28672  0
cdrom                  40960  1 sr_mod
sd_mod                 61440  2
ppdev                  20480  0
joydev                 24576  0
drm_kms_helper        274432  3 cirrus
ata_generic            16384  0
cec                    61440  1 drm_kms_helper
pata_acpi              16384  0
rc_core                53248  1 cec
ata_piix               36864  1
libata                290816  3 ata_piix,pata_acpi,ata_generic
drm                   622592  3 drm_kms_helper,cirrus
scsi_mod              270336  3 sd_mod,libata,sr_mod
pcspkr                 16384  0
psmouse               159744  0
input_leds             16384  0
serio_raw              16384  0
e1000                 126976  0
i2c_piix4              24576  0
intel_agp              24576  0
intel_gtt              24576  1 intel_agp
evdev                  24576  0
floppy                 90112  0
tiny_power_button      16384  0
parport_pc             53248  0
parport                57344  2 parport_pc,ppdev
button                 20480  0

Крысотищща!

Ага. Но не совсем…

Нет предела совершенству.

Во первых: кастомный initrd разросся ажник до 350Мб. Жирновато на мой взгляд.

Собственно, вопрос: как затащить в свой initrd не всю библу кернела, а лишь то что нужно?

Во вторых: как можно, вообще обойтись без udev?

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

В директории с модулями создаётся файл с зависимостями модулей. Чтобы все корректно работало тебе нужно скопировать только нужные модули в инитрд и сгенерировать новый файл зависимостей модулей.

Читай man depmod.

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

В директории с модулями создаётся файл с зависимостями модулей. Чтобы все корректно работало тебе нужно скопировать только нужные модули в инитрд и сгенерировать новый файл зависимостей модулей.

Извините, не могли бы вы попотробнее расписать необходимые действия?

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

А что не понятно?

Создаёшь относительно директории в которой находится структура файлов для сборки Initramfs директорию lib/modules/версия_ядра, собственно директорию с тем же именем, что находится в /lib/modules/ для твоего ядра.

Помещаешь в неё нужные тебе файлы модулей.

Переходишь в директорию с файлам Initramfs и выполняешь

depmod -a -b ./

Собираешь свой Initramfs (Initrd).

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