Próbuję dowiedzieć się czegoś o initrd. Postępowałem zgodnie z tym samouczkiem, aby zbudować własny initrd od zera, i zainstalowałem na nim busyboksa. Następnie zrobiłem .iso z niego za pomocą isolinux, aby móc przetestować go w virtualbox. Działa świetnie!
Mam podstawowe polecenia z busybox, więc chciałem zamontować system plików. Ale katalog / dev jest prawie pusty (bez sda), z wyjątkiem niektórych plików, które utworzyłem podczas korzystania z samouczka. Dowiedziałem się o udev i myślę, że tego właśnie potrzebuję. Nie jestem jednak pewien, jak to zrobić.
Czy powinienem po prostu pobrać najnowszy kod źródłowy z udev, skompilować go i dodać do mojego initrd? A potem wywołaj / bin / udev czy coś takiego w moim skrypcie init? Czy jest inny / lepszy sposób na zapełnienie katalogu / dev?
Edycja: Kilka dodatkowych informacji i aktualizacji na temat tego, co już zrobiłem.
- Testuję wszystko w wirtualnym pudełku. Właśnie zainstalowałem ubuntu minimal w wirtualnym pudełku, zrobiłem .iso z mojego initrd, a następnie uruchomiłem z iso w virtualbox.
- Użyłem vmlinuz,
/lib/modules
które były obecne na debian-businesscard.iso i skopiowałem je do mojego initrd, który utworzyłem, wykonując samouczek, który wcześniej podłączyłem. - Jądro ma
CONFIG_DEVTMPFS=y
- Niektóre urządzenia pojawiają się w
/dev
, jak tty0-tty63 i niektóre inne, ale nie sda / hda. - Uruchomiłem
lspci -k
w moim obecnie działającym systemie operacyjnym i wirtualnym polu, aby sprawdzić, które moduły są w użyciu.SATA Controller
mówi, że używaahci
jako modułu. - Kiedy
modprobe -v ahci
wykonuję, dużo narzeka na „nieznany symbol: ata_some_stuff”, ale potem zwraca coś w styluSCSI Subsystem initialized
,ATA-6: VBOX HARDDISK
iDirect-Access ATA VBOX HARDDISK
. Jednak nadal nie znaleziono urządzeń na dysku twardym/dev
.
Mój obecny /init/
skrypt wygląda następująco:
#!/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
Czy ktoś ma pojęcie, co robię źle i co powinienem robić zamiast tego?
CONFIG_DEVTMPFS=y
, ale nadal nie otrzymuję żadnych urządzeń SDA. Myślę, że dzieje się tak, ponieważ nie załadowałem żadnych modułów (lsmod nic nie zwraca). Jakie moduły należy załadować, aby uzyskać urządzenia z systemem plików? Czy jest coś jeszcze, o czym zapomniałem?/dev
, po prostu nie napędy, wtedy devtmpfs działa i prawdopodobnie brakuje Ci modułu kontrolera dysku (jak się domyślasz). Niestety jedynym sposobem, aby dowiedzieć się, którego sterownika / modułu potrzebujesz, jest albo odczytanie informacji dla każdego z nich w konfiguracji jądra, albo uruchomienielspci -k
w działającym systemie Linux (który pokaże, jakiego sterownika jądra używają różne komponenty twojego systemu) .CONFIG_DEVTMPFS_MOUNT=y
nie ma żadnego wpływu na initramfs. Z tekstu pomocy jądra: „Ta opcja nie wpływa na uruchamianie oparte na initramfs, tutaj system plików devtmpfs zawsze musi być montowany ręcznie po zamontowaniu rootfs”Udev zapełni się
/dev
automatycznie na podstawie sterowników załadowanych do jądra i urządzeń wykrytych przez te sterowniki. Nazwy urządzeń i ich uprawnienia oparte są na zestawie reguł, które administratorzy mogą dostosować. Większość systemów Linux powinna używać udev; wyjątkiem są systemy (zwykle osadzone), w których konfiguracja sprzętu jest znana w momencie konfigurowania systemu i nie będzie się później zmieniać.Zazwyczaj dzwonisz
udev
dość wcześnie w sekwencji startowej. Jedną z niewielu rzeczy, które powinieneś (musisz?) Zrobić, to mount/proc
i/sys
. Po uruchomieniu demona, wywołaj,udevadm trigger --action=add; udevadm settle
aby udev przetworzył wszystkie oczekujące zdarzenia z jądra (trigger
) i zaczekaj, aż zdarzenia zostaną przetworzone przed kontynuowaniem (settle
). Następnie możesz zlokalizować urządzenie zawierające główny system plików.Oprócz
udevd
pliku binarnego, będziesz potrzebować innych częściudev
na initrd. Obejmuje to pliki konfiguracyjne w/etc/udev
, konfigurację podstawową/lib/udev
oraz pliki binarne pomocnicze, takie jakscsi_id
również/lib/udev
. Potrzebujesz wszystkich programów, które są wywoływane z reguł udev, które dołączasz do initrd.Pod koniec initrd, przed przeniesieniem kontroli na prawdziwą partycję root, musisz zatrzymać się
udevd
jak każdy inny program z initrd. To nie usuwa żadnego urządzenia z/dev
. Użyj,mount --move /dev /root/dev
aby przenieść zamontowanego/dev
do prawdziwego katalogu głównego.Gentoo ma przewodnik po initramfs i stronę wiki initramfs, które wymieniają między innymi udev. Initramfs jest nowoczesnym następcą initrd, wykorzystującym archiwum CPIO zamiast obrazu systemu plików oraz z innym interfejsem procesu (na initrd
/linuxrc
musi wyjść, podczas gdy na initramfs/init
musi miećexec
init z prawdziwego katalogu głównego); większość systemów zmieniła się w tych dniach (nawet jeśli plik nadal może mieć nazwę initrd).źródło
lsmod
na działającym systemie. Zacznij więc od nich wszystkich, a następnie inteligentnie przycinaj, jeśli chcesz zaoszczędzić miejsce.