Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows 10
  • Crearea unui sistem de operare bazat pe nucleul linux. De la zero

Crearea unui sistem de operare bazat pe nucleul linux. De la zero

Această serie de articole este dedicată programării de nivel scăzut, adică arhitecturii computerelor, proiectării sistemului de operare, programării în limbaj de asamblare și domeniilor conexe. Până acum, două habrauzera sunt angajate în scris - și. Pentru mulți elevi de liceu, studenți și programatori profesioniști, aceste subiecte se dovedesc a fi foarte greu de învățat. Există multă literatură și cursuri despre programarea la nivel scăzut, dar este dificil să obțineți o imagine completă și cuprinzătoare din acestea. Este dificil, după ce am citit una sau două cărți despre asamblare și sisteme de operare, să ne imaginăm, cel puțin în termeni generali, cum funcționează de fapt acest sistem complex de fier, siliciu și multe programe - un computer.

Fiecare rezolvă problema învățării în felul său. Cineva citește multă literatură, cineva încearcă să treacă rapid la practică și să înțeleagă pe parcurs, cineva încearcă să explice prietenilor tot ceea ce studiază. Și am decis să combinăm aceste abordări. Deci, în acest curs de articole, vom demonstra pas cu pas cum să scrieți un sistem de operare simplu. Articolele vor avea un caracter general, adică nu vor conține informații teoretice exhaustive, totuși, vom încerca întotdeauna să oferim link-uri către materiale teoretice bune și să răspundem la toate întrebările care apar. Nu avem un plan clar, așa că multe decizii importante vor fi luate pe parcurs, ținând cont de feedback-ul dumneavoastră.

Poate că vom opri în mod deliberat procesul de dezvoltare pentru a vă permite dvs. și nouă înșine să înțelegeți pe deplin toate consecințele unei decizii greșite, precum și să perfecționăm unele abilități tehnice asupra acesteia. Deci nu ar trebui să iei deciziile noastre ca fiind singurele corecte și să ai încredere orbește în noi. Încă o dată, subliniem că ne așteptăm ca cititorii să fie activi în discutarea articolelor, care ar trebui să influențeze puternic dezvoltarea generală și scrierea articolelor ulterioare. În mod ideal, am dori să vedem unii dintre cititori să se alăture dezvoltării sistemului în timp.

Vom presupune că cititorul este deja familiarizat cu elementele de bază ale limbajelor de asamblare și C, precum și cu conceptele de bază ale arhitecturii computerelor. Adică nu vom explica ce este un registru sau, să zicem, o memorie cu acces aleatoriu. Dacă nu aveți suficiente cunoștințe, puteți oricând să consultați literatura suplimentară. O scurtă listă de referințe și link-uri către site-uri cu articole bune se află la sfârșitul articolului. De asemenea, este de dorit să puteți utiliza Linux, deoarece toate instrucțiunile de compilare vor fi date special pentru acest sistem.

Și acum - mai la obiect. În restul articolului, vom scrie un program clasic „Hello World”. Lumea noastră Hello se va dovedi a fi puțin specifică. Nu va rula de pe niciun sistem de operare, ci direct, ca să spunem așa, „pe bare metal”. Înainte de a trece direct la scrierea codului, să ne dăm seama cum încercăm exact să facem acest lucru. Și pentru aceasta trebuie să luați în considerare procesul de pornire a computerului.

Deci, luați computerul preferat și apăsați pe cel mai mare buton de pe unitatea de sistem. Vedem un ecran de splash vesel, unitatea de sistem emite un bip fericit cu un difuzor, iar după un timp sistemul de operare este încărcat. După cum înțelegeți, sistemul de operare este stocat pe hard disk și aici apare întrebarea: cum a pornit magic sistemul de operare în RAM și a început să se execute?

Știți acest lucru: sistemul care se află pe orice computer este responsabil pentru acest lucru, iar numele său - nu, nu Windows, vă așteaptă limba - se numește BIOS. Numele său înseamnă Basic Input-Output System, adică sistemul de bază de intrare-ieșire. BIOS-ul se află pe un mic microcircuit de pe placa de bază și pornește imediat după apăsarea butonului mare ON. BIOS-ul are trei sarcini principale:

  1. Detectați toate dispozitivele conectate (procesor, tastatură, monitor, RAM, placă video, cap, brațe, aripi, picioare și cozi...) și verificați-le pentru funcționare. Programul POST (Power On Self Test) este responsabil pentru acest lucru. Dacă hardware-ul vital nu este găsit, atunci niciun software nu va putea ajuta, iar în acest moment difuzorul sistemului va scârțâi ceva sinistru și sistemul de operare nu va ajunge deloc în sistemul de operare. Să nu vorbim despre trist, să presupunem că avem un computer complet funcțional, ne bucurăm și trecem la examinarea celei de-a doua funcție BIOS:
  2. Furnizarea sistemului de operare cu un set de bază de funcții pentru lucrul cu hardware. De exemplu, prin funcțiile BIOS, puteți afișa text pe ecran sau puteți citi date de la tastatură. Prin urmare, se numește sistemul I/O de bază. De obicei, sistemul de operare accesează aceste funcții prin întreruperi.
  3. Lansarea încărcării sistemului de operare. În acest caz, de regulă, se citește sectorul de boot - primul sector al purtătorului de informații (dischetă, hard disk, CD, unitate flash). Ordinea mediilor de interogare poate fi setată în BIOS SETUP. Sectorul de boot conține un program numit uneori încărcător de pornire primar. În linii mari, sarcina bootloader-ului este să pornească sistemul de operare. Procesul de pornire al unui sistem de operare poate fi foarte specific și foarte dependent de caracteristicile acestuia. Prin urmare, bootloader-ul primar este scris direct de dezvoltatorii sistemului de operare și este scris în sectorul de pornire în timpul instalării. În momentul în care pornește bootloader-ul, procesorul este în modul real.
Veste tristă: dimensiunea bootloader-ului ar trebui să fie de numai 512 octeți. De ce atât de puțini? Pentru a face acest lucru, trebuie să ne familiarizăm cu dispozitivul dischetei. Iată o poză informativă:

Imaginea arată suprafața unei unități de disc. Discheta are 2 suprafete. Fiecare suprafață are urme în formă de inel. Fiecare pistă este împărțită în bucăți mici, arcuite, numite sectoare. Deci, din punct de vedere istoric, un sector de dischetă are o dimensiune de 512 octeți. Primul sector de pe disc, sectorul de boot, este citit de BIOS în segmentul de memorie zero la offset 0x7C00, iar apoi controlul este transferat la această adresă. Încărcătorul de pornire se încarcă de obicei în memorie nu sistemul de operare în sine, ci un alt încărcător. program stocat pe disc, dar dintr-un motiv oarecare (cel mai probabil, acest motiv este dimensiunea) care nu se încadrează într-un singur sector. Și, deoarece rolul sistemului de operare nostru este jucat până acum de un banal Hello World, scopul nostru principal este să faceți computerul să creadă în existența sistemului nostru de operare, chiar dacă doar pe un sector, și rulați-l.

Cum funcționează sectorul de boot? Pe un computer, singura cerință pentru sectorul de boot este ca ultimii doi octeți să conțină valorile 0x55 și 0xAA - semnătura sectorului de boot. Deci, este deja mai mult sau mai puțin clar ce trebuie să facem. Să scriem codul! Codul de mai sus este scris pentru asamblatorul yasm.

secțiune. text

folosi16

org 0x7C00 ; programul nostru este încărcat la 0x7C00

start:

mov ax, cs

mov ds, ax ; selectați segmentul de date



mov si, mesaj

cld ; direcție pentru comenzi șir

mov ah, 0x0E ; Numărul funcției BIOS

mov bh, 0x00 ; pagina de memorie video

puts_loop:

lodsb ; încărcați următorul caracter în al

test al, al ; caracterul nul înseamnă sfârșitul rândului

jz puts_loop_exit

int 0x10 ; apelați funcția BIOS

