initrd(4)

NUME
initrd - discul RAM inițializat de încărcătorul de boot

CONFIGURARE
/dev/initrd este un dispozitiv de bloc numai pentru citire căruia i s-a atribuit numărul major 1 și numărul minor 250. În mod obișnuit, /dev/initrd este deținut de root:disk cu modul 0400 (acces în citire numai de către root). În cazul în care sistemul Linux nu are /dev/initrd deja creat, acesta poate fi creat cu următoarele comenzi:

    mknod -m 400 /dev/initrd b 1 250
    chown root:disk /dev/initrd

De asemenea, pentru a utiliza /dev/initrd, trebuie compilat direct în nucleul Linux atât suportul pentru „discul RAM”, cât și pentru „discul RAM inițial” (de exemplu, CONFIG_BLK_DEV_RAM=y și CONFIG_BLK_DEV_INITRD=y). Atunci când se utilizează /dev/initrd, controlorul de disc RAM nu poate fi încărcat ca modul.

DESCRIERE
Fișierul special /dev/initrd este un dispozitiv de bloc numai pentru citire. Acest dispozitiv este un disc RAM care este inițializat (adică, încărcat) de către încărcătorul de boot înainte de pornirea nucleului. Apoi, nucleul poate utiliza conținutul lui /dev/initrd pentru o pornire a sistemului în două faze.

În prima fază de pornire, nucleul pornește și montează un sistem de fișiere rădăcină inițial din conținutul lui /dev/initrd (de exemplu, discul RAM inițializat de încărcătorul de pornire). În a doua fază, controlori suplimentari sau alte module sunt încărcate din conținutul dispozitivului rădăcină inițial. După încărcarea modulelor suplimentare, un nou sistem de fișiere rădăcină (adică sistemul de fișiere rădăcină normal) este montat de pe un alt dispozitiv.

  Operația de pornire
La pornirea cu initrd, sistemul pornește după cum urmează:

(1) Încărcătorul de pornire încarcă programul nucleului și conținutul lui /dev/initrd în memorie.

(2) La pornirea nucleului, acesta decomprimă și copiază conținutul dispozitivului /dev/initrd pe dispozitivul /dev/ram0 și apoi eliberează memoria utilizată de /dev/initrd.

(3) Apoi, nucleul montează în citire-scriere dispozitivul /dev/ram0 ca sistem de fișiere rădăcină inițial.

(4) Dacă sistemul de fișiere rădăcină normal indicat este, de asemenea, sistemul de fișiere rădăcină inițial (de exemplu, /dev/ram0), atunci nucleul sare la ultimul pas pentru secvența obișnuită de pornire.

(5) Dacă fișierul executabil /linuxrc este prezent în sistemul de fișiere rădăcină inițial, /linuxrc este executat cu UID 0; (fișierul /linuxrc trebuie să aibă permisiunea de execuție). Fișierul /linuxrc poate fi orice executabil valid, inclusiv un script shell.

(6) Dacă /linuxrc nu este executat sau când /linuxrc se termină, este montat sistemul de fișiere rădăcină normal; (dacă /linuxrc iese cu orice sistem de fișiere montat pe sistemul de fișiere rădăcină inițial, atunci comportamentul nucleului este NESPECIFICAT). Consultați secțiunea NOTE pentru comportamentul actual al nucleului.

(7) Dacă sistemul de fișiere rădăcină normal are un director /initrd, dispozitivul /dev/ram0 este mutat din / în /initrd. În caz contrar, dacă directorul /initrd nu există, dispozitivul /dev/ram0 este demontat.; (atunci când este mutat din / în /initrd, /dev/ram0 nu este demontat și, prin urmare, procesele pot continua să ruleze de pe /dev/ram0. Dacă directorul /initrd nu există pe sistemul de fișiere rădăcină normal și orice proces rămâne în execuție de pe /dev/ram0 când /linuxrc iese, comportamentul nucleului este NESPECIFICAT). Consultați secțiunea NOTE pentru comportamentul actual al nucleului.

(8) Secvența obișnuită de pornire (de exemplu, invocarea lui /sbin/init) este efectuată pe sistemul de fișiere rădăcină normal.

  Opțiuni
Următoarele opțiuni ale încărcătorului de pornire, atunci când sunt utilizate cu initrd, afectează operația de pornire a nucleului:

initrd=fnume-fișier
    Specifică fișierul care urmează să fie încărcat ca fiind conținutul lui /dev/initrd. Pentru LOADLIN, aceasta este o opțiune de linie de comandă. Pentru LILO trebuie să utilizați această comandă în fișierul de configurare LILO /etc/lilo.config. Numele fișierului specificat cu această opțiune va fi de obicei o imagine de sistem de fișiere comprimată în formatul gzip.

noinitrd
    Această opțiune de pornire dezactivează operația de pornire în două faze. Nucleul execută secvența obișnuită de pornire ca și cum /dev/initrd nu ar fi fost inițializat. Cu această opțiune, orice conținut al /dev/initrd încărcat în memorie de către conținutul încărcătorului de pornire este păstrat. Această opțiune permite ca conținutul lui /dev/initrd să fie orice date și nu este necesar să se limiteze la o imagine a sistemului de fișiere. Cu toate acestea, dispozitivul /dev/initrd este numai pentru citire și poate fi citit o singură dată după pornirea sistemului.

root=nume-dispozitiv
    Specifică dispozitivul care urmează să fie utilizat ca sistem de fișiere rădăcină normal. Pentru LOADLIN, aceasta este o opțiune de linie de comandă. Pentru LILO, aceasta este o opțiune de pornire sau poate fi utilizată ca o linie de opțiune în fișierul de configurare LILO /etc/lilo.config. Dispozitivul specificat de această opțiune trebuie să fie un dispozitiv care poate fi montat și care are un sistem de fișiere rădăcină adecvat.

  Schimbarea sistemului de fișiere rădăcină normal
În mod implicit, pentru sistemele de fișiere rădăcină normale se utilizează configurația nucleului (de exemplu, configurată în fișierul nucleu cu rdev(8) sau compilată în fișierul nucleu) sau configurația opțiunii încărcătorului de pornire. Pentru un sistem de fișiere rădăcină normal montat prin NFS, trebuie să se utilizeze opțiunile de pornire nfs_root_name și nfs_root_addrs pentru a da parametrii NFS. Pentru mai multe informații despre rădăcina montată prin NFS, consultați fișierul de documentare a nucleului Documentation/filesystems/nfs/nfsroot.txt (sau Documentation/filesystems/nfsroot.txt înainte de Linux 2.6.33). Pentru mai multe informații despre stabilirea sistemului de fișiere rădăcină, consultați, de asemenea, documentația LILO și LOADLIN.

De asemenea, este posibil ca executabilul /linuxrc să schimbe dispozitivul rădăcină normal. Pentru ca /linuxrc să modifice dispozitivul root normal, trebuie să fie montat /proc. După montarea /proc, /linuxrc modifică dispozitivul normal rădăcină prin scrierea în fișierele proc /proc/sys/kernel/real-root-dev, /proc/sys/kernel/nfs-root-name și /proc/sys/kernel/nfs-root-addrs. Pentru un dispozitiv rădăcină fizic, dispozitivul rădăcină este schimbat prin faptul că /linuxrc scrie noul număr al dispozitivului sistemului de fișiere rădăcină în /proc/sys/kernel/real-root-dev. Pentru un sistem de fișiere rădăcină NFS, dispozitivul rădăcină este modificat prin faptul că /linuxrc scrie configurația NFS în fișierele /proc/sys/kernel/nfs-root-name și /proc/sys/kernel/nfs-root-addrs și apoi scrie 0xff (de exemplu, numărul pseudo-dispozitivului NFS) în fișierul /proc/sys/kernel/real-root-dev. De exemplu, următoarea linie de comandă shell ar schimba dispozitivul rădăcină normal în /dev/hdb1:

    echo 0x365 >/proc/sys/kernel/real-root-dev

Pentru un exemplu NFS, următoarele linii de comandă shell ar schimba dispozitivul rădăcină normal în directorul NFS /var/nfsroot pe un server NFS în rețea locală cu numărul IP 193.8.232.7 pentru un sistem cu numărul IP 193.8.232.2 și numit „idefix”:

    echo /var/nfsroot >/proc/sys/kernel/nfs-root-name
    echo 193.8.232.2:193.8.232.7::255.255.255.0:idefix \
        >/proc/sys/kernel/nfs-root-addrs
    echo 255 >/proc/sys/kernel/real-root-dev

Notă: Utilizarea /proc/sys/kernel/real-root-dev pentru a schimba sistemul de fișiere rădăcină este depășită. Consultați fișierul sursă al nucleului Linux Documentation/admin-guide/initrd.rst (sau Documentation/initrd.txt înainte de Linux 4.10), precum și pivot_root(2) și pivot_root(8) pentru informații despre metoda modernă de schimbare a sistemului de fișiere rădăcină.

  Utilizare
Principala motivație pentru implementarea initrd a fost aceea de a permite configurarea modulară a nucleului la instalarea sistemului.

Un posibil scenariu de instalare a sistemului este următorul:

(1) Programul de încărcare pornește de pe dischetă sau de pe alt suport cu un nucleu minim (de exemplu, suport pentru /dev/ram, /dev/initrd și sistemul de fișiere ext2) și încarcă /dev/initrd cu o versiune comprimată în format gzip a sistemului de fișiere inițial.

(2) Executabilul /linuxrc determină ce este necesar pentru (1) montarea sistemului de fișiere rădăcină normal (adică tipul de dispozitiv, controlorii de dispozitiv, sistemul de fișiere) și (2) suportul de distribuție (de exemplu, CD-ROM, rețea, bandă, ...). Acest lucru se poate face prin solicitarea utilizatorului, prin autoprobare sau prin utilizarea unei abordări hibride.

(3) Executabilul /linuxrc încarcă modulele necesare din sistemul de fișiere rădăcină inițial.

(4) Executabilul /linuxrc creează și populează sistemul de fișiere rădăcină; (în această etapă, sistemul de fișiere rădăcină normal nu trebuie să fie încă un sistem finalizat).

(5) Executabilul /linuxrc instalează /proc/sys/kernel/real-root-dev, demontează /proc, sistemul de fișiere root normal și orice alte sisteme de fișiere pe care le-a montat, apoi se termină.

(6) Nucleul montează apoi sistemul de fișiere rădăcină normal.

(7) Acum că sistemul de fișiere este accesibil și intact, încărcătorul de pornire poate fi instalat.

(8) Încărcătorul de pornire este configurat să încarce în /dev/initrd un sistem de fișiere cu setul de module care a fost utilizat pentru a porni sistemul (de exemplu, dispozitivul /dev/ram0 poate fi modificat, apoi demontat și, în final, imaginea este scrisă din /dev/ram0 într-un fișier).

(9) Sistemul este acum pornibil și pot fi efectuate sarcini suplimentare de instalare.

Rolul cheie al /dev/initrd în cele de mai sus este acela de a reutiliza datele de configurare în timpul funcționării normale a sistemului, fără a necesita selectarea inițială a nucleului, un nucleu generic de mari dimensiuni sau, recompilarea nucleului.

Un al doilea scenariu este cel al instalațiilor în care Linux rulează pe sisteme cu configurații hardware diferite într-o singură rețea administrativă. În astfel de cazuri, ar putea fi de dorit să se utilizeze doar un set mic de nuclee (ideal ar fi unul singur) și să se mențină cât mai mică partea de informații de configurare specifică sistemului. În acest caz, creați un fișier comun cu toate modulele necesare. Apoi, doar fișierul /linuxrc sau un fișier executat de /linuxrc ar fi diferit.

Un al treilea scenariu este reprezentat de discuri de recuperare mai convenabile. Deoarece informații precum locația partiției sistemului de fișiere rădăcină nu sunt necesare în momentul pornirii, sistemul încărcat de pe /dev/initrd poate utiliza un dialog și/sau o detecție automată urmată de o eventuală verificare a corectitudinii.

Nu în ultimul rând, distribuțiile Linux pe CD-ROM pot folosi initrd pentru o instalare ușoară de pe CD-ROM. Distribuția poate utiliza LOADLIN pentru a încărca direct /dev/initrd de pe CD-ROM fără a fi nevoie de dischete. Distribuția ar putea, de asemenea, să utilizeze o dischetă de pornire LILO și apoi să pornească un disc RAM mai mare prin intermediul /dev/initrd de pe CD-ROM.

FIȘIERE
/dev/initrd
/dev/ram0
/linuxrc
/initrd

NOTE

•   Cu nucleul actual, orice sistem de fișiere care rămâne montat atunci când /dev/ram0 este mutat de la / la /initrd continuă să fie accesibil. Cu toate acestea, intrările /proc/mounts nu sunt actualizate.

•   Cu nucleul actual, dacă directorul /initrd nu există, atunci /dev/ram0 nu va fi complet demontat dacă /dev/ram0 este utilizat de orice proces sau dacă are un sistem de fișiere montat pe el. Dacă /dev/ram0 nu este complet demontat, atunci /dev/ram0 va rămâne în memorie.

•   Utilizatorii de /dev/initrd nu ar trebui să depindă de comportamentul prezentat în notele de mai sus. Comportamentul se poate schimba în versiunile viitoare ale nucleului Linux.

CONSULTAȚI ȘI
chown(1), mknod(1), ram(4), freeramdisk(8), rdev(8)

Documentation/admin-guide/initrd.rst (sau Documentation/initrd.txt înainte de Linux 4.10) în arborele sursă al nucleului Linux, documentația LILO, documentația LOADLIN, documentația SYSLINUX

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.