Käsikirja
2 FreeBSD Käyttöjärjestelmä
2.10 FreeBSD:n kerneli
3 Asennetut palvelinohjelmistot ja niiden käyttäminen
2.10 FreeBSD:n kerneli
Mikä on Kerneli?
Kerneli on elintärkeä ydin tietokoneesi käyttöjärjestelmässä, se tarjoaa perustoiminnot kaikkiin osiin käyttöjärjestelmääsi. Kernel sisältää ajurit, jolla tietokoneesi keskustelee eri laitteidesi kanssa, kuten äänikortit, kiintolevyt ja jne.
Mitä tarkoitetaan kernelin kääntämisellä?
Kernelin kääntämisellä tarkoitetaan järjestelmäsi ytimen asetusten, muokkaamista. Käytännössä tämä tarkoittaa, että ytimeesi lisätään tai poistetaan laitteiden "ajureita" tai erilaisia asetuksia.
Kääntäminen nopeasti: Ensiksi tehdään sopiva asetustiedosto, jonka jälkeen kääntäjällä käännetään lähdekoodisi binaariksi, mikäli kääntäminen onnistui. Asennetaan uusi kerneli, joka sisältää uudet asetukset.
FreeBSD:n kerneli pitää sisällään perusasetukset, mikäli haluat esimerkiksi tuen äänikortille suoraan kerneliisi. Sinun kannattaa kääntää ytimesi uudelleen.
Miksi kääntää kerneli uudelleen?
- Lisää laitetukea, laitteille jota voit tarvita
- Nopeampi käynnistys aika koneellesi
- Pienempi muistinkulutus, turha laite tuki pois.
Kuinka voin asentaa kernelin lähdekoodin kääntämistä varten tietokoneeseeni?
Ensimmäisen kerran käännettäessä kerneliä on helpoin asentaa lähdekoodi sysinstall ohjelmistolla
Ohje lähdekoodin sysintallilla hakemiseksi:
Käynnistä sysinstall /stand/sysinstall
Seuraa kuvia:
Valitse sys kohta välilyönnillä.
Tämän jälkeen järjestelmä kysyy sinulta mistä lähdekoodi asennetaan. Valitse mediaksesi sinulle sopivin (kernelin lähdekoodi tulee minimal cd:nkin mukana, ainoastaan bootonly ei sisällä lähdekoodia kernelistä). Helpointa on kuitenkin hakea se FreeBSD:n FTP palvelimelta.
Vinkkin!
Koko järjestelmän päivittäminen samalla, kun käännän kernelin.
FreeBSD:llä "maailman rakentaminen" eli järjestelmän lähdekoodi päivitys on myös joskus hyvä idea. Tällä toiminolla voit päivittää järjestelmäsi hakemalla uuden lähdekoodin ja kääntämällä sen vanhan järjestelmäsi päälle. Etuina ovat mm. RELENG_ versiot sisältävät valmiiksi kaikki tietoturva päivitykset, kyseiseen FreeBSD:n version lähdekoodin. Uusissa versioissa Kernelin laitetuki on parempi. Rakentamalla optimoidun järjestelmän voit saavuttaa lisää nopeutta sovellutustesi käyttöön.
Maailman yhteydessä rakennetaan ja asennetaan seuraavat: Järjestelmän ohjelmien uudet binaarit, korjaukset käynnistysjonoihin ja uusi kernel.
Lue lisää järjestelmän lähdekoodi päivityksestä
Mistä löytyvät kernelin asetustiedostot?
Kernelin oletus asetustiedosto löytyvät "/usr/src/sys/i386/conf/"
Yleistä: GENERIC tiedostossa löytyy GENERIC kernelin, asetukset. Olen muokannut itse GENERIC kernelin asetustiedosta sopivan asetustiedoston, josta olen kääntänyt myöhemmin kernelin.
Olen tehnyt kääntämisen helpottamiseksi valmiit malli asetustiedostot kuvauksineen. Tiedoston on tarkoitus helpottaa kääntämästäsi. HUOM tiedostot ei välttämättä sovellu koneesi asetuksille. Niiden tarkoitus on selventää FreeBSD kernelin asetustiedoston asetuksia!!
Käy laitteistosi asetukset huolella läpi ennen kuin käännät kernelisi, mikäli poistat kernelistäsi tärkeitä laitetukia, joita järjestelmäsi tarvitsi käynnistyäkseen. Voi olla ettei järjestelmäsi enää käynnisty tai esim. Verkko ei toimi.
Mistä tiedän mitä rivejä tarvitsen kerneliini?
dmesg komennolla löydät nykyisen järjestelmäsi lataamien laitteiden nimet, sekä tiedot. Esim. dmesg |grep laite. (Vinkki verkortin näkee nopeitin ifconfig komenolla).
Lisää rivejä löydät eri laitteille NOTES tiedostosta "/usr/src/sys/i386/conf/NOTES"
Hieman kernelin laitetuesta
Laitteiden tuki UNIX järjestelmissä ilmoitetaan piirin mukaan, tämä tarkoittaa käytännössä sitä, että laitteen Valmistajan nimellä ei ole väliä vaan piirillä jota laitteesi käyttää.
Vaihe 1
Tehdään muutokset kokoonpano tiedostoihin, joista muodostetaan myöhemmin käännettävä aineisto. Aloita kopioimalla cp GENERIC uusinimi tiedostoksi. Tämän jälkeen editoi uuden kernelisi asetustiedoston sisältö. Kaikki eivät välttämättä halua tietenkään karsia laitetukea kernelistään pois voit myös lisäillä sitä lisäämällä rivejä kernelin loppuun. Tämä sopii yleensä hyvin aloittelijoille, joille kaikki on vielä uutta ja outoa. Huom. älä editoi suoraan GENERIC tiedostoa sillä mikäli päivität lähdekoodiasi kaikki tiedostoon tekemäsi muutokset häviävät ja tiedosto korvataan uudella tiedostolla.
Esimerkki Kernelit
5.x "Muokkaamani asetustiedosto selityksineen 5.x FreeBSD:n kernelille"
lataa tiedosto Huomio 5.3
FreeBSD:t sarjasta ylöspäin pcm ajuri muuttui nimelle sound, eli korja
device pcm device sound:iksi . !!!!
4.x " Muokkaamani asetustiedosto selityksineen 4.x FreeBSD:n kernelille" lataa tiedosto. Toimii 4.8 sarjasta ylöspäin
Huom. Varmista, että esimerkkien kernelit sopivat koneesi laitteistolle.
Muutamia rivejä joita vakio kernelistä ei löydy, mutta joita olen itse käyttänyt
5.x Sarjan kernelistä löytyvät ominaisuudet.
device acpi #Acpi intel/Microsoft/Compaq/Toshiba kehittämä
virran hallitan
tuki
options ACPI_DEBUG #virhe tilassa päälle acpi
Kaikkien FreeBSD:n sarjoista löytyvät ominaisuudet (4.8 sarjasta ylöspäin)
device atapicam #scsi emulaatio polttavalle cd/dvd asemalle
tarvitsee scsi väylän tuen (4.8 sarjan
FreeBSD:stä ylöspäin) ilman kernelin patchimistä.
device pcm #äänikortti tuki
options QUOTA #Levyrajoitukset käytettäväksi
options COMPAT_LINUX #Linux Emulaatio päälle
options LINPROCFS #Linux Procfs tiedostojärjestelmä
device ehci #USB 2 Väylän tuki Tarvitsee toimiakseen USB
väylän tuen
options IPFIREWALL #Ipfw palomuurin tuki
options IPDIVERT #Tuki Divert soketeille (Mahd. NATD:n)
options DUMMYNET #IPFW liikenteen rajoitin tuki
Lisää laitteita ja asetuksia löydät NOTES tiedostosta /usr/src/sys/i386/conf/ hakemistosta
Käännetään Kerneli
Yleistä: Varsinkin alkuun kun olet uusikäyttäjä FreeBSD:n kanssa. Törmäät usein ongelmiin kernelin kanssa, ennen kuin opit ymmärtämään FreeBSD:n kernelin idean ja toiminnan. Monelle Windows Käyttälle Kerneli tuntuu aivan uudelta asialta, koska Windows maailmassa kerneliä ei pääse näpelöimään, toisin kuin Unix järjestelmillä.
Kaksi vaihtoehtoa kääntää kerneli:
Traditionaalinen tapa
Traditionaalinen eli vanha tapa jossa kernelin asetustiedostosta muodostetaan "aineisto" config komennolla, jonka jälkeen rakennetaan varsinainen kerneli.
Uusi tapa
Järjestelmä muodostaa aineiston itse ja kääntää kernelin. Erona lähinnä traditionaaliseen tapaan on, ettei sinun tarvitse luoda config komenolla ensiksi käännettäviä asetustiedostoja. "Tokihan muitakin eroja löytyy
Virheistä yleisesti
Virheitä ilmaantuessa on hyvä lukea kääntäjän näyttämiä tapahtumia, siitä selviää yleensä virheen todellinen syy. Virheiden yleisin syy on käyttäjälle asetustiedostoon jääneet pienet virheet. Tavallisimpia tälläsiä virheitä ovat esim. USB ohjaimelle löytyvä tuki, mutta usb väylältä puuttuu tuki. "USB ohjain ja väylä tarvitsevat molemmat toisiaan toimiakseen"
Tarkemmin virheistä
Config Virheet
Vaiheeseen 3 ja uudella tavalla käännettävän kernelin perus config herjaukset
Pari tavallisinta virheilmoitusta esimerkkeinä, joita config komento antaa:
config: koe:2: syntax error
Tässä koe nimisessä kernel tiedostossa oli rivillä kaksi syntaksi virhe. Eli esim. kirjoitusvirhe jossakin sanassa.
koe: unknown option "acpi"
Kernelissäsi oli tuntematon option rivi. Eli option "acpi":tä ei ole olemassakaan. Tässä tapauksessa optionin pitäisi olla device acpi
config: Error: device "acpi_debug" is unknown
config: 1 errors
Kernelissäsi oli tuntematon device rivi nimeltä "acpi_debug" eli device acpi_debug:ia ei ole olemassakaan. Tässä tapauksessa meillä olisi tullut olla options ACPI_DEBUG
Ongelmatilanteita kernelin kääntämisen aikana
Vaiheisiin 4 ja 5 ja uudella tavalla käännettäessä tulevat kääntäjän antamat herjaukset
Käytätkö make.conf tiedostossa optimointeja -O2 -O3 ?
nämä joskus jostain syystä särkevät jonkun laiteajurin koodia. Yleensä ongelmaa ei ole
Kernelissäsi on tuki jollekkin laitteelle, joka tarvitsee toista laitetta toimiakseen. Näissä tilanteissa joudut hieman lukemaan virheilmoitusta. Mahdolliset laiteisto riippuvuudet kuten "USB väylälle oleva tuki, mutta usb ohjaimen tuki puuttuu ja jne."
Esimerkki ongelma tilanne ja toinen laite tarvitsee toista:
ehci.o: In function `ehci_init':
ehci.o(.text+0x214): undefined reference to `usb_delay_ms'
ehci.o(.text+0x24f): undefined reference to `usb_delay_ms'
ehci.o(.text+0x320): undefined reference to `usb_allocmem'
ehci.o(.text+0x49c): undefined reference to `usb_delay_ms'
ehci.o(.text+0x50a): undefined reference to `usb_freemem'
ehci.o: In function `ehci_intr1':
ehci.o(.text+0x610): undefined reference to `usb_schedsoftintr'
ehci.o: In function `ehci_pcd':
ehci.o(.text+0x82d): undefined reference to `usb_transfer_complete'
ehci.o: In function `ehci_idone':
ehci.o(.text+0x9c8): undefined reference to `usb_transfer_complete'
ehci.o: In function `ehci_waitintr':
ehci.o(.text+0xa1c): undefined reference to `usb_delay_ms'
ehci.o(.text+0xa76): undefined reference to `usb_transfer_complete'
ehci.o: In function `ehci_allocm':
ehci.o(.text+0xb03): undefined reference to `usb_allocmem'
ehci.o: In function `ehci_freem':
ehci.o(.text+0xb24): undefined reference to `usb_freemem'
ehci.o: In function `ehci_allocx':
ehci.o(.text+0xb6d): undefined reference to `M_USB'
ehci.o: In function `ehci_open':
ehci.o(.text+0xd98): undefined reference to `usb_allocmem'
ehci.o: In function `ehci_root_ctrl_transfer':
ehci.o(.text+0x1040): undefined reference to `usb_insert_transfer'
ehci.o: In function `ehci_root_ctrl_start':
ehci.o(.text+0x1936): undefined reference to `usb_delay_ms'
ehci.o(.text+0x1983): undefined reference to `usb_delay_ms'
ehci.o(.text+0x1a79): undefined reference to `usb_transfer_complete'
ehci.o: In function `ehci_root_intr_transfer':
ehci.o(.text+0x1b40): undefined reference to `usb_insert_transfer'
ehci.o: In function `ehci_root_intr_abort':
ehci.o(.text+0x1bc2): undefined reference to `usb_transfer_complete'
ehci.o: In function `ehci_alloc_sqh':
ehci.o(.text+0x1c33): undefined reference to `usb_allocmem'
ehci.o: In function `ehci_alloc_sqtd':
ehci.o(.text+0x1d13): undefined reference to `usb_allocmem'
ehci.o: In function `ehci_abort_xfer':
ehci.o(.text+0x208d): undefined reference to `usb_schedsoftintr'
ehci.o(.text+0x20d8): undefined reference to `usb_transfer_complete'
ehci.o: In function `ehci_timeout':
ehci.o(.text+0x2139): undefined reference to `usb_add_task'
ehci.o: In function `ehci_device_ctrl_transfer':
ehci.o(.text+0x2170): undefined reference to `usb_insert_transfer'
ehci.o: In function `ehci_device_request':
ehci.o(.text+0x2563): undefined reference to `usb_transfer_complete'
ehci.o: In function `ehci_device_bulk_transfer':
ehci.o(.text+0x2590): undefined reference to `usb_insert_transfer'
ehci.o: In function `ehci_device_bulk_start':
ehci.o(.text+0x2631): undefined reference to `usb_transfer_complete'
ppc.o: In function `ppcintr':
ppc.o(.text+0xeb1): undefined reference to `isa_dmadone'
ppc.o: In function `ppc_write':
ppc.o(.text+0x1052): undefined reference to `isa_dmastart'
ppc.o(.text+0x10b4): undefined reference to `isa_dmadone'
ppc.o: In function `ppc_attach':
ppc.o(.text+0x1787): undefined reference to `isa_dma_acquire'
ppc.o(.text+0x179a): undefined reference to `isa_dmainit'
sio.o: In function `sioprobe':
sio.o(.text+0x62c): undefined reference to `isa_irq_pending'
sio.o(.text+0x7ec): undefined reference to `isa_irq_pending'
sio.o(.text+0x810): undefined reference to `isa_irq_pending'
sio.o(.text+0x850): undefined reference to `isa_irq_pending'
*** Error code 1
Stop in /usr/obj/usr/src/sys/koe.c
*** Error code 1
Stop in /usr/src.
*** Error code 1
Stop in /usr/src.
EHCI olisi tarvinnut tukea usb väyllälle ja sio taas isa väylälle. Tiedostojen nimistä voi yleensä päätellä jo paljon ongelmallisista riveistä.
Traditionaalinen tapa:
editoituasi sinulle sopivan kernelin voit config komenolla muodostaa käännettävän aineiston ../compile/tiedostosi nimiseen kansioon, mikäli kaikki tiedostossasi on kunnossa. Tiedostosi virheistä config komento ilmoittaa millä rivillä virhe on korjaa virhe, jonka jälkeen uudelleen config.
Vaihe 2
Config komento ja sen käyttö:
config tiedostosi_nimi
Esim. onnistuneesta kokoonpanosta:
Kernel build directory is ../compile/koe
Don't forget to do a ``make depend''
tässä esimerkissä kernelin tiedoston nimi oli koe jolloin ../compile/koe kansio luotiin ja muodostettiin sinne käännettävä aineisto.
Vaihe 3
Siirrytään hakemistoon jossa aineistosi sijaitsee: eli Kernelin rakennus hakemistoon, josta compile imoitti onnistuneen
cd ../compile/kernelisi
Vaihe 4
Rakennetaan kaikki riippuvuudet kerneliisi:
make depend
Vaihe 5
Rakennetaan varsinainen kernelisi:
make
Vaihe 6
Asennettaan uusi kernelisi
make install
Vaihe 7
Käynnistetään koneesi uudelleen
reboot -n
"Uusi tapa" New WAY
Yleistä: FreeBSD 4.2 Versiosta lähtien on tullut mahdolliseksi kernelin kääntäminen myös uudella tavalla. Uudessa tavassa editoit Vaihe 1 mukaisesti uuden kernelisi asetustiedoston ja seuraat seuraavia ohjeita:
Huom. Asetustiedoston tulee löytyä /usr/src/sys/i386/conf/ polusta ja sinun tulee olla polussa /usr/src aloitettaessa kääntäminen.
Vaihe 2
Aloitetaan muokkaamasi asetustiedoston rakentaminen KERNELIKSI.
make buildkernel KERCONF=asetustiedosto
Onnistunut kääntö ilmoitetaan seuraavasti:
--------------------------------------------------------------
>>> Kernel build for koe completed on Sun May 2 13:30:07 EEST 2004
--------------------------------------------------------------
Ongelmia Kääntämisessä
Huom. mikäli kääntämisesi pysähtyy heti alkuun ja saat ilmoituksen config errorista tai vastaavasta lue Traditionaalisen tavan vaihe 2. Kernelisi asetustiedosta löytyy virhe.
Esimerkki virhe ilmoitus kuinka make buildkernel ilmoittaa Config tiedostossa olevasta syntaksi virheestä. Lue lisää Config virheistä
config: /usr/src/sys/i386/conf/koe:280: syntax error
*** Error code 1
Stop in /usr/src.
*** Error code 1
Stop in /usr/src.
Muut virheet: Lue kappale ongelma tilanteita kernelin kääntämisen aikana
Vaihe 3
make installkernel KERNCONF=asetustiedosto
Mitä jos jokin meni pieleen eikä järjestelmäsi käynnisty enää tai jokin laite ei toimi?
Kuinka voin ladata vanhan kerneli:n?
5.x Versiot FreeBSD:stä:
mukaan valitse 6 eli loader prompt
kirjoita:
load kernel.old
tämän jälkeen käynnistyksen yhteydessä vanha kernelisi latautuu uudestaan.
4.x Versiot FreeBSD:stä
Käynnistyksen yhteydessä välilyönti näppäintä ennen (ennen kuin kernelisi ladataan):
load kernel.old
Vanhan kernelin takaisin vaihtaminen
5.x
rm -rf /boot/kernel poistetaan kerneli
mv /boot/kernel.old /boot/kernel nimetään vanha kerneli uudeksi
4.x
rm -rf /kernel poistetaan kerneli
mv /kernel.old /kernel nimetään vanha kerneli uudeksi
Hieman virheen analysoinnista:
Yleistä: Mikäli sinulla on ongelma joka liittyy käynnistykseen tai jonkun laitteen toimintaan. Lue tarkkaan mahdolliset virheilmoitukset niistä yleensä selviää mikä laite aiheuttaa ongelman ja mistä se mahdollisesti johtuu. Seuraavassa tyypillisempiä ongelmia kun laitetta ei löydy tai jokin ei toimi.
Laitetta ei löydy
Näppäimistö:
PS/2 jätitkö näppäimistö ohjaimen tai tuen näppäimistölle pois? "
USB väyläiset näppäimistöt tarvitsevat tuen usb väylälle ja USB näppäimistölle. Käynnistyykö usb daemonisi ? löytyykö usb ohjaimesi kernelistäsi.
Hiiri:
Ps/2: Jäikö Ps/2 hiiren tuki vahingossa pois? Käynnistyykö Moused ?
USB:Jäikö tuki USB väylälle pois tai USB hiirelle ? käynnistyykö usbd ?
SARJA hiiri: Muistitko jättää sarjaportille tuen kerneliin? Onko sio pois käytöstä ?
Verkkokortti:
Löytääkö ifconfig komento laitettasi, mikäli ei löydä verkkokortin ajuri ei ole kernelissä mukana.
Kiintolevy:
kiintolevysi löytyvät, mutta juuriosio ei suostu kiinnittymään yleinen syy on että ufs tiedosto järjestelmän tuki on karsittu pois tai tiedostojärjestelmän tuki jota käytät juuri osiollasi.
Mounting root from ufs:/dev/kiintolevysi jälkeen kernelin tiedot ovat ladattu alkaa vaihe jossa ajatetaan fsck ynnä muut.
Usein käynnistys tyssää kohtaan jossa pääosio ei suostu kiinnittymään. Kyseessä ei ole kuitenkaan ongelma joka johtuisi kernelistä. Vaan ongelma johtuu siitä ettei tiedostojärjestelmä tullut puhtaaksi fsck:ta ajatettaessa tällöin sinun täytyy puhdistaa tiedostojärjestelmäsi itse fsck komennolla. Komento kyselee yleensä tehtävistä korjauksista.
siirry single tilaan hyväksymällä /bin/sh shelliksesi ja kirjoita fsck komento.
käynnistä koneesi uudelleen.
Kernel panics "paniikit":
Kernel paniikit ovat harvinaisia ja niitä syntyy vain kun järjestelmäsi suorittaa vakavan virheen ytimessään eikä voi toipua siitä. Ota laitteen tiedot ylös ja mieti mahdollisia asetuksia joita, muutit sille.
|