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
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."
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..."
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.
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
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, ....
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 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.
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.
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 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
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.
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
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.
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.
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.
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
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.
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.
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...
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.
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.
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
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.
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 (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.
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.
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.
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 /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
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
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 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).
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.
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.
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...
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.
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.
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:
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.
Moze sa stat ze vam to nebude fungovat tak ako ma. Problemov je niekolko.
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.
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
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:
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.
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!
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.
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.
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 ;)
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).
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.
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!
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
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
Od teraz uz bude vylepsovanie distribucie znacne monotonne. Bude pozostavat uz len z tychto krokov:
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.
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 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 (/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 (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.
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 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.
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.
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.
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.
Sluzi na zmenu hesla v subore /etc/passwd alebo /etc/shadow. Takisto vyzaduje funcnu PAM.
Normalne zakodovane hesla niesu v /etc/passwd ale v /etc/shadow ktore bezny uzivatel nemoze citat. Je to kvoli bezpecnosti.
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 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
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/
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!
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
To co som doteraz o SysVInit a PAM povedal najdete v jednej distribucii vdl-4.0.0-pam-distro.tgz.
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.
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
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.
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:
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...
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!
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.
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:
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.
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.
Kernel 2.6.x nepotrebuje bdflush demona. V /etc/inittab teda mozete riadok ud:... vykomentovat. Pouziva udev.
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.
V skratke LC_* a ine lokalizacne premenne premenne:
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
Nebudem robit co uz za mna niekto urobil. Velmi dobry navod v slovencine ako na lokalizaciu v linuxe najdete tu: SK lokalizacia
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.
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
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 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.
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
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
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 #
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!
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!
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 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