jmp puts_loop

puts_loop_exit:

jmp $; ciclu etern



mesaj:

db „Bună lume!” , 0

finalizarea:

ori 0x1FE - terminare + start db 0

db 0x55, 0xAA ; semnătura sectorului de boot

Acest scurt program necesită o serie de explicații importante. Linia org 0x7C00 este necesară pentru ca asamblatorul (mă refer la program, nu la limbaj) să calculeze corect adresele pentru etichete și variabile (puts_loop, puts_loop_exit, mesaj). Așa că îl informăm că programul va fi încărcat în memorie la adresa 0x7C00.
În rânduri
mov ax, cs

mov ds, ax
segmentul de date (ds) este setat egal cu segmentul de cod (cs), deoarece în programul nostru atât datele, cât și codul sunt stocate într-un singur segment.

Apoi mesajul „Hello World!” este afișat caracter cu caracter în buclă. Funcția 0x0E a întreruperii 0x10 este utilizată pentru aceasta. Are urmatorii parametri:
AH = 0x0E (numărul funcției)
BH = numărul paginii video (nu vă deranjați încă, specificați 0)
AL = cod de caractere ASCII

La linia „jmp $” programul se blochează. Și pe bună dreptate, nu este nevoie ca ea să execute cod suplimentar. Cu toate acestea, pentru ca computerul să funcționeze din nou, va trebui să reporniți.

În linia „times 0x1FE-finish + start db 0”, restul codului programului (cu excepția ultimilor doi octeți) este umplut cu zerouri. Acest lucru se face astfel încât după compilare semnătura sectorului de boot să apară în ultimii doi octeți ai programului.

Am descoperit codul programului, acum haideți să încercăm să compilăm această fericire. Pentru compilare, avem nevoie, de fapt, de un asamblator - cel menționat mai sus

În primul rând, învață programarea. Cunoașterea asamblatorului este esențială; Este foarte recomandat să fiți conștient și de alte limbaje de programare de nivel inferior, cum ar fi C.

Decideți pe ce dispozitiv doriți să porniți sistemul de operare. Acesta poate fi un CD, DVD, unitate flash, hard disk sau alt computer.

Decideți cum doriți să apară sistemul dvs. de operare. Ar trebui să fie o versiune completă a sistemului de operare cu o interfață grafică cu utilizatorul (GUI) sau poate ceva mai minimalist? Trebuie să știți în ce direcție să mergeți înainte de a începe procesul.

Verificați ce platformă de procesor va accepta sistemul dvs. de operare. AI-32 și x86_64 sunt cele mai comune două versiuni pentru computerele personale, așa că pot fi considerate cea mai bună alegere.

Decideți dacă preferați să faceți totul singur de la zero sau dacă există nuclee pe baza cărora doriți să construiți sistemul. Linux de la zero este un proiect pentru cei care doresc, de exemplu, să-și creeze propria distribuție Linux.

Alegeți dacă veți folosi propriul bootloader sau Grand Unified Bootloader (GRUB) predefinit. Deoarece codificarea propriului program de pornire necesită cunoștințe extinse despre software-ul computerului și BIOS-ul, aceasta poate respinge programul de programare pentru nucleul real.

