Initrd - RAM diszk - hogyan lesz egy programozó
RAM diszk indítani a Linux (initrd) egy átmeneti gyökér fájlrendszer csatolt bootoláskor a RAM-ba, hogy támogassa 2-szintű terhelési modell szerint. Initrd áll a különböző végrehajtható és illesztőprogramok, amelyek lehetővé teszik, hogy felmászik a valódi gyökér fájlrendszer, akkor az initrd
szereletlen és a memória felszabadul. Sok beágyazott rendszerek initrd, és továbbra is a root fájlrendszert. Ez a cikk feltárja a boot RAM lemez a Linux 2.6 kernel, beleértve a folyamat létrehozása és használata a Linux kernel.
Mi a boot RAM lemez?
Az indítási RAM disk (initrd) az a kép, a root fájlrendszert, amely fel van szerelve, mielőtt a valódi gyökér fs lesz elérhető. Initrd kapcsolódó kernel és betölteni a rendszermag indítható. A kernel felcsatolja a initrd, amely tartalmazza a szükséges modulokat a root fs, és a további átmenet a gyökér az elsődleges.
Az initrd tartalmazza a legszükségesebb könyvtárak és végrehajtható betölteni modulok, mint például insmod betölteni a kernel modulokat.
Abban az esetben, asztali vagy szerver rendszer, initrd ideiglenes fájlrendszeren. Élettartama rövid, és csak arra szolgál, mint egy linket a root fs. A beágyazott rendszerek, nincs rögzített adattároló eszközök, így initrd az állandó gyökér fs. Ez a cikk azt vizsgálja mindkét lehetőséget.
belső initrd
Az initrd tartalmazza a szükséges minimális rendszerfájlok és futtatható egy második szintű boot linux. Attól függően, hogy a Linux-verziót használ különböző módszerek létrehozása initrd.
Kezdve Fedora Core 3, az alapértelmezett initrd egy tömörített cpio archívum. Ahelyett, szerelés egy fájlt a loop eszköz, akkor kell használni a program maradt meg. Ahhoz, hogy vizsgálja meg a tartalmát a cpio archívum, használja a következő parancsokat:
2. lista Research initrd (FC3 és újabb verziók)
# Mkdir temp; cd temp Ennek eredményeként, van egy kis gyökér fájlrendszer, amelynek tartalmát a 3. listában A kicsi, de szükséges körben alkalmazható jelen a könyvtár / bin könyvtárban, a Nash (nem kagyló, script tolmács), insmod betöltése kernel modulokat, és az LVM (kezelésére szolgáló segédprogram LVM ). 3. lista initrd alapértelmezett struktúra létrehozása (FC3) Érdekes a lista 3. init fájlt a gyökér. Ez a fájl, mint a hagyományos linux boot folyamat akkor kezdődik, amikor az initrd kicsomagolása a memóriában. Elemezzük ezt a folyamatot később ebben a cikkben. Térjünk vissza az elejére, és hivatalosan razbremsya hogyan lehet létrehozni egy képet az initrd. A hagyományos rendszerek Linux initrd Sodano a telepítés során. Rengeteg program, mint például az mkinitrd, fel lehet használni, hogy megteremtse a initrd a szükséges könyvtárak és modulok kommunikáció a valódi gyökér fájlrendszer. Mkinitrd lényegében egy hagyományos shell Használata cpio parancs cpio parancs. lehet manipulálni cpio fájlokat. Cpio fájl lényegében egy egyszerű konkatentsiya fájlfejlécek. cpio fájl formátum lehetővé teszi, hogy működjön együtt a két ASCII fájl, és bináris. A kompatibilitás használja ASCII, hogy csökkentse a méretét - bináris változata. Annak a ténynek köszönhetően, hogy számos beágyazott rendszerek alapuló linux nincs merevlemez, az initrd szintén állandó és fs. A 4. lista bemutatja, hogyan lehet létrehozni egy képet az initrd. ÉN használ egy szabványos asztali linuxos, így próbálja ki ezeket a műveleteket anélkül kéznél egy beágyazott rendszer Linux. Eltekintve összeállítása újabb 4. lista Utility (mkird), hogy hozzon létre egy egyedi initrd # Housekeeping ... # Ramdisk állandók # Létre egy üres ramlemez kép # Legyen egy ext2 fájlrendszert szerelhető # Mount azt, hogy mi is feltölti # Az állományrendszert (alkönyvtárak) # Fogd busybox, és hozzunk létre linkeket # Fogd meg a szükséges fájlokat dev # Equate sbin bin # Létrehozása az init fájlban 4. lista Script mkird automatikusan létrehoz kép Létrehozásához initrd, hozzon létre egy üres fájlt A következő lépés az, hogy megteremtse a szükséges alkönyvtárakat: / bin, / sys, Ahhoz, hogy ez a gyökér fs predostavlyalya szükséges funkcionális használata A következő lépés - a létrehozása szükséges ustroyst fájlokat. Azt másolja Az utolsó előtti lépés - létrehozása linuxrc fájlt. Miután a rendszermag Ennek eredményeként, akkor készülj, hogy root fs. A kép nem szerelt és Hogy a kezdeti RAM-lemez, akkor egyszerűen futtatni a mkinitrd és ő Disztribúciótól az initrd érdekes nyitott lett kifejlesztve Egy alternatív fájlrendszer ext2 Ext2 szabvány Tesztelés egyedi initrd Tehát az új initrd van a / boot, a következő lépés 5. lista kézi betöltése a kernel és az initrd GRUB segítségével grub> kernel /bzImage-2.6.1 grub> initrd /ramdisk.img.gz Kicsomagolása Linux. OK, a rendszermag indításakor. Listing 6. Töltsük be a linux kernel egy egyszerű initrd Az indítási folyamat RAM diszk Most már tudja, hogyan kell összeállítani a képet initrd, ebben a részben azt asztácium Loader, mint például a GRUB, azonosítja a kernel, hogy a betölteni kívánt és Miután a kernel és az initrd csomagolni és bemásolni memória initrd_load () függvény meghívja az init / do_mounts_rd.c: rd_load_image () Szerelés blokk készüléket, mint gyökér szakasz kezdődik A végén, akkor visszatér a init függvény meghívásakor 7. kódrészlet a funkciók hierarchiájában. Nem minden funkció vesz részt Listing 7. hierarchiája fő funkciója a folyamatban részt vevő be- és init / main.c: init Diskless rendszerek Méretének csökkentésével az initrd Amikor létrehoz egy beágyazott rendszer és szeretné érjük el a legkisebb Ebben a példában BusyBox összeállított statikusan, azaz ő nem kell, hogy
# Cp /boot/initrd-2.6.14.2.img initrd-2.6.14.2.img.gz
# A gunzip initrd-2.6.14.2.img.gz
# CPIO -i -make-könyvtárak Utility létrehozni initrd
forgatókönyvet, így láthatja, hogyan lehet elérni a kívánt eredményt. Van is YAIRD (Yet Another mkinitrd) - olyan program, amely lehetővé teszi, hogy testre szinte minden paraméterét a initrd.Kézi létrehozása egyedi initrd
platform, a koncepció létrehozásának initrd ugyanaz a beágyazott rendszerek és asztali (beleértve a szervereket).
rm -f /tmp/ramdisk.img
rm -f /tmp/ramdisk.img.gz
RDSIZE = 4000
BLKSIZE = 1024
dd if = / dev / zero of = / tmp / ramdisk.img bs = $ BLKSIZE count = $ RDSIZE
/ Sbin / mke2fs -F -m 0 -b $ BLKSIZE /tmp/ramdisk.img $ RDSIZE
csatolási /tmp/ramdisk.img / mnt / initrd -t ext2 -o loop = / dev / loop0
mkdir / mnt / initrd / bin
mkdir / mnt / initrd / sys
mkdir / mnt / initrd / dev
mkdir / mnt / initrd / proc
pushd / mnt / initrd / bin
cp /usr/local/src/busybox-1.1.1/busybox.
ln -s busybox hamu
ln -s busybox szerelhető
ln -s busybox echo
ln -s busybox ls
ln -s busybox macska
ln -s busybox ps
ln -s busybox dmesg
ln -s busybox sysctl
popd
cp -a / dev / console / mnt / initrd / dev
cp -a / dev / ramdisk / mnt / initrd / dev
cp -a / dev / ram0 / mnt / initrd / dev
cp -a / dev / null / mnt / initrd / dev
cp -a / dev / tty1 / mnt / initrd / dev
cp -a / dev / tty2 / mnt / initrd / dev
pushd / mnt / initrd
ln -s bin sbin
popd
cat >> / mnt / initrd / linuxrc <
ál / dev / zero (nulla áramlás), mint bemeneti
áramlási ramdisk.img fájlt. Az eredmény egy olyan fájl mérete 4
megabyte (4000 első kilobyte blokk). Ezután a parancs
mke2fs, hozzon létre egy fájlt az ext2 fájlrendszer. Miután a fájl
formázott ext2, csatoljuk a / mnt / initrd a
hurok készülékek. A csatolási pont most van egy könyvtár
amely tükrözi az ext2 fájlrendszer fájlt, és ott is már
gyűjteni a kép initrd.
/ Dev / proc. Egy kell csak biztosítani kell a szükséges
funkciókat, így például nem kell semmilyen könyvtár (ez a feltétel igaz
amikor minden futtatható fájl található a initrd összeállítása
statikusan).
BusyBox. Ez az alkalmazás az egyik módja sok közművek,
általánosan használt Linux rendszerek (például hamut, awk, sed,
insmod stb.) Busybox Az előnye az, hogy, többek között a
funkcionalitását sok a szükséges eszközöket, sokkal kisebb méretű.
Ez ideális kimenet beágyazott rendszerek. Másolás BusyBoxból a könyvtárban
/ Bin a gyökér fájlrendszer kép initrd. teremt
a szükséges szimbolikus linkeket (ugyanazon a hamu, awk, sed, stb)
/ Bin könyvtárban BusyBox. BusyBoxból kitalálja, mi a közüzemi indítottak,
Biztosítja a szükséges funkciókat. Egy kis linkek száma létre
A katalógusban, hogy az init script (ezek a linkek pont vissza
is BusyBox).
közvetlenül a / dev könyvtár az operációs rendszer a -a (a
cp), hogy mentse a fájl attribútumokat.
ram felcsatolja a meghajtót, úgy néz ki, az init script végre kell hajtani. Ha az init fájlban
nem található, a kernel végzi linuxrc fájl helyett a init. Ez a fájl
alapvető műveleteket a beállításához a környezet, például
szerelt fájlrendszer / proc. Amellett, hogy a / proc csak
szerelt fájlrendszer / sys, és egy üzenetet jelenít meg a konzolon. Végén
fut hamu (Bourne héj másolat), hogy képes kölcsönhatásba lépni
gyökér fs. Linuxrc futtatható fájl kerül (+ x) segítségével flag
parancsot chmod.
gzip tömörítve. A kapott fájl (ramdisk.img.gz)
másolni a / boot könyvtárba annak érdekében, hogy képes legyen letölteni GRUB'om
vagy lilo.
automatikusan összegyűjti a képet, és másold a / boot
forráskódú projekt, amelyben az egész Linux disztribúció került a képre
initrd, ez az úgynevezett MiniMax. Elfoglalt 32 megabájt. ez magában foglalja
BusyBoxból és uClibc magát egy kisebb méretű. Annak ellenére, hogy kis
mérete, ez egy értékesítési alapján 2.6 kernel és egy meglehetősen
számos hasznos segédprogramot.
de facto szabványa linux, de ha az alternatívákat, amelyek csökkentik
a méret a végső kép initrd. Például romfs (ROM File System),
cramfs (tömörített fájlrendszer ROM) és squashfs (erősen tömörített fájl
rendszer csak olvasható). Ha kell valami, hogy írjon a fs, ext2
Ez illik. Végül ott van e2compr - ezt a kiterjesztést
ext2, amely támogatja a tömörítést.
Meg kell tesztelni azt a kernel. Indítsuk újra a rendszert, és ha
GRUB prompt jelenik meg, nyomja meg a C gombot, akkor lefordítani GRUB
parancssori módban. Akkor vzaimodestvovat ilyen GRUB'om
átadni a kernel paramétereket vagy feltöltheti saját képét
initrd. kernel parancs, hogy melyik kernel betöltéséhez, és a csapat
initrd initrd válassza ki a képet. Ha ezeket a paramétereket opredelnie tárcsa
és rendszertöltő betölti a megadott kernel és az initrd.
[Linux-bzImage, setup = 0x1400, méret = 0x29672e]
[Linux-initrd @ 0x5f2a000, 0xb5108 bájt]
md: automatikusan érzékelő RAID tömbök
md: autorun
md. autorun KÉSZ.
RAMDISK: Sűrített kép található blokkban 0
VFS: Szerelt gyökér (ext2 fájlrendszer).
Felszabadítása használt kernel memória: 208K felszabadult
/ $ Ls
bin stb linuxrc proc sys
dev lib lost + found sbin
/ $ Cat / proc / 1 / cmdline
/ Bin / ash / linuxrc
/ $ Cd bin
/ Bin $ ls
hamu macska Echo szerelhető sysctl
busybox dmesg ls ps
/ Bin $ érintés zfile
/ Bin $ ls
hamu macska Echo szerelhető sysctl
busybox dmesg ls ps zfile
nézd meg, hogy a kernel és az initrd azonosítja van felszerelve, mint root fájlrendszert.
Mentem keresztül ez a folyamat megállás néhány fontos
funkciók a boot lánc, kifejtve, hogy mi történik.
másolni a kernel és az initrd képet a memóriába. Megtalálható egy leírást minden
szükséges funkciókat az / init a kernel forrás.
Ez jelzi a mag. Ezen a ponton sok különböző inicializálási
eljárásokat, végül meg fogja találni magát init / main.c funkciók: init ()
(Alkönyvtár / fájl funkció). Ez a funkció csak az
inicializálás alrendszer. Tehát van egy függvényhívás
init / do_mounts.c: prepare_namespaces (), amely előkészíti a munka
tér (csatolja a fájlt dev rendszer, RAID vagy MD készüléket, és
ennek eredményeként ő initrd). Loading initrd történik meghívásával
init / do_mounts_initrd.c: initrd_load ().
amely meghatározza a RAM lemez Braz betöltheti azt a
init / do_mounts_rd.c: identify_ramdisk_image (). Ez a funkció ellenőrzi
„Magic szám” a kép, hogy melyik fs ez a kép:
minux, ext2, romfs, cramfs vagy gzip formátumban. Vozvrayaschayas működéséhez
initrd_load_image, van egy hívás init / do_mounts_rd: crd_load (). ezt
funkció memóriát helyet a RAM-lemez és az említett ellenőrző
(CRC), majd kicsomagolja és betölti a RAM lemez a memóriában. most
A initrd alkalmas szerelő tömb
készüléket.
init / do_mounts.c funkció: mount_root (). Az embernek az a root partíció, és
Ez akkor fordul elő init / do_mounts.c hívás: mount_block_root (). Ezért ez az úgynevezett
init / do_mounts.c: do_mount_root (), ami
fs / namespace.c: sys_mount (), hogy meg kell a root fs és megy
bele. Ez az, ahol a kimenet a konzol ismerősek számunkra a hirdetést 6
Hozzászólás VFS: Szerelt gyökér (ext2 fájlrendszer).
init / main.c: run_init_process. Ez akkor fordul elő, mint a felhívás eredményeképpen a execve
A folyamat elindításához init (ebben az esetben linuxrc). linuxrc lehet
lehet akár egy futtatható fájl vagy script (ha a szkript,
tolmács).
a folyamat a másolás és inicializálás felmászik egy RAM lemezt
Az eredmények azt mutatják, de az alapötlet az egész eljárás van feltüntetve.
hegyen initrd
init / do_mounts.c: prepare_namespace
init / do_mounts_initrd.c: initrd_load
init / do_mounts_rd.c: rd_load_image
init / do_mounts_rd.c: identify_ramdisk_image
init / do_mounts_rd.c: crd_load
lib / inflate.c: gunzip
init / do_mounts.c: mount_root
init / do_mounts.c: mount_block_root
init / do_mounts.c: do_mount_root
fs / namespace.c: sys_mount
init / main.c: run_init_process
execve
Az a kép méretét initrd, ha egy pár trükköt, hogy ez.
Az első Tip - használja BusyBox (leírt a cikkben). BusyBox tartalmazza
néhány megabájt közművek és tömöríti őket néhány száz
kilobyte.
dolgozni azokat a könyvtárakat. Azonban meg kell eesli szabványos könyvtárak
C nyelv (további programok), vannak olyan módon, hogy megoldja ezt a neskolno
problemmu nem használ tömeges glibc. Az első kis könyvtár
alkalmas céljainknak uClibc, ami minimalizálható
változata a C standard könyvtár rendszerek szűk helyekre.
Tovább könyvtár, amely ideális szempontjából disk
Space dietlib. Ne felejtsük el, hogy annak érdekében, hogy a programot
dolgozott egy lecsupaszított változata, ezeket a programokat kell újrafordítani,
Ezekkel a könyvtárak igényel némi további munkát,
de megéri.