Tuum ja Baas

Allikas: Kuutõrvaja

Sissejuhatus

Tuum ja Baas

Linux distributsioonid, võtame näiteks ühe populaarseima, Debiani (võiksime sama hästi võtta ka OpenSuse, Fedora, Gentoo Linux jms), koosnevad kahest loogilisest üksusest: tuumast ja kasutajamaailmast (kasutajamaailm on kõik utiliidid, seadistusfailid ning kaustad: /bin/sh, ee, cp, mv jne). BSD operatsioonisüsteemid, näiteks FreeBSD, koosnevad kolmest loogilisest üksusest: tuumast, kasutajamaailmast ja kolmandate osapoolte (apache, samba ..) tarkvarast.

BSD pere operatsioonisüsteemides arendatakse tuuma ja kasutajamaailma koos. Selline tsentraliseeritud arendus- ja ülesehitusmudel tagab mugava dokumenteerimisvõimaluse nii tuumale kui ka “userlandile” korraga. Kogu operatsioonisüsteemi lähtekood on saadav ühest kohast korraga(üle CVS süsteemi).

Linux'i tuuma ja seda osa mida BSD nimetab kasutajamaailmaks arendatakse eraldi. Distributsioon iseenesest koosneb tuumast ja kõigest muust mida konkreetse distro kokkupanijad oma maitse järgi vajalikuks peab. Kui sulle valmis Linuxi distributsioonid ei istu, paned kokku enda oma: kernel ühest kohast, kõik muu hädavajaliku otsid üle interneti kah ise kokku, iga asi ise kohast. Paindlik aga aeganõudev, selle pärast eelistataksegi valmis Linux distributsioone.

Kuna kriitilised BSD operatsioonisüsteemi osad on kokku koondatud ühte kohta, nende arendus toimub juba aastatega väljakujunenud standartite alusel ja on korralikult dokumenteeritud, siis on sellisele süsteemile üsna mugav teha ka turvaauditit. Näiteks OpenBSD, mis on just keskendudnud turvalisusele, auditeerib periooditi nii oma tuuma, kasutajamaailma ja ka kolmandate osapoolte porditud koodi.

Linux osas tegelevad tuuma ja kasutajamaailma kokku koondamisega distributsiooni koostajad. Linux tuuma arendus on hästi organiseeritud ja ka dokumenteeritud. Kurvem lugu on kasutajamaailmaga - oma distributsiooni RedHat vaevalt lubab algajate kirjutatud utiliite, kuid kogu kasutajamaailm on vaja internetist üles otsida, kontrollida et see oleks uusim, parandatud kood, leida korrektne dokumentatsioon(mis ei ole alati just lihtne). Turvaauditit teha kogu distributsioonile võib olla mõnetigi keerukam kui BSD operatsioonisüsteemide puhul. See selleks.

BSD pere operatsioonisüsteemide uuendamine on isegi algaja taseme jaoks mugav: CVS serverist lähtekood, vastavalt siis mis versiooni endale soovid, paar tundi kompileerimist ja ongi tuum koos kasutajamaailmaga uuendatud, või uuendad ainult tuuma, vastavalt oma maitsele. Variante ja optimeerimise võimalusi on palju.

BSD pere operatsioonisüsteemides on tuum koos kasutajamaailmaga(ehk siis operatsioonisüsteemi põhi) eraldatud rangelt kolmandate osapoolte tarkvarast. Näiteks asuvad /bin ja /sbin kataloogides ainult operatsioonisüsteemi failid, kui te soovite oma süsteemi näiteks Apache veebiserverit või KDE töökeskkonda, siis paigaldatakse kõik vajalikud failid väljaspoole süsteemi ala, FreeBSD puhul /usr/local/bin jne, NetBSD kasutajatel /usr/pkg/bin. FreeBSD_kataloogistruktuur Eraldatud pole mitte ainult binaarfailid vaid ka /etc, /share /var jne.

Linux'i distributsioonide uuendamine toimub vastavalt igale distrole erinevalt, Gentoo eelistab enamjaolt kõike ise kompileerida, RedHat, Suse, Debian pakuvad juba valmis binaarkujul pakke kuid igaühe uuendamissüsteem on küllaltki omalaadne ja distrode vahel liikumine nõuab mõningat harjumist. Vanemad RedHat Linux'i kasutajad mäletavad veel ehk kunagist “rpm hell'i”.

FreeBSD uuendamine