Decideți limbajul de programare pe care îl veți utiliza. Desigur, este destul de posibil să dezvoltați un sistem de operare într-un limbaj precum Pascal sau BASIC, dar este de preferat să scrieți în C sau assembler. Asamblatorul este absolut necesar, deoarece unele părți importante ale sistemului de operare necesită cunoașterea acestui limbaj special. C ++, pe de altă parte, conține cuvintele cheie necesare pentru a rula sistemul de operare complet.

  • Pentru a construi un sistem de operare folosind cod C sau C++, veți folosi, desigur, un compilator sau altul. Aceasta înseamnă că trebuie să citiți manualul / instrucțiunile / documentația pentru compilatorul C / C ++ la alegere, care vine la pachet cu software-ul sau este disponibil pe site-ul web al distribuitorului. Va trebui să înveți o mulțime de lucruri complicate despre compilator și, de asemenea, va trebui să înveți schema și ABI pentru a îmbunătăți C++. Se așteaptă să înțelegeți diferitele formate de execuție (ELF, PE, COFF, binare obișnuite etc.) și să observați că formatul PE nativ Windows (.exe) este protejat prin drepturi de autor.
  • Selectați Interfața de programare a aplicației (API). O colecție de API-uri bune este POSIX, deoarece este bine documentată. Toate sistemele Unix au suport cel puțin parțial POSIX, așa că ar fi trivial să adăugați programe Unix la sistemul dumneavoastră de operare.

    Decideți asupra designului. Există miezuri monolitice și microsâmburi. Nucleele monolitice efectuează toate serviciile din nucleu, în timp ce microkernel-urile au un nucleu mic combinat cu o implementare a serviciului personalizat. În general, nucleele monolitice sunt mai rapide, dar micro-nucleele au o izolare și o protecție mai bună împotriva posibilelor defecte.

    Luați în considerare dezvoltarea și munca în echipă.În acest fel, veți avea nevoie de mai puțin timp pentru a rezolva problemele mari, ceea ce vă va permite să creați un sistem de operare mai bun într-un interval de timp mai scurt.

    Nu ștergeți complet hard diskul. Amintiți-vă, formatarea unității dvs. va șterge definitiv toate datele dvs.! Utilizați GRUB sau alt manager pentru a duplica pornirea computerului de pe alt sistem de operare până când versiunea dvs. este complet funcțională.

    Începe mic. Acordați atenție mai întâi lucrurilor mici, cum ar fi afișarea textului și întreruperile, înainte de a trece la elemente complexe precum gestionarea memoriei și multitasking.

    Păstrați o copie de rezervă a celei mai recente versiuni de lucru. Acest lucru vă oferă o anumită liniște sufletească în cazul în care ceva nu merge complet greșit cu versiunea curentă a sistemului de operare sau cu suplimentele ulterioare. În cazul unei defecțiuni a computerului și al incapacității de pornire, după cum înțelegeți dvs., să aveți o a doua copie pentru serviciu va fi o oportunitate excelentă, astfel încât să puteți remedia defecțiunile existente.

    Testează-ți noul sistem de operare într-o mașină virtuală.În loc să reporniți computerul de fiecare dată când faceți modificări sau transferați fișiere de pe computerul de producție pe o mașină de testare, puteți utiliza o aplicație pentru a rula sistemul de operare într-o mașină virtuală în timp ce sistemul de operare actual este încă în funcțiune. Aplicațiile VM includ VMWare (care are și un server disponibil gratuit), sursă deschisă alternativă, Bochs, Microsoft Virtual PC (nu este compatibil cu Linux) și XVM VirtualBox.

    Lansați versiunea de lansare. Acest lucru va permite utilizatorilor să vă spună despre posibilele defecte ale sistemului dvs. de operare.

  • De asemenea, sistemul de operare trebuie să fie ușor de utilizat, așa că asigurați-vă că adăugați funcții utile care vor deveni parte integrantă a designului dvs.

    • Când dezvoltarea este terminată, luați în considerare dacă doriți să faceți codul disponibil gratuit sau să stabiliți drepturi private asupra acestuia.
    • Asigurați-vă că funcțiile de securitate sunt prioritatea dvs. de top dacă doriți ca sistemul dvs. să fie viabil.
    • Nu începeți un proiect de dezvoltare a unui sistem de operare în scopul de a preda programarea. Dacă nu cunoașteți C, C++, Pascal sau orice alte limbaje și proprietăți adecvate, inclusiv tipuri de pointer, operații de biți de nivel scăzut, comutare de biți, asamblare inline etc., atunci nu sunteți pregătit să creați OS.
    • Răsfoiți portaluri precum OSDev și OSDever pentru a vă ajuta să vă îmbunătățiți propriul sistem de operare. Vă rugăm să rețineți în special că pentru majoritatea problemelor, comunitatea OSDev.org preferă să consultați singur conținutul site-ului decât să vă alăturați forumului. Dacă totuși decideți să vă alăturați rândurilor membrilor forumului, trebuie să existe anumite condiții prealabile pentru aceasta. Trebuie să aveți cunoștințe aprofundate de C sau C ++ și limbajul de asamblare x86. Ar trebui să înțelegeți, de asemenea, concepte generale și complexe de programare, cum ar fi Listele legate, Cozile etc. Comunitatea OSDev în regulile sale afirmă în mod explicit că nimeni nu va îngriji noi programatori. Dacă încercați să dezvoltați un sistem de operare, este de la sine înțeles că sunteți un „zeu” în domeniul programării. De asemenea, vi se cere să citiți manualul procesorului pentru arhitectura pe care o alegeți; de exemplu x86 (Intel), ARM, MIPS, PPC etc. O astfel de referință la structura procesorului poate fi găsită cu ușurință căutând pe Google („Manuale Intel”, „Manuale ARM”, etc.). Nu vă înscrieți pe forumul OSDev.org pentru a pune întrebări evidente. Va duce doar la răspunsuri de genul „Citiți manualul f *** ing”. Pentru a începe, ar trebui să încercați să citiți Wikipedia, tutoriale pentru diferitele instrumente pe care intenționați să le utilizați.
    • Verificați eventualele puncte moarte și alte bug-uri. Neajunsurile, fundurile și alte probleme pot afecta designul sistemului dvs. de operare.
    • Dacă doriți o modalitate mai ușoară, imaginați-vă distribuții Linux precum Fedora Revisor, Custom Nimble X, Puppy Remaster, PCLinuxOS mklivecd sau SUSE Studio și SUSE KIWI. Cu toate acestea, sistemul de operare pe care îl creați este deținut de compania care a introdus pentru prima dată serviciul (deși aveți drepturi de a-l redistribui, modifica și rula în mod liber după GPL).
    • O soluție bună este să creați o partiție complet nouă pentru sistemul de operare în curs de dezvoltare.

    Avertizări

    • Rescrierea neglijentă a sistemului de operare pe hard disk îl poate deteriora complet. ai grija
    • Nu vei avea un sistem complet în două săptămâni. Începeți cu un sistem de operare bootabil și apoi treceți la un material mai interesant.
    • Dacă faci ceva nechibzuit, cum ar fi să scrii octeți dezordonați în porturi I/O aleatoare, atunci distrugeți sistemul de operare și ar putea (teoretic) să vă ardeți hardware-ul.
    • Nu vă așteptați să fie ușor să construiți un sistem de operare de calitate. Există multe interdependențe complexe. De exemplu, pentru ca un sistem de operare să poată gestiona mai multe procesoare, managerul de memorie trebuie să aibă mecanisme de „blocare” pentru a împiedica procesoarele inutile să acceseze aceeași resursă în același timp. „Blocurile” folosite presupun un planificator pentru a se asigura că doar un procesor accesează o resursă critică la un moment dat, iar toate celelalte sunt inactive. Cu toate acestea, planificatorul depinde de prezența managerului de memorie. Acesta este un exemplu de dependență de blocaj. Nu există o modalitate standard de a rezolva aceste tipuri de probleme; fiecare creator de sistem de operare este de așteptat să fie suficient de calificat pentru a veni cu propria soluție.

    Surse de

    De ce ai nevoie

    • Calculator
    • Procesorul pe care urmează să construiți
    • Suficientă memorie cu acces aleatoriu (RAM) pentru mașina virtuală
    • Sistemul de operare primar (folosit pentru a dezvolta codul sursă în limbaj de asamblare (și colab.) Și construirea și pachetul timpuriu; în cele din urmă, propriul sistem de operare va deveni principal)
    • Editor de coduri de culoare de sintaxă (utilizat în absența mediului de dezvoltare integrat)
    • Compilator
    • Unitate CD/DVD
  • Ilya Alexandrov

    Ne creăm propriul sistem de operare bazat pe Linux

    Există sute de distribuții Linux și nu se știe câte vor mai apărea. Zeci de companii și mii de programatori concurează pentru a crea cel mai bun proiect Linux, în timp ce orice utilizator experimentat poate deveni autorul unui sistem PC de acasă care rivalizează cu produsele giganților IT.

    De-a lungul anilor de lucru cu Linux, am folosit un număr mare de distribuții diferite: Mandriva, Fedora, SlackWare, Debian, Ubuntu și multe altele. Un proiect mi-a plăcut mai mult, alții mai puțin. Dar în toate distribuțiile a trebuit inevitabil să se confrunte cu defecte grave care îngreunau foarte mult munca. Unul este prea solicitant cu resurse, celălalt nu suportă toate echipamentele necesare, al treilea îi lipsește diverse software-uri. Atunci mi-am amintit de cunoscuta înțelepciune orientală: dacă trebuie să faci ceva bine, fă-o singur.

    Linux de la zero

    Nu sunt singurul care a decis să înceapă să-și construiască propria versiune de Linux - un sistem de operare în care partea de bază a sistemului și nucleul vor fi luate ca bază, dar în care nu va mai fi un singur kilobyte în plus din dezvoltator, adică de la tine. Un număr mare de distribuții Linux care nu îndeplinesc cerințele utilizatorilor l-au împins pe Gerard Beekmans să creeze o distribuție care să ofere tuturor posibilitatea de a construi un sistem cu doar componentele și funcțiile de care au nevoie.

    Aspirația talentatului programator a rezultat în proiectul Linux from Scratch (www.linuxfromscratch.org), sau pe scurt LFS. Acest proiect vă permite să construiți de la zero, din coduri sursă, sistemul dumneavoastră de operare bazat pe Linux. LFS este compilat pe un computer cu un sistem Linux deja instalat, cu toate acestea, un Live-CD „avansat”, de exemplu, Knoppix, va face.

    În acest caz, sistemul Linux utilizat pentru construirea poate fi oricare - este necesară doar prezența unui compilator și a bibliotecilor de sistem. Linux From Scratch poate fi numit cu greu un kit de distribuție în sensul obișnuit al cuvântului - este ceva ca un software auxiliar care, împreună cu partea de bază a sistemului de operare, vă va permite să vă creați propria versiune unică a sistemului de operare.

    După cum știți, Linus Torvalds și-a dezvoltat sistemul de operare sub motto-ul „Doar pentru distracție!” – adică doar de dragul plăcerii. Trebuie să recunosc că LFS chiar nu se găsește des pe servere, acest sistem fiind de obicei folosit de pasionații de computere. Instalarea și lucrul cu Linux de la zero vă va ajuta să înțelegeți interconectarea componentelor sistemului de operare, ceea ce vă va fi util pentru propria dvs. dezvoltare a unei distribuții Linux, și nu numai bazată pe LFS. Prin urmare, LFS este conceput în mare măsură pentru acei oameni pentru care procesul de construire a propriei distribuții este distractiv și interesant - și există mulți astfel de oameni, credeți-mă.

    Deci, dacă sunteți gata să petreceți o zi întreagă (sau chiar mai mult) pentru construirea unui sistem, atunci vă recomand să descărcați LFS-packages-6.0, LFS-book de pe site (2) și să continuați să citiți acest articol.

    Partiționarea unui disc și crearea unui arbore de directoare

    Pentru o mai bună înțelegere a materialului, vom descrie întregul proces în termeni generali (vezi Fig. 1).

    În prima etapă, folosind kitul de distribuție deja instalat sau LiveCD, discul este partiționat. O partiție este alocată pe hard disk pentru noul sistem. După aceea, în această secțiune, va trebui să compilați static toate programele necesare și nucleul de sistem. Apoi, directorul rădăcină este schimbat într-o partiție de hard disk alocată pentru noul nostru sistem de operare. Va trebui să compilați din nou, dar de data aceasta software-ul trebuie să fie compilat dinamic (diferența dintre compilarea dinamică și compilarea statică va fi descrisă mai jos). Ultimul pas implică construirea bibliotecii esențiale glibc și configurarea sistemului de operare instalat. După cum puteți vedea, nu trebuie să faceți nimic deosebit de dificil.

    Pe parcursul întregului proces, asistentul tău principal este documentația din pachetul LFS-book, a cărei traducere în limba rusă poate fi găsită aici: http://multilinux.sakh.com/download/lfsbook.tar.bz2. Cartea acoperă în detaliu fiecare pas al construirii unui sistem de operare, așa că asigurați-vă că consultați acest ghid în caz de probleme (acest articol nu are scopul de a înlocui o documentație atât de extinsă).

    Creați o nouă partiție - în cazul meu / dev / hda5, deoarece partiția / dev / hda1 este deja ocupată de hard disk-ul Slackware Linux instalat. Este recomandat să faceți mai întâi o copie de rezervă a sistemului, astfel încât să îl puteți restaura în caz de deteriorare, deși probabilitatea ca aceasta este aproape de zero. Și aici, cred, totul este clar: alocam cantitatea necesară (23 GB sunt suficiente) pentru directorul rădăcină, un spațiu egal cu dublul cantității de RAM - pentru o partiție de swap, dacă doriți, puteți crea partiții separate pentru directorul de acasă (/ home) și pentru / boot. Cu toate acestea, opțiunea populară de partiționare - pentru a aloca tot spațiul disponibil minus schimbul pentru directorul rădăcină și crearea ulterioară a schimbului în sine - este, de asemenea, destul de acceptabilă atunci când se construiește LFS. Pe computerul autorului și Linux, Slackware, care este sistemul de operare părinte, și LFS folosesc același hard disk, cu toate acestea, instalarea LFS pe un alt hard disk nu este, de asemenea, dificilă.

    Alegeți sistemul de fișiere la discreția dvs.: nu au existat probleme atât cu Ext3, cât și cu ReiserFS sub LFS. Dar fanii XFS vor trebui să se supere - încercările de a face Linux From Scratch să funcționeze cu acest FS nu au fost încununate cu succes.

    Acum montem partiția dedicată noului sistem de operare:

    $ mount / dev / hda5 / mnt / mylin

    Pentru comoditate, să definim variabila MYLIN:

    $ export MYLIN = / mnt / mylin

    Grozav, pentru lucrări ulterioare este mai bine să creați un utilizator separat mylin, pe care îl vom atribui proprietarului partiției montate.

    $ useradd mylin

    $ chown –R mylin $ MYLIN

    Trebuie să creăm un arbore de directoare la rădăcina noii secțiuni:

    $ cd $ MYLIN

    $ mkdir –p bin boot dev etc home lib mnt opt ​​​​root sbin usr / (X11R6, local) var

    Creați structura necesară în directoarele usr, usr / X11R6, usr / locale: subdirectoare bin, etc, include, lib, sbin, share, src.

    Apoi vom face același lucru pentru directoarele / var și / opt ale viitorului sistem:

    $ mkdir var / (cache, lib, local, blocare, jurnal, opt, rulare, spool)

    $ mkdir opt / (bin, doc, include, info, lib, man)

    Să nu uităm că există ierarhii mai profunde, de exemplu / usr / share / man / man1. Dar volumul articolului nu permite să oferiți aici toate informațiile despre structura arborelui de fișiere, așa că fie trebuie să utilizați documentul Standard Hierarhy Filesystem (poate fi găsit la: http://linux-ve.net/ MyLDP/file-sys/fhs-2.2-rus) sau studiați cu atenție structura sistemului de operare al familiei Linux pe care ați instalat-o deja. După pregătirea hard disk-ului, trecem la asamblarea statică.

    Construcție statică

    De ce folosim construcția statică? Compilarea statică atașează codul sursă al bibliotecii la codul aplicației, ceea ce îi mărește dimensiunea, dar în același timp menține integritatea. Cu compilarea dinamică, biblioteca este localizată într-un fișier separat, care este accesat de aplicații după cum este necesar. Ca rezultat, toate programele funcționează cu o singură versiune a bibliotecii.

    Dar când folosim comanda chroot pentru a seta directorul rădăcină pentru sistemul nou construit, bibliotecile „părinte”, sistemul instalat situat în / lib, / usr / lib și altele, nu vor mai fi disponibile, deci dinamic programele compilate vor refuza să funcționeze, în plus, compatibilitatea versiunilor de către oricine nu este garantată.

    Pentru a evita acest lucru, vom colecta mai întâi toate software-urile necesare pentru viitorul nostru sistem static. Să începem cu shell-ul bash. (Fanii ZSH sau TCSH își pot instala interpreții preferati după instalarea sistemului, dar în etapa de construire utilizarea lor nu este furnizată de autorul LFS). Ar trebui să verificați dacă aveți fișierul /usr/lib/libcurses.a și dacă nu, instalați pachetul nсursesdev. Toate pachetele trebuie să fie compilate cu steaguri de construcție statice: „--enable-static-link”, „--disable-shared” sau „--static”. Care este potrivit pentru fiecare caz particular, puteți afla din documentația pentru un anumit pachet sau din rezultatul scriptului de configurare lansat cu parametrul „--help”.

    $ ./configure –-help

    Pentru a nu confunda programele ulterioare compilate static cu cele „dinamice”, creați un director special pentru ele:

    $ mkdir $ MYLIN / stat

    Când construiți și instalați pachete, nu uitați să adăugați parametrul „--prefix = $ MYLIN / stat” pentru a muta fișierele în acest director particular. În cele din urmă, instalăm bash:

    $ ./configure –-enable-static-link --prefix = $ MYLIN / stat

    $ face

    $ make install

    Colectăm restul pachetelor necesare în același mod. : binutils, bzip2, textutils, texinfo, tar, sh-utils, gcc, grep, gzip, gawk, diffutils, fileutils, make, patch, sed,și, de fapt, Linux-kernel.

    Da, atunci când compilați nucleul, nu uitați că pentru versiunile mai vechi de nuclee (2.2.x-2.4.x) trebuie să utilizați gcc 2.95, iar pentru versiunea actuală 2.6.x este recomandat să utilizați gcc 3.x, deci ca nu sunt probleme.

    Nu uitați să vă uitați la secțiunile corespunzătoare ale cărții LFS, spune despre aceasta și multe alte nuanțe. În general, compilarea nucleului în LFS nu diferă de o procedură similară efectuată atunci când se utilizează kitul de distribuție instalat pe HDD. Dezarhivați sursele nucleului în $ MYLIN / usr / src / linux-2.6.xx, apoi configurați-l rulând:

    $ make menuconfig

    Procesul de configurare a parametrilor nucleului a fost descris de multe ori pe Internet (6), nu este nevoie să ne oprim mai detaliat asupra acestui lucru. În continuare, dăm următoarele comenzi în directorul cu sursele kernel-ului Linux:

    $ make bzImagine

    $ face module

    Gata, există un nucleu nou la $ MYLIN / usr / src / linux-2.6.xx / arch / i386 / boot / bzImage.

    Apoi, creăm fișierele $ MYLIN / etc / passwd și $ MYLIN / etc / grup. În primul, înregistrăm singurul utilizator de până acum - root cu orice parolă, iar în al doilea grup de utilizatori (pentru a începe, va fi suficient și un grup de rădăcină).

    Aceasta încheie pregătirile noastre pentru următorul pas și trecem la o asamblare dinamică mai subtilă.

    Construcție dinamică

    Acum trebuie să schimbăm directorul rădăcină în / mnt / mylin, unde vom folosi doar utilități compilate static - nu vom mai putea folosi instrumentele din sistemul de operare „părinte”. Dăm comanda în consolă:

    $ chroot $ MYLIN / usr / bin / env –i

    > HOME = / rădăcină TERM = $ TERM PS1 = ’u: w $’

    > PATH = / bin: / usr / bin: / sbin: / usr / sbin: / stat / sbin

    > / stat / bin / bash --login

    Cu această comandă, am specificat căile către fișierele executabile, tipul terminalului, interpretul și tipul promptului liniei de comandă.

    Pentru ca unele programe să funcționeze, sistemul de fișiere proc trebuie să fie instalat pe noul sistem.

    $ mount proc / proc -t proc

    A venit cel mai crucial moment. Construirea bibliotecii glibc. El este cel mai responsabil pentru că majoritatea programelor necesare nu vor funcționa fără el și nu are rost să folosești Linux fără biblioteca principală. Construirea glibc este adesea problematică.

    La construirea, am specificat parametrul „--prefix = $ MYLIN / stat”, astfel încât atunci când rădăcina este schimbată, toate pachetele construite static vor apărea în directorul / stat al noii partiții de sistem de operare.

    Deci, despachetați arhiva glibc-2.x.x.tar.gz (de exemplu, în directorul / usr / src /) și mergeți la directorul glibclinuxthreads. Va trebui să modificăm ușor codul sursă din cauza faptului că în această etapă a sistemului este imposibil să identificăm utilizatorul după nume (doar din cauza lipsei glibc și a altor biblioteci) și a faptului că pentru a instala glibc aveți nevoie de un interpret Perl, pe care noi nu îl avem.

    Înlocuim rădăcina numelui de utilizator din login / Makefile cu uid-ul său, care este 0, iar variabila $ PERL din malloc / Makefile ar trebui înlocuită cu calea către interpret - / usr / bin / perl - și va fi pur și simplu ignorat în timpul configurării.

    $ /usr/src/glibc-2.x.x/configure --prefix = / usr --enable-add-ons --libexecdir = / usr / bin &&

    & face

    & face instalarea

    $ make localedata / install-locales

    $ / stat / bash --login

    Dacă ați făcut totul corect, glibc va compila, „root” va apărea în cele din urmă la prompt și toate programele pot fi recompilate dinamic.

    Finalizați instalarea nucleului:

    $ make modules_install

    $ make install

    Pentru a muta noul nucleu în directorul / boot, executați încă o comandă:

    $ make unstall

    Colectăm toate programele instalate și unele noi, acum fără steaguri de compilare statică. Vom avea nevoie (în această etapă este foarte important să nu uităm să compilam toate următoarele) (vezi tabelul 1).

    Tabelul 1. Set necesar de pachete pentru asamblare

    autoconf

    grep

    perl

    automake

    groff

    bash

    gzip

    procinfo

    bin86

    procps

    binutils

    Mai puțin

    psmisc

    bzip2

    reiserfs-progs

    diffutils

    libtool

    e2fsprogs

    lilo

    sh-utils

    umbră

    fişier

    face

    sysklogd

    fileutils

    makedev

    sysvinit

    findutils

    pagini de manual

    contracta

    modutile

    texinfo

    bălălău

    nblesteme

    textutils

    netkitbase

    util-linux

    zimbri

    net-instrumente

    gettext

    plasture

    După efectuarea recompilării dinamice, puteți șterge directorul cu pachete construite static:

    $ rm -rf / stat

    Puteți respira ușurat și puteți bea cafea - cea mai dificilă, rutina este lăsată în urmă. Să trecem la următoarea etapă - configurația inițială a sistemului nostru.

    Configurarea inițială a sistemului

    Înainte de a continua configurarea, observ că toate modificările trebuie făcute în fișierele directorului noului sistem de operare, și nu în sistemul părinte.

    Pentru a seta ora sistemului, creați fișierul / etc / sysconfig / clock, care conține doar o singură linie:

    UTC = 0

    Acum, ceasul computerului va afișa ora în fusul dvs. orar - cu condiția ca ora din BIOS să fie setată corect.

    Să dăm computerului un nume:

    echo "HOSTNAME = my_linux"> / etc / sysconfig / network

    Acum vom specifica partițiile pe care sistemul ar trebui să le monteze la pornire în / etc / fstab:

    # opțiuni de tip fs-point de montare pentru sistemul de fișiere dump fsck-order

    Valori implicite / dev / hda5 / ext3 1 1

    / dev / hda3 swap swap pri = 1 0 0

    proc / proc proc implicite 0 0

    În loc de / dev / hda3 și / dev / hda5, scrieți partițiile (root și swap), adăugați puncte de montare pentru alte hard disk și partiții CD-ROM, dacă este necesar.

    Acum să facem sistemul nostru bootabil.

    Dacă, pe lângă lFS, utilizați alte distribuții Linux, atunci acum trebuie să vă conectați la vechiul sistem - pentru aceasta rulăm comanda:

    $ ieșire

    Deja în sistemul de operare părinte, adăugați următoarele în fișierul /etc/lilo.conf:

    # LFS

    imagine = / boot / bzImage

    Etichetă = lfs

    Rădăcină =

    Numai citire

    Este clar că „/ boot / bzImage” este calea către nucleul pe care l-ați compilat pentru sistem, iar „partiția” este partiția de disc în care se află directorul rădăcină.

    Dacă nu intenționați să utilizați alte sisteme de operare și distribuții Linux, atunci treceți direct la configurarea LILO în LFS.

    În acest caz, lilo.conf va arăta cam așa:

    boot = / dev / hda

    Întârziere = 40

    Compact

    Vga = normal

    Rădăcină = / dev / hda1

    Numai citire

    Imagine = / boot / zImage-2.6.12

    Etichetă = Linux

    Faceți modificările necesare în funcție de configurația dvs. Actualizăm bootloader-ul cu comanda:

    $ / sbin / lilo –v

    Și, dacă toți pașii anteriori au fost executați corect, ne vom regăsi într-un sistem nou. Cu toate acestea, o etapă lungă de reglare „fină” (o atenție deosebită trebuie acordată securității noului sistem, deoarece LFS în mod implicit pare destul de neprotejat, ca orice sistem de operare nou instalat) este încă în față. Dar aveți deja o versiune de Linux auto-asamblată.

    P.S

    Gerard Bickmans nu este singurul care are ideea de a-și crea propriul Linux. Un alt proiect, BYOLinux, condus de Jonatan Thorpe, și-a oprit astăzi dezvoltarea, deși documentația scrisă rămâne actuală, dar nu este la fel de detaliată ca cartea LFS și nu a fost tradusă în limba rusă. Principala diferență în metoda lui John este că glibc este portat de la părinte la copil fără recompilare, ceea ce nu este la fel de eficient, dar evită multe probleme de construcție. Unii utilizatori FreeBSD doresc, de asemenea, să se simtă ca un designer de sistem de operare.

    Acum, acest lucru este foarte posibil - la http://ezine.daemonnews.org/200302/fbsdscratch.html există un articol despre construirea FreeBSD din sursă în ansamblu - de la distribuții la porturi, iar metoda nu este similară cu cea obișnuită " reconstruire" a sistemului, dar similar cu metoda Gerard Beekmans. Ei bine, acum ai propriul tău sistem unic bazat pe Linux. În caz de probleme, căutați soluția lor în cartea LFS, totul este descris în detaliu acolo. De asemenea, recomand să descărcați Ghidul Administratorului de Rețea Linux de pe portalul http://www.tldp.org, deși nu are legătură directă cu LFS, va fi util în etapa de configurare a sistemului. Nu uitați că fiecare program vine și cu diverse pagini de manual și informații, care sunt, de asemenea, concepute pentru a ușura viața utilizatorilor Linux.

    1. Cartea LFS în limba rusă - http://multilinux.sakh.com/lfs.
    2. Portalul oficial al proiectului LFS este http://www.linuxfromscratch.org.
    3. Portal ByoLinux - http://www.byolinux.org.
    4. FreeBSD articol de la zero - http://ezine.daemonnews.org/200302/fbsdscratch.html.
    5. Un articol despre compilarea nucleului Linux - http://vikos.lrn.ru/MyLDP/kernel/kompil-2-6.html.
    6. Bayrak A. Review of Knoppix 3.7 Russian Edition. - Jurnal „Administrator de sistem”, nr. 3, martie 2005 - 4-6 p. ().

    Această serie de articole este dedicată programării de nivel scăzut, adică arhitecturii computerelor, proiectării sistemului de operare, programării în limbaj de asamblare și domeniilor conexe. Până acum, doi habrauseri sunt angajați în scris - iley și pehat. Pentru mulți elevi de liceu, studenți și programatori profesioniști, aceste subiecte se dovedesc a fi foarte greu de învățat. Există multă literatură și cursuri despre programarea la nivel scăzut, dar este dificil să obțineți o imagine completă și cuprinzătoare din acestea. Este dificil, după ce am citit una sau două cărți despre asamblare și sisteme de operare, să ne imaginăm, cel puțin în termeni generali, cum funcționează de fapt acest sistem complex de fier, siliciu și multe programe - un computer.

    Fiecare rezolvă problema învățării în felul său. Cineva citește multă literatură, cineva încearcă să treacă rapid la practică și să înțeleagă pe parcurs, cineva încearcă să explice prietenilor tot ceea ce studiază. Și am decis să combinăm aceste abordări. Deci, în acest curs de articole, vom demonstra pas cu pas cum să scrieți un sistem de operare simplu. Articolele vor avea un caracter general, adică nu vor conține informații teoretice exhaustive, totuși, vom încerca întotdeauna să oferim link-uri către materiale teoretice bune și să răspundem la toate întrebările care apar. Nu avem un plan clar, așa că multe decizii importante vor fi luate pe parcurs, ținând cont de feedback-ul dumneavoastră.

    Poate că vom opri în mod deliberat procesul de dezvoltare pentru a vă permite dvs. și nouă înșine să înțelegeți pe deplin toate consecințele unei decizii greșite, precum și să perfecționăm unele abilități tehnice asupra acesteia. Deci nu ar trebui să iei deciziile noastre ca fiind singurele corecte și să ai încredere orbește în noi. Încă o dată, subliniem că ne așteptăm ca cititorii să fie activi în discutarea articolelor, care ar trebui să influențeze puternic dezvoltarea generală și scrierea articolelor ulterioare. În mod ideal, am dori să vedem unii dintre cititori să se alăture dezvoltării sistemului în timp.

    Vom presupune că cititorul este deja familiarizat cu elementele de bază ale limbajelor de asamblare și C, precum și cu conceptele de bază ale arhitecturii computerelor. Adică nu vom explica ce este un registru sau, să zicem, o memorie cu acces aleatoriu. Dacă nu aveți suficiente cunoștințe, puteți oricând să consultați literatura suplimentară. O scurtă listă de referințe și link-uri către site-uri cu articole bune se află la sfârșitul articolului. De asemenea, este de dorit să puteți utiliza Linux, deoarece toate instrucțiunile de compilare vor fi date special pentru acest sistem.

    Și acum - mai la obiect. În restul articolului, vom scrie un program clasic „Hello World”. Lumea noastră Hello se va dovedi a fi puțin specifică. Nu va rula de pe niciun sistem de operare, ci direct, ca să spunem așa, „pe bare metal”. Înainte de a trece direct la scrierea codului, să ne dăm seama cum încercăm exact să facem acest lucru. Și pentru aceasta trebuie să luați în considerare procesul de pornire a computerului.

    Deci, luați computerul preferat și apăsați pe cel mai mare buton de pe unitatea de sistem. Vedem un ecran de splash vesel, unitatea de sistem emite un bip fericit cu un difuzor, iar după un timp sistemul de operare este încărcat. După cum înțelegeți, sistemul de operare este stocat pe hard disk și aici apare întrebarea: cum a pornit magic sistemul de operare în RAM și a început să se execute?

    Știți acest lucru: sistemul care se află pe orice computer este responsabil pentru acest lucru, iar numele său - nu, nu Windows, vă așteaptă limba - se numește BIOS. Numele său înseamnă Basic Input-Output System, adică sistemul de bază de intrare-ieșire. BIOS-ul se află pe un mic microcircuit de pe placa de bază și pornește imediat după apăsarea butonului mare ON. BIOS-ul are trei sarcini principale:

    1. Detectați toate dispozitivele conectate (procesor, tastatură, monitor, RAM, placă video, cap, brațe, aripi, picioare și cozi...) și verificați-le pentru funcționare. Programul POST (Power On Self Test) este responsabil pentru acest lucru. Dacă hardware-ul vital nu este găsit, atunci niciun software nu va putea ajuta, iar în acest moment difuzorul sistemului va scârțâi ceva sinistru și sistemul de operare nu va ajunge deloc în sistemul de operare. Să nu vorbim despre trist, să presupunem că avem un computer complet funcțional, ne bucurăm și trecem la examinarea celei de-a doua funcție BIOS:
    2. Furnizarea sistemului de operare cu un set de bază de funcții pentru lucrul cu hardware. De exemplu, prin funcțiile BIOS, puteți afișa text pe ecran sau puteți citi date de la tastatură. Prin urmare, se numește sistemul I/O de bază. De obicei, sistemul de operare accesează aceste funcții prin întreruperi.
    3. Lansarea încărcării sistemului de operare. În acest caz, de regulă, se citește sectorul de boot - primul sector al purtătorului de informații (dischetă, hard disk, CD, unitate flash). Ordinea mediilor de interogare poate fi setată în BIOS SETUP. Sectorul de boot conține un program numit uneori încărcător de pornire primar. În linii mari, sarcina bootloader-ului este să pornească sistemul de operare. Procesul de pornire al unui sistem de operare poate fi foarte specific și foarte dependent de caracteristicile acestuia. Prin urmare, bootloader-ul primar este scris direct de dezvoltatorii sistemului de operare și este scris în sectorul de pornire în timpul instalării. În momentul în care pornește bootloader-ul, procesorul este în modul real.
    Veste tristă: dimensiunea bootloader-ului ar trebui să fie de numai 512 octeți. De ce atât de puțini? Pentru a face acest lucru, trebuie să ne familiarizăm cu dispozitivul dischetei. Iată o poză informativă:

    Imaginea arată suprafața unei unități de disc. Discheta are 2 suprafete. Fiecare suprafață are urme în formă de inel. Fiecare pistă este împărțită în bucăți mici, arcuite, numite sectoare. Deci, din punct de vedere istoric, un sector de dischetă are o dimensiune de 512 octeți. Primul sector de pe disc, sectorul de boot, este citit de BIOS în segmentul de memorie zero la offset 0x7C00, iar apoi controlul este transferat la această adresă. Încărcătorul de pornire se încarcă de obicei în memorie nu sistemul de operare în sine, ci un alt încărcător. program stocat pe disc, dar dintr-un motiv oarecare (cel mai probabil, acest motiv este dimensiunea) care nu se încadrează într-un singur sector. Și, deoarece rolul sistemului de operare nostru este jucat până acum de un banal Hello World, scopul nostru principal este să faceți computerul să creadă în existența sistemului nostru de operare, chiar dacă doar pe un sector, și rulați-l.

    Cum funcționează sectorul de boot? Pe un computer, singura cerință pentru sectorul de boot este ca ultimii doi octeți să conțină valorile 0x55 și 0xAA - semnătura sectorului de boot. Deci, este deja mai mult sau mai puțin clar ce trebuie să facem. Să scriem codul! Codul de mai sus este scris pentru asamblatorul yasm.

    secțiune. text

    folosi16

    org 0x7C00 ; programul nostru este încărcat la 0x7C00

    start:

    mov ax, cs

    mov ds, ax ; selectați segmentul de date



    mov si, mesaj

    cld ; direcție pentru comenzi șir

    mov ah, 0x0E ; Numărul funcției BIOS

    mov bh, 0x00 ; pagina de memorie video

    puts_loop:

    lodsb ; încărcați următorul caracter în al

    test al, al ; caracterul nul înseamnă sfârșitul rândului

    jz puts_loop_exit

    int 0x10 ; apelați funcția BIOS

    jmp puts_loop

    puts_loop_exit:

    jmp $; ciclu etern



    mesaj:

    db „Bună lume!” , 0

    finalizarea:

    ori 0x1FE - terminare + start db 0

    db 0x55, 0xAA ; semnătura sectorului de boot

    Acest scurt program necesită o serie de explicații importante. Linia org 0x7C00 este necesară pentru ca asamblatorul (mă refer la program, nu la limbaj) să calculeze corect adresele pentru etichete și variabile (puts_loop, puts_loop_exit, mesaj). Așa că îl informăm că programul va fi încărcat în memorie la adresa 0x7C00.
    În rânduri
    mov ax, cs

    mov ds, ax
    segmentul de date (ds) este setat egal cu segmentul de cod (cs), deoarece în programul nostru atât datele, cât și codul sunt stocate într-un singur segment.

    Apoi mesajul „Hello World!” este afișat caracter cu caracter în buclă. Funcția 0x0E a întreruperii 0x10 este utilizată pentru aceasta. Are urmatorii parametri:
    AH = 0x0E (numărul funcției)
    BH = numărul paginii video (nu vă deranjați încă, specificați 0)
    AL = cod de caractere ASCII

    La linia „jmp $” programul se blochează. Și pe bună dreptate, nu este nevoie ca ea să execute cod suplimentar. Cu toate acestea, pentru ca computerul să funcționeze din nou, va trebui să reporniți.

    În linia „times 0x1FE-finish + start db 0”, restul codului programului (cu excepția ultimilor doi octeți) este umplut cu zerouri. Acest lucru se face astfel încât după compilare semnătura sectorului de boot să apară în ultimii doi octeți ai programului.

    Am descoperit codul programului, acum haideți să încercăm să compilăm această fericire. Pentru compilare, avem nevoie, de fapt, de un asamblator - cel menționat mai sus

    Mai devreme sau mai târziu, fiecare utilizator Linux se gândește să-și creeze propriul kit de distribuție. Unii susțin că poți „personaliza totul pentru tine”. Alții se plâng că nu există un ideal printre distribuțiile deja prezentate în Filială. Și se presupune că au idei superconceptuale pentru propriul lor sistem. De ce am început toată această psihologie? Pentru a tăia imediat oxigenul pentru începătorii care se joacă cu Linux, care nu au ce face. Dacă vă gândiți deja să creați un sistem de operare, gândiți-vă până la capăt. Asa de,

    Vreau să creez un sistem de operare bazat pe Linux.
    Vă avertizez imediat: ar fi fost secolul al XVIII-lea, toți cei care, pentru baza viitorului lor sistem, aleg un alt kit de distribuție dezvoltat (și, Doamne ferește, unul popular...) ar fi spânzurați. Postarea este despre crearea unui sistem de la zero, ceea ce înseamnă că nu vom atinge niciun Slax și Linux Mint.

    Pasul 1. Selectați media
    Există puține opțiuni: fie sistemul de operare pornește de pe un LiveCD, fie de pe un hard disk, fie de pe un dispozitiv flash. O să fac o rezervare imediat: nu voi spune un cuvânt despre hard disk în postare, pentru că este mult mai convenabil să creezi un kit de distribuție flexibil din seria „Port totul cu mine”, sau un blocat. kit de distribuție pe un disc optic. Dacă înveți cum să creezi un sistem LiveCD sau LiveUSB, nu va fi nicio problemă la instalarea pe un hard disk.

    Pentru orice eventualitate, pregătiți un stick USB gol, un CD-ROM și, în sfârșit, instalați Virtualbox.

    Pasul 2. Compilarea nucleului
    În ceea ce privește lansarea celui de-al treilea nucleu Linux, acest pas încurajează dezvoltarea ulterioară... Deci, avem nevoie de sursele kernelului. Fiecare utilizator știe că pot fi obținute de la kernel.org. În niciun caz, auziți?, nu înșurubați niciodată un nucleu terță parte care nu a fost compilat de dvs. în sistemul dvs.!

    Deoarece lenea mea era în afara topurilor, am creat folderul / linuxkernel și am despachetat arhiva cu sursele de acolo. După ce m-am conectat ca root, am făcut următoarele:

    cd / linuxkernel
    face menuconfig

    Practic, nucleul poate fi configurat în trei moduri: make config (configurare dialog), make menuconfig (configurare pseudografică prin ncurses) și make xconfig (configurare grafică). Concluzia este că make config îți va distruge starea de spirit pentru mult timp, pentru că el va pune toate întrebările posibile cu privire la toate aspectele tuturor subiectelor. Problema cu make xconfig nu este întâlnită de toată lumea, dar am întâlnit-o și încă o fac. Dacă doriți să o faceți prin X, înțelegeți-l singur. Cea mai bună opțiune este make menuconfig. Acest lucru îți va deschide o interfață pseudo-grafică prin care poți personaliza nucleul în felul tău. Lucrul necesită biblioteca ncurses, care este ușor de instalat.

    Practic, dacă creierul tău înțelege Linux deloc, poți să-ți dai seama de configurație. Procesul este interesant, există într-adevăr multe opțiuni, iar ajutorul, deși este în limba engleză, încă mulțumește cu accesibilitatea și simplitatea sa.

    Totuși, tot trebuie să te ghidezi. Accesați Sisteme de fișiere ---> și adăugați asteriscurile necesare. Litera M înseamnă că acesta sau acel driver este acceptat prin conectarea la miezul unui modul extern (îi urăsc!). De asemenea, avem nevoie de suport Isofs pentru a citi discurile. Sisteme de fișiere ---> Sisteme de fișiere CD-ROM / DVD ---> Suport pentru sistemul de fișiere ISO 9660 CDROM. Puteți încă susține vechile sisteme Dosov.

    Nebunii dezvoltatori Mandriva au uitat să activeze Sisteme de fișiere ---> Sisteme de fișiere DOS / FAT / NT ---> Suport de scriere NTFS, iar pe una dintre distribuțiile lor mă luptam cu accesul la vechea partiție Wind.

    Aruncă o privire la Tipul și caracteristicile procesorului ---> Familia de procesoare, am fost sfătuit să merg pe Pentium-MMX.

    Scotocește și în driverele de dispozitiv, este util. Pentru distracție, puteți selecta totul acolo și puteți compila un nucleu cu o greutate > 50 MB.

    Mai departe. După încărcare, nucleul trebuie să încarce sistemul în sine. Fie din fișiere compilate (utilizate în sistemele încorporate), fie dintr-o arhivă CPIO comprimată cu ceva, fie din Initrd. Aici nu sunteți DOS, aici nu vă veți putea referi imediat la un fișier init „nou în directorul rădăcină al unui disc sau al unei unități flash. De fapt, va funcționa, nu ascultați unchiul Annix! Acest lucru este greșit, deși există deja o controversă bolnăvicioasă pe Internet despre acest lucru, vom folosi initrd pe sistemul nostru, deoarece este convenabil și nu va provoca expresii obscene de la dezvoltatori terți, spre deosebire de arhiva CPIO.

    Da, compilați nucleul cu comanda

    Dacă aveți x86, îl puteți găsi la / linuxkernel / arch / x86 / boot / bzImage.

    Pentru programatorii duri din Chelyabinsk, puteți utiliza compilarea încrucișată...

    Crearea Ramdisk-ului.

    Acum avem nevoie de un initrd cu cel mai simplu shell instalat acolo. Vom folosi busybox pentru că poate face orice. Vom fura metoda lui Roberto de Leo, creatorul Movix (aș începe chiar să-l respect dacă nu ar fi dragostea lui revoltătoare pentru Perl):

    dd if = / dev / zero of = / dev / ram0 bs = 1k count = 5000 - Creați un Ramdisk în memoria RAM a computerului nostru.
    mke2fs -m0 / dev / ram0 5000 - Formatați discul Ram pe Ext2
    mkdir / distro - Creați un folder
    mount / dev / ram0 / distro - Montați în folderul / distro

    Gata, acum avem un Ramdisk cu o capacitate de 5 MB. Mai mult este posibil, doar nu este necesar. Spre deosebire de Thomas Matejisek, nu voi umple initrd-ul cu module comprimate LZMA în Squashfs. Orice este necesar va fi compilat cu nucleul. Da, acest lucru nu este foarte logic și corect, dar bătaia de cap este de o sută de ori mai mică. Și mai ales pentru cei care condamnă această abordare, puteți activa opțiunea de modularitate din nucleu: Activați suportul pentru module încărcate.

    În Ramdisk-ul nostru, montat în / distro, există un astfel de folder, lost + found.Aceasta se datorează faptului că l-am formatat în ext2.În niciun caz nu trebuie să-l ștergeți, deși cu greu vă va ajuta aici, imaginea este reparată.ar busybox primul pus...

    Se instalează Busybox
    De aceea proiecte atât de grozave au site-uri atât de proaste? Deși... acest lucru nu mai este important dacă sursele sunt descărcate și despachetate cu succes în folderul / busybox.

    Puteți configura busybox în același mod:

    cd / busybox
    face menuconfig

    Daca nu ai inteles inca ce este, iti explic. Busybox înlocuiește tone de aplicații UNIX stocate în folderele / bin, / sbin, / usr / bin, / usr / sbin. În schimb, este creată o singură aplicație: / bin / busybox și sunt create o grămadă de link-uri către aceasta în folderele de mai sus. Instalați busybox cu următoarea comandă:

    face CONFIG_PREFIX = / distro install

    Busybox va crea, de asemenea, fișierele / sbin / init și din anumite motive / linuxrc, astfel încât sistemul dvs. să pornească corect. Cu toate acestea, nu toate folderele necesare au fost create. Așa că terminăm totul cu mâinile noastre și creăm:

    / distro / etc
    / distro / lib
    / distro / dev
    / distro / mnt
    distro / proc
    / distro / root
    / distro / tmp
    / distro / root

    Dacă ai uitat ceva - amintește-ți, tk. este greu să uiți aceste directoare.

    Totul ar fi bine, dar busybox necesită biblioteci pentru a funcționa, care trebuie copiate în kitul nostru de distribuție. Este foarte ușor să afli care:

    ldd / distro / bin / busybox

    Programul ne va arăta bibliotecile necesare pentru shell-ul nostru. Spun imediat: poarta linux este creată de kernel și nu poate fi copiată.

    Când copiați biblioteci, puteți tăia informațiile de depanare (după cum ne sfătuiește Roberto):

    objcopy --strip-debug de unde până unde

    Facem Linux din Linux

    Mai multe fișiere text de sistem trebuie create:

    Avem nevoie de / etc / inittab. O să vă surprind: la începutul vieții, sistemul nici măcar nu știe ce este Root. Avem chiar și un utilizator fără nume, dar fișierul cu caracteristici de nivel scăzut (ONF) la nivel de sistem trebuie să fie prezent. Conținutul pilot al fișierului este următorul:

    # Primul fișier care se rulează, / sbin / init mai târziu.
    :: sysinit: /etc/rc.d/rc.S

    # Rulați shell în consolă.
    :: respawn: - / bin / sh

    # Comenzi de executat înainte de oprire și repornire.
    :: shutdown: / sbin / swapoff -a> / dev / null 2> & 1
    :: shutdown: / bin / umount -a -r> / dev / null 2> & 1

    Următorul fișier este / etc / fstab. Acesta este un tabel care descrie ce și unde se montează la pornire. Lucru inutil! Trebuie să montem proc, altfel nimic nu va funcționa deloc, așa că în fișier scriem:

    none / proc proc implicite 0 0

    Montarea are nevoie și de fișierul / etc / mtab. Creați-l și lăsați-l necompletat.

    Dar mount va face tot ce este necesar atunci când îi cerem în mod explicit să facă acest lucru. Și vom întreba în același fișier inițial de boot /etc/rc.d/rc.S (rc.d este folderul). Întrebăm politicos:

    / bin / mount -av -t nonfs

    Avem nevoie și de un fișier de profil (b) (a) sh, în general există spațiu pentru imaginație. Creați fișierul de profil / etc / și completați-l cu următoarele:

    PATH = "$ PATH: / bin: / sbin: / usr / bin: / usr / sbin:"
    MAI MIN = -MM
    TERM = linux
    HOME = / rădăcină
    PS1 = ">"
    PS2 = ">"
    ignoreeof = 10
    export PATH DISPLAY LESS TERM PS1 PS2 HOME ignoreeof

    Veți avea nevoie și de fișierul / etc / shell, care indică faptul că există un shell:

    / bin / sh
    / coș / cenușă
    / bin / bash

    Asta e tot. Puteți scrie Ramdisk-ul nostru într-un fișier.

    mkdir / os - folder pentru „terminat”.
    umount / dev / ram0 - demontează o bucată de RAM.
    dd if = / dev / ram0 of = / os / initrd bs = 1k count = 5000 - creați un fișier.
    gzip / os / initrd - comprimă fișierul initrd

    Crearea unei unități USB bootabile

    „Întinderea acasă” a micului nostru design. Luăm o unitate flash USB, o introducem, o formatăm în vfat (puteți folosi și ext, dar nu uitați că nu toți utilizatorii de Windows s-au împușcat încă).

    Pe unitatea flash USB, creați un folder de boot, în el folderele initrd și kernel.

    Copiați Ramdisk-ul comprimat din folderul / os în folderul boot / initrd de pe unitatea flash, numiți-l „main.gz”. Copiați bzImage din folderul cu sursele kernel-ului în folderul de boot / kernel de pe unitatea flash, numiți-l „main.lk”. Obținem fișierele de bootloader Syslinux (pe Internet, sau din altă distribuție: nu contează aici), și anume syslinux.bin, syslinux.boot, syslinux.cfg. Le copiem în directorul rădăcină al unității noastre flash. Scriem așa ceva în fișierul syslinux.cfg:

    implicit mm
    prompt 1
    timeout 100
    eticheta mm
    kernel /boot/kernel/main.lk

    eticheta mc
    kernel /boot/kernel/main.lk

    eticheta cm
    kernel /boot/kernel/custom.lk
    append initrd = / boot / initrd / main.gz load_ramdisk = 1 ramdisk_size = 5000 rw root = / dev / ram0
    eticheta cc
    kernel /boot/kernel/custom.lk
    append initrd = / boot / initrd / custom.gz load_ramdisk = 1 ramdisk_size = 5000 rw root = / dev / ram0
    etichetă hd
    localboot 0x80

    Astfel, am acceptat initrd și kernel personalizate, care, de dragul experimentului, pot fi conectate la distribuția noastră.

    Să aflăm ce dispozitiv este unitatea noastră flash în sistem (puteți rula mount fără parametri și vedeți). Acesta este fie / dev / sdb1, fie / dev / sdc1 sau / dev / sdd1. Merită să demontați stick-ul USB înainte de a începe instalarea.

    Instalați syslinux (dacă pachetul nu este pe sistem, apt-get install syslinux):

    syslinux -d calea_dispozitivului

    Fișierul ldlinux.sys ar trebui să apară în directorul rădăcină al unității flash. Dacă este, atunci syslinux.bin, syslinux.boot nu mai sunt necesare.

    Nu vă voi spune cum să configurați BIOS-ul să pornească de pe o unitate flash USB - este ușor. Voi spune doar că este foarte convenabil să creezi un folder / boot / initrd / init, în care să poată fi montat / boot / initrd / main, pentru lucrul ulterioar cu acesta. Nu uitați să îl decomprimați și să îl comprimați cu gzip.

    OK, totul sa terminat acum.

    Ca și cum tocmai ți-am spus cum să creezi un sistem Linux de la zero. Ușor, nu-i așa? Apoi puteți edita scriptul / sbin / init, pentru că mai aveți mult de lucru! Va trebui să scrieți un script pentru a monta stick-ul care face chroot în directorul rădăcină. În caz contrar, va trebui să lucrați cu partiția ReadOnly, de 5 MB. Dar asta este o cu totul altă poveste.

    Top articole similare