Despre cum construiesc kernelul 2.6.
Este aproape complet aplicabil kernelului 3.x din Slackware 14 și mai târziu.
Execut comenzi de la terminalul X, la momentul potrivit, când folosesc versiunea grafică a configuratorului de kernel. Înregistrez sistemul în nume propriu, dar colectez kernelurile în numele rădăcină superuser. Pentru a permite rădăcină să utilizeze afișajul meu X, fac următoarele în terminalul X: primesc rădăcină; Îmi combină fișierul (extraterestră) Xauthority cu utilizatorul rădăcină cu același nume și setați variabila de mediu DISPLAY. Acest lucru face posibilă rularea aplicațiilor X de la terminalul su.
În schimb, puteți executa următoarele două comenzi care vor produce același rezultat:
Descărcarea și configurarea
Acum, când se creează mediul de construire, vom ajunge la codul sursă.
Acum luați fișierul de configurare a kernel-ului Slackware ca bază pentru configurația dvs. Fișierele de configurare ale lui Patrick sunt destul de comune. Poate că atunci când citiți aceste linii, configurația pentru versiunea 2.6 este disponibilă:
În schimb, puteți utiliza configurația kernelului care rulează în prezent:
Acum aveți un nucleu destul de comun (probabil pentru că Patrick le numește "kernel-generic") și veți dori să schimbați unele dintre valorile implicite pentru nevoile dvs. Porniți configuratorul grafic (dacă utilizați o consolă de text în loc de X, executați "make menuconfig" pentru a porni programul de dialog bazat pe blesteme)
Treceți prin setările de pădure. Ceea ce schimb eu de obicei (în Slackware 13.37 și mai târziu) este:
Adunarea în ext3 și ext4 kernel (necesită, de asemenea, driverul JBD) și sisteme de Reiser conducător auto / xfs / JFS fișier în loc de modul de asamblare - acest lucru elimină necesitatea «initrd,».
(vezi secțiunea "Fișiere de fișiere" în configurator).
Suportă 64 GB de memorie RAM.
("Tipul și caracteristicile procesorului"> "Suport pentru memorie înaltă (64 GB)"). Utilizați pentru sisteme cu 4 GB RAM sau mai mult.
Sprijin pentru "latența redusă" a kernel-ului dacă aplicațiile desktop desktop / portabile - multimedia funcționează mult mai lină.
("Tipul și caracteristicile procesorului"> "Model de preempțiune"> "Kernel preemptible"). Pentru un sistem desktop cu un număr mare de aplicații multimedia, aceasta este o opțiune utilă, deoarece păstrează capacitatea de reacție a sistemului chiar și la încărcare ridicată.
Am setat cronometrul la 1000 Hz ("Tipul și caracteristicile procesorului"> "Frecvența temporizatorului"> "1000 Hz"). O frecvență crescută poate fi utilă pentru multimedia # "sisteme desktop #".
Sau pornesc timer-ul ("Tipul și caracteristicile procesorului"> "Sistemul Tickless (Dynamic Ticks)").
Dacă (re) colectează nucleu Slackware, trebuie să vă asigurați că instalarea noilor module de kernel va părăsi originalul intact. Pentru a face acest lucru, specificați o linie unică în câmpul versiunii locale a kernel-ului ("Configurare generală"> "Versiune locală - adăugați la lansarea kernel-ului"). Acest parametru de kernel corespunde cu CONFIG_LOCALVERSION în fișierul .config. În miezurile Slackware pentru SMP, acest parametru este setat la "-smp".
Numărul versiunii finale a kernelului (returnat de "umake -r") pentru versiunea kernel "2.6.37.6" cu versiunea locală a "-alien" va fi "2.6.37.6-alien".
... și altceva în care nu-mi amintesc acum. Puteți decide să dezactivați majoritatea modulelor construite în configurația implicită pentru a reduce timpul de compilare dacă nu este disponibil pe computer. Dacă aveți un laptop, puteți acorda atenție și parametrilor de suspendare a software-ului și parametrilor de scalare a frecvenței CPU (secțiunea "Tipul și caracteristicile procesorului").
Și, în final, salvați configurația dacă vă convine.
Construirea unui kernel
Acum, rulați ansamblul kernel-ului, modulelor și instalarea acestora pe locul potrivit.
Pentru kernelurile 2.6.x, ar trebui să fie suficient să faceți "make" sau "make all" în loc de "make bzImage modules". În acest caz, obiectivul implicit vor fi colectate: vmlinux (nucleul necomprimat), bzImage (nucleu comprimat, pe care o vom folosi) și module (toate modulele de bază). Deoarece nu avem nevoie de un kernel necomprimat, de obicei folosesc comanda "make bzImage modules".
Dacă doriți să aflați mai multe despre obiectivele de realizare disponibile. puteți face "ajutor" și puteți examina rezultatele. Obiectivele de asamblare sunt marcate cu un asterisc (*) în mod implicit.
Editați lilo.conf
Editați /etc/lilo.conf și adăugați o nouă partiție pentru noul kernel. Amintiți-vă, dacă a existat o eroare undeva, noul dvs. kernel s-ar putea să nu fie chiar încărcat, astfel încât secțiunile existente ale nucleelor curente ar trebui lăsate ca atare. În /etc/lilo.conf lângă capăt există o secțiune precum:
Adăugați o altă secțiune după următoarea (adăugând mai jos se asigură că actualul dvs. funcționează - kernelul va rămâne pentru boot-ul implicit):
După adăugarea partiției la noul kernel din /etc/lilo.conf, trebuie să salvați fișierul și apoi să executați lilo pentru a activa modificările:
Acum este timpul să reporniți și să testați noul kernel! Când apare ecranul de pornire lilo, selectați "newkernel" în loc de "linux" în mod implicit.
Dacă noul dvs. kernel se încarcă după cum era de așteptat, puteți să îl faceți bootabil implicit adăugând următoarea linie la începutul /etc/lilo.conf și reporniți "lilo":
Slackware pachete de nucleu-antet
Ați decis să construiți și să utilizați un nou kernel. S-ar putea să aveți o întrebare despre ce să faceți cu pachetul Slackware-headers.
Răspuns: Nu scoateți acest pachet!
Fișierele kernel-ului pot fi găsite în două locuri; unul este în directorul sursă al kernelului (în acest caz directorul /usr/src/linux-2.6.37.6), celălalt este / usr / include / linux. Pachetul pentru kernel-headers conține de obicei fișiere antet preluate din codul sursă Slackware implicit. Au fost aceste fișiere antet care au fost folosite la construirea pachetului glibc. Faptul că pachetul kernel-headers instalează aceste fișiere în / usr / include / linux le face independente de fișierele antet din directorul sursă al kernel-ului.
Până când pachetul glibc este actualizat, nu trebuie să actualizați sau să ștergeți pachetul corespunzător pentru anteturile kernel-ului.
Cum se corelează pachetele de anteturi pentru kernel și glibc?
La un moment dat, veți dori să actualizați (recompilați!) Unele dintre software-ul de pe sistemul dvs. În cazul în care acest software este conectat (este legat) cu glibc (ca cea mai mare parte a software-ului de bază), o compilatie de succes depinde de disponibilitatea de fișiere antet de kernel corespunzătoare în / usr / include / linux. Folosind un kernel complet diferit de cele implicite în Slackware nu contează. Pachetul de nucleu-nucleu reflectă starea sistemului în timpul asamblării glibc. Dacă dezinstalați pachetul pentru anteturile kernel-ului. cu privire la funcționarea sistemului, acest lucru nu se va reflecta în nici un fel, dar nu puteți (re-compilați majoritatea software-ului).
Aveți nevoie de codul sursă al kernel-ului pentru ceva după ce nucleul este deja compilat?
În paragraful anterior, am spus că fișierele antet localizate în / usr / include / linux sunt folosite pentru a compila software-ul de sistem. Cu toate acestea, arborele sursă al kernel-ului este necesar pentru a construi modulele de kernel ale terților (madwifi, linux-uvc, ndiswrapper, ... această listă nu se termină). Nu vă limitați la compilarea driverului numai pentru kernelul încărcat în prezent. Puteți colecta drivere pentru orice kernel atât timp cât arborele modulului (de mai jos / lib / modules) și codul sursă sunt în loc.
Să presupunem că veți construi un modul pentru kernel, a cărui versiune a fost specificată în variabila de mediu $ KVER. De exemplu, prin executare
Alte pachete care conțin module kernel
Sigur că veți avea unul sau mai multe pachete instalate care conțin module care nu fac parte din kernelul implicit. De exemplu, Slackware instalează "svgalib-helper"; Dacă ați instalat drivere de rețea fără fir, acestea sunt de obicei și module de kernel.
Rețineți că, după instalarea și descărcarea unui nou kernel, aceste module non-kernel vor deveni indisponibile. Va trebui să recompilați codul sursă pentru a obține module corespunzătoare versiunii noului kernel.
Pentru a obține o listă a tuturor pachetelor care conțin module pentru kernelul curent, puteți folosi comanda (trebuie să o executați cu vechiul kernel încărcat):
Toate pachetele de mai sus vor necesita recompilarea, dacă doriți ca modulele lor să fie potrivite pentru un nou kernel.
Dacă ați reconstruit pachetul care conține modulul kernel, nu utilizați upgradepkg pentru al instala. dar installpkg. care nu va șterge versiunea originală a modulului.
upgradepkg va elimina modulul kernel vechi, care ar putea fi necesar să reporniți cu vechiul kernel. Acest truc se bazează pe presupunerea că versiunea de kernel este o parte a câmpului versiune a numelui pachetului, astfel: svgalib_helper-1.9.25_2.6.37.6 -i486-1.txz (Eu știu, că exemplul viciate, deoarece acest pachet nu mai este).
Metoda descrisă mai sus nu este relevantă pentru modulele de kernel pe care le-ați compilat și instalat manual, în loc să creați pachete pentru ele. Uneori, drivere grafice de proprietate, cum ar fi de la Nvidia sau Ati. poate fi un motiv de îngrijorare dacă uitați să le recompilați pentru un nou kernel înainte de a rula Fereastra X ... în special dacă computerul este încărcat în mod implicit la nivelul de execuție implicit 4.
În acest caz, reporniți la runlevel 3. Descărcați cea mai recentă versiune disponibilă a driverului grafic și compilați / instalați driverul. Aceasta vă va permite să reporniți în ecranul de conectare grafică. Pentru cei care au uitat, să rulăm în următorul nivel de performanță este simplu: Când vedeți ecranul LILO, introduceți o etichetă a kernel-ului dvs. (în exemplul nostru de mai sus este newkernel) și numărul de nivel de performanță: Newkernel Space 3 Enter.
Crearea unui initrd
În cazul în care miezul nu include driver-ul pentru sistemul de fișiere rădăcină, sau driverul pentru magistrala SATA, sau altceva, module asamblate, panica kernel la boot, să nu fie capabil de a obține acces la disc necesar, partiția și / sau fișiere. De obicei, arată așa
și înseamnă că trebuie să construiți un initrd (scurt pentru "Disk Initial Ram") - o unitate în RAM pentru inițierea inițială care conține modulele necesare. Apoi, calea către initrd este adăugată la secțiunea corespunzătoare /etc/lilo.conf. astfel încât kernel-ul să-l găsească și să încarce driverele pentru a accesa discurile când le-a încărcat. Este destul de ușor să creați un initrd, mai jos voi arăta două opțiuni, una pentru cazul în care sistemul de fișiere al Riser este folosit pentru partiția rădăcină, celălalt pentru ext3. Mai jos dau instrucțiuni pentru versiunea de kernel 2.6.37.6, dacă versiunea noului dvs. kernel este diferită, schimbați numărul versiunii în comenzi în consecință.
Accesați directorul / boot.
Executați "mkinitrd" pentru a crea fișierul /boot/initrd.gz. care conține un sistem de fișiere comprimat cu modulele specificate pe linia de comandă:
pentru sistemul de fișiere Reiser sau
dacă pentru partiția rădăcină folosiți sistemul de fișiere ext3.
Adăugați linia "initrd = /boot/initrd.gz" în secțiunea newkernel a fișierului /etc/lilo.conf. salvați modificările și executați lilo; Voi folosi exemplul citat anterior al secțiunii lilo.conf.
Data viitoare când porniți, noul kernel se va opri de panică.
Dacă utilizați deja imaginea initrd cu kernelul actual, aveți două opțiuni:
Creați o altă imagine initrd, cu comanda arătat mai sus, specificând numele fișierului initrd creat (care trebuie să fie diferită de prestabilită într-un fișier existent nu este suprascris)
și apoi modificați partiția în lilo.conf într-un mod similar:
Adăugați module pentru noul dvs. kernel într-un fișier initrd existent. În acest fel veți avea o imagine initrd care conține module pentru mai multe nuclee. Tot ce trebuie să faceți este să eliminați opțiunea -c, care este utilizată pentru a pre-curăța directorul / boot / initrd-tree.
Am scris scriptul shell (mkinitrd_command_generator.sh).
Scenariul nu face nimic cu sistemul. Acesta va analiza sistemul Slackware de funcționare și prezintă un exemplu de mkinitrd de comandă. Dacă executați această comandă, va fi creat imaginea initrd, care va conține toate modulele și bibliotecile necesare pentru a porni sistemul cu nucleul generic Slackware.
Iată un exemplu de pornire și ieșire a unei comenzi:
Puteți observa că partiția mea rădăcină criptată pe LUKS a fost identificată.
Acest script este inclus în pachetul mkinitrd de la lansarea Slackware 12.2.
Încărcarea modulelor la momentul încărcării
Înainte de Slackware 11.0 module pentru subsistemul nucleu încărcat sau hotplug (hotplug), sau comenzi modprobe în fișierul /etc/rc.d/rc.modules. Prezența totală a fișierului rc.modules pentru versiunile 2.4.x si 2.6.x ale kernel-ul nu a fost cea mai bună soluție.
În kernelul Slackware 12.0 și versiunile ulterioare 2.4 nu mai sunt disponibile. Încărcarea modulelor de kernel este asigurată de comenzile udev și modprobe. modulele care nu sunt încărcate de udev pot fi încă scrise în fișierul rc.modules. Doar acum aceste fișiere pot fi mai multe decât una. Slackware verifică existența următoarelor fișiere executabile în această ordine:
Dacă există /etc/rc.d/rc.modules.local. acesta va fi lansat
În caz contrar, dacă există /etc/rc.d/rc.modules-$(uname -r). acesta va fi lansat
În caz contrar, dacă există /etc/rc.d/rc.modules. acesta va fi lansat
$ (uname -r) este versiunea actualului kernel. Dacă versiunea kernelului este 2.6.37.6-smp. atunci Slackware va verifica prezența fișierului /etc/rc.d/rc.modules-2.6.37.6-smp. Astfel, este posibil să aveți fișiere speciale rc pentru diferite nuclee, ceea ce vă permite să configurați sistemul în cel mai bun mod posibil.
În Slackware 13.37 pachet /etc/rc.d/rc.modules-2.6.37.6-smp /slackware/a/kernel-modules-smp-2.6.37.6_smp-i686-1.txz instalează fișierul. O puteți utiliza, de exemplu, în cazul în care doriți să vă construi un kernel personalizat, care necesită descărcarea modulelor individuale de modprobe.
fișier /etc/rc.d/rc.modules-2.6.38.2.alien va fi utilizat atunci când descărcarea noul nucleu 2.6.38.2.alien.
Semnătura GPG
nucleu sursă arhive semnat codul OpenPGP cheie «Linux Kernel Archives Cheie de verificare» (înregistrări de screening cheie nucleul Linux). Acest lucru vă permite să vă asigurați că codul sursă pe care l-ați descărcat este o arhivă originală și nu a fost manipulat. Acest capitol descrie metoda unei astfel de verificări.
Mai întâi importați cheia OpenPGP în GnuPG sau copiind cheia de pe pagina de semnături sau importând-o de pe serverul cheie. Id-ul cheii nucleului este 0x517D0F0E. Exemplul arată astfel:
Concluzia va fi următoarea:
Apoi descărcați fișierul de semnătură pentru arhiva nucleului descărcat:
și asigurați-vă că este în același director ca și arhiva nucleului.
În ultimul pas, rulați gpg pe acest fișier de semnătură și verificați dacă va ieși:
Concluzia este ca aici:
Dacă ați specificat gnupg pentru a avea încredere în această cheie, partea finală ar arăta diferită. Pentru mine, adăugând că cheia de la lista de încredere nu este sysl practic, dacă nu îndeplinesc unul dintre dezvoltatorii de bază, care a fost în posesia cheii, și care ar putea prezenta o autoritate credibilă.
Cu toate acestea, arhiva codului sursă este într-adevăr semnată cu cheia pe care tocmai ați importat-o. Și aceasta este o veste bună.
Această traducere în limba rusă: Serg Bormant