Я пытаюсь узнать кое-что о initrd. Я следовал этому руководству, чтобы создать свой собственный initrd с нуля, и я установил на нем busybox. Затем я сделал .iso из него с isolinux, чтобы я мог проверить его в virtualbox. Работает отлично!
У меня есть основные команды от busybox, поэтому я хотел смонтировать файловую систему. Но каталог / dev почти пуст (без sda), за исключением некоторых файлов, которые я создал, следуя руководству. Я узнал об Udev и думаю, что это то, что мне нужно. Однако я не уверен, как пойти на это.
Должен ли я просто взять последний исходный код из udev, скомпилировать его и добавить в мой initrd? А потом вызвать / bin / udev или что-то подобное в моем скрипте инициализации? Или есть другой / лучший способ заполнить каталог / dev?
Изменить: некоторая дополнительная информация и обновления о том, что я уже сделал.
- Я тестирую все в виртуальной коробке. Я просто установил Ubuntu Minimal в виртуальный ящик, сделал .iso из моего initrd, а затем загрузился с ISO в VirtualBox.
- Я использовал vmlinuz,
/lib/modules
который присутствовал в файле debian-businesscard.iso, и скопировал его в свой initrd, который я создал, следуя руководству, которое я связал ранее. - Ядро имеет
CONFIG_DEVTMPFS=y
- Некоторые устройства отображаются
/dev
, например, tty0-tty63 и некоторые другие, но не sda / hda. - Запустил
lspci -k
в моей в настоящее время работающей ОС и в виртуальном окне, чтобы проверить, какие модули используются.SATA Controller
говорит, что использует вahci
качестве модуля. - Когда я выполняю
modprobe -v ahci
его, он много жалуется на «неизвестный символ: ata_some_stuff», но после этого он возвращает что-то вродеSCSI Subsystem initialized
,ATA-6: VBOX HARDDISK
иDirect-Access ATA VBOX HARDDISK
. Тем не менее, все еще не найдено устройств с жестким диском/dev
.
Мой текущий /init/
сценарий выглядит следующим образом:
#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login
Кто-нибудь знает, что я делаю неправильно и что я должен делать вместо этого?
CONFIG_DEVTMPFS=y
, но я все еще не получаю никаких устройств sda. Я думаю, это потому, что я не загружал никаких модулей (lsmod ничего не возвращает). Какие модули я должен загрузить, чтобы получить устройства файловой системы? Или я что-то еще забыл?/dev
, кроме дисков, то devtmpfs работает, и вы, вероятно, пропускаете модуль контроллера диска (как вы уже догадались). К сожалению, единственный способ узнать, какой драйвер / модуль вам нужен, это либо прочитать информацию для каждого из них в конфигурации ядра, либо запуститьlspci -k
в работающей системе Linux (которая покажет вам, какой драйвер ядра используют различные компоненты вашей системы). ,CONFIG_DEVTMPFS_MOUNT=y
не влияет на initramfs. Из текста справки ядра: «Эта опция не влияет на загрузку на основе initramfs, здесь файловую систему devtmpfs всегда нужно монтировать вручную после монтированияUdev заполняется
/dev
автоматически в зависимости от драйверов, загруженных в ядро, и устройств, которые эти драйверы обнаруживают. Имена устройств и их разрешения основаны на наборе правил, которые администраторы могут настроить. Большинство систем Linux должны использовать udev; Исключение составляют системы (обычно встроенные), в которых конфигурация оборудования известна во время настройки системы и впоследствии не изменится.Вы обычно звоните
udev
довольно рано в вашей последовательности запуска. Одной из немногих вещей, которые вы должны (должны?) Сделать до этого, является mount/proc
и/sys
. После запуска демона вызовитеudevadm trigger --action=add; udevadm settle
udev для обработки всех ожидающих событий из ядра (trigger
) и дождитесь обработки событий, прежде чем продолжить (settle
). Затем вы можете перейти к поиску устройства, содержащего корневую файловую систему.Помимо
udevd
двоичного файла, вам понадобятся другие частиudev
вашего initrd. Это включает в себя файлы конфигурации в/etc/udev
базовой конфигурации,/lib/udev
а также вспомогательные двоичные файлы, такие какscsi_id
также в/lib/udev
. Вам нужны все программы, которые вызываются из правил udev, которые вы включаете в initrd.В конце initrd, перед передачей управления реальному корневому разделу, вам нужно будет остановиться,
udevd
как и любая другая программа из initrd. Это не удаляет любое устройство из/dev
. Используйтеmount --move /dev /root/dev
для перемещения подключенного/dev
к настоящему корню.В Gentoo есть руководство по initramfs и вики-страница initramfs, в которых упоминается udev. Initramfs - это современный преемник initrd, использующий архив cpio, а не образ файловой системы, и с другим интерфейсом процесса (на initrd
/linuxrc
должен завершиться, тогда как на initramfs/init
должен бытьexec
init от реального корня); большинство систем переключились в эти дни (даже если файл все еще может называться initrd).источник
lsmod
на работающей системе. Поэтому начните со всех из них, а затем обрезайте с умом, если вам нужно сэкономить место.