FreeBSD kernel fordítás

A kernel fordítás egy remek lehetőség a FreeBSD-vel való ismerkedésre. Azért kezdtem ebbe bele, mert felmerült bennem a kérdés, hogy milyen kernel található a TrueNAS-ban, és milyen változtatásokat hajtottak végre az általános kernelhez képest (a NAS-omon egy FreeBSD fut). A TrueNAS configját a github-on kerestem meg.

A következő modulokat fordítottam bele a kernelbe: ZFS, FDESCFS, NullFs, UnionFS, AMD temperature modul (amdtemp), AMD System Management Network (amdsmn), CPU control (cpuctl), network bridging (if_bridge), USB-vel kapcsolatos modulok: uhid, usbhid, hidbus

Ezen kívül a configból kivettem egy csomó modult, ami az én hardware-emhez nem kell, vagy egy NAS-hoz semmi szükség rá. A kernel méretét így sikeresen lefeleztem (bár ennek itt tényleg nincs jelentősége, és egyébként a GENERIC kernellel is csak olyan module-ok töltődnek be, amikre szükség van).

A dokumentációban most sem csalódtam; minden részletesen le van írva:

A műveleteket a root felhasználóval kell végezni.

Az első lépés a kernel forrásának letöltése, és átváltás a megfelelő branch-re:

git clone -b releng/14.1 https://git.freebsd.org/src.git /usr/src

 

A konfigurációkat a következő könyvtárban találod:

cd /usr/src/sys/amd64/conf

 

A GENERIC konfigurációból érdemes kiindulni, le tudod másolni magadnak valahova, és tetszőlegesen módosítani. (Én egy a NAS nevű fájlba tettem a saját configomat, mivel a NAS-om kerneléről van szó.) Ezt egy szimbolikus link létrehozásával tudod a megfelelő könyvtárba linkelni:

cd /usr/src/sys/amd64/conf
ln -s /path/to/NAS_FreeBSD_kernel_conf/sys/amd64/conf/NAS NAS

A módosított config (az én gépemhez): https://pastebin.com/xgB7yYQH (###-vel commenteztem ki, amit kivettem a GENERIC-ből, a custom rész alatt van, amit betettem.)

 

Az előző build-et a következő módon tudod letörölni:

cd /usr/src
make -j12 clean

A -j paraméterrel tudod megadni, hogy hány szálon fusson a buildelés. Nekem 12 mag van a gépemben, ezért állítottam 12-re.

 

Kernel fordítás (továbbra is a /usr/src könyvtárban):

make -j12 buildkernel KERNCONF=NAS

 

Kernel installálása (a /usr/src könyvtárban):

make installkernel KERNCONF=NAS

 

Gép újraindítása:

reboot

Ha valami félre menne, a bootolás során választhatod az előző kernelt is.

 

Frissítés telepítése után a saját kernelt a /usr/src könyvtárban a git pull paranccsal tudod frissíteni, és a fenti lépésekkel tudod újra fordítani.

Nekem 12 szálon, 32 Gb memóriával, egy AMD 5600G procival, SSD-n a kernel kereken 3 perc alatt fordul le.

 

Még egy kiegészítés: Megéri-e custom kernelt fordítani? Szerintem, ha minden jól működik a GENERIC kernellel, vagy nincs speciális dolog, amire szükség lenne, akkor nem. Ez inkább csak próbálgatás / játszadozás.
Nem hiszem, hogy sokat lehet vele nyerni bootidőben (max pár ms), vagy memória használatban (max pár Mb).

Hozzászólások

Hasznos írás. Főleg, hogy még nem fordítottam FreeBSD-s kernelt, csak Linux kernelt.

Én linux kernelt régen fordítottam, és nem is futott elsőre. :)

Ezen meglepődtem, hogy egyszerű, és viszonylag gyors folyamat, és a doksi is jó.

Itt találtam még egy jó repo-t, ami bemutatja, hogy lehet saját modulokat írni, hátha valakinek érdekes: https://github.com/xcellerator/freebsd_kernel_hacking (egy könyv is van hozzá).

A doksi nagyon jó szerintem, ez volt az első dolog, ami miatt megszerettem a FreeBSD-t, és nagyon szimpatikus nekem ez az egész.

Még egy kiegészítés az előző linkhez, amit küldtem: ha valaki ezzel akar hobbizni, és kipróbálni hogy lehet modult írni alá, akkor viszont érdemes a fejlesztői kézikönyvvel kezdeni: https://docs.freebsd.org/en/books/developers-handbook/introduction/

(Persze ez már megint egy minden időt elvivő, kizárólagos hobbi lehetne valakinek, de hátha valakit ez érdekel. :))

Már pont meg akartam kérdezni, hogy minek, amikor az utolsó bekezdésben csak leírtad. Egy-két főverzióval ezelőtt még volt olyan funkció, ami érdekelt, nem volt benne a GENERIC-ben, és nem lehetett modulból betölteni. Most már nem tudok ilyenről. (Szerintem legalább 10 éve leszoktam róla, igyekszem minden megoldani a betölthető modulokkal.)

Persze csak hajrá!

Először akkor gondoltam rá, hogy kell majd fordítani, amikor a feleségem laptopjában a wifi sehogy nem akart működni, és a szükséges drivernek a forráskódját találtam meg.

Persze a szükséges modult a teljes kernel fordítás nélkül le lehetett fordítani, és be lehet tölteni.

Én sem látok most olyan esetet, amire nekem nem lenne jó a GENERIC kernel.

Pf+Altq nem oldható meg nélküle sajnos.
Mivel én ehhez szoktam hozzá és ezt használom NAS-on, nekem mindíg marad a custom kernel készítés, ha a freebsd update frissíti a kernelt.
De nem nagy dolog, már hozzászoktam.
Plusz nyüglődtem 14-es szérián a Realtek RTL8192EU usb driver saját fordításán, mert a hostapd elhasalt tőle.
De sajnos úgy sem működött.
Maradtam 13.2 szérián ott tökéletes.
Egyébként az esetek 99 százalékában tényleg felesleges.

Az ALTQ-ra emlékeztem (*). Tudom, hogy a szokásokat nehéz megváltoztatni, de dummynet(4) használata helyette - azt egy ideje már be lehet modulként is tölteni :-) ? (Mondjuk azt olvasom, hogy a dummynet csak 14-es óta megy pf-fel, és gondolom PF-ről IPFW-re váltani az már kicsit sok lenne egy kernel fordítás megspórolása érdekében.) Amúgy ha valaki tud egy jó összehasonlító cikket ALTQ vs dummynet témában, szóljon!

(*) Meg a VNET-re, de a VIMAGE egy ideje már benne van GENERIC-ben. Persze nyilván van még egy halom (másnak) fontos funkció.

Megéri-e custom kernel a GENERIC helyett? Már csak azért sem, mert ha gondod van vele, leginkább csak a generic-es kernelt szeretik a troubleshoot levlistán. Ha meg esetleg még peccselve is lett, akkor hagyj fel minden reménnyel.

Céges környezetben, csak ha valami nagyon nyomós ok van rá. (az egy másik kategória)

Ha otthon kell, azt mindenki eldönti, hogy akar-e ilyenekkel foglalkozni. (annak nyilván megéri, aki tanulni akar, vagy érdeklődik, vagy így tud csak valamit megoldani). Pl az egyik hobbim volt 12-13 éve, hogy a HTC desire telefonomhoz kernelt fordítgatok és patch-elem, kísérletezek. Az még 2.6-os kernel volt, ki lehetett próbálni pl a brain fuck schedulert (ami nem volt jobb mint a CFS szerintem), under voltage beállításokat, vagy call record patch.  A call record patch pl nekem kellett, a többi meg szórakozás volt.

De az biztos, hogy ezzel az ember egy csomó feladatot vesz a nyakába, pl frissítések után fordítgatni kell, ha valami nagyobb verzió ugrás van, akkor eltérések lehetnek, esetleg a patch sem jó már.

Nalunk, ha jol remlik a TCP_RACK(4) miatt kell forgatni sajat kernel-t, de lehet a ktls + cx6 hw offload miatt is.