FreeBSD uuendamiseks tuleb uuesti kompileerida kokku nii baas kui tuum. Sourcest saab tõmmata lihtsate vahenditega nii kõige viimase release kui ka veel arenduses olevaid versioone. FreeBSD võimaldab ka käigult kompileerida näiteks FreeBSD versioo 6 ümber versioon 7'meks. Ei tasuks ainult uuendamisel ühte versiooni vahele jätta näiteks üritada versioon 4 kompileerida kohe versiooniks 7 vaid esimesena versiooniks 5 ja siis 6 ning seejärel 7 alles. Sellise uuendamise teeb võimalikuks see ,et kõik kolmanda osapoole tarkvara paigaldatakse kausta /usr/local ja baas ning kernel on monoliitne ühtne bsd arendusmeeskonna poolt loodav. Selline võimalus teeb lihtsaks FreeBSD käigupealt uuendamise.

FreeBSD uuendamine koosneb järgnevatest sammudest

  1. Algkoodi hankimine
  2. Vajaduse korral tuuma seadistamine ning tuuma & baassüsteemi algkoodist kompileerimine
  3. Tuuma ja baassüsteemi paigaldamine ning konfiguratsioonifailide uuendamine

Koodi hankimine Subversioniga

Uuemal ajal on cvs FreeBSDst välja heidetud ja asendatud subversioniga.

TODO vajab testimist

Uuemates FreeBSD versioonides on olemas svnlite käsk, pisut vanemates tuleb subversion käsitsi paigaldada

Subversioni paigaldamine

# pkg_add -r subversion

devel/subversion tuleb ehitada kas NEONi või selle puudumisel SERFiga. Ilma hakkab teatama Unrecognized URL scheme 'http://'

Algkoodi alla tõmbamine

# cd /usr
# svn co https://svn.freebsd.org/base/stable/9 /usr/src

Edaspidi piisab stable-9 viimase koodi allatõmbamiseks

# cd /usr/src
# svn update

viimase aja valguses siis juba release-11.4 või 12.2

svn checkout  https://svn.freebsd.org/base/releng/11.4 /usr/src
svn co https://svn.freebsd.org/base/stable/11 /usr/src

Ning httpsi asemel võib öelda ka svn Või veel täpsemaks release seadistuseks https://svn.freebsd.org/base/releng/8.4

Juhul kui vaja kasutada proxyt tuleb muuta enda kasutaja kaustas ~/.subversion/servers faili

[global]
http-proxy-host = ip.add.re.ss
http-proxy-port = 3128
http-proxy-compression = no

Kui aga juurkataloog on liiga väike võib lasta failid kompileerimisel seadistada teisele kettale

# env MAKEOBJDIRPREFIX=/db/obj/ make buildworld

Koodi hankimine CVSiga (vanem ja enam mitte toetatud lahendus)

Esmalt on vaja leida üks kiire lähedalasuv CVD serverit kust algkood hankida. Eestis on võimalik kasutada näiteks ametlikku mirrorit: cvsup.ee.FreeBSD.org või mitteametlikku cvsup.eenet.ee. CVS serverite täielikku nimekirja näeb lingilt http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/cvsup.html. Endale lähima ja kiireima cvs serveri leidmiseks võib kasutada ka tarkvara nimega fastest_cvsup, seda saab paigaldada nii portsust kui paketist ning käivitamine käib käsuga

# fastest_cvsup -c all

Selle väljund näeb välja midagi sarnast

- 1st: cvsup2.ee.freebsd.org
- 2nd: cvsup.ee.freebsd.org
- 3rd: cvsup.lv.freebsd.org

Ehk kõige kiirem on cvsup2.ee, teisel kohal cvsup.ee ja kolmandal kohal Läti mirror.

Olles leidnud sobiva CVS algkoodi serveri aadressi tuleb luua CVS seadistusfail mille alusel koodi tõmbame. Faili nimi pole poluline. Näiteks tekitame ta hetkel 8-sup nimega ja kirjutame sinna sisse oma lemmik tekstiredaktoriga järgmise sisu. Faili asukoht süsteemis pole oluline, võime nt paigaldada selle administraatori kodukausta.

*default host=cvsup.eenet.ee
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8
src-all

Selline seadistusfail võtab ühendust cvsup.eenet.ee serveriga, pakib portsud lahti /usr harusse jing tõmbab alla FreeBSD 8 kõige uuema STABLE haru algkoodi (src-all)

Koodi tõmbamise alustamiseks tuleb kasutada käsku csup (FreeBSD 6x, 7x, 8x sees on see vaikimisi olemas, vanemates versioonides tuleb paigaldada pakett cvsup-without-gui).

