Vlastna Distribucia Linuxu Index | Dokumentacia | Download | Linky | Kontakt | Forum


Obsah

  • Vlastna Distribucia Linuxu
  • Uvod
  • Co je to VDL
  • Co NIEJE VDL
  • Otazky a odpovede
  • Preco projekt VDL vznikol?
  • Co budete potrebovat
  • Hardver
  • Linux
  • Softver
  • GCC
  • Kernel
  • Kompilacia linuxoveho kernelu
  • Moduly
  • Kernel panic!
  • Zariadenia
  • Zariadenia v linuxe
  • MAKEDEV
  • Datovy priestor
  • Pevny disk
  • Particie
  • Floppy
  • CD Rom
  • Pamat
  • USB kluce
  • Filesystem
  • Typy filesystemov
  • Vytvaranie a formatovanie filesystemu
  • Montovanie filesystemu
  • Standardna struktura filesystemu
  • Initial ramdisk
  • Co je to initrd
  • Problematika initrd
  • Ako vytvorit initrd
  • Nestandardne initrd, kernel 2.6.x
  • Program mkinitrd
  • Nastavenie initrd programom tune2fs
  • Boot proces
  • Kernel
  • Initial ramdisk
  • Bootloader
  • Problemy
  • Boot na roznych mediach
  • Vas prvy boot!
  • Problemy pri prvom boote
  • Prvy proces
  • Program linuxrc
  • Program NASH
  • Vas prvy linux s initial ramdiskom a normalnym root filesystemom
  • Balicky
  • Konvencne balickovacie systemy
  • Kniznice
  • Zdielane kniznice
  • Program ldd
  • Symbolicke linky
  • Program ldconfig
  • Vasa prva distribucia s kniznicami
  • Prikazovy riadok
  • Bash
  • Proces INIT
  • System V Init
  • Vasa prva distro so System V Init
  • Busybox
  • Konzoly
  • Prihlasenie, Ucty, Odhlasenie, Hesla a Pouzivatelia
  • Login
  • Password
  • Shadow
  • Tinylogin
  • PAM
  • Logy
  • Odhlasenie, Restart, Shutdown, Halt
  • Halt
  • Vasa prva distribucia s PAM
  • Kontrola filesystemu pri starte
  • Zakladne linuxove programy
  • Siet
  • Midnight Commander
  • xinetd
  • Scrinchy HTTP server
  • vsftpd FTP server
  • Live distribucie
  • Bootovanie live distribucii
  • Vytvorenie Live CD
  • Typy a triky
  • Rozdiely medzi kernelom 2.4.x a 2.6.x
  • Lokalizacia
  • Miestne nastavenia
  • Lokalizacia v textovej konzole
  • Ako vykuchat RPM balicky
  • Uzitocne programy
  • ldd
  • dd
  • fdisk
  • tar
  • gzip
  • mount
  • cat
  • grep
  • echo
  • sed

  • Vlastna Distribucia Linuxu

    Uvod

    Co je to VDL

  • podrobna dokumentacia ako si vytvorit vasu vlastnu distribuciu linuxu
  • ako si vytvorit linux ktory bude mat presne take parametre ake potrebujete
  • mnozina niekolkych ukazkovych minidistribucii ktore ukazuju niektore postupy pri vytvarani vasej vlastnej distribucie
  • plus niekolko dalsich pomocnych programov a navod ako s nimi pracovat

    Co NIEJE VDL

  • VDL nie je linuxova distribucia

    Otazky a odpovede


    Otazka: "Mozete do dalsej distribucie VDL pridat program XYZ?"
    Odpoved: "NIE! Pretoze VDL nieje distribucia?"


    Otazka: "Mozete do dalsej verzie VDL pridat navod ako do vlastnej distribucie pridat program XYZ?"
    Odpoved: "Samozrejme! Velmi radi, Urobime to tak skoro ako to my sami zistime. Medzytim na to skuste prist sam a ked na to pridete tak nam dajte vediet a my to zverejnime ostatnym."


    Otazka: "Preco v dokumentacii nieje diakritika"
    Odpoved: "Lebo bez diakritiky pisem rychlejsie a je s tym menej problemov. Text bez diakritiky sa da citat. Text so zle zobrazenou diakritikou sa neda citat."

    Preco projekt VDL vznikol?

    dvh: "Kernel linuxu je z mojho pohladu dokonaly. Nemam mu co vytknut. Problem je s distribuciami. Som velmi narocny uzivatel a este som nenasiel taku ktora by mi 100% vyhovovala. Tak som sa rozhodol ze si spravim vlastnu. Problem bol v tom ze som nevedel ako na to tak som zacal hladat ale nenasiel som ziadny uceleny studijny material. Vacsine distribucii chyba otvorenost v zmysle 'toto sme urobili takto aby tento program robil toto, urobit to inak je zdanlivo jednoduchsie ale potom bude problem s ...'. Tak som zacal studovat minidistribuce lebo tie su na pochopenie najjednoduchsie. Lahsie v nich najdete ako funguje jedna konkretna vec, ako v napr. v debiane ktory je na 14-tich CD. Dalsou vecou s ktorou som bol nespokojny u distribucii 'hlavneho prudu' je ich naboptnalost a pomaly start. Verim tomu ze jadro distribucie sa vojde do cca 50 MB a zvysok uz su len volitelne programy ktore su u kazdeho cloveka naprosto jedinecne a netreba ich k jadru distribucie pliest. Spravna distribucia by podla mna mala byt tvorena z akychsi dobre oddelitelnych vrstiev..."


    Co budete potrebovat

    Hardver

    Hlavne nejaky normalny pocitac, ja pouzivam Intel Pentium 133 MHz, 64 MB RAM, 4 GB pevny disk, sietova karta, Graficka karta S3 Trio 64V+ 1MB, PCI 15" CRT monitor, klavesnica, PS/2 mys.

    Linux

    V podstate akykolvek, mal by podporovat vela filesystemov (ext2, ext3, reiserfs, minix, vfat/msdos, ramfs, romfs, iso9660), nevyhnutna je podpora loop zariadenia, kernel 2.x, dobre je pouzit nejaku mainstreamovu distribuciu lebo vacsinou chodia dobre a obsahuju plno programov uz skompilovanych tak nebudete stracat cas kompilovanim ked riesite problem s nastavenim...

    Pozn: ja pouzivam RedHat 7.2, kernel 2.4.7, gcc 2.96, glibc 2.2.x

    Softver

    Len bezne programy ako: man, mount, umount, mkfs, fsck, cp, mv, ls, dd, lilo, ldd, mkdir, mc, insmod, modprobe, dmesg, grep, ps, touch, cat, echo, ln, ifconfig, rdev, ....

    GCC

    Kompilovaniu sa asi aj tak nevyhnete, najma ak budete stahovat soft z netu. Ked si vyberate ktoru distro budete pouzivat ako pracovnu tak si stiahnute z sourceforge.net 100 nahodnych programov a skuste ich skompilovat na niekolkych distribuciach. Ta ktora skompiluje najviac programov je najlepsia na kompilovanie. U RedHatu 7.2 je uspesnost kompilacie asi tak 50%. Niektory vravia ze na kompilovanie su dobre nebinarne distribucie (ako napr. gentoo) ale pre kompilovanie cudzich programov podla mna plati to iste ako pre binarne.


    Kernel

    Kernel je jadro operacneho systemu. Tvori ho jediny subor s velkostou od cca 150 kB do 5 MB, bezne ma od 400 do 1200 kB. Najdolezitejsia je verzia kernelu a to kolko modulov v sebe obsahuje. Cim viac modulov, tym vacsi kernel. Doporucuje sa do kernelu davat len dolezite moduly, ostatne mozu byt v externych moduloch a natahovat sa dynamicky.

    Aky kernel pouzit?

    Tazko povedat. Starsie (napr. "kultovy" 2.0.35) su obvykle mensie, a preto vhodne na disketove mini distribucie. Dost dolezita je napr. podpora USB ktora zacina pri kerneloch rady 2.2.x. Najnovsi stabilny kernel je rady 2.6.x. Kernel 2.4.x sa mi zda trochu jednoduchsi na nastavenie ako 2.6.x.

    Kompilacia linuxoveho kernelu

    Nie je to az take zlozite ako sa zda ale nie je to ani nevyhnutne. Kernel obsahuje totiz velmi vela nastaveni. Jednoduchsie je zobrat kernel (a samozrejme moduly) z nejakej inej distribucie alebo si z netu stiahnut uz skompilovany kernel. Na P133 sa kernel kompiluje asi 1,5 Hodiny. Odporucam konfiguraciu z menu (ncurses alebo X) lebo ked v konzole nahodou 2x stlacite eneter tak budete musiet zacinat od zaciatku...

    Moduly

    Moduly su samostatne subory, natahuju sa do jadra prikazom insmod, odstranuju sa prikazom rmmod. Program modprobe umoznuje pridavanie aj odoberanie. Program lsmod zobrazi stav modulov v kerneli. Moduly maju obvykle priponu .o alebo .ko a nachadzaju sa v adresari /lib/modules/VERZIA_KERNELU/kernel/, napr. "/lib/modules/2.4.7-10/kernel/drivers/net/smc-ultra.o" je driver pre sietovu kartu SMC EtherCard Elite 16 Ultra (a ine). Pri spravne nastavenej distribucii staci napisat toto:

    # modprobe smc-ultra
    

    V subore /lib/modules/VERZIA_KERNELU/modules.dep su popisane zavislosti modulov, takze ked napr. date uz spominany prikaz modprobe smc-ultra tak sa natiahne aj subor 8390.o - to je ta zavislost SMC na 8390. Mozete kludne spravit toto:

    # modprobe 8390
    # modprobe smc-ultra
    # lsmod | sort
    

    Kernel panic!

    Ide o pomerne castu chybovu hlasku, najma ked si vyrabate vlastnu distro. Po tejto hlaske obvykle nasleduje podrobnejsi popis chyby. Najcastejsie je to nejaka chyba s diskom alebo napr. chybajuci program init.

    Zariadenia

    Zariadenia v linuxe

    Pre starsie kernely (<=2.4.x) plati ze v standardnom adresari /dev sa nachadzaju specialne subory, ktore obsahuju 2 cisla ktore jednoznacne popisuju kazde zariadenie v linuxe. Napr:

    2,0	/dev/fd0	- prva disketova mechanika
    3,0	/dev/hda	- prvy disk (IDE)
    3,1	/dev/hda1	- prva particia prveho disku
    10,1	/dev/psaux	- ps2 port
    1,3	/dev/null	- neobmedzeny kanal (mv ~/pripomienky_od_sefa.txt > /dev/null)
    1,5	/dev/zero	- neobmedzeny zdroj nul
    	/dev/mouse	- odkaz napr. na /dev/psaux
    	/dev/cdrom	- odkaz napr. na 3 IDE disk kde je cdrom
    	/dev/initctl	- FIFO rura ktoru pouziva init
    

    MAKEDEV

    Tento program sluzi na vytvaranie suborov v adresari /dev, aby ste si cisla nemuseli pamatat. Navyse umoznuje vytvorit seriu zariadeni, napr. hda0-9, atd... Nemusite ho ale nevyhnutne pouzivat, staci skopirovat jednotlive /dev subory z nejakej inej distribucie. Viac informacii v samostatnej kapitole venovanej programu MAKEDEV a v sekcii Ako vytvorit initrd. Dev subory sa daju vytvarat aj pomocou programu mknod.

    Datovy priestor

    Datovym priestorom myslim to, kde bude cela linuxova distribucia ulozena. T.j. root filesystem. Dolezite je aby cielovy pocitac bol schopny z daneho media nabootovat. Niektore informacie su spolocne pre rozne datove media.

    Pevny disk

    Najbeznejsie medium pre normalne linuxove distribucie. Ak sa nemylim tak plati ze na jednom disku mozu byt maximalne 4 primarne particie a vacsi pocet sekundarnych particii.

    Particie

    Logicke miesto na disku ktore ma jeden konkretny typ filesystemu, napr. ext2. Moze byt aj viac particii s tym istym filesystemom. Priklady vypisu particii prikazom df, realne particie (na disku /dev/hda1) su /dev/hda6 a /dev/hda7. "shm" nieje realna particia na disku.

    dvh> df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/hda6             10164316   6338424   3301232  66% /		<-- 10 GB root filesystem
    /dev/shm                123784         0    123784   0% /dev/shm
    /dev/hda7             17553248   6766080  10787168  39% /mnt/dos	<-- 20 GB dosovska particia
    
    stary> df
    Filesystem           1k-blocks      Used Available Use% Mounted on
    /dev/hda1              4032092   2539304   1287964  67% /		<-- 4 GB root filesystem
    none                     31168         0     31168   0% /dev/shm
    /dev/hda2               124443        13    118004   1% /mnt/hda2	<-- 128 MB testovacia distro
    /dev/hda3               205591    134262     71329  66% /mnt/dos	<-- 200 MB dosovska particia
    /dev/hda4               101107     34751     61135  37% /mnt/hda4 	<-- 100 MB testovacia distro
    

    Particie mozete vytvarat, upravovat a mazat napr. pomomocou programu fdisk. Napr: fdisk /dev/hda

    Floppy

    Klasicka disketa je najjednoduchsi sposob ako mat neobmedzene mnozstvo roznych testovacich distribuucii. Existuje mnozstvo specialnych mini distribucii. Napr. zalohovacie a zachrane (na obnovenie padnuteho systemu), demonstracne, rozne sietove aplikacie (router, firewall, bridge, ...), rozne serverove sluzby (bbs, mail, http, ftp, ...), alebo aj openMosix cluster na jednej diskete. Vrcholom je pravdepodobne jednodisketova verzia s X Window System. Dvojdisketova disketa s X je uz celkom slusne pouzitelna napr. na sufrovanie po webe.

    Typicke pre disketove distribucie je doslova "maximalna minimalizacia" velkosti filesystemu. Cim viac programov na diskete, tym rafinovanejsie tahy. Asi najbeznejsie filesystemy su FAT12 (msdos resp. vfat), minix (zrejme zabera malo miesta) a ext2. Vacsinou su tam len moduly pre najbeznejsi alebo vyslovene konkretny hardver autora distribucie. Asi najlepsie vysledky sa dosahuju ked je initial ramdisk co najmensi a softver ked je v tar.bz2 balikoch ktore sa rozbaluju a primontovavaju do initial ramdisku. Kernel a initial ramdisk sa z 1.44 MB diskety natahuje asi 20 sekund, co je dost vela.

    Diskety maju rozne formaty ale osobne by som iny ako 1440 kB asi nepouzival. Tato dokumentacia nieje urcena primarne na disketove minidistribucie takze ak vas zaujimaju prave jednodisketove distribucie, budete sa musiet obratit inam.

    Zvlastnu kategoriu tvoria bootovacie diskety "velkych" distribucii. Tym mam na mysli bootovaciu disketu vasej pracovnej distribucie kde vyrabate vasu vlastnu distribuciu. Tie budete pouzivat velmi casto, pretoze si aspon 1000 krat vymazete bootovaci sektor v snahe prinutit vasu vlastnu distro nabootovat. Obrazy bootovacich diskiet sa nachadzaju na instalacnom CD kazdej slusnejsej distribucie. Ich pointa je v tom ze na diskete je kernel a initial ramdisk s modulmi pre disky a filesystemy (ext3) a po nabootovani pouzivaju ako root filesystem vas disk.

    CD Rom

    Velkokapacitne, lacne, bezne dostupne medium. Standard vacsiny "velkych" distribucii. Asi najvacsia je Debian 4 ktora je na 14 CD. Moja Fedora Core 4 je na 4 CD a to tam nieje vsetko co by som chcel. Na druhu stranu je tam 90% veci ktore nechcem a su mi na nic. Osobne povazujem CD za najlepsie instalacne medium pre linux.

    V naprosto drvivej vacsine sa pouziva ISO9660 filesystem. Tiez sa pouziva initial ramdisk (a to roznych velkosti pocnuc 300 kB az po desiatky MB), zvysok je bud vo forme balikov (napr. tgz, rpm) alebo filesystem v subore ktory sa po starte namontuje na nejaky adresar root filesystemu. Trochu specificka kapitola je bootovatelne CD. Nedockavci hladajte v googli "el torito".

    Oblubene su aj rozne male cd ako napr. 9cm CD alebo "bootable bussines card CD" vo velkosti kreditky. Dalsim specifikom su "live" distribucie. Ide v podstate o plne funkcny linux na CD takze ho staci strcit do mechaniky a mozete robit v linuxe bez obav ze si nespravnou instalaciou vymazete nieco na disku.

    Pamat

    Tym mam zrejme na mysli (initial) ramdisk ktory moze byt jedinym datovym mediom na ktorom linux pobezi. Ak takyto linux nabootuje tak mozete povodne medium (disketa, disk, CD, ...) odobrat a linux pobezi dalej len v pamati. Vyhodou je ze vsetky operacie so subormi pobezia velmi rychlo. Maximalna velkost filesystemu je obmedzena velkostou RAM pamate. Prakticke vyuzitie? Mozno tenky klienti alebo podobne zalezitosti...

    USB kluce

    Zaujimave nove medium, vraj sa z USB klucov da tiez bootovat. Podmienkou je asi podpora v biose a kernel asi musi byt novsi alebo aspon 2.2.x s podporou USB. Inak plati to iste co pre disky. Najbeznejsi filesystem je VFAT.

    Filesystem

    V linuxe sa pouziva niekolko roznych filesystemov. Je len na vas pre ktory sa rozhodnete. Na to aby ste dany filesystem mohli pouzivat musi vas kernel tento filesystem podporovat. Ide po pomerne dolezitu sucast takze sa odporuca mat podporu vasho filesystemu priamo v kerneli, nie cez kernel moduly. Je ich velmi vela, napr. vo fdisku ked date zmenit ID particie a potom stlacite L tak vam zobrazi viac ako 80 moznosti.

    Typy filesystemov

  • ext2 - overeny, vcelku spolahlivy, moj oblubeny, je mozne ho bez problemov upgradovat na ext3
  • ext3 - novsi, zabera viac miesta (nevhodny pre disketove distribucie), je zurnalovaci
  • reiserfs - zurnalovaci filesystem
  • minix - linux zacinal s tymto fs, dnes pomerne bezny na jednodisketovych distribuciach
  • fat12 - disketove distribucie
  • romfs, ramfs - niektore initial ramdisky pouzivaju tento filesystem
  • iso9660 - cd rom, len na citanie
  • fat16, fat32 - rozne verzie dosu a windows
  • ntfs - novy windows, niekedy len na citanie pretoze je to zatvoreny format

    Vytvaranie a formatovanie filesystemu

    V podstate su dve moznosti. Vytvorit filesystem na nejakom zariadeni (napr. disk, disketa, usb, ...) alebo vytvorit filesystem v subore. Pri vytvarani filesystemu do suboru vyuzijete prikaz dd ktorym si vytvorite subor takej velkosti aku ma mat vas filesystem. Potom v tomto subore alebo na cielovom zariadeni pomocou prikazu mkfs alebo jeho variant vytvorite samotny filesystem. Tu je priklad vytvorenia filesystemu pre disketu:

    # dd if=/dev/zero of=./disketa.img bs=1k count=1440
    # mkfs -t msdos disketa.img
    

    Vynimku tvori program mkisofs ktory standardne vytvara filesystem z adresara. T.j. v nejakom pomocnom adresari si vytvorite strukturu a potom pomocou mkisofs vytvorite filesystem v subore. Je to tak preto lebo iso9660 nema podporu zapisovania.

    # mkisofs -A MojeCD -f -R -T -o MojeCD.iso /home/dvh/zaloha1
    

    Montovanie filesystemu

    Ak sa filesystem nachadza na nejakom zariadeni (napr. diskova particia /dev/hda1) mozete ho normalne primontovat prikazom mount na nejaky existujuci a prazdny adresar. Obvykle je to adresar v /mnt ale moze to byt aj napr. /usr. Niekedy (ak typ filesystemu daneho zariadenia nieje uvedeny v /etc/fstab) je potrebne explicitne uviest typ filesystemu. Priklad:

    # mount /dev/hda1 /mnt/dos
    # mount /dev/hda1 /mnt/dos -t msdos 	<-- ak to neprejde na prvy krat
    

    Ak chcete primontovat filesystem ktory je v subore, musite mat v kerneli podporu tzv. loop zariadenia a musite byt root. Pri loop zariadeni musite typ fs uviest skoro vzdy. Tu je priklad ktory MojeCD.iso primontuje do adresara /mnt/pokus:

    # mount ./MojeCD.iso /mnt/pokus -o loop -t iso9660
    

    Tip: VZDY pri prikaze mount pouzivajte -t prepinac ako posledny prikaz, usetrite si tak cas a nervy ked na prvy krat neuhadnete typ filesystemu.

    Standardna struktura filesystemu

    FSSTD resp. FSSTND (File System STaNdarD) definuje to ako ma vyzerat zakladna struktura linuxoveho filesystemu. Podobny, mozno este prehladnejsi navod poskytuje dokument FHS (File Hierarchy Standard ktory je urceny vseobecne pre POSIX.3 kompatibilne operacne systemy). V oboch pripadoch ide o to ze v root filesysteme maju byt nasledovne adresare (zatial len strucny vytah, podrobnejsie neskor alebo v horeuvedenych dokumentoch):

    /bin			- zakladne prikazy, pre vsetkych uzivatelov
    /boot			- staticke subory pre boot loader, kernel
    /dev			- subory zariadeni
    /etc			- konfiguracne subory (host-specific)
        /opt 		- konfiguracia pre /opt
        /X11 		- nastavenia X Window System
        /sgml 		- konfiguracia pre sgml
        /xml 		- konfiguracia pre xml
    /home			- domovsky adresar uzivatelov
    /lib			- hlavne zdielane kniznice a kernel moduly
    /lib64 a /lib32		- 64/32 bitove kniznice (architekturovo zavysle)
    /media			- mountovacie body pre vymenitelne media
    /mnt			- mountovacie body pre docasne montovanie filesystemov
    /opt			- pridavne baliky programov
    /proc			- vyrtualny filesystem kernelu a procesov
    /root			- domovsky adresar administratora
    /sbin			- zakladne systemove programy
    /srv			- data pre sluzby poskytovane systemom
    /tmp			- docasne subory
    /usr			- sekundarna hierarchia
        /bin		- vacsina uzivatelskych programov
        /include  		- standardne .h hlavickove subory pre C programy
        /lib		- kniznice pre programovanie a baliky
        /local	
        /sbin		- doplnkove systemove programy
        /share		- architekturovo nezavisle data
              /dict 	- zoznamy slov
              /man		- manualove stranky
              /misc		- rozne architekturovo nezavysle data
              /sgml		- sgml data
              /xml		- xml data
        /src		- zdrojove kody
    /var			- premenlive data
        /account  		- proccess accounting logs
        /cache		- cache aplikacii
              /fonts	- lokalne generovane pisma
              /man		- lokalne formatovane manualove stranky
        /crash 		- dumpy po padoch systemu
        /games		- premenlive data hier
        /lib		- premenlive stavove informacie
            /{editor} 	- zalohy editovanych suborov a stavy editora
            /hwclock  	- stavovy adresar pre hwclock
            /misc		- rozne premenlive data
        /lock		- lock subory
        /log		- logovacie subory a adresare
        /mail		- postove schranky uzivatelov
        /opt		- premenlive data pre /opt
        /run		- run-time premenlive data
        /spool		- spool data aplikacii 
              /lpd		- fronty line-printer demona
              /rwho		- subory pre rwhod
    	  /cron		- joby pre cron a at
        /tmp		- docasne subory uchovane medzi rebootami systemu
        /yp			- databazove subory Network Information Service
    

    Initial ramdisk

    Co je to initrd

    Initial ramdisk (initrd) je subor s root filesystemom ktory bootloader primontuje bezprostredne po nabootovani kernelu na root filesystem. Vyuziva sa v tzv. "two phase boot" procese, t.j. najprv sa primontuje initial ramdisk ako root filesystem. Kernel si z neho nacita moduly ktore potrebuje na pristup na skutocny root filesystem (na disku). Mozu to byt napr. scsi drivre alebo ext3 modul ak ma kernel len podporu ext2, pripadne moze natiahnut driver sietovej karty, ovladac grafickej karty a podobne. Po tom sa na / primontuje skutocny root filesystem z disku.

    Problematika initrd

    Niekedy sa uvadza ze pomocou initial ramdisku je mozne opravit poskodeny filesystem. Zial este som nevidel (na normalnej diskovej distribucii) initrd ktory by obsahoval fsck alebo podobnu utilitu. Vo vacsine diskovych distribucii nieje v initial ramdisku nic podstatne. Navyse initial ramdisk sa natahuje z fyzicky toho isteho disku (aj kej nie z toho isteho filesystemu, pretoze kernel a initrd je mimo filesystem) takze ked sa nieco na disku pokazi, moze to zasiahnut aj initial ramdisk. Navyse samotne natahovanie initrd par sekund trva (radove 1-2s) co spomaluje start systemu.

    O initial ramdisku toho viem dost ale naco je dobry na normalnom uz nainstalovanom linuxe to netusim. Ak o tom nieco viete, dajte mi vediet. Nic to nemeni na fakte ze s initrd sa budete stretavat velmi casto pretoze na disketovych a CD distribuciach sa nachadza velmi casto. Dolezity je ak mate ext3 filesystem a kernel v sebe modul pre ext3 neobsahuje.

    Ako vytvorit initrd

    Je to trochu zlozitejsie ale da sa to pochopit. Je to velmi dolezita kapitola lebo vela z toho vyuzijete neskor pri vyrabani vlastnej distribucie a to aj v pripade ze initial ramdisk nepouzijete.

    Prihlaste sa ako root aby ste mohli pouzivat loop zariadenia. Vytvorte si nejaky pomocny adresar v ktorom budete pracovat a vojdite donho. Potom postupujte podla nasledovneho postupu:

    Vytvorte pomocny adresar test:

    # mkdir test
    

    Vytvorte subor s miestom pre buduci initial ramdisk. 4 MB by mali stacit. Na diskete alebo disku bude zbaleny takze o jeho velkost sa nemusite obavat (nevyuzite miesto budu same nuly a to sa zkomprimuje velmi dobre). Pozor: data musite kopirovat ze /dev/zero, nie z /dev/null, to by vam vytvorilo prazdny subor

    # dd if=/dev/zero of=initrd bs=1k count=4000
    4000+0 records in
    4000+0 records out
    

    V tomto subore vytvorte ext2 alebo nejaky iny filesystem ktory chcete pouzit. Na disketach sa casto pouziva minix alebo FAT12 (vfat/msdos) lebo kernel ktory pozna len minix filesystem ma trochu mensiu velkost a aj samotny minix zabera malo miesta. Ja pouzivam vacsinou ext2.

    # mkfs initrd -t ext2
    mke2fs 1.23, 15-Aug-2005 for EXT2 FS 0.5b, 95/08/09
    initrd is not a block special device.			
    Proceed anyway? (y,n) y					<-- tu stlacte "y" a enter
    Filesystem label=
    OS type: Linux
    Block size=1024 (log=0)
    Fragment size=1024 (log=0)
    504 inodes, 4000 blocks
    200 blocks (5.00%) reserved for the super user
    First data block=1
    1 block group
    8192 blocks per group, 8192 fragments per group
    504 inodes per group
    
    Writing inode tables: done                            
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 22 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.    
    

    Ked ma upozornil ze subor initrd nieje blokove specialne zariadenie dal som "y" a stlacil enter. V subore initrd je teraz ext2 filesystem. Mozete ho primontovat na adresar test:

    # mount initrd test -o loop -t ext2
    

    Ked vojdete do adresara test tak tam uvidite adresar "lost+found" co znaci ze skutocne ide o ext2 filesystem. V adresari test teraz vytvorte zakladnu adresarovu strukturu initial ramdisku:

    # cd test
    # umask 022
    # mkdir bin dev etc lib loopfs proc sbin sysroot
    

    Vsetky adresare by mali mat usera "root" a masku na citanie od vsetkych ale zapis len od majitela, oktalne je to 755. Ak by ste zabudli umask mozete pouzit toto:

    # chmod 755 bin dev etc lib loopfs proc sbin sysroot
    

    Teraz vytvorte polozky zariadeni v adresari /dev. V podstate su to subory ktore obsahuju 2 cisla ktore jednoznacne identifikuju zariadenie. Najjednoduchsie je skopirovat ich z nejakej distribucie alebo mozete pouzit nastroj MAKEDEV. Ukazem oba sposoby, najprv kopirovanie:

    # cp -a /dev/console ./dev/
    # cp -a /dev/null ./dev/
    # cp -a /dev/ram ./dev/
    # cp -a /dev/systty ./dev/
    # cp -a /dev/tty1 ./dev/
    # cp -a /dev/tty2 ./dev/
    # cp -a /dev/tty3 ./dev/
    # cp -a /dev/tty4 ./dev/
    

    Mozete pridat aj tieto:

    # cp -a /dev/mem ./dev/
    # cp -a /dev/kmem ./dev/
    # cp -a /dev/port ./dev/
    # cp -a /dev/zero ./dev/
    # cp -a /dev/core ./dev/
    # cp -a /dev/full ./dev/
    # cp -a /dev/loop0 ./dev/
    # cp -a /dev/loop1 ./dev/
    # cp -a /dev/loop2 ./dev/
    # cp -a /dev/loop3 ./dev/
    # cp -a /dev/ram0 ./dev/
    # cp -a /dev/ram1 ./dev/
    # cp -a /dev/ram2 ./dev/
    # cp -a /dev/ram3 ./dev/
    # cp -a /dev/ram4 ./dev/
    # cp -a /dev/ram5 ./dev/
    # cp -a /dev/ram6 ./dev/
    # cp -a /dev/ram7 ./dev/
    # cp -a /dev/ramdisk ./dev/
    

    Alebo pomocou MAKEDEV ktory sa nachadza v /dev/ vytvorte polozky vo vasom adresari dev. Pozor: je to az nezvykle pomale, mne vytvorenie 1 suboru trva asi 8 sekund! To asi preto ze vytvara vsetky pridruzene zariadenia, takze vam to vygeneruje napr. 128 seriovych terminalov co v praxi nevyuzijete. Pouzijte volbu -m 8 cim sa z kazdeho druhu zariadenia vytvori len 8 suborov:

    # /dev/MAKEDEV -d ./dev null
    # /dev/MAKEDEV -d ./dev console
    # /dev/MAKEDEV -d ./dev ram
    # /dev/MAKEDEV -d ./dev systty
    # /dev/MAKEDEV -d ./dev -m 4 tty
    

    Ak vam vypise hlasku "MAKEDEV: error making ./dev/ttyS24: No space left on device" tak mate priliz vela poloziek v dev alebo priliz maly ramdisk. Po vytvoreni si mozete pozriet obsah adresara dev. Niektore zariadenia mozu byt cervene alebo inak zvyraznene pretoze ukazuju tam kde nic nieje. To je v poriadku lebo toto nieje nabootovany filesystem. MAKEDEV skutocne generuje tych zariadeni priliz vela. Najjednoduchsie je skopirovat ich z nejakej disketovej mini distribucie. Ak vam nejake zariadenie bude chybat tak ho neskor mozete lahko doplnit.

    Bezne sa vyskytuju este tieto zariadenia ktore by bolo dobre mat vo vasej distribucii, nemusia byt ale v initial ramdisku lebo tam ich vacsinou netreba:

    audio, cua, dsp, fb*, fd*, hda*, hdb*, hdc*, hdd*, ippp*, loop*, lp*, midi, mixer, nvram, parport*, ppp***, psaux, ptmx, random, rtc, scd*, sda*, sdb*, sequencer, smbus*, speaker, sr*, stderr, stdin, stdout, urandom, userdma, ...

    Takisto sa tam nachadzaju aj samostatne adresare. Su to napr. tieto:

    ataraid, cciss, compaq, dri, fd, i2o, ida, inet, input, logicalco, pts, raw, rd, shm usb, video, ...

    S poctom zariadeni v initial ramdisku to neprehanajte lebo to nieje skutocny root filesystem. V initial ramdisku staci zopar zariadeni, najma diskove particie. V skutocnom root filesysteme mozu byt asi vsetky.

    Na koniec initial ramdisk odmontujte a zbalte ho gzipom:

    # cd ..
    # umount test
    # gzip -9 initrd
    

    Tym je initial ramdisk hotovy. Najdete ho tu: vdl-1.1.0-initrd.gz. Neobsahuje ale initial skript linuxrc takze nevykona ziadnu inteligentnu cinnost. Na jeho zaklade budu ale zalozene vsetky "realne" initial ramdisky. Obvykle sa umiestnuje do adresara /boot (teda /mnt/hda2/boot) to plati najma pre dvojfazovy start. Tuto cestu zadajte aj do konfiguracneho suboru bootloadera. V /etc/lilo.conf je to napr. volba: initrd = /boot/initrd.gz. Mierne ina je situacia pri pouziti bootloadera syslinux (ldlinux). Popis ako vytvorit initrd aj so skriptom linuxrc je popisany v nasledujucich kapitolach.

    Nestandardne initrd, kernel 2.6.x

    V niektorych distribuciach (RedHat 7.2, Fedora Core 4) sa nachadzaju initial ramdisky ktore nemaju uplne standardny format. Bud sa vam ich nepodari primontovat alebo ich primontujete ale nic v nich nebude. Magicke zaklinadlo znie "cpio". Ucel celeho toho asi je aby ste to nemuseli robit ako root a cez loop raziadenie.

    Rozbalenie initial ramdisku:

    # mkdir test
    # cd test
    # gzip -cd < ../initrd.gz | cpio -i
    

    Opatovne zbalenie initial ramdisku

    # rm -f ../initrd.gz
    # find . | cpio -o -c | gzip -9 > ../initrd.img
    # cd ..
    # rm -rf test
    

    Program mkinitrd

    Program /sbin/mkinitrd je shell skript ktory vsetko urobi za vas a vytvori initial ramdisk s takymi parametrami ako pozadujete. To by uz ale mohol rovno existovat program /sbin/mkmydistro a nic nove by ste sa nenaucili. mkinitrd produkuje prave take initial ramdisky ktore sa nedaju dekompilovat. Obsahuje aj rozne nastavenia, ako napr. --with=nazov_modulu, atd. Nasledujuci prikaz vytvory initial ramdisk (druhy parameter je kernel):

    # /sbin/mkinitrd pokus.img.gz 2.6.11-1.1369-FC4
    
      alebo
      
    # /sbin/mkinitrd --with=jbd --with=ext3 pokus.img.gz 2.6.11-1.1369-FC4
    

    Nastavenie initrd programom tune2fs

    Pri vytvoreni initial ramdisku mozete este spustit tune2fs pomocou ktoreho nastavite aby sa initial ramdisk nekontroloval pomocou e2fsck (-c 0), zrusite rezervovane miesto pre filesystem - lebo initrd je len na citanie, nic nove v nom nevznika (-m 0), a nastavite interval medzi kontrolami na nulu (-i 0).

    # dd if=/dev/zero of=./initrd bs=1k count=4000
    # mkfs -F initrd -t ext2
    # tune2fs -m0 -c0 -i0 ./initrd
    # mount ./initrd test -o loop -t ext2
    ... normalne vytvorite initrd
    

    Boot proces

    Tato kapitola podrobne opisuje co sa deje pocas boot procesu az po vas prvy boot. Ak budete uspesny, na konci vas caka hlaska "Kernel panic - no init found!"

    Kernel

    Kernel je jadro operacneho systemu. Je to vzdy jeden konkretny subor, standardne sa nachadza v /boot a mava taketo nazvy: vmlinuz, linux, linuz, vmlinux, bzimage, zimage, kernel,... Ak ho vymazete tak sa v podstate nic nestane lebo aktualne jadro sa nachadza niekde inde, mimo root filesystem. Dal ho tam bootloader ktory je na disku tesne pred nim a postara sa o jeho zavedenie (boot).

    Initial ramdisk

    Bol podrobne popisany v predchadzajucich kapitolach. Pri starte (ak je initial ramdisk pouzity) sa zavedie spolu s kernelom. Kernel z neho natiahne moduly ktore potrebuje na primontovanie root filesystemu, pripadne urobi ine zakladne nastavenia. Robi to tak ze spusti skript /linuxrc v initial ramdisku. Nakoniec tento skript primontuje skutocny root filesystem. Viac informacii v "man initrd" a v dalsich kapitolach.

    Bootloader

    Natahuje kernel a initial ramdisk pri starte systemu. Je to ciste hardverova zalezitost, este na urovni biosu. Dolezite su nastavenia bootloadera ktore sa odovzdavaju pri starte systemu.

  • initrd=meno_suboru - ktory subor sa pouzije ako initial ramdisk, moze byt zbaleny gzipom
  • noinitrd - nepouzije sa initial ramdisk
  • root=zariadenie-s-root-fs - definuje na ktorej particii bude root filesystem (napr. /dev/hda1)

    Existuje niekolko bootloaderov. Asi najbeznejsie su: lilo, grub, syslinux, ldlinux. Syslinux a ldlinux bootuju z dosu takze my ich ani pouzivat nebudeme, pouzivaju sa ale casto na disketach a na live cd. Osobne preferujem lilo kvoli jeho jednoduchosti ale grub je tiez dobry, najma ak potrebujete bootovat aj ine eperacne systemy...

    Problemy

    Typickym problemom je ze vam linux nechce nabootovat. Jedine co na nabootovanie potrebujete je particia, kernel a bootloader. Dovodovv moze byt niekolko, vacsinou ide ale o zlu konfiguraciu alebo ste si (napr. v dose) nieco spravili s particiamy a podobne.

    Boot na roznych mediach

    Postup je mierne odlisny podla toho na akom mediu bude linux. Ak ide o disketu, s najvacsou pravdepodobnostou tam bude komprimovany initial ramdisk takze musite v konfiguracii tento initrd nastavit.

    Vas prvy boot!

    Ukazem to na priklade kedy na pocitaci kde je na /dev/hda1 nainstalovany RedHat 7.2 na particii /dev/hda2 vytvorim filesystem ext2, skopirujem tam kernel (napr. z Fedora Core 4 aby ste videli ze to moze byt akykolvek kernel, nie ten isty ako je na pracovnom linuxe) a nastavim bootloader lilo tak aby nabootoval tento kernel.

    Najprv nabootujem "pracovny" linux (RH72) v ktorom budem vsetko robit. Samozrejme je nutne vsetko robit ako root! Najprv musim vytvorit particiu /dev/hda2 na ktorej bude novy linux. Pouzijem na to fdisk ktory je interaktivny a velmi pohodlny.

    # fdisk /dev/hda
    
    Command (m for help): p						<-- chcem vidiet moje particie
        
    Disk /dev/hda: 255 heads, 63 sectors, 784 cylinders	
    Units = cylinders of 16065 * 512 bytes
    
       Device Boot    Start       End    Blocks   Id  System
    /dev/hda1             1       510   4096543+  83  Linux		<-- RedHat 7.2
    /dev/hda3   *       527       552    208845    b  Win95 FAT32	<-- dos
    /dev/hda4           553       565    104422+  83  Linux		<-- testovacia particia
    

    Ako vidite spustil som fdisk na disk /dev/hda. Dal som si vypisat prikazy ("m"). Potom som prikazom "p" zobrazil vsetky aktualne particie na tomto disku (su tri) a to: /dev/hda1 (4 GB particia s RedHat linuxom), bootovatelna particia /dev/hda3 (200 MB s DOSom), a nakoniec testovacia 100 MB particia /dev/hda4. V dalsej casti prikazom "n" vytvorim novu particiu /dev/hda2 o velkosti asi 128 MB.

    Command (m for help): n      		<-- vytvor novu particiu
    
    Command action
       e   extended
       p   primary partition (1-4)
    p					<-- chcem novu Primarnu particiu! (aby sa dala bootovat)
    Partition number (1-4): 2		<-- particia cislo 2 (/dev/hda2)
    First cylinder (511-784, default 511): 	<-- pyta sa na prvy cylinder, stlacim rovno enter
    Using default value 511			
    Last cylinder or +size or +sizeM or +sizeK (511-526, default 526): 	<-- pyta sa na velkost, stlacim enter
    Using default value 526				
    
    Command (m for help): p      			<-- dam zobrazit particie
    
    Disk /dev/hda: 255 heads, 63 sectors, 784 cylinders
    Units = cylinders of 16065 * 512 bytes
       Device Boot    Start       End    Blocks   Id  System
    /dev/hda1             1       510   4096543+  83  Linux
    /dev/hda2           511       526    128520   83  Linux		<-- moja nova particia :)
    /dev/hda3   *       527       552    208845    b  Win95 FAT32
    /dev/hda4           553       565    104422+  83  Linux
    
    Command (m for help): w				<-- zapiseme zmeny na disk
    
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    Re-read table failed with error 16: Device or resource busy.	<-- chyba
    Reboot your system to ensure the partition table is updated.
    
    WARNING: If you have created or modified any DOS 6.x
    partitions, please see the fdisk manual page for additional
    information.
    Syncing disks.
    [root@stary root]# 
    

    Ako vidite, nikto nieje neomylny. To asi preto ze som bol prihlaseny na dvoch terminaloch. Po reboote je vsetko normalne. Fdiskom si novu particiu /dev/hda mozete prezriet. Ak je vsetko v poriadku, vytvorime na novej particii filesystem ext2:

    # mkfs /dev/hda2 -t ext2
    mke2fs 1.23, 15-Aug-2001 for EXT2 FS 0.5b, 95/08/09
    Filesystem label=
    OS type: Linux
    Block size=1024 (log=0)
    Fragment size=1024 (log=0)
    32256 inodes, 128520 blocks
    6426 blocks (5.00%) reserved for the super user
    First data block=1
    16 block groups
    8192 blocks per group, 8192 fragments per group
    2016 inodes per group
    Superblock backups stored on blocks: 
            8193, 24577, 40961, 57345, 73729
    
    Writing inode tables: done                            
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 27 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    

    Aby sa nam lahsie pracovalo, mozeme si tuto novu particiu pridat do /etc/fstab cim sa bude zaroven automaticky primontovavat po nabootovani linuxu. Najprv ale skontrolujeme ci uz tam nahodou nieje:

    # cat /etc/fstab | grep /dev/hda2	
    #/dev/hda2               swap                   swap    defaults        0 0
    

    Je ale je vykomentovana znakom # - predtym som druhu particii pouzival ako swap. To je zbytocny luxus, teraz swapujem do suboru a particiu /dev/hda2 mozem pouzit na distribuciu. V /etc/fstab teda /dev/hda2 nieje, mozeme ju tam pridat na koniec suboru. Ak by tam bola tak normalne editujte subor v textovom editore.

    # echo /dev/hda2 /mnt/hda2 ext2 defaults 0 0 >> /etc/fstab	<-- zapis na koniec suboru
    # tail -n 1 /etc/fstab						<-- vypis posledneho riadku
    /dev/hda2 /mnt/hda2 ext2 defaults 0 0				<-- posledny riadok - je tam!
    # mkdir /mnt/hda2						<-- vytvorime adresar kde sa bude montovat
    

    Vyznam jednotnyvych poloziek v subore /etc/fstab je takyto: Prve je zariadenie resp. particia (/dev/hda2), druhe je kam (na aky adresar) sa ma dana particia primontovavat. Tretia polozka je typ filesystemu (ext2 ale mozete dat aj auto). Stvrta polozka je sposob primontovania (defaults alebo rozna kombinacia slov noauto, user, owner, ... oddelene ciarkami). Piata polozka urcuje ci sa ma pouzit pre program dump. Siesta polozka urcuje poradie v akom sa maju pomocou fsck kontrolovat filesystemy (root filesystem 1, 0=nekontrolovat). Jednotlive polozky mozu byt oddelene medzerami alebo aj tabulatormi. Ak rebootujete system, particiu /dev/hda2 po starte automaticky primontuje na adresar /mnt/hda2, alebo particiu primontujte manualne prikazom: mount /dev/hda2 /mnt/hda2

    Teraz mozete vytvorit zakladnu adresarovu strukturu, zkopirovat kernel a bootloader:

    # pwd;ls			<-- vypis aktualny adresar a jeho obsah
    /root/pom			<-- sme v /root/pom
    vmlinuz-2.6.11-1.1369_FC4	<-- je tu jeden subor - linuxovy kernel z FC4
    # mkdir /mnt/hda2/boot		<-- vytvorime adresar boot
    # mkdir /mnt/hda2/etc		<-- vytvorime adresar etc
    # cp ./vmlinuz-2.6.11-1.1369_FC4 /mnt/hda2/boot	    <-- zkopirujeme kernel
    # cp /boot/boot.b /mnt/hda2/boot		    <-- toto je lilo bootloader
    

    Kernel a bootloader je na mieste. Teraz musime vytvorit konfiguracny subor pre bootloader (pouzijeme lilo). Mozete pouzit nejaky textovy editor ale vystacite si aj s programom cat, len sa nesmiete pomylit:

    # cat > /root/MYLINUX/etc/lilo.conf <<EOF
    > boot=/dev/hda
    > timeout=100
    > message=/boot/message
    > prompt
    > read-only
    > image=/boot/vmlinuz-2.6.11-1.1369_FC4
    >   label=linux
    >   root=/dev/hda2
    > EOF
    

    Tym mate vytvorenu konfiguraciu pre lilo bootloader. Vyznam jednotlivych poloziek je takyto:

  • boot - ktore zariadenie sa ma pouzit na bootovanie (hda = primarny disk)
  • timeout - ako dlho ma cakat pri spustani (nasoby 0.1 s, 100 = 10s)
  • message - subor s textovou hlaskou alebo logom
  • prompt - ci ma umoznit zadat vstupne parametre pri starte
  • read-only - root filesystem bude len read only
  • image - kernel (moze ich byt aj viac!)
  • label - co musite zadat aby sa nabootoval dany kernel
  • initrd - cesta k initial ramdisku ak by bol pouzity

    Musite vytvorit nejaku textovu hlasku (/boot/message) ktora sa pri starte zobrazi:

    # cat > /root/MYLINUX/boot/message <<EOF
    > vdl-boot-1
    > EOF
    

    Uplne poslednym krokom pred vasim prvym bootom bude spustenie programu /sbin/lilo ktory nacita konfiguraciu a umiestni bootloader (boot.b) a kernel do bootovacej casti disku. lilo zatial nemusi byt na hda2 lebo aj tak potrebuje nejake kniznice, staci ked ho spustite z pracovnej distribucie (RH72). Na to aby ale mohol zapisovat na disk, potrebuje niektore subory v /dev. Vyriesite to tak ze ich skopirujete z aktualnej distribucie. Potom mozete spustit lilo pricom -r prepinacom mu poviete kde je root (korenovy adresar):

    # mkdir /mnt/hda2/dev
    # cp -a /dev/hda /mnt/hda2/dev
    # cp -a /dev/hda1 /mnt/hda2/dev
    # cp -a /dev/hda2 /mnt/hda2/dev
    # cp -a /dev/hda3 /mnt/hda2/dev
    # cp -a /dev/hda4 /mnt/hda2/dev
    # cp -a /dev/mem ./dev/
    # cp -a /dev/kmem ./dev/
    # cp -a /dev/null ./dev/
    # cp -a /dev/port ./dev/
    # cp -a /dev/zero ./dev/
    # cp -a /dev/core ./dev/
    # cp -a /dev/full ./dev/
    # cp -a /dev/ram ./dev/
    # cp -a /dev/ram0 ./dev/
    # cp -a /dev/ram1 ./dev/
    # cp -a /dev/ram2 ./dev/
    # cp -a /dev/ram3 ./dev/
    # cp -a /dev/ram4 ./dev/
    # cp -a /dev/ramdisk ./dev/
    # cp -a /dev/tty ./dev/
    # cp -a /dev/tty0 ./dev/
    # cp -a /dev/tty1 ./dev/
    # cp -a /dev/tty2 ./dev/
    # cp -a /dev/tty3 ./dev/
    # /sbin/lilo -r /mnt/hda2
    Added linux *
    

    Hotovo! Mozete restartovat pocitac a vychutnat si svoj prvy boot. Ak vsetko pojde hladko, uvidite priblizne toto:

    LILO
    vdl-boot-1
    boot:
    Loading linux..............
    Uncompressing linux..............
    .
    .
    asi 2 strany kernelovych hlasok 
    .
    .
    VFS: Mounted root (ext2 filesystem) read-only
    Freeing unused kernel memory: 216k freed
    Kernel panic: No init found. Try passing init= option to kernel.
    

    V tejto "distribucii" nemozete nic robit ale je to ten najjednoduchsi zaklad na ktorom si postavite vasu distribuciu. Ak raz budete mat problem s bootovanim, urcite to nemusite ladit na distribucii ktora ma GNOME alebo KDE ale bude vam stacit tento zaklad. V distribucii je viac takychto stupnov a boot je prvym z nich. Preto je nasledovna distribucia "prvej urovne". Mozete si ju stiahnut v sekcii download alebo tu: vdl-1.0.0-boot-lilo.tgz.

    Problemy pri prvom boote

    Moze sa stat ze vam to nebude fungovat tak ako ma. Problemov je niekolko.

  • Ked som pouzil kernel 2.0.34 z RH5.1 tak mi to hlasilo ze ext2 filesystem ma nejake nezname doplnujuce nastavenia. Bolo to asi preto ze kernel 2.0.35 jednoducho nepoznal format ext2 ktoru vytvoril RH7.2 ktory ma kernel 2.4.7 (mke2fs ma prepinac na pre 2.2.x kerneli, treba ho pouzit)
  • Ked som pouzil kernel 2.6.11 z FC4 tak to hned pri starte padlo a pocitac sa resetoval. Mohlo to byt tym ze kernel bol pre procesory 686 alebo ze mu chybal nejaky dolezity subor v /dev alebo nejake ine nastavenie. Kazdopadne vdl-v1.0.x je idealna na taketo experimenty a ladenie problemov pri bootovani.

    Prvy proces

    Hlavy vyznam OS je ze vam umoznuje spustat procesy. V tejto kapitole si ukazeme ako na to v linuxe. Samotny sposob spustenia prveho procesu zavisi na tom ci pouzivate initial ramdisk a ci pouzivate System V init. Ako prve si ukazeme upravu initial ramdisku (ako zaklad pouzijeme vdl-1.1.0-initrd.gz) ked donho pridame skript linuxrc interpretovany nash-om, a staticky linkovany ash prikazovy riadok.

    Program linuxrc

    Skript alebo program /linuxrc je uplne prvy proces ktory (ak existuje a je v initial ramdisku) je spusteny kernelom. Staci teda vytvorit skript /linuxrc alebo staticky linkovany program s rovnakym menom a je to. Ak initial ramdisk nepouzijete, kernel sa pokusi spustit program /sbin/init (vid. dalsia kapitola System V Init).

    Z 30-tich disketovych minidistribucii 10 pouzivalo linuxrc, ostatne SysVinit. Najjednoduchsi bol v RedHat 5.1 kde je /linuxrc simlinka na /sbin/init. Napr. v emblin linuxe je v linuxrc toto:

    #!/bin/sh
    echo This is LINUXRC
    

    Emblin potom dalej pouziva /etc/rc skript v ktorom je napr: root_device=`block_device /`; mount -t minix -n -o remount $root_device / O cosi standardnejsie je to v mulinux: mount -o remount,rw / 2>/dev/null

    Takmer klasicky je linuxrc ponaty vo free linuxe. Tam sa z initial ramdisku spusta priamo bash prikazovy riadok prikazom open:

    #!/bin/sh
    
    PATH="$PATH:/bin:/usr/bin:/usr/local/bin:."
    TERM=linux
    PS1='TEST #'
    PS2='> '
    TMP="/tmp"
    TEMP="/tmp"
    ignoreeof=10
    export PATH DISPLAY LESS TERM PS1 PS2 ignoreeof LD_NOWARNA TMP TEMP
    umask 022
    
    mount /proc /proc -t proc
    
    open bash
    open bash
    exec bash
    

    Jednoznacne najvacsi je linuxrc skript v distribuciach zalozenych na Knoppix linuxe (radovo 20kb).

    Pozn: Na otazku ktory program bol spusteny ako prvy je velmi tazko odpovedat. Co ak je linuxrc shell skript a na prvom riadku je napisane napr. #!/sbin/nash ? Bol prvy spusteny linuxrc alebo nash? Tento "spor" ale nema nijaky hlbsi vyznam, jedine snad ze by tuto otazku niekto polozil v nejakom kvize tak by stalo zato sa trochu pohadat. Kazdopadne tvrdit ze init je prvy proces je blbost, moze byt predok vsetkych procesov ale nieje prvy. Aby to nebolo take jednoduche tak kernel "init" chape ako prvy proces ktory spustil (to moze byt hocico) a "init" je niekedy chapany ako System V Init co je program /sbin/init ktory vola vsetky tie /etc/rc.d/ skripty pri prepinani runlevelov. A dalsia moznost co moze byt init je posledny proces. Ak ho skusite zabit tak kernel bude hlasit "Attempted to kill init".

    Teraz si ukazeme ako vytvorit linuxrc skript. Ak to bude skript musi byt spusteny nejakym interpretrom. Velmi vhodne je pouzit staticky linovany, napr. staticky ash ma okolo 150kB. Vyborny je NASH (vid dalej). Tu je priklad jednoho linuxrc suboru pre interpreter ash a potom pre nash:

    Priklad 1: skript linuxrc interpretovany ash-om, na konci vytvori normalny prikazovy riadok (prevzate z HAL91 linuxu):

    #!/bin/ash
    echo "HAL91 Linux v1.0"
    PATH="/bin:/usr/bin:/usr/local/bin:."
    TERM=linux
    export PATH DISPLAY TERM
    umask 022
    echo -n "mounting proc filesystem: "
    mount /proc/ /proc -v -t proc 
    INIT_LOC=`cat /proc/sys/kernel/real-root-dev`
    echo -n "Loading init-script from: "
    case $INIT_LOC in
      769) echo "hda1"
    	mount /dev/hda1 /mnt/tmp
    	;;
      770) echo "hda2"
    	mount /dev/hda2 /mnt/tmp
    	;;
      771) echo "hda3"
    	mount /dev/hda3 /mnt/tmp
    	;;
      772) echo "hda4"
    	mount /dev/hda4 /mnt/tmp
    	;;
      775) echo "hdb1"
    	mount /dev/hdb1 /mnt/tmp
    	;;
      776) echo "hdb2"
    	mount /dev/hdb1 /mnt/tmp
    	;;
      777) echo "hdb3"
    	mount /dev/hdb1 /mnt/tmp
    	;;
      778) echo "hdb4"
    	mount /dev/hdb1 /mnt/tmp
    	;;
       *) echo "floppy"
    echo -n " mounting: "
    mount /dev/fd0 /mnt/tmp -t msdos
    esac;
    [ -f /mnt/tmp/hal91/hal91.ini ] && cat /mnt/tmp/hal91/hal91.ini \
    | tr -d '\r' >/hal91.ini
    [ -f /hal91.ini ] && chmod 777 /hal91.ini
    [ -f /hal91.ini ] && exec /hal91.ini
    echo
    echo "** hal.ini failed.. starting a shell"
    echo
    exec ash
    

    Priklad 2: linuxrc pre NASH (/sbin/nash), na konci primontuje skutocny root filesystem - vhodne pre "two phase boot" proces:

    #!/sbin/nash
    echo Mounting /proc filesystem
    mount -t proc /proc /proc
    echo Creating root device
    mkrootdev /dev/root
    echo 0x0100 > /proc/sys/kernel/real-root-dev
    umount /proc
    echo Mounting root filesystem
    mount --ro -t ext2 /dev/root /sysroot
    pivot_root /sysroot /sysroot/initrd
    

    Program NASH

    NASH je specialny interpreter linuxrc (/linuxrc v initial ramdisku) suborov. Je to velmy jednoduchy a hlavne maly program, staticky linkovany ma 8 kB (v RH7.2, vo FC4 uz 400kB - zeby kartelova dohoda s vyrobcami pamate a diskov ???). Dolezite su prikazy mkrootdev a pivot_root ktory z nejakej diskovej particie spravy root filesystem. Ak predate kernelu parameter typu "root=nieco" tak sa pouzije "nieco". Standardne sa pouzije /proc/sys/kernel/real-root-dev. Tu su prikazy:

  • access - zisti ci uzivatel ma pristup na dany cestu alebo ci subor existuje
  • echo - vypise text do suboru alebo na obrazovku
  • find - zobrazi cestu k suboru
  • findlodev - zobrazi cestu k prvemu nepouzitemu loopback blokovemu zariadeniu
  • losetup - pripoji subor k loop zariadeniu
  • mkdevices - vytvori subory v /dev pre vsetky particie
  • mkdir - vytvori adresar
  • mknod - vytvori device inode pre danu cestu
  • mkdmnod - mknod pre device mapper
  • mkrootdev - pripravi zvolene zariadenia na primontovanie ako root filesystem
  • mount - primontuje filesystem, nepodporuje nfs
  • pivot_root - zmeni root filesystem
  • readlink - zobrazi cestu symbolickej linky
  • raidautorun - spusti autodetekciu raid particii
  • setquiet - len textove vypisy
  • showlabels - zobrazi zoznam zariadeni, ich filesystem a ich uuid
  • sleep - caka niekolko sekund
  • switchroot - nastavy novy filesystem (len >= 2.6 kernel)
  • umount - odmontuje filesystem

    Vas prvy linux s initial ramdiskom a normalnym root filesystemom

    V predchadzajucej kapitole sme si ukazali ako ako nabootovat linuxovy kernel. Teraz si ukazeme ako spustit prvy proces a to skript linuxrc (v initrd). Ako zaklad pouzijeme initial ramdisk vdl-1.1.0-initrd.tgz kde pridame interpreter ash, nash a vytvorime linuxrc skript. Ash a Nash su staticky linkovane takze ziadne kniznice potrebovat zatial nebudeme.

    Na nejaku prazdnu particiu (uvazujme hda2) rozbalte root filesystem ktory je v vdl-1.0.0-boot-lilo.tgz.

    # tar zxpf vdl-1.0.0-boot-lilo.tgz -C /mnt/hda2
    

    Teraz do nejakeho pomocneho adresara (/root/pom) skopirujte initial ramdisk vdl-1.1.0-boot.gz, rozbalte ho a primontujte ho na pomocny adresar (root/initrd/test). Potom donho skopirujte nash. Nakoniec vytvorte skript linuxrc a nastavte mu spustitelny priznak.

    # cd /root
    # mkdir pom
    # cp vdl-1.1.0-initrd.gz pom/
    # cd pom
    # mkdir test
    # gzip vdl-1.1.0-initrd.gz
    # mv vdl-1.1.0-initrd initrd
    # mount initrd test -o loop -t ext2
    # cp /sbin/nash ./test/sbin
    # ldd /sbin/nash
            not a dynamic executable	<-- staticky linkovany, netreba kniznice !
    

    Teraz vytvorime skript linuxrc ktory bude interpretovany nash-om.

    # cat > ./test/linuxrc << EOF
    > #!/sbin/nash
    > echo Mounting /proc filesystem
    > mount -t proc /proc /proc
    > echo Creating root device
    > mkrootdev /dev/root
    > echo 0x0100 > /proc/sys/kernel/real-root-dev
    > umount /proc
    > echo Mounting root filesystem
    > mount --ro -t ext2 /dev/root /sysroot
    > pivot_root /sysroot /sysroot/initrd
    > EOF
    # chmod 755 ./test/linuxrc
    

    Tym je initial ramdisk s linuxrc hotovy. Teraz ho odmontujte a zbalte gzipom. Mozno ho budeme pouzivat aj neskor takze od teraz bude toto vdl-1.2.0-initrd-linuxrc.gz.

    # umount test
    # gzip -9 initrd
    # ls i*
    initrd.gz
    

    Teraz tento initrd musite niekam umiestnit takze pouzite ten zaklad distribucie ktory je v vdl-1.0.0-boot-lilo.tgz, rozbalte to na prazdnu particiu (napr. hda2) a do /mnt/hda2/boot skopirujte initial ramdisk ktory ste vytvorili v predoslom kroku vdl-1.2.0-initrd-linuxrc.gz. Potom do /mnt/hda2/etc/lilo.conf pridajte cestu k initial ramdisku a spustite lilo.

    # cp /root/pom/initrd.gz /mnt/hda2/boot
    # echo "  initrd=/boot/initrd.gz"
    # /sbin/lilo -r /mnt/hda2
    Added linux *
    

    Tym je distribucia s na hda2 s initial ramdiskom hotova. Po reboote by sa malo vypisat priblizne toto:

    LILO
    vdl-boot-1
    boot:
    Loading linux.................
    Uncompressing linux......................
    .
    .
    (kernelove hlasky)
    .
    .
    Red Hat nash version 3.2.6 starting
    Mounting /proc filesystem		<-- tu zacina linuxrc
    Creating root device
    Mounting root filesystem
    Freeing unused kernel memory: 216k freed
    Kernel panic: No init found. Try passing init= option to kernel.
    

    Tuto distribuciu najdete tu: vdl-2.1.0-distro-initrd.tgz. Nasledujucej casti si ukazeme ako z tejto distribucie konecne spravit distribuciu s prikazovym riadkom. Konkretne spravime dve, prva bude mat prikazovy riadok v initial ramdisku a druha v normalnom root filesysteme.

    Prikazovy riadok v initial ramdisku

    Jedine vyuzitie je pre disketove minidistribucie. Vezmite initial ramdisk vdl-1.2.0-initrd-linuxrc.gz, rozbalte ho, primontujte na pomocny adresar test, do adresara /bin pridajte staticky linkovany ash, upravte linuxrc, odmontujte, zbalte, pridajte novy initrd do boot a spustite lilo:

    # mkdir pom pom/test
    # cp vdl-1.2.0-initrd-linuxrc.gz pom
    # cd pom; gzip -d vdl-1.2.0-initrd-linuxrc.gz
    # mv vdl-1.2.0-initrd-linuxrc initrd
    # mount initrd test -o loop -t ext2
    # cp /bin/ash ./test/bin
    # echo "exec ash" >> ./test/linuxrc
    # umount test
    # gzip -9 initrd
    # cp initrd.gz /mnt/hda2/boot
    # /sbin/lilo -r /mnt/hda2
    Added linux *
    

    Po restarte by malo vypisat toto:

    LILO
    vdl-boot-1
    boot:
    Loading linux.................
    Uncompressing linux......................
    .
    .
    (kernelove hlasky)
    .
    .
    Red Hat nash version 3.2.6 starting
    Mounting /proc filesystem		<-- tu zacina linuxrc
    Creating root device
    Mounting root filesystem
    Freeing unused kernel memory: 216k freed
    # pwd					<-- tu je ash, skusam par prikazov: pwd, ls a exit
    Cannot exec /bin/pwd
    # ls
    ls: not found
    # exit
    Kernel panic: attempted to kill init!
    

    Prikazovy riadok v root filesysteme

    Toto bude este jednoduchsie. Vezmite distro s initial ramdiskom vdl-2.1.0-distro-initrd.tgz, rozbalte ho na prazdnu particiu (napr. hda2). Pridajte tam adresar bin a skopirujte tam ash. Zaroven vytvorte adresar sbin a v nom skript init ktory spusti ash:

    # tar zxpf vdl-2.1.0-distro-initrd.tgz -C /mnt/hda2
    # mkdir /mnt/hda2/bin /mnt/hda2/sbin
    # cp /bin/ash /mnt/hda2/bin
    # cat > /mnt/hda2/sbin/init << EOF
    > #!/bin/ash
    > echo Toto je init skript interpretovany ash-om
    > exec ash
    > EOF
    EOF
    

    Obe verzie by sa mali chovat rovnako. T.j. po nabootovani spustia prikazovy riadok ash. Vypnutie systemu nieje nijak osetrene. Druhu spominanu verziu najdete tu: vdl-2.2.0-ash-distro.tgz.

    Vytvorenim skriptu /sbin/init sme sa pomali dostali k tzv. System V init ktory je popisany v niektorej nasledujucej kapitole.

    Balicky

    Tu niekde zacina byt normalny popis jednotlivych suborov kopirovanych na disk problematicky kvoli ich velkemu poctu. Preto odteraz budem pouzivat TGZ balicky ktore sa uplne jednoducho rozbalia na disk. Ich pripadny popis bude na samostatnych strankach. Neskor! Nateraz si mozete kazdy pozriet a prestudovat. Vacsiu pozornost budem venovat len konfiguracnym suborom. Vsetky balicky su specialne zostavene pre ucely VDL ale su na 99% standardne a v podstate su to vykuchane RPM balicky.

    Konvencne balickovacie systemy

    Je ich vela druhov. RPM, DEB, TGZ, ... Momentalne nieje v mojich silach ich TERAZ popisat takze to necham na neskor alebo na niekoho ineho...

    Veta: Kazdy balickovaci system obsahuje minimalne jeden nedostatok pre ktory ho nebudete most pouzit ;)

    Kniznice

    V tejto kapitole si povieme vsetko co je potrebne o knizniciach vediet ked si vyrabate vlastnu distribuciu. Kniznica je v podstate skompilovany zdrojovy kod. Nachadzaju sa v adresari /lib, /usr/lib, /usr/local/lib a maju priznaky spustitelneho suboru. Navyse sa pri nich nachadzaju symbolicke linky na tieto kniznice (kvoli kompatibilite).

    Zdielane kniznice

    V linuxe su kniznice zdielane. To znamena ze su nejake "standardne", casto pouzivane funkcie ktore su v nejakej kniznici a kazdy program ktory tieto funkcie pouziva vola tieto funkcie zo zdielanych kniznic. Vyhodou je ze ak dva rozne programy vyuzivaju jednu kniznicu tak je v pamati len raz.

    Program ldd

    Sluzi na vypisanie zdielanych kniznic programu, syntax je: ldd nejaky_program, viac informacii. Vzdy ked do distribucie pridavate nejaky program, skontrolujte si ci mate vsetky kniznice!

    Symbolicke linky

    Napriklad kniznicu tvori jediny subor /lib/ld-2.4.5.so a je vytvorena symbolicka linka /lib/ld-linux.so.2 ktora na nu ukazuje. Nazvy tych symbolickych liniek su standardizovane takze rozne programy mozu bezat s roznymi verziami kniznic. Pri instalacii sa musia tieto symbolicke linky vytvorit. Robi sa to programom ln alebo specialne urcenym programom ldconfig alebo jednoduchum skopirovanim liniek zo zdroja.

    Priklad instalacie kniznice ld-2.4.5 z aktualnej distribucie na hda2:

    # cp -p /lib/ld-2.4.5.so /mnt/hda2/lib
    # cp -p /lib/ld-linux.so.2 /mnt/hda2/lib	<-- skopirovanie symbolickej linky
    # cd /mnt/hda2/lib
    # ln -s ld-2.4.5.so ld-linux.so.2		<-- vytvorenie simbolickej linky
    # > > /etc/ld.so.conf				<-- vytvorenie prazdneho konfiguracneho suboru
    # ldconfig -r /mnt/hda2				<-- vytvorenie s.l. pomocou ldconfig
    

    Program ldconfig

    Sluzi na vytvaranie cache kniznic a symbolickych liniek pre NAJBEZNEJSIE alebo ZNAME kniznice. Pozor: ak sa jedna o nejaku specialnu kniznicu tak symlinky nevytvori! Kazdopadne ho treba spustit vzdy po pridani nejakej kniznice. Ak je kniznica inde ako v /lib alebo /usr/lib tak cestu k adresaru treba pridat do /etc/ld.so.conf a spustit ldconfig. Priklady:

    dvh# cat /etc/ld.so.conf	<-- FC4
    include ld.so.conf.d/*.conf
    dvh# cat /etc/ld.so.conf.d/xorg-x11-i386.conf
    /usr/X11R6/lib
    stary# cat /etc/ld.so.conf	<-- RH72
    /usr/X11R6/lib
    

    Vasa prva distribucia s kniznicami

    Od teraz uz bude vylepsovanie distribucie znacne monotonne. Bude pozostavat uz len z tychto krokov:

    1. Zistime ktory program chceme pridat
    2. Pomocou ldd zistime ktore kniznice potrebuje
    3. Pridame kniznice
    4. Nastavime kniznice
    5. Pridame program
    6. Nastavime program

    Uplne prva kniznica ktoru pridame bude sada kniznic znamych ako GLIBC (cize GNU C Libraries). Su to uplne najzakladnejsie kniznice. Z rpm balicku som pripravil tgz balicek s tymito kniznicami. Su tam aj konfiguracne subory a aj nejake standardne programy. Vela sa k tomu povedat neda, jednoducho pozrite si obsah balicka a je to. Tu je kniznica: glibc-2.2.4-13.i386.tgz a tu je postup instalacie na hda2 kde predpokladam zaklad nejake distro:

    # tar zxpf glibc-2.2.4-13.i386.tgz -C /mnt/hda2
    

    Vsetky ostatne kniznice budu vo forme tgz balicka, maximalne tam bude nejaky instalacny skript.

    Prikazovy riadok

    V tejto kapitole popiseme ako nainstalovat plnohodnotny prikazovy riadok. V predoslej casti sme pouzivaly staticky ash kvoli jeho jednoduchosti a nenarocnosti, nema ale niektore dolezite funkcie. Intepretru prikazoveho riadku sa tiez hovori "shell". Je to program ktory nacitava prikazy z klavesnice (alebo suboru) a vykonava ich.

    Bash

    BASH je skratka z "Bourne-Again SHell". Patri medzi standardne prikazove riadky. Vrelo odporucam! Potrebuje ale niektore kniznice ktore doposial niesu nainstalovane.

    # ldd /bin/bash
            libtermcap.so.2 => /lib/libtermcap.so.2 (0x007a5000)  <-- nieje sucast GLIBC !
            libdl.so.2 => /lib/libdl.so.2 (0x0078a000)
            libc.so.6 => /lib/libc.so.6 (0x00638000)
            /lib/ld-linux.so.2 (0x0061a000)
    

    Musite teda nainstalovat kniznicu libtermcap. Je to male rpm s jedinou kniznicou, ma 12 kb. Jej balicek najdete tu: libtermcap-2.0.8-28.i386.tgz. Potom mozete nainstalovat aj bash. Nakoniec mozete zmenit skript /sbin/init aby sa namiesto ash spustal bash:

    # tar zxpf libtermcap-2.0.8-28.i386.tgz -C /mnt/hda2
    # cat > /mnt/hda2/sbin/init << EOF
    > #!/bin/bash
    > echo "Toto je akoze init, spustam bash"
    > exec bash
    > EOF
    EOF
    

    Po spusteni lilo a restarte by ste mali dostat distribuciu s glibc a bash shellom. Bash shell je totiz velmi dolezity, pretoze ho pouzivaju takmer vsetky konfiguracne skripty. A to aj System V init v nasledujucej kapitole. Samotnu distribuciu najdete tu: vdl-2.3.0-glibc-bash-distro.tgz.

    Proces INIT

    Proces init (/sbin/init) je v poradi druhy proces ktory sa kernel pokusi spustit ak sa mu nepodari spustit /linuxrc. V 90% pripadov je to v linuxe nejaka obdoba niecoho co je zname ako "System V init" (zvysnych 10% tvori BSD a GoboLinux :). V podstate to moze byt akykolvek program, staci ak sa vola init. Proces init je predkom vsetkych ostatnych spustenych procesov. Preto ma cislo pid (process ID) rovne 1:

    #ps x
      PID TTY      STAT   TIME COMMAND
        1 ?        S      0:04 init [3] 		<-- proces init
        2 ?        SW     0:00 [keventd]
        3 ?        SW     0:00 [kapm-idled]
        4 ?        SWN    0:00 [ksoftirqd_CPU0]
        5 ?        SW     0:00 [kswapd]
        6 ?        SW     0:00 [kreclaimd]
        7 ?        SW     0:00 [bdflush]		<-- 2.4.x kernel :)
        8 ?        SW     0:00 [kupdated]		
        9 ?        SW<    0:00 [mdrecoveryd]
       80 ?        SW     0:00 [khubd]
      470 ?        S      0:00 syslogd -m 0
      475 ?        S      0:01 klogd -2
      636 ?        S      0:00 /usr/sbin/apmd -p 10 -w 5 -W -P /etc/sysconfig/apm-sc
      692 ?        S      0:01 /usr/sbin/sshd
      725 ?        S      0:00 xinetd -stayalive -reuse -pidfile /var/run/xinetd.pid
      765 ?        S      0:00 sendmail: accepting connections
      784 ?        S      0:00 gpm -t ps/2 -m /dev/mouse
      802 ?        S      0:00 crond
      872 ?        S      0:00 anacron
      944 ?        S      0:01 /usr/sbin/httpd -DHAVE_ACCESS -DHAVE_PROXY -DHAVE_AUT
      963 ?        S      0:00 /bin/sh /usr/bin/safe_mysqld --defaults-file=/etc/my.
      971 tty1     S      0:00 /sbin/mingetty tty1
      972 tty2     S      0:00 /sbin/mingetty tty2
      973 tty3     S      0:00 /sbin/mingetty tty3
      974 tty4     S      0:00 /sbin/mingetty tty4
      977 tty5     S      0:00 /sbin/mingetty tty5
      978 tty6     S      0:00 /sbin/mingetty tty6
     1012 ?        S      0:00 /usr/sbin/sshd
     1013 pts/0    S      0:00 -bash
     1061 pts/0    R      0:00 ps x
    

    System V Init

    System V Init (SysVInit) patri medzi standardy. Pouziva sa vo vsetkych "normalnych" distribuciach a preto by ste ho mali pouzit aj vy. Jedina vynimka mozu byt disketove alebo specialne distribucie. SysVInit v podstate riesi prepinanie runlevelov v linuxe. Ak kernel nenajde /sbin/init vypise chybovu hlasku "Kernel panic: No init found!"

    System V Init pouziva konfiguracny subor /etc/inittab ktory popisuje ktore programy sa maju spustat v ktorom runleveli. Runlevel je v podstate cislo vyjadrujuce rezim v ktorom system bezi. Vyznam tohoto cisla je takyto:

    0 - halt (zastavenie systemu, vypnutie)
    1 - single user (pre jedneho pouzivatela)
    2 - multiuser bez siete
    3 - multiuser so sietou (normalny rezim)
    4 - rezerva
    5 - multiuser (3) s prihlasenim do X Window System
    6 - reboot (restartovanie systemu)
    

    Okrem toho aj pismena A,B,C ale s tym som sa este nestretol. Subor /etc/inittab ma specificky format, kazdy neprazdny riadok ktory nezacina # ma tento format. Pozor, niektore verzie SysVinit "id" policko odmietaju alebo maju mierne odlisny format!

    id:runlevel:akcia:proces
    

    Kde:

  • id - 1 az 4 znakovy identifikator, starsie init podporuju len 2 znaky, tradicne pre terminaly sa pouziva to iste cislo ako cislo terminalu, niektore starsie verzie to predpokladaju
  • runlevel - cisla 0 az 6 (aj viac cisel spojenych), vyznam je popisany vyssie
  • akcia - popisuje akciu ktora sa vykona (respawn,wait,once,boot,bootwait,off, ondemand,initdefault,sysinit,powerwait,powerfail,powerokwait, powerfailnow,ctrlaltdel,kbrequest,)
  • proces - ktory proces sa spusti
  • Tu je jednoduchy priklad inittabu:

    # standardny runlevel je 3
    id:3:initdefault:
    
    # inicializacia systemu
    si::sysinit:/etc/rc.d/rc.sysinit
    
    # prepinanie runlevelov
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    l3:3:wait:/etc/rc.d/rc 3
    l4:4:wait:/etc/rc.d/rc 4
    l5:5:wait:/etc/rc.d/rc 5
    l6:6:wait:/etc/rc.d/rc 6
    
    # veci ktore sa deju pri kazdom runleveli
    ud::once:/sbin/update
    
    # CTRL-ALT-DELETE
    ca::ctrlaltdel:/sbin/shutdown -h now
    
    # napajanie
    pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
    pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
    
    # terminaly 
    1:2345:respawn:/sbin/mingetty --noclear tty1
    2:2345:respawn:/sbin/mingetty tty2
    3:2345:respawn:/sbin/mingetty tty3
    4:2345:respawn:/sbin/mingetty tty4
    5:2345:respawn:/sbin/mingetty tty5
    6:2345:respawn:/sbin/mingetty tty6
    
    # xdm v runleveli 5
    x:5:respawn:/etc/X11/prefdm -nodaemon
    

    Ako vidite, System V Init netvori len jeden program ale viacero skriptov, standardne v /etc/init.d/ alebo /etc/rc.d/. Dalej budete potrebovat program shutdown, update, mingetty, atd. To vsetko je sucastou balika programov System V init. Tie musite skopirovat na vasu particiu. Niesu to ale staticky linkovane programy takze najprv musite vyriesit zdielane kniznice. Konkretne init 2.78 potrebuje tieto kniznice:

    # ldd /sbin/init
            linux-gate.so.1 =>  (0x00a17000)
            libc.so.6 => /lib/libc.so.6 (0x00638000)
            /lib/ld-linux.so.2 (0x0061a000)
    

    Mozete tieto kniznice len skopirovat (kniznice a symbolicke linky) alebo nainstalovat tie kniznice normalne z nejakeho baliku, napr. rpm. Ten druhy sposob je lepsi lebo kniznice mozu so sebou mat aj niektore konfiguracne subory! Na druhu stranu, napr. balik glibc-common-2.2.4-13.i386.rpm obsahuje asi 100 MB lokalizacnych dat (v 288 jazykoch) co si myslim ze je trochu mrhanie prostriedkami. Ak hovorite Svahilsky chodte sem.

    Vasa prva distro so System V Init

    Zakladom bude distribucia s GLIBC a BASH prikazovym riadkom vdl-2.3.0-glibc-bash-distro.tgz. Bash je dolezity lebo ak maju vyzerat init skripty trochu normalnejsie tak potrebujeme kvalitny interpreter, nie nejaky staticky minimalisticky ash! Dolezita je podpora: if, case, for a funkcie.

    Pripravil som balicek so Sysrem V Init: SysVinit-2.78-19.i386.tgz. Staci ho rozbalit na hda2. Tym sa prepise povodny skript /sbin/init (vo vdl-ash-distro len spustal ash interpreter) standardnym init skriptom.

    # tar zxpvf vdl-2.3.0-glibc-bash-distro.tgz -C /mnt/hda2
    # tar zxpvf SysVinit-2.78-19.i386.tgz -C /mnt/hda2 
    

    Sucastou SysVInit su napr. programy halt, killall5, pidof, shutdown, runlevel, sulogin. Dalsim balickom bude balicek setup-2.5.7-1.noarch.tgz. Su to najma konfiguracne subory v /etc/ a jeden log (/var/log/lastlog).

    /etc/bashrc      - nastavenia bash (napr. PS1, spustanie profilov programov v /etc/profile.d/, funkcie, aliasy)
    /etc/csh.cshrc   - to iste pre c-shell
    /etc/csh.login   - detto
    /etc/exports     - netusim
    /etc/filesystems - zoznam znamych filesystemov (zrejme kernelu)
    /etc/group       - definovanie skupin uzivatelov
    /etc/host.conf   - konfigurak tykajuci sa konverzie ip/host adries
    /etc/hosts.allow - zoznam mien hostov ktori mozu pouzivat lokalne INET sluzby
    /etc/hosts.deny  - mena hostov ktory nesmu pouzivat lokalne INET sluzby
    /etc/inputrc     - cosi ako zakladne rozlozenie klavesnice
    /etc/motd        - message of the day
    /etc/passwd      - subor definujuci uzivatelov
    /etc/printcap    - zakladne nastavenie tlace
    /etc/profile     - vacsinou nastavenie ciest, env premennych, hostname, ...
    /etc/protocols   - zoznam IP protokolov
    /etc/securetty   - zoznam bezpecnych konzol z ktorych sa moze prihlasit root
    /etc/services    - zoznam sluzieb, porty a protokoly na ktorych bezia
    /etc/shells      - zoznam prikazovych interpretrov (bash, sh, ...)
    

    Dalsi balicek ktory budete potrebovat je bdflush-1.5-17.i386.tgz. Ktory obsahuje program /sbin/update - demon ktory zapisuje buffre spat na disk pri prepinani runlevelov. Tyka sa to len kernelov < 2.6

    Dalsim balickom je samozrejme vdl-3.0.0-inittab.tgz ktory obsahuje init skripty v /etc/rc?.d, /etc/init.d a najma samotny /etc/inittab. Najdolezitejsie sucasti:

    /etc/rc.d/rc - prepinanie runlevelov, cisla levelov su parametre skriptu
    /etc/rc.d/rc.local - toto sa spusti po rc.sysinit, je tam preto aby ste nemuseli sprtat do rc.sysinit 
    /etc/rc.d/rc.sysinit - hlavny inicializacny skript, spusta sa bezprostredne po spusteni init
    /etc/rc0.d - skripty ktore sa maju spustat pri HALTe systemu
    /etc/rc1.d/ az /etc/rc5.d/ - skripty ktore sa maju pustat pri runleveloch 1 az 5
    /etc/rc6.d/ - skripty ktore sa maju spustat pri reboote
    /etc/init.d/ - vsetky skripty
    

    Skript /etc/rc.d/rc.sysinit pouziva prikaz mount ktory musite nainstalovat. Pripravil som balicek mount-2.11g-5.i386.tgz ktory obsahuje prikazy mount a umount, swapon, swapoff ako aj konfiguracny subor /etc/fstab ktory obsahuje zoznam filesystemov a particie alebo adresare a nastavenia ako sa maju montovat.

    Budete potrebovat aj niektore nove dev subory: /etc/pts, /etc/shm. Takisto bude treba vytvorit SWAP. Samozrejme pouzijeme SWAP do suboru pretoze matlab zatial pustat nebudeme a swap particiou by sme zbytocne o jednu particiu prisli. V beznej prevadzke samozrejme pouzite samostatnu swapovu particiu , bude to ovela rychlejsie. Tu je postup vytvorenie swapoveho suboru /SWAP:

    # dd if=/dev/zero of=/mnt/hda2/SWAP bs=1k count=2000
    # mkswap /mnt/hda2/SWAP
    Setting up swapspace version 1, size = 2043904 bytes
    # chmod 755 /mnt/hda2/swap
    

    Dalsou dolezitou sucastou je balik sh-utils-2.0.11-5.i386.tgz ktory obsahuje plno zakladnych linuxovych programov (nice, pwd, su, true, chroot, env, ...) ale nateraz najdolezitejsie budu echo a sleep pomocou ktorych sa da velmi slusne ladit start linuxoveho systemu. Proste pred kazdym prikazom vypisete co sa spusta a date sem tam nejaky sleep aby ste stihli citat co sa vypisuje.

    Dalsim balickom je mingetty-0.9.4-18.i386.tgz ktory obsahuje program mingetty. Je to program ktory otvory tty konzolu a spusti program login ktory caka na zadanie mena uzivatela.

    Samotny program login zatial nebudete potrebovat pretoze by ste aj tak neprihlasili kvoli chybajucej PAM (to bude az v dalsej kapitole). Jedine ze by ste pouzili busybox ktory PAM nepouziva...

    Tym by mala byt System V Init distribucia hotova. Nieje funkcna lebo sa nemozete prihlasit. Mozete si ju pozriet tu: vdl-3.3.0-sysvinit-distro.tgz

    Busybox

    Busybox je projekt ktoreho cielom je vytvorit zakladne linuxove programy (ls, cp, mv, rm, mount, login, ...) systemom tzv. multicall binaries, t.j. jeden spustitelny program dokaze nahradit vsetky programy. Vyhodou je to ze rovnako funkcny program zabera menej miesta (a moze byt rychlesi) ako maju tie programy spolu ked su samostatne. Je to preto ze tam nieje nevyuzite miesto z napoli obsadenych diskovych clusterov a tiez na zaciatku kazdeho spustitelneho programu su opakujuce sa casti kodu ktore zaberaju miesto. Busybox je idealny na miniaturne disketove distribucie alebo na male live CD verzie. Dalsou vyhodou je ze programy ktore busybox implementuje su od toho isteho autora a teda je mensia pravdepodobnost ze si nebudu rozumiet.

    Multicall binarky maju vsak aj svoje nevyhody. Menej ochotne prijimaju externe programy a su celkovo trochu nestandardne. Medzi hadam najvacsie nedostatky patri to ze nepodporuju PAM. Tiez sa obcas stane ze napr. mate dve verzie busyboxu, pricom v prvej nefunguje dobre napr. shell a v druhej nefunguje tar. Jedine co mozete spravit je nefunkcnu cast nahradite standalone programom, napr. samostatny tar. Problemy byvaju aj so zavyslostami kniznic.

    Konzoly

    Konzola je cosi ako virtualna obrazovka, typicky pocet textovych konzol je 6, prepineju sa cez Alt+F1 az Alt+F6. Pocet konzol je definovany v subore /etc/inittab tak ze kolkokrat je spusteny mingetty alebo podobny program, tolko je konzol. Zoznam konzol z ktorych sa moze pripojit root je v /etc/securetty. Viac k tomu asi nemam co povedat.

    Prihlasenie, Ucty, Odhlasenie, Hesla a Pouzivatelia

    Prihlasovanie do linuxu cez virtualnu konzolu prebieha tak ze program /sbin/mingetty ktory vytvara konzolu spusti program /sbin/login ktory nacitava meno a heslo. Ak je meno a heslo spravne (/etc/passwd alebo /etc/shadow), login spusti interpreter prikazoveho riadku (7.zaznam v /etc/passwd) a nastavi aktualny adresar na domovsky adresar (6. zaznam v /etc/passwd). Odhlasenie je ked uzivatel ukonci interpreter prikazoveho riadku. Potom sa ukonci program mingetty a spusti sa novy na tej istej konzole, ktory je opat pripraveny na prihlasenie sa uzivatela. Ucty su definovane v /etc/passwd, /etc/shadow, /etc/group a /etc/gshadow. Spravovat ucty je mozne programami useradd, userdel, groupadd, ... ktore su sucastou balika shadow-utils-20000902-4.i386.tgz.

    Login

    Program login je sucastou balicka util-linux-2.11f-9.i386.tgz, spolu s programami dmesg, kill, more, agetty, fdisk, mkswap, ... Najdolezitejsie je ze vyzaduje PAM takze ak chcete mat funkcny login, najprv potrebujete rozchodit PAM!

    Velmi dolezite je ale to ze program login potrebuje na svoju spravnu cinnost beziaci syslog a takisto niektore log subory. Su to najma /var/log/wtmp a /var/run/utmp. Ak tieto logy nebudu existovat tak sa vam nepodari odhlasit alebo vypnut pocitac. Bude vypisovat hlasky "You don't exist. Go away!" a podobne.

    Password

    Sluzi na zmenu hesla v subore /etc/passwd alebo /etc/shadow. Takisto vyzaduje funcnu PAM.

    Shadow

    Normalne zakodovane hesla niesu v /etc/passwd ale v /etc/shadow ktore bezny uzivatel nemoze citat. Je to kvoli bezpecnosti.

    Tinylogin

    Plati o nom to iste co o busyboxe. Je to multicall binarka ktora sa stara o prihlasenie. Obsahuje teda ekvivalent programov login, (min)getty a niektorych dalsich. Vhodne na disketove distribucie lebo zabera menej miesta. Nepodporuje PAM takze ak mate zle nastavenu PAM (alebo logy) a nefunguje vam normalne prihlasenie tak pomocou tinylogin sa bez problemov prihlasite aj odhlasite.

    PAM

    PAM znamena Pluggable Authentication Modules, cize zasuvne moduly na utorizaciu alebo prihlasenie. Je to velmi dolezita vec. PAM je dost vyrazne zviazana so System V Init a startom systemu, vytvara dost komplikovane zavyslosti a nieje jednoduche to nastavit tak aby to fungovalo tak ako ma. Velmi vela programov PAM pouziva a preto je to jedna z dolezitych sucasti systemu.

    Cela PAM je v jednom balicku pam-0.75-14.i386.tgz samotne moduly PAM sa nachadzaju v /lib/security/. Je tam (v povodnom RPM) pomerne husty instalacny skript takze som pripravil vlastny balicek kde pribudli simlinky na pam kniznice v /lib/ a konfigurak /etc/sysconfig/authconfig:

    USEHESIOD=no
    USELDAP=no
    USEMD5=yes
    USENIS=no
    USEKERBEROS=no
    USELDAPAUTH=no
    USESHADOW=yes
    USESMBAUTH=no
    

    Logy

    Uz som spominal ze pre PAM su logy zivotne dolezite. Samozrejme MUSI bezat spravne syslogd a klogd, musite mat nastaveny spravne konfiguracny subor /etc/syslog.conf a najma, vsetky log subory musia byt vytvorene a mat spravne masky! Tu je uplny zoznam logov ktore musite mat na to aby ste sa mohli prihlasit, odhlasit a restartovat pocitac:

    755 /var/lock/
    755 /var/lock/subsys/
    755 /var/log/
    600 /var/log/boot.log
    644 /var/log/btmp
    644 /var/log/dmesg
    600 /var/log/maillog
    600 /var/log/messages
    600 /var/log/secure
    600 /var/log/spooler
    664 /var/log/wtmp		- velmi dolezite!
    755 /var/run/
    755 /var/run/console/
    600 /var/run/klogd.pid
    600 /var/run/syslogd.pid
    664 /var/run/utmp		- velmi dolezite!
    755 /var/spool/
    755 /var/tmp/
    

    Odhlasenie, Restart, Shutdown, Halt

    Na odhlasenie, restart, shutdown aj halt musite mat spravne nastaveny syslog a vsetky horeuvedene logy! Opakujem to uz treti krat ale fakt je to velmi dolezite!

    Halt

    Na rozdiel od Shutdown sa pri halte pocitac nevypne ale len zostane zastaveny. Prakticky vyznam toho nepoznam (asi dosky bez APM/ACPI). Samotny skript je uplne rovnaky ako pre shutdown len na konci sa namiesto shutdown vola halt (s rovnakymi parametrami). Kernel nakoniec vypise priblizne toto:

    System is halted
    System halted
    

    Vasa prva distribucia s PAM

    To co som doteraz o SysVInit a PAM povedal najdete v jednej distribucii vdl-4.0.0-pam-distro.tgz.

    Kontrola filesystemu pri starte

    Vsetky normalne distribucie pri starte kontroluju filesystem na diskoch programom fsck. Tento program dokaze opravit chyby ktore na ext2 alebo inom filesysteme vzniknu vtedy ked napriklad tvrdo resetujete stroj alebo vypadne napajanie alebo nedajboze padne kernel - to sa mi za posledne 4 roky stalo len raz (niekolko krat som rychlo zastrcil a vytiahol usb kluc v RH72 - kernel 2.4.7-10).

    Program fsck pre ext2 a ext3 je sucastou balika e2fsprogs-1.23-2.i386.rpm z ktoreho som pripravil balik vdl-4.3.0-fsck.tgz. Samotna kontrola filesystemu sa dava do inicializacneho skriptu /etc/rc.d/rc.sysinit a to samozrejme este pred tym ako sa root filesystem remontuje v read-write mode! Bude to teda umiestnene za primontovanim filesystemov / a /proc v read-only mode a pred remontovanim v read-write mode.

    echo -n "Checking root filesystem: "
    fsck -T -C /
    if [ "$?" -gt 2 ]; then
        echo "failed"
        echo "WARNING: Errors found while checking root filesystem."
        echo "You can login as root now, the system will reboot after logout."
        sulogin
        /sbin/shutdown -r now
    elif [ "$?" = "2" ]; then
        echo "failed"
        echo "NOTICE: System needs to be rebooted now."
        sleep 1
        /sbin/shutdown -r now
    else
        echo "done"
    fi
    

    Pre jednoduchost instalacie som pripravil balicek s upravenym rc.sysinit skriptom: vdl-4.2.0-fsck-sysinit.tgz.

    Zakladne linuxove programy

    Ked uz mame zakladnu PAM distribuciu, bolo by vhodne ju doplnit o zakladne programy ako ls, cp, mv a podobne aby sa v nej dalo nieco normalne robit. Toto je velmi jednoduche pretoze staci pozadovane programy skopirovat na disk. Vrelo vam odporucam tieto standardne balicky

  • fileutils-4.1-4.i386.tgz - chgrp, chmod, chown, cp, dd, df, ln, ls, mkdir, mknod, mv, rm, rmdir, sync, touch, dir, dircolors, du, install, mkfifo, shred, vdir
  • findutils-4.1.7-1.i386.tgz - find, xargs
  • grep-2.4.2-7.i386.tgz - grep, egrep, fgrep
  • lilo-21-4-4-14.i386.tgz - lilo
  • man-1.5i2-6.i386.tgz - man
  • mktemp-1.5-11.i386.tgz - mktemp
  • modutils-2.4.6-4.i386.tgz - depmod, genksyms, insmod, insmod_ksymoops_clean, kallsyms, kernelversion, ksyms, lsmod, modinfo, modprobe, rmmod
  • passwd-0.64.1-7.i386.tgz - passwd
  • sed-3.02-10.i386.tgz - sed
  • textutils-2.0.14-2.i386.tgz - cat, cut, sort, cksum, comm, csplit, expand, fmt, fold, head, join, md5sum, nl, od, paste, pr, ptx, sha1sum, split, sum, tac, tail, tr, tsort, unexpand, uniq, wc

    Siet

    Tato kapitola je o tom ako do VDL pridat funkcnu siet. Ako zaklad pouzijem distro so System V Init a PAM vdl-4.0.0-pam-distro.tgz. Pridame balicek modutils-2.4.6-4.i386.tgz aby sme mohli natahovat moduly sietovej karty. Dalsi balicek bude iputils-20001110-6.i386.tgz ktory obsahuje program ping ktorym budeme testovat funkcnost siete. Dalsi balicek bude net-tools-1.60-3.i386.tgz ktory obsahuje najma program /sbin/ifconfig, a potom programy hostname, netstat atd. No a nakoniec, asi najdolezitejsia sucast su moduly. Tie su sucastou distribucie kernelu, tiez som pripravil balicek s kernel modulmi: vdl-5.0.0-modules.tgz. Su to v podstate vsetky drivre ktore kernel 2.4.7-10 podporuje. Zaberaju ale 22 MB co je az zbytocne vela ked chceme len ukazat ako nastartovat siet na jednej konkretnej sietovej karte. Preto som pripravil balicek s kernel modulmi mojej sietovej karty "SMC EtherCard Elite 16 Ultra" konkretne smc-ultra.o a 8390.o. Tiez obsahuje suboor modules.dep ktory popisuje zavislosti modulov. Balicek vdl-5.1.0-modules-smc.tgz co ma zbalene len 8 kB, teda asi 2700x menej :). Tato "finta" je nevyhnutna najma pri jednodisketovych distribuciach! Uplny postup instalacie je takyto:

    # tar zxpf vdl-4.0.0-pam-distro.tgz -C /mnt/hda2
    # tar zxpf vdl-5.1.0-modules-smc.tgz -C /mnt/hda2
    # tar zxpf modutils-2.4.6-6.i386.tgz -C /mnt/hda2
    # tar zxpf iputils-20001110-6.i386.tgz -C /mnt/hda2
    # tar zxpf net-tools-1.60-3.i386.tgz -C /mnt/hda2
    

    Po nabootovani a prihlaseni musite nahodit siet. Najprv natiahnete modul sietovej karty smc-ultra.o a potom prgramom ifconfig nahodite sietove rozhranie so zatial pevnou IP adresou 1.1.1.4, druhy pocitac ma 1.1.1.7:

    # modprobe smc-ultra
    smc-ultra.c: Presently autoprobing (not recomended) for a single card
    smc-ultra.c: No ISAPnP cards found, trying standards ones...
    smc-ultra.c:v2.02 2/3/98 Donald Becker (becker@cesdis.gsfc.nasa.gov)
    eth0: SMC Ultra at 0x300, 00 00 C0 9E AB BC, IRQ 10 memory 0xd0000-0xd3fff.
    # ifconfig eth0 1.1.1.4 up
    # ifconfig lo 127.0.0.1 up
    
    # ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:00:C0:9E:AB:BC  
              inet addr:1.1.1.4  Bcast:1.255.255.255  Mask:255.0.0.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:12 errors:0 dropped:0 overruns:0 frame:0
              TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:100 
              RX bytes:1100 (1.0 Kb)  TX bytes:1100 (1.0 Kb)
              Interrupt:10 Base address:0x310 Memory:d0000-d4000 
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:16436  Metric:1
              RX packets:4 errors:0 dropped:0 overruns:0 frame:0
              TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:336 (336.0 b)  TX bytes:336 (336.0 b)
    
    # ping 1.1.1.4
    Warning: time of days go back, taking countermeasures
    PING 1.1.1.4 (1.1.1.4) from 1.1.1.4 : 56(84) bytes of data.
    64 bytes from 1.1.1.4: icmp_seq=0 ttl=255 time=721 usec
    64 bytes from 1.1.1.4: icmp_seq=1 ttl=255 time=185 usec
    64 bytes from 1.1.1.4: icmp_seq=2 ttl=255 time=191 usec
    Ctrl^C
    --- 1.1.1.4 ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max/mdev = 0.181/0.252/0.721/0.177 ms
    
    # ping 1.1.1.7
    Warning: time of days go back, taking countermeasures
    PING 1.1.1.7 (1.1.1.7) from 1.1.1.4 : 56(84) bytes of data.
    64 bytes from 1.1.1.7: icmp_seq=0 ttl=64 time=1.468 msec
    64 bytes from 1.1.1.7: icmp_seq=1 ttl=64 time=571 usec
    64 bytes from 1.1.1.7: icmp_seq=2 ttl=64 time=571 usec
    64 bytes from 1.1.1.7: icmp_seq=3 ttl=64 time=570 usec
    
    --- 1.1.1.7 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss
    round-trip min/avg/max/mdev = 0.570/0.795/1.468/0.388 ms
    

    Ako vidite, vsetko funguje ako ma. To loopback zariadenie som nahadzoval preto aby som mohol pingovat aj sam seba (127.0.0.1). Samozrejme ze bezny user nebude chciet po hazdom prihlaseni nahazdovat siet takze to treba nejak automatizovat. Bezne sa to robi tak ze do /etc/init.d/ sa prida skript network ktory nahodi siet (aj je jeho S* linka v niektorom rc*.d). Tych zariadeni moze byt viac a mozno nie vsetky chcete spustat takze sa to robi tak ze v adresari /etc/sysconfig/network-scripts/ su konfiguracne subory pre vsetky mozne rozhrania, napr:

    Subor: /etc/sysconfig/network-scripts/ifcfg-01-lo  
      
      DEVICE=lo
      ONBOOT=yes
      NAME=loopback
      IPADDR=127.0.0.1
      NETMASK=255.0.0.0
      NETWORK=127.0.0.0
      BROADCAST=127.255.255.255
    
    Subor: /etc/sysconfig/network-scripts/ifcfg-eth0
    
      DEVICE=eth0
      ONBOOT=yes
      BOOTPROTO=none
      HWADDR=00:14:38:06:FB:04
      TYPE=Ethernet
      DHCP_HOSTNAME=dvh.domena
      IPADDR=1.1.1.7
      NETMASK=255.255.255.0
      USERCTL=no
      PEERDNS=yes
      IPV6INIT=no
    

    Tieto subory sa potom pouzivaju skriptom /etc/init.d/network ktory vsetky rozhrania spusti pomocou ifconfig. Tu je jeho velmi jednoducha ale prehladna a funkcna verzia (vyberam len tu cast co startuje sietove rozhrania):

    start() 
      {
        echo "Bringing up all network interfaces"
        for i in /etc/sysconfig/networking/ifcfg-*; do
          if [ -f "$i" ]; then
            . $i
            echo -n "  $DEVICE - $NAME at $IPADDR: "
    	if [ "$ONBOOT" == "yes" ]; then
      	  /sbin/ifconfig $DEVICE $IPADDR netmask $NETMASK up
              echo "online"
    	else
    	  echo "stay offline"	  
    	fi
          fi
        done
      }
    

    Cely balicek so sietovymi init skriptami najdete tu: vdl-5.3.0-network-init.tgz.

    Midnight Commander

    Velmi dolezita vec lebo pre ludi prechadzajucich na linux je to aspon z casti cosi zname, rozhodne znamejsie ako vi. Dost dolezite je u MC nastavenie kniznic lebo MC je pomerne velky moloch:

    # ldd /usr/bin/mc
            linux-gate.so.1 =>  (0x00cb4000)
            libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x003d7000)
            libdl.so.2 => /lib/libdl.so.2 (0x0078a000)
            libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x001fc000)
            libext2fs.so.2 => /lib/libext2fs.so.2 (0x005b3000)
            libcom_err.so.2 => /lib/libcom_err.so.2 (0x00b89000)
            libgpm.so.1 => /usr/lib/libgpm.so.1 (0x0042a000)
            libslang-utf8.so.1 => /usr/lib/libslang-utf8.so.1 (0x00830000)
            libnsl.so.1 => /lib/libnsl.so.1 (0x0736c000)
            libc.so.6 => /lib/libc.so.6 (0x00638000)
            /lib/ld-linux.so.2 (0x0061a000)
            libm.so.6 => /lib/libm.so.6 (0x00764000)
    

    Hlavny problem s MC byva ze ide spustit v X ale nejde spustit v konzole. Normalne zamrzne a nefunguje ani ctrl+c ani ctrl+z. Ak sa vam to stane, skuste nasledujuce postupy (postupne alebo v roznych kombinaciach). Mne pomohla prva moznost:

  • vymazte subor /usr/lib/mc/bin/cons.saver
  • vytvorte /dev/pty* subory (cd /dev; ./MAKEDEV pty)
  • vytvorte /dev/ptmx (cd /dev; ./MAKEDEV ptmx)
  • vytvorte /dev/pt0-15 (cd /dev; ./MAKEDEV pt)
  • nastavte pristupove prava na /dev/tty* na 666
  • kernel musi byt skompilovany s CONFIG_UNIX98_PTYS=y a CONFIG_DEVPTS_FS=y
  • musi existovat adresar /dev/pts
  • nastavte premennu TERM na linux alebo xterm (export TERM=linux)
  • skuste nastavenie v /etc/termcap
  • skontrolujte zapis do /tmp a /var adresara
  • skontrolujte ci nieco nieje v logoch
  • skontrolujte cez ldd zavislosti
  • skontrolujte programy v `mc -f`
  • skuste spustit mc s roznou kombinaciou parametrov -x -d -t -k -s -b -u
  • poslite popis chyby a vypus `mc -V` na mc-devel@gnome.org

    xinetd

    Toto je velmi dolezita vec. Je to demon ktory spusta sietove sluzby az vtedy ked su potrebne. Napr. ak mate na pocitaci ssh, ftp a http server tak pri starte sa spusti len xinetd a az ked sa niekto pripoji tak ho xinetd spusti. Pouziva PAM a navyse dve (tri) dalsie kniznice: cracklib-2.7-12.i386.tgz, ...

    O inetd/xinetd sa toho da povedat vela, zatial nieje cas...

    Scrinchy HTTP server

    Velmi zaujimavy projekt. HTTP server ktory ma skompilovany len 26 kB a potrebuje len GLIBC. Minimalne na lokalne testovanie stranok je to vyborna vec ale viem si ho predstavit aj ako normalny server. Tentoraz to bude balicek aj so zdrojovymi kodmi: vdl-5.4.0-scrinchy.tgz.

    Samozrejme som tam uz implementoval aj podporu SysVInit, standardne je server vypnuty, zapnut si ho mozete editovanim konfiguraku /etc/scrinchy/scrinchy.conf. Bohuzial sa mi ho nepodarilo rozchodit tak aby bezal cez xinetd!

    vsftpd FTP server

    Nahodou som natrafil na zdrojaky vsftpd FTP servra a zistil som ze RH7.2 aj FC4 to vie skompilovat a navyse to na rozdiel od wu-ftpd funguje na prvy pokus tak som spravil balicek. Je to podobne ako scrinchy, Nastavil som tam hlavne SysVInit veci. Balicek najdete tu: vdl-5.5.0-vsftpd.tgz. Balicek obsahuje aj zdrojove kody.

    Live distribucie

    Tato kapitola obsahuje informacie o live distribuciach. Momentalne to nieje moja primarna oblast zaujmu takze tu najdete len zakladne informacie. Udajne v niektorych distribuciach existuje skript "mklivecd" alebo nieco podobne. Samozrejme ze my chceme vediet co je za tym takze pojdeme vlastnou cestou. Problematika live distribucii sa tyka:

  • bootovanie
  • nemoznost zapisu na CD
  • kvalitne rozpoznavanie hardveru

    Bootovanie live distribucii

    Na CD sa pouziva ISO9660 filesystem ktory je readonly. Preto naprklad program mkisofs nepouziva loop zariadenie ale vytvara filesystem v subore priamo z existujuceho adresara. Nemozete primontovat ISO obraz cez loop na zariadenie, nakopirovat tam subory a odmontovat lebo ISO9660 jednoducho zapis nepodporuje. Dosledok toho je uplne jasny. Nemozete pouzit LILO! Je tu ale syslinux - jednoduchy bootloader pre FAT filesystem, bezne sa vyskytuje aj na disketach. Tiez je tu projekt LOADLIN ktory sa pouziva na CD-ROM.

    Vytvorenie Live CD

    Postup je takyto: Vytvorite si dosovsky obraz diskety velkosti 2.88 MB ktora sa na CD pouzije na bootovanie. Pomocou programu syslinux tam skopirujete bootloader. Primontujete ako normalnu disketu cez loop zariadenie na adresar, skopirujete kernel (subor vmlinuz) a root filesystem v initial ramdisku (subor rootfs.gz). Nakoniec prikazom rdev nastavite root device na ramdisk 0.

    # mkdir pom
    # mkdir -p iso/boot
    # dd if=/dev/zero of=image bs=10k count=288
    # mkdosfs image
    # mount image pom -o loop -t msdos
    # cp vmlinuz pom/linux
    # rdev pom/linux /dev/ram0
    # cp rootfs.gz pom
    # syslinux image
    

    Teraz v adresari pom vytvorte konfiguracny subor syslinux.cfg ktory bude obsahovat:

    append initrd=rootfs.gz
    

    Teraz vytvorte iso obraz samotneho CD. Najprv do adresara iso/boot skopirujte image tej 2.88 MB diskety. Potom do adresara iso mozete dat pripadne dalsie subory (po nabootovani si mozete CD primontovat a subory normalne pouzit). Nakoniec vytvorte .iso obraz pre bootovatelne CD prikazom mkisofs.

    # cd iso
    # mkisofs -r -b boot/boot.img -c boot/boot.cat -o ../bootcd.iso .
    # cd ..
    

    Tym je CD hotove. Uz len napalit na CD a je to. Prikladom moze byt napriklad bootovatelne CD s nazvom tty-linux ktoreho iso obraz najdete tu: tty-linux-4.8.iso.

    Typy a triky

  • Ked robite distro vsetko robte ako root, moze sa stat ze vytvorite nejaky subor ako obycajny user a potom sa budete cudovat preco vam to nejde
  • Zruste swapovaciu particiu, swapujte do suboru, usetrite tak jednu primarnu particiu na bootovanie
  • Pozerajte logy! Fakt je tam uplne vsetko zaznamenane ak vam nieco nejde. Velakrat sa mi stalo ze nieco neslo a ja som sa s tym trapil hodiny a dni len preto ze som zabudol pozriet vsetky logy
  • Ak su logy prazdne, mozno vam nejdu logery syslogd a klogd

    Rozdiely medzi kernelom 2.4.x a 2.6.x

    Kernel 2.6.x nepotrebuje bdflush demona. V /etc/inittab teda mozete riadok ud:... vykomentovat. Pouziva udev.

    Lokalizacia

    Cela tato kapitola pojednava o poslovenceni vasej distribucie linuxu, t.j. ktore balicky treba nainstalovat a ako sa nastavuju. Zakladny je balicek locales a potom slovensky balicek locales-sk.

    Miestne nastavenia

  • Ich podpora je implementovana priamo v glibc
  • Definovanie formatu datumu a casu
  • Pomocou premennych prostredia LC_nieco=sk

    V skratke LC_* a ine lokalizacne premenne premenne:

  • LANGUAGE - alternativne miestne nastavenia, aj viac oddelenych dvojbodkami
  • LC_ALL - nastavenie vsetkych LC_* premennych naraz
  • LANG - nastavenie pre tie LC_* premenne ktore niesu nastavene
  • LC_COLLATE - triedenie podla lokalnych pravidiel (napr. ch je jedno pismeno a nasleduje za h, siroke a za dlhym a), vyuziva ho sort
  • LC_CTYPE - prevod znakov
  • LC_MONETARY - mena
  • LC_NUMERIC - format cisel, desatinna ciarka
  • LC_TIME - format datumu a casu
  • LC_MESSAGES - vyber jazyka, najma hlasky programov
  • NLSPATH - cesta oddelena dvojbodkami kde sa budu hladat .mo subory
  • TZ - casova zona napr. "Europe/Bratislava" + HW hodiny nastavene na greenwichsky cas!

    Hodnoty ktore sa tam zapisuju maju bud jednoducy dvojpismennovy kod (sk) alebo vseobecny: jazyk[_uzemie[.kodovanie]][@modifikator]

    sk_SK.ISO-8859-2        sk_SK                         sk
    cs_CZ.ISO-8859-2        cs_CZ@-ch       cs@-ch        cs
    en_GB.iso8859           en_GB           en@euro       en
    ja_JP.ujis              ja_JP.EUC       ja_JP         ja
    

    Lokalizacia v textovej konzole

    Nebudem robit co uz za mna niekto urobil. Velmi dobry navod v slovencine ako na lokalizaciu v linuxe najdete tu: SK lokalizacia

    Ako vykuchat RPM balicky

    Ak chcete vytvorit tgz balicek ktory je v RPM tak postupujte takto. V mc vojdite do .rpm balicka. Ma priblizne takuto strukturu:

    balicek-v1.v2.v3-b.a.rpm
      \INFO\SCRIPTS\ - adresar instalacnych skriptov (ALL, POSTIN, POSTUN, PREIN, PREUN)
           \SUBORY   - rozne subory s nulovou velkostou
      \CONTENTS.cpio - subor so samotnym obsahom balicka, mozno don vojst
      \HEADER        - suhrn z \INFO\SUBORY, popisuje co je v balicku
      \INSTALL	 - instalacny skript
      \UPGRADE  	 - skript na upgrade
    
    v1 - major version
    v2 - minor version
    v3 - release
    b - build balicka
    a - architektura (napr. i386, noarch, ...)
    

    Mozete si precitat subor HEADER, co je v balicku, normalne cez F3 si ho pozrite. Dole je Summary a Description co je popis balicka. Vyjdite von. Ked kliknete na subor CONTENTS.cpio tak tam vidite obsah samotneho balicka z pohladu root adresara. Skopirujte vsetko do nejakeho pomocneho adresara. Vyjdite von a vojdite do INFO/SCRIPTS (ak neexistu tak je to este jednoduchsie). Ak existuje tak tam su skripty ktore sa maju vykonat. V subore ALL su vsetky skripty aj s typom programu ktory ich ma spustit, bezne sa vyskytuje /bin/sh a /sbin/ldconfig. Ak tu ziadne skripty niesu tak balicek staci jednoducho skopirovat do root adresara.

    Ak skripty existuju tak si ich musite pozriet a pochopit o co v nich ide a to urobit alebo jednoducho ten skript nejak spustit vtedy ked treba. Napr. PREIN sa spusta pred instalaciou, POSTIN po instalacii, PREUN pred odinstalovanim a POSTUN po odinstalovani balicka. Casto tieto skripty obsahuju vela balastu ktory tam vobec nemusi byt, je to napr. kvoli kompatibilite so starsimi balickami a podobne. Napr. RPM balicek bash obsahuje skript ktory si pozrie subor /etc/shells a ked tam nieje /bin/bash alebo /bin/sh tak ich tam prida. Velmi casto je tam skript na instalovanie info napovedy. Ja ju nepouzivam takze napr. riadok /sbin/install-info ... mozete ignorovat. U kniznic sa casto spusta ldconfig. Toto mozete obist tym ze symbolicke linky vytvorite rucne a zahrniete ich do vasho tgz balicku. Casto sa tiez najma u demonov spusta chkconfig. To robi to ze precita komentar v /etc/init.d/nieco a na zaklade toho vytvori polozky v /etc/rc?.d pre System V Init. Obist sa to da tak ze tieto linky vytvvorite vo vasom balicku. Uninstall tiez velmi neriesim, zatial som ziaden balicek neodinstalovaval...

    Niektore programy (napr. lilo) ale naozaj potrebuju nejaky instalacny skript. Vyriesil som to tak ze upraveny instalacny skript som vytvoril v kazdom balicku v /usr/share/packages takze je mozne ho spustit po nainstalovani.

    Uzitocne programy

    ldd

    Vypise pouzite kniznice lubovolneho spustitelneho programu. Ak je program shell skript alebo je to staticky linkovany program (napr. nash) tak vypise "not a dinamic executable". Ak je pri niektorej kniznici "not found" tak program pravdepodobne nespustite. A

    # ldd /sbin/nash 
            not a dynamic executable
    # ldd /bin/cat
            linux-gate.so.1 =>  not found
            libc.so.6 => /lib/libc.so.6 (0x00638000)
            /lib/ld-linux.so.2 (0x0061a000)
    # ldd /usr/X11R6/bin/startx
        not a dynamic executable
    

    dd

    Program na kopirovanie suborov, pouziva sa na kopirovanie image suborov napr. na disketu. Parametre: if - vstupny subor, of - vystupny subor, bs - velkost bloku, count - pocet blokov.

    # dd if=./boot.img of=/dev/fd0 bs=1k count=1440
    

    Druhe pouzitie je ked v subore chcete vytvorit miesto pre buduci filesystem. Pozor, /dev/zero a /dev/null nieje to iste! Ak pouzijete /dev/null tak to skopiruje len 1 bajt! Toto napr. vytvori 8MB subor plny nul:

    # dd if=/dev/zero of=./pokus.img bs=1k count=8000
    

    fdisk

    fdisk je interaktivny program na nastavovanie linuxovych particii. Odporucam vam len operacie zobrazenie particii, mazanie particii, pridavanie particii, zmena typu particie, nastavovanie boot flag a ukladanie zmien. To je vsetko co by ste mali potrebovat. Po spusteni programu fdisk s parametrom disku stlacte "m" pre hlavne menu:

    # fdisk /dev/hda
    
    Command (m for help): m	
    Command action
       a   toggle a bootable flag			<-- nastavi particiu ako bootovaciu
       b   edit bsd disklabel
       c   toggle the dos compatibility flag
       d   delete a partition			<-- vymaze particiu
       l   list known partition types		<-- zobrazi podporovane particie
       m   print this menu
       n   add a new partition			<-- prida novu particiu
       o   create a new empty DOS partition table
       p   print the partition table		<-- zobrazi particie
       q   quit without saving changes		<-- koniec, NEULOZI zmeny
       s   create a new empty Sun disklabel
       t   change a partition's system id		<-- zmeni typ particie
       u   change display/entry units
       v   verify the partition table		<-- skontroluje particiu
       w   write table to disk and exit		<-- ZAPISE zmeny na disk
       x   extra functionality (experts only)
    
    Command (m for help): p				<-- chcem vidiet moje particie
        
    Disk /dev/hda: 255 heads, 63 sectors, 784 cylinders	
    Units = cylinders of 16065 * 512 bytes
    
      Device Boot    Start       End    Blocks   Id  System
    /dev/hda1             1       510   4096543+  83  Linux		<-- RedHat 7.2
    /dev/hda3   *       527       552    208845    b  Win95 FAT32	<-- dos
    /dev/hda4           553       565    104422+  83  Linux		<-- testovacia particia
    

    Ako vidite spustil som fdisk na disk /dev/hda. Dal som si vypisat prikazy ("m"). Potom som prikazom "p" zobrazil vsetky aktualne particie na tomto disku (su tri) a to: /dev/hda1 (4 GB particia s RedHat linuxom), bootovatelna particia /dev/hda3 (200 MB s DOSom), a nakoniec testovacia 100 MB particia /dev/hda4. V dalsej casti prikazom "n" vytvorim novu particiu /dev/hda2 o velkosti asi 128 MB.

    Command (m for help): n      		<-- vytvor novu particiu
    
    Command action
       e   extended
       p   primary partition (1-4)
    p					<-- chcem novu primarnu particiu!
    Partition number (1-4): 2		<-- particia cislo 2 (/dev/hda2)
    First cylinder (511-784, default 511): 	<-- pyta sa na prvy cylinder, stlacim rovno enter
    Using default value 511			
    Last cylinder or +size or +sizeM or +sizeK (511-526, default 526): 	<-- pyta sa na velkost, stlacim enter
    Using default value 526				
    
    Command (m for help): p      			<-- dam zobrazit particie
    
    Disk /dev/hda: 255 heads, 63 sectors, 784 cylinders
    Units = cylinders of 16065 * 512 bytes
       Device Boot    Start       End    Blocks   Id  System
    /dev/hda1             1       510   4096543+  83  Linux
    /dev/hda2           511       526    128520   83  Linux		<-- moja nova particia :)
    /dev/hda3   *       527       552    208845    b  Win95 FAT32
    /dev/hda4           553       565    104422+  83  Linux
    
    Command (m for help): w				<-- zapiseme zmeny na disk
    
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    Re-read table failed with error 16: Device or resource busy.	<-- chyba
    Reboot your system to ensure the partition table is updated.
    
    WARNING: If you have created or modified any DOS 6.x
    partitions, please see the fdisk manual page for additional
    information.
    Syncing disks.
    [root@stary root]# 
    

    Ako vidite, nikto nieje neomylny. To asi preto ze som bol prihlaseny na dvoch terminaloch. Po reboote je vsetko normalne. Fdiskom si novu particiu /dev/hda mozete prezriet.

    tar

    Program tar sluzi na zbalovanie a rozbalovanie suborov. ...

    # tar c ./adresar > zbaleny_adresar.tar
    # rm -R ./adresar
    # tar xpvf zbaleny_adresar.tar
    # tar xpvf zbaleny_adresar.tar -C /usr/local/share/pokus
    

    gzip

    Program gzip sluzi na efektivnu kompresiu alebo dekompresiu suborov.

    # gzip -9 zbaleny_adresar.tar
    # ls
    zbaleny_adresar.tar.gz
    # gzip -d zbaleny_adresar.tar.gz
    # tar c ./adresar | gzip -9 > zbaleny.tgz
    

    mount

    Sluzi na primontovanie disku na adresar. Casto budete cez loop zariadenie montovat filesystemy v subore. Dobra rada - pouzivajte zapis ako je uvedeny tu, t.j. typ filesystemu az ako posledny priklad - jednoduchsie mozte menit typ fs ak len hadate. Ak pouzivate loop tak musite byt root. Ak chcete montovat len adresar bez specifikovania particie tak to musi byt nastavene v /etc/fstab. Odmontujete prikazom umount. Mount bez parametra vypise primontovane particie.

    # mount initrd test -o loop -t ext2
    mount: wrong fs type, bad option, bad superblock on /dev/loop0,
           missing codepage or other error
           In some cases useful info is found in syslog - try
           dmesg | tail  or so
    # mount initrd test -o loop -t minix
    #
    

    cat

    Bezne sa vyuziva na zobrazenie suboru ale moze byt pouzity aj ako najjednoduchsi textovy editor, nesmiete sa ale pomylit:

    # cat > subor.txt << eof
    >Toto je subor
    >a toto je jeho druhy
    >a toto treti riadok!
    >EOF
    # cat subor.txt
    Toto je subor
    a toto je jeho druhy
    a toto treti riadok! 
    

    grep

    Vyhladavanie retazca v subore, castejsie pouzijete napr. ked v nejakom vystupe chcete najst nieco dolezite:

    # cat /var/log/secure | grep failed
    Mar 15 20:30:57 dvh sshd[2074]: error: Bind to port 22 on 0.0.0.0 failed: Address already in use.
    # ps x | grep bash
     2723 pts/2    S      0:00 bash
     2818 pts/2    S+     0:00 grep bash	<-- pozor na toto, samotny grep s hladanym parametrom je tam tiez!
    

    echo

    Bezne sa s nim vypisuju texty ale mozete nim aj pripojit SCSI zariadenie alebo pripojit zaznam na koniec suboru a plno inych veci:

    # echo "scsi add-single-device" 1 0 1 0 > /proc/scsi/scsi
    # echo "/dev/cdrom /mnt/cdrom iso9660 noauto,defaults,user,owner 0 0" >> /etc/fstab 
    

    sed

    Sed alebo stream editor sluzi na jednoduche upravy textu. Bezne sa pouziva v kolonach (niekolko prikazov oddelenych | alebo > znakmi). Prepinac "-e" tam asi nemusi byt. Prikaz "s///" nahradzuje len prvy najdeny vyraz! Tu je niekolko prikladov:

    sed -e 's/Jablko/Hruska/'	- nahradi slovo "Jablko" na vstupe slovom "Hruska" na vystupe
    sed -e 's/^Jablko/Hruska/'	- znak ^ znamena ze slovo "Jablko" musi byt na zaciatku (riadku)
    sed -e 's/Jablko$/Hruska/'	- znak $ znamena ze slovo "Jablko" musi byt konci
    sed -e 'y/A/a/'			- nahradi vsetky pismena "A" pismenom "a"
    sed -e 's| Jablko|Hruska|g' 	- nahradi stlpec v ktorom je "Jablko" stlpcom "Hruska"
    sed -e 's|ab|AB|g'		- nahradi vsetky vyskyty "ab" retazcom "ABC"
    \				- pouziva sa na pisanie spec. znakov ako napr. /
    

    Priklady:

    # echo "Ja som MENO" | sed -e "s|MENO|Dusan|g"
    Ja som Dusan
    # echo "/bin/beep /bin/beep" | sed -e "s/^\/bin\//\/usr\/bin\//"
    /usr/bin/beep /bin/beep
    # echo "/bin/beep" | sed -e "s/\//\\\\\//"
    \/bin/beep
    # echo "/bin/beep" | sed -e "s|\/|\\\/|g"
    \/bin\/beep
    # cat /etc/lilo.conf | sed -e "s/hda1/hda4/" > lilo.new
    ... prepis lilo.conf aby pouzivalo hda4 tam kde predtym hda1
    # POMS=`echo "$1" | sed -e "s/.tgz$/.tar.gz/"`
    ... do premennej POMS zapise parameter skriptu 1 ale ak je pripona 
        .tgz tak ju zmeni na .tar.gz