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
# 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

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.

Utility létrehozni initrd

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
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.

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.

Kézi létrehozása egyedi initrd

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
platform, a koncepció létrehozásának initrd ugyanaz a beágyazott rendszerek és asztali (beleértve a szervereket).

4. lista Utility (mkird), hogy hozzon létre egy egyedi initrd

# Housekeeping ...
rm -f /tmp/ramdisk.img
rm -f /tmp/ramdisk.img.gz

# Ramdisk állandók
RDSIZE = 4000
BLKSIZE = 1024

# Létre egy üres ramlemez kép
dd if = / dev / zero of = / tmp / ramdisk.img bs = $ BLKSIZE count = $ RDSIZE

# Legyen egy ext2 fájlrendszert szerelhető
/ Sbin / mke2fs -F -m 0 -b $ BLKSIZE /tmp/ramdisk.img $ RDSIZE

# Mount azt, hogy mi is feltölti
csatolási /tmp/ramdisk.img / mnt / initrd -t ext2 -o loop = / dev / loop0

# Az állományrendszert (alkönyvtárak)
mkdir / mnt / initrd / bin
mkdir / mnt / initrd / sys
mkdir / mnt / initrd / dev
mkdir / mnt / initrd / proc

# Fogd busybox, és hozzunk létre linkeket
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

# Fogd meg a szükséges fájlokat dev
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

# Equate sbin bin
pushd / mnt / initrd
ln -s bin sbin
popd

# Létrehozása az init fájlban
cat >> / mnt / initrd / linuxrc <

4. lista Script mkird automatikusan létrehoz kép

Létrehozásához initrd, hozzon létre egy üres fájlt
á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.

A következő lépés az, hogy megteremtse a szükséges alkönyvtárakat: / bin, / sys,
/ 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).

Ahhoz, hogy ez a gyökér fs predostavlyalya szükséges funkcionális használata
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).

A következő lépés - a létrehozása szükséges ustroyst fájlokat. Azt másolja
közvetlenül a / dev könyvtár az operációs rendszer a -a (a
cp), hogy mentse a fájl attribútumokat.

Az utolsó előtti lépés - létrehozása linuxrc fájlt. Miután a rendszermag
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.

Ennek eredményeként, akkor készülj, hogy root fs. A kép nem szerelt és
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.

Hogy a kezdeti RAM-lemez, akkor egyszerűen futtatni a mkinitrd és ő
automatikusan összegyűjti a képet, és másold a / boot

Disztribúciótól az initrd érdekes nyitott lett kifejlesztve
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.

Egy alternatív fájlrendszer ext2 Ext2 szabvány
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.

Tesztelés egyedi initrd

Tehát az új initrd van a / boot, a következő lépés
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.

5. lista kézi betöltése a kernel és az initrd GRUB segítségével

grub> kernel /bzImage-2.6.1
[Linux-bzImage, setup = 0x1400, méret = 0x29672e]

grub> initrd /ramdisk.img.gz
[Linux-initrd @ 0x5f2a000, 0xb5108 bájt]

Kicsomagolása Linux. OK, a rendszermag indításakor.

Listing 6. Töltsük be a linux kernel egy egyszerű initrd


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

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
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.

Loader, mint például a GRUB, azonosítja a kernel, hogy a betölteni kívánt és
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.

Miután a kernel és az initrd csomagolni és bemásolni memória
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 ().

initrd_load () függvény meghívja az init / do_mounts_rd.c: rd_load_image ()
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.

Szerelés blokk készüléket, mint gyökér szakasz kezdődik
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).

A végén, akkor visszatér a init függvény meghívásakor
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).

7. kódrészlet a funkciók hierarchiájában. Nem minden funkció vesz részt
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.

Listing 7. hierarchiája fő funkciója a folyamatban részt vevő be- és
hegyen initrd

init / main.c: init
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

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
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.

Ebben a példában BusyBox összeállított statikusan, azaz ő nem kell, hogy
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.