# csup 8-sup

Cvs võimaldab hankida ka mingit teatud ajahetke BSD versiooni. Näiteks lisades cvs faili 8-sup rea

*default  date=2006.10.10.00.00.00

Mis tõmbab algkoodi sellisel kujul nagu ta oli 2006.10.10 kuupäeval. Selliselt on võimalik ajas tagasi liigutada ka portsude puud, uuendada oleks mõistlik seejuures kogu portsude puu mitte vaid mõni selle haru.

Kui on huvi kasutada kõige uuemat mitte releaseks või isegi mitte stableks tunnistatud FreBSD'd milleks näiteks hetkel on versioon 9 siis tuleks määrata seadistusfailis *default tag=.

Tuum

Operatsioonisüsteemi tuum laetakse mällu peale arvuti käivitamist esimesena ning tema ülesanne on vahendada füüsilisi seadmeid operatsioonisüsteemi programmidele.

Vajadus uue tuuma järele tekib tavaliselt siis, kui

  • soovite uuendada enda FreeBSD versiooni
  • soovite eemaldada või lisada olemasolevasse tuuma mõne seadme toetust, näiteks PS2 hiirt
  • soovite eemaldada või lisada tuuma teatud funktsioone, näiteks toetust IP pakettide filtreerimiseks

FreeBSD tuuma juurde kuuluvad samuti moodulid mis vaikimisi tekitatakse igakordsel tuuma paigaldamisel kataloogi /modules.

Tuuma konfigureerimine

NB! Kui eesmärgiks on vaid FreeBSD tuuma ehk Linuxi keeles kerneli versiooni uuendamine siis võib järgneva tekstilõigu rahulikult vahele jätta.

Tasub siiski tähele panna, et üldiselt on konfigureeritud tuumal mitmeid eeliseid vaikeseaditustega GENERIC ees. Alglaadimine toimub kiiremalt. Kuna kernel otsib ainult riistvara, mis sul masinas ka tegelikult olemas on, võtab süsteemi alglaadimine tunduvalt vähem aega. Väiksem mälukasutus. Kohandatud kernel kasutab tihtipeale vähem mälu kui GENERIC-kernel ja see on tähtis, kuna kernel on protsess, mis peab alati reaalses mälus olema. Sellel põhjusel on kohandatud kerneli kasutamine eriti kasulik vähese RAM-iga süsteemi puhul. Lisanduv riistvaratugi. Kohandatud kernelisse saad lisada toe näiteks helikaartidele, mida GENERIC-kernelis pole.

Enne lähtetekstidest tuuma kompileerimist peab näitama, milliste kohandatud omadustega tulemust soovitakse saada. Kerneli sedadistamist tehakse kerneli seadistusfaili redigeerides, mingit Linuxi menuconfig laadset käsurea tarkvara selleks pole. Kerneli default seadistusfail asub kaustas /usr/src/sys/arhidektuurinimi/conf nimega GENERIC (kus paikneb kerneli seadistuste fail) ja compile (see on kataloog, kuhu kernel ehitatakse). arhitektuur tähistab sinu arvuti arhitektuuri, näiteks i386, alpha või pc98 (alternatiivne PC arendusharu, mis on populaarne Jaapanis). Kõik, mis on konkreetse arhitektuuri kataloogi all, on antud arhitektuurile spetsiifiline. Kogu ülejäänud kood on kõikidele platformidele, millele FreeBSD võidakse portida, ühine.

näiteks 64 bitine kernelifaili täisrada oleks

/usr/src/sys/amd64/conf/GENERIC

Soovides seda faili nüüd muuta sisenege kataloogi /usr/src/sys/amd64/conf ning kopeerige meelepärase nime alla tuuma näidiskonfiguratsioonifail GENERIC

# cp GENERIC TUUM1

Tuuma nimi kirjutatakse traditsiooniliselt suurte tähtedega. Tuuma konfiguratsioonifaili süntaks on traditsiooniline, trellist (#) paremale jäävat teksti ja tühje ridu ignoreeritakse. Teistel ridadel on parameetrid ja nende väärtused süstaksiga

parameeter väärtus1 [väärtus2]

näiteks selline rida konfigureerib tuuma ISO9660 standardile vastavate CD-plaatide lugemise toetuse

options 	CD9660

aga rida

options    SMP  

lisab mitmeprotsessori toe

Võrguseadme kasutamiseks tuleb tuuma konfiguratsioonis näidata, millise seadmega on tegemist, näiteks 3Comi PCI etherneti võrgukaardi mudel 3C950 jaoks on rida

device          vx              # 3Com 3c590, 3c595 (``Vortex)

ning arvuti algkäivitamisel sobiva tuumaga ilmub dmesgi sarnane tekst

vx0: <3COM 3C590 Etherlink III PCI> port 0xa800-0xa81f irq 10 at device 10.0 on pci0
vx0: supplying EUI64: 00:a0:24:ff:fe:75:43:6e
vx0: driver is using old-style compatability shims
vx0: starting DAD for fe80:0001::02a0:24ff:fe75:436e
vx0: DAD complete for fe80:0001::02a0:24ff:fe75:436e - no duplicates found

Samas kataloogis asuv fail NOTES sisaldab kõikvõimalikke parameetreid koos kommentaaridega. Kindlasti tasub seda faili uurida ,et paremini mõista mis rida teeb mida ja ei saaks kogematta midagi väga vajalikku välja visatud näiteks klaviatuuri tugi või midagi hullemat

Tuuma kompileermine ja paigaldamine

Kompileerimiseks tuleb liikuda kaustapuus '/usr/src alla ja anda käsk

# make buildkernel

Kui see käsk on oma töö edukalt lõpetanud võib kohe ka tuuma paigaldada käsuga

# make installkernel

Juhul kui te tegite eelneva peatüki eeskujul tuuma konfiguratsioonifailis mingeid muudatusi tuleb need käsud anda KERNCONF=TUUM1 võtmega kujul näitks make buildkernel KERNCONF=TUUM1 ja make installkernel KERNCONF=TUUM1.

Probleemide esinemisel

Kui uus tuum mingil põhjusel ei sobi. Näiteks ei sisalda vajalikku draiverit või lihtsalt ei käivitu saab startida süsteemi uuesti vanalt.

Nimelt olles installeerinud uue kerneli jäetakse ka eelmine kernel nime alla /kernel.old alles. Vana saate kasutada katkestades bootimise ja andes käsu

config> boot /kernel.old 

Samas kirjutatakse kernel.old igakord uuesti yle nii ,et tasuks siiski teha erineva nimealla eelnevast kernelist varukoopja

# cd /boot
# cp -r kernel.old kernel.generic

Ning boodil tuleb anda käsud.

unload
config>boot /boot/kernel.generic/kernel

Kui aga käsu täitmisel teatatakse, et ruumi napib (vaikimisi tehtud juur partitsioon liiga väike juhtunud) tuleb raske südamega kustutada vana kernel rm -rf /boot/kernel.old

Baas süsteemi kompileerimine ja paigaldamine

Kui tuum on paigas tuleks kokku panna ka uus userland, ehk siis baas süsteem kus asuvad kõik töövahendid ning failid

Selleks siseneda kausta /usr/src ja anda käsud

# make buildworld

Mis kompileerib eelnevalt allatõmmatud algkoodis baasi kokku. Kui need käsud läksid veatult läbi siis

# make installworld

Mis asendab kokku kompileeritud failidega hetkel kasutuses olevad

Aravatavasti tasub järgnevalt kontrollida põhimõttelisi muudatusi süsteemses seadistuses

# mergemaster

Käsu väljundit ja küsimusi tuleks hoolikalt jälgida sest mergemaster võib tahta kirjutada üle faile nt master.passwd etc milledes võib leiduda väärtuslikke seadistusi mida me ei soovi kaotada.

Lihtsustada võivad aidata protsessi mõned võtmed:

# mergemaster -F If the files differ only by VCS Id ($FreeBSD) install the new file.
# mergemaster -U Attempt to auto upgrade files that have not been user modified.

Viimaseks sammuks on algkäivitus, peale seda on juba kasutusel uus FreeBSD versioon

Täpsem häälestamine

/etc/src.conf faili abil on võimalik häälestada kuidas ja mis komponentidest süsteem kokku pannakse. Järgnevalt mõned võimalikud väärtused milleta võib süsteemi kokku meisterdada. Rohkem infot annab man src.conf

#WITHOUT_ACPI=       true    # do not build acpiconf(8) and related programs
WITHOUT_BOOT=       true    # do not build boot blocks and loader
WITHOUT_BLUETOOTH=  true    # do not build Bluetooth related stuff
WITHOUT_FORTRAN=    true    # do not build g77 and related libraries
WITHOUT_GDB=        true    # do not build GDB
WITHOUT_GPIB=       true    # do not build GPIB support
WITHOUT_I4B=        true    # do not build isdn4bsd package
WITHOUT_IPFILTER=   true    # do not build IP Filter package
WITHOUT_PF=         true    # do not build PF firewall package
WITHOUT_AUTHPF=     true    # do not build and install authpf (setuid/gid)
#WITHOUT_KERBEROS=   true    # do not build and install Kerberos 5 (KTH Heimdal)
WITHOUT_LPR=        true    # do not build lpr and related programs
WITHOUT_MAILWRAPPER=true    # do not build the mailwrapper(8) MTA selector
WITHOUT_MODULES=    true    # do not build modules with the kernel
WITHOUT_SHAREDOCS=  true    # do not build the 4.4BSD legacy docs
WITHOUT_NETCAT=     true    # do not build netcat
#WITHOUT_NIS=        true    # do not build NIS support and related programs
WITHOUT_SENDMAIL=   true    # do not build sendmail and related programs
#WITHOUT_USB=        true    # do not build usbd(8) and related programs
WITHOUT_VINUM=      true    # do not build Vinum utilities
WITHOUT_ATM=        true    # do not build ATM related programs and libraries
#WITHOUT_CRYPT=      true    # do not build any crypto code
WITHOUT_GAMES=      true    # do not build games (games/ subdir)
#WITHOUT_INFO=       true    # do not make or install info files
WITHOUT_MAN=        true    # do not build manual pages
WITHOUT_PROFILE=    true    # Avoid compiling profiled libraries

# BIND OPTIONS
WITHOUT_BIND=               true    # Do not build any part of BIND
WITHOUT_BIND_DNSSEC=        true    # Do not build dnssec-keygen, dnssec-signzone
WITHOUT_BIND_ETC=           true    # Do not install files to /etc/namedb
#WITHOUT_BIND_LIBS_LWRES=    true    # Do not install the lwres library
WITHOUT_BIND_MTREE=         true    # Do not run mtree to create chroot directories
WITHOUT_BIND_NAMED=         true    # Do not build named, rndc, lwresd, etc.

NB! see mõjutab peamiselt ainult installworldi, kompileeritakse kokku kõik jupid endiselt

Võimalik on erinevaid konfiguratsioone ühendada külge võtmete abil, näiteks

# make installworld DESTDIR=<jail mroot> SRCCONF=/root/src.conf.internetz

Tuuma moodulid

Tuuma modulaarsuse põhjuseks on see, et parasjagu mitteoluline kood poleks arvuti mällu laetud ja ei raiskaks süsteemi ressurssi. Moodulid asuvad kataloogis /boot/kernel ja nendega manipuleerimine toimub järgmiste programmidega:

  • kldstat - kuvatakse nimekiri kernelisse laetud moodulites
  • kldload nimi - moodul laetakse mällu
  • kldunload nimi - moodul eemaldatakse mälust

Probleemid

Juhul kui kompileerimine jääb mingil arusaamatul põhjusel seisma võib esmalt vaadata, et kas kasutusel on antud releasest kõige uuem versioon. Nt kui kasutusel 8.1 ning miskipärast läheb 9.2 peale uuendades ehitamine katki võiks uuendada kõigepealt 8.4-stable peale ja alles siis sealt edasi.

9.1-RELEASE peal võib uuendamise käigus teatada "ERROR: Required auditdistd user is missing, see /usr/src/UPDATING.". Mille puhul aitab järgneva käsuga unbound kasutaja loomine

# pw useradd -n auditdistd -g audit -c "Auditdistd unprivileged user" -d /var/empty -s /usr/sbin/nologin

Või kurta unbound puudumise üle "ERROR: Required unbound user is missing, see /usr/src/UPDATING." laheneb taas kasutaja tekitamisega.

# pw useradd -n unbound -c "Unbound unprivileged user" -d /var/empty -s /usr/sbin/nologin

Puuduva proxy kasutaja saab lisada

# pw useradd proxy -u 62 -g proxy -c 'Packet Filter pseudo-user' -d /nonexistent -s /usr/sbin/nologin

Kui 10.0 eelses süsteemis tulevad ehitamisel veateated nagu

cc1: error: unrecognized command line option "-mno-aes"

on vaja /etc/make.conf faili lisada

CC=clang
CXX=clang++
CPP=clang-cpp

FreeBSD 11.0-RC3 tuli veateade

# make installworld
 "ERROR-tried-to-rebuild-during-make-install".

Sellest saab lahti võtmega

#make buildworld -DNO_CLEAN"