Linux-Tips-HOWTO <author>Paul Anderson <paul@geeky1.ebtech.net>&nl; prevedel Andrej Grauf <andrej.grauf@club.win-ini.si> <date>v3.6, junij 1998, prevod 22. december 1998 <abstract> Ta HOWTO sestavljajo namigi in nasveti, ki jih boste težko našli drugje, Po njihovi zaslugi postane Linux prijaznejši. </abstract> <toc> <sect>Uvod <p> Dobrodošli v Linux Tips-HOWTO, seznamu zanimivih zvijač in optimizacij, po zaslugi katerih postane Linux mnogo bolj zabaven. Spis sestavljajo samo nasveti iz moje glave in tisti iz prejšnjega spisa Tips-HOWTO (zakaj bi zavrgli čisto spodobne nasvete?). Zato bom zelo vesel vaših najljubših namigov in nasvetov, ki jih bom lahko uvrstil v naslednji Tips-HOWTO. Paul Anderson, vzdrževalec Linux TIPS HOWTO <htmlurl name="panderson@ebtech.net" url="mailto:panderson@ebtech.net"> <sect>Krajši nasveti <p> <sect1>Uporabna zvijača za Syslog <p> Uredite datoteko <tt>/etc/syslog.conf</tt> in vstavite naslednjo vrstico: <tscreen><verb> # Izpiši vse na tty8 *.* /dev/tty8 </verb></tscreen> Opozorilo: NE POZABITE UPORABITI TIPKE TAB! Syslog ne mara presledkov. <sect1>Skript za ogled stisnjenih HOWTO <p> Začetnik začetniku. Tu je kratek skript, ki vam bo olajšal iskanje in ogledovanje spisov howto. Moji HOWTO so v imeniku <tt>/usr/doc/faq/howto/</tt> in so stisnjeni s programom <tt>gzip</tt>. Imena datotek so <tt><em>XXX</em>-HOWTO.gz</tt>, pri čemer <tt><em>XXX</em></tt> predstavlja temo. V imeniku <tt>/usr/local/sbin</tt> sem ustvaril naslednji skript in ga poimenoval "<tt>howto</tt>": <tscreen><verb> #!/bin/sh if [ "$1" = "" ]; then ls /usr/doc/faq/howto | less else gunzip -c /usr/doc/faq/howto/$1-HOWTO.gz | less fi </verb></tscreen> Kadar skript kličete brez argumenta, ta izpiše imenik s HOWTO, ki so na voljo, kadar pa vnesete prvi del imena datoteke (pred vezajem) kot argument, samodejno raztegne in izpiše spis (izvirnik pri tem ostane nespremenjen). Če si želite ogledati spis Serial-HOWTO, vnesite: <tscreen> $ howto Serial </tscreen> <sect1>Ali je dovolj prostora na disku? <p> V tem razdelku boste našli kratek skript, ki bo tu in tam preveril, ali je še dovolj prostora na napravah, ki jih lahko izpišete z ukazom <tt>mount</tt> (diski, CD-ROM, disketa,) Če zmanjkuje prostora, se na zaslonu vsakih <em>X</em> sekund izpiše sporočilo, o vsaki zapolnjeni napravi pa boste dobili tudi elektronsko sporočilo. <tscreen><verb> #!/bin/sh # # Id: check_hdspace,v 1.18 1996/12/11 22:33:29 root Exp root # # # Ko so mi datoteke tmp zapolnile diske, sem začel prejemati skrivnostna # sporočila o napakah. Zato sem spisal tale skript, ki me opozori, preden # se diski zapolnijo. # # Če te vrstice obvarujejo vaš strežnik, preden se zruši, # pošljite elektronsko sporočilo z zahvalami zocki@goldfish.cube.net. # Obžalujem, če vam tale skript povzroča težave, ampak # saj sem vas posvaril: brez pritožb, prosim. # Če res obvladate delo s sed, mi, prosim, oprostite :) # # # Poženi in pozabi: V rc.local vstavite 'check_hdspace &'. # Preveri količino nezasedenega prostora na napravah vsakih $SLEEPTIME sekund. # Preverite lahko tudi diskete in tračne enote. :) # Če je nezasedenega prostora manj kakor $MINFREE (kb), bo sprožila opozorilo # in poslala eno elektronsko sporočilo za vsako triggering napravo # na $MAIL_TO_ME. # Če je prostora več, kot je spodnja meja, podana z omejitvijo, pri # kateri se sprožijo opozorila, se tudi opravilo elektronskega # pošiljanja znova opremi. # # NALOGA: Različen $MINFREE za vsako napravo. # Če zmanjka prostora na disku, iz imenikov /*tmp varno odstrani # staro šaro. DEVICES='/dev/sda2 /dev/sda8 /dev/sda9' # naprava; tu navedite diske # sproži opozorilo SLEEPTIME=10 # sec; mirovanje med preverjanjem MAIL_TO_ME='root@localhost' # fool; kdo prejme opozorilo # ------ pod to vrstico ni treba vnašati sprememb (vsaj upam :) ------- MINMB=0 ISFREE=0 MAILED="" let MINMB=$MINFREE/1024 # ja, mi smo dosledni :) while [ 1 ]; do DF="`/bin/df`" for DEVICE in $DEVICES ; do ISFREE=`echo $DF | sed s#.\*$DEVICE" "\*[0-9]\*""\*[0-9]\*" "\*## | sed s#" ".\*##` if [ $ISFREE -le $MINFREE ] ; then let ISMB=$ISFREE/1024 echo "OPOZORILO: $DEVICE samo $ISMB mb prosto." >&2 #echo "sem pridejo dodatne stvari" >&2 echo -e "\a\a\a\a" if [ -z "`echo $MAILED | grep -w $DEVICE`" ] ; then echo "OPOZORILO: Na $DEVICE samo $ISMB mb prosto. (Sprožilec je nastavljen na $MINMB mb)" \ | mail -s "OPOZORILO: Na $DEVICE le $ISMB mb prosto!" $MAIL_TO_ME MAILEDH="$MAILED $DEVICE" MAILED=$MAILEDH # sem vstavite še druga opravila, npr. čiščenje # imenikov */tmp... fi elif [ -n "`echo $MAILED | grep -w $DEVICE`" ] ; then # Če je dovolj prostora, skript odstrani # oznako, da je bila elektronska pošta poslana. # Pripravljeni smo za novo opravilo pošiljanja # elektronske pošte. MAILEDH="`echo $MAILED | sed s#$DEVICE##`" MAILED=$MAILEDH fi done sleep $SLEEPTIME done </verb></tscreen> <sect1>Pripomoček za odstranjevanje dnevnikov <p> Če ste taki kakor jaz, imate seznam 430 naročnikov plus 100+ sporočil na dan prek UUCP. Torej, kaj naj heker naredi s temi gromozanskimi dnevniki? Namesti naj <tt>chklogs</tt>. Avtor programa <tt>chklogs</tt> je Emilio Grimaldo, <tt>grimaldo@panama.iaehv.nl</tt>, trenutno različico 1.8, ki sama po sebi daje dovolj informacij o poteku namestitve (seveda bi bilo dobro preveriti tudi informacije v imeniku <tt>doc</tt>), pa najdete na <url url="ftp://ftp.iaehv.nl/pub/users/grimaldo/chklogs-1.8.tar.gz">. Ko boste program namestili, dodajte vnos <tt>crontab</tt> v naslednji obliki: <tscreen><verb> # Vsak dan ob 21:00 zaženi chklogs. 00 21 * * * /usr/local/sbin/chklogs -m </verb></tscreen> Ko ste že pri tem, ne pozabite omeniti avtorju, kako uporaben program je to :) <sect1>Priročen skript za odstranjevanje odlagališč <p> Ustvarite datoteko z imenom <tt>rmcores</tt> (avtor jo imenuje <tt>handle-cores</tt>) in naslednjo vsebino: <tscreen><verb> #!/bin/sh USAGE="$0 <directory> <message-file>" if [ $# != 2 ] ; then echo $USAGE exit fi echo Brišem... find $1 -name core -atime 7 -print -type f -exec rm {} \; echo e-mailing for name in `find $1 -name core -exec ls -l {} \; | cut -c16-24` do echo $name cat $2 | mail $name done </verb></tscreen> Naj jo opravilo <tt>cron</tt> zažene vsake toliko časa. <sect1>Prenašanje imenikov iz enega datotečnega sistema v drugega <p> Hitri premik celotne drevesne strukture datotek z enega diska na drugega <tscreen><verb> (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -) </verb></tscreen> (Da bi se izognili izgubi imenikov, če bi se zgodila nesreča, se premaknite iz <tt>cd /source/directory; tar</tt> itd. Hvala Jimu Dennisu, <tt>jim@starshine.org</tt>, ki me je opozoril na to. -Vzdrževalec) <sect1>Iskanje največjih imenikov <p> Ali vas je že kdaj zanimalo, kateri imeniki so v vašem računalniku največji? To lahko ugotovite na naslednji način: <tscreen><verb> du -S | sort -n </verb></tscreen> <sect1>Glasilo za Linux <p> Zasluge ima John Fisk, avtor glasila za Linux. To je odličen e-zine plus in še <bf>brezplačen</bf>! Kaj bi si še lahko želeli? Oglejte si <url url="http://www.linuxgazette.com">. MMG, izkaže se, da (1) glasilo za Linux (LG) zdaj izhaja enkrat na mesec in (2) John Fisk ni več njegov urednik. Zdaj skrbi zanj ekipa pri SSC. <sect1>Kako dobiti popravek za program GNU make 3.70 in s tem preprečiti čudno vedenje VPATH <p> Ne vem, ali ima veliko ljudi podobne težave, vendar ima GNU <tt>make</tt> različice 3.70 "lastnost", ki mi ni všeč. Namreč to, da se <tt>VPATH</tt> čudno vede, če podaste absolutno pot do datoteke. Na voljo je zelo dober popravek, ki te težave odpravi. Dobite ga od Paula D. Smitha <<tt>psmith@wellfleet.com</tt>>. Po vsaki popravljeni izdaji programa GNU make ustrezne popravke in dokumentacijo tudi objavi v novičarski skupini "<tt>gnu.utils.lug</tt>". Ta popravek uporabim in spet prevedem <tt>gmake</tt> v vsakem sistemu, do katerega imam dostop. <sect1>Kako preprečiti preverjanje sistema s programom fsck ob vsakem zagonu računalnika? <p> V: Kako naj preprečim programu <tt>e2fsckm</tt>, da bi ob vsakem zagonu preverjal diske? O: Ko znova zgradite jedro, je datotečni sistem označen kot "umazan", torej bo vaš disk pregledan vsakič, ko boste zagnali računalnik. To preprečite, če zaženete: <tscreen><verb> rdev -R /zImage 1 </verb></tscreen> S tem popravite jedro tako, da datotečnega sistema ne bo več obravnaval kot umazanega. Opozorilo: Če uporabljate lilo, naj bo nastavitev za Linux v nastavitveni datoteki za lilo (navadno je to <tt>/etc/lilo.conf</tt>) namenjena "samo za branje" (read-only). <sect1>Kako se izogniti preverjanju zaradi "zasedenosti naprav" <p> Če pri zaustavitvi sistema pogosto dobite sporočilo o zasedenosti naprav, kar povzroči, da se ob vnovičnem zagonu izvede preverjanje datotečnega sistema, se lahko temu izognete takole: V datoteko <tt>/etc/rc.d/init.d/halt</tt> ali <tt>/etc/rc.d/rc.0</tt> pred izvedbo ukaza <tt>umount -a</tt> dodajte vrstico <tscreen><verb> mount -o remount,ro /mount.dir </verb></tscreen> za vsak priključen datotečni sistem, razen za <tt>/</tt>. To pomeni, da če se pri zaustavitvi zaradi določenih razlogov ne prekinejo vsi procesi in se ne izvede odklop diskov, bodo ti ob vnovičnem zagonu vseeno čisti. S tem med zagonom pridobim veliko časa. <sect1>Kako poiskati največje datoteke na disku <p> <tscreen><verb> ls -l | sort +4n </verb></tscreen> Tisti, ki ste zares na tesnem s prostorom, lahko uporabite tudi naslednji način. Resda bo trajalo nekaj časa, a odlično deluje: <tscreen><verb> cd / ls -lR | sort +4n </verb></tscreen> <sect1>Kako natisniti strani, da jih boste lahko pozneje preluknjali in vstavili v mapo <p> <tscreen><verb> #!/bin/sh # /usr/local/bin/print # preprosta urejena oblika izpisa na list, da ga boste lahko # preluknjali in vstavili v mapo. cat $1 | pr -t -o 5 -w 85 | lpr </verb></tscreen> <sect1>Način za iskanje določenih regularnih izrazov v drevesnih strukturah datotek <p> Ta skript imenujem '<tt>forall</tt>' (za vse). Uporabite ga na naslednji način: <tscreen><verb> forall /usr/include grep -i ioctl forall /usr/man grep ioctl </verb></tscreen> Pa še vsebina skripta <tt>forall</tt>: <tscreen><verb> #!/bin/sh if [ 1 = `expr 2 \> $#` ] then echo Usage: $0 dir cmd [optargs] exit 1 fi dir=$1 shift find $dir -type f -print | xargs "$@" </verb></tscreen> <sect1>Skripti za odstranjevanje varnostnih kopij datotek in samodejno shranjenih datotek, ki jih tvorijo nekateri programi <p> Tu je preprost dvovrstični skript, ki preišče ureditev imenika in odstrani <tt>emacs</tt>ove samodejno shranjene (<tt>#</tt>) datoteke, varnostne kopije datotek (<tt>-</tt>), datoteke <tt>.o</tt> in datoteke <tt>.log</tt>, ki jih naredi TeX. Prav tako ga lahko uporabite za stiskanje datotek <tt>.tex</tt> in <tt>README</tt>. V svojem sistemu sem ga imenoval '<tt>squeeze</tt>' (stiskač). <tscreen><verb> #!/bin/sh #SQUEEZE odstrani nepotrebne datoteke in stisne datoteke .tex in README #Avtor Barry tolnas, tolnas@sun1.engr.utk.edu # echo squeezing $PWD find $PWD \( -name \*~ -or -name \*.o -or -name \*.log -or -name \*\#\) -exec rm -f {} \; find $PWD \( -name \*.tex -or -name \*README\* -or -name \*readme\* \) -exec gzip -9 {} \; </verb></tscreen> <sect1>Kako ugotoviti, kateri proces zasede največ pomnilnika? <p> <tscreen><verb> ps -aux | sort +4n </verb></tscreen> -ALI- <tscreen><verb> ps -aux | sort +5n </verb></tscreen> <sect1>Priprava programa vi na programiranje v programskem jeziku C <p> V prostem času veliko programiram v programskem jeziku C, zato sem pripravil program <tt>vi</tt>, tako da je primeren za programiranje v tem jeziku. Tu je moj <tt>.exrc</tt>: <tscreen><verb> set autoindent set shiftwidth=4 set backspace=2 set ruler </verb></tscreen> Čemu rabijo te nastavitve? <tt>Autoindent</tt> povzroči, da <tt>vi</tt> avtomatsko poravna vsako vrstico glede na poravnavo prve vrstice, <tt>shiftwidth</tt> nastavi razdaljo <tt>^T</tt> na štiri presledke, <tt>backspace</tt> nastavi način backspace, <tt>ruler</tt> pa povzroči, da <tt>vi</tt> izpisuje število vrstic. Če se želite pomakniti v določeno vrstico, npr. dvajseto, uporabite: <tscreen><verb> vi +20 myfile.c </verb></tscreen> <sect1>Uporaba ctags za poenostavitev programiranja <p> Večina hekerjev ima <tt>ctags</tt> že nameščen v svoj računalnik, vendar ga ne uporabljajo. Zelo uporaben je lahko pri urejanju določenih funkcij. Predpostavimo, da imate v eni izmed številnih izvirnih datotek v imeniku programa, ki ga pišete, neko funkcijo, ki bi jo radi posodobili. To funkcijo bomo poimenovali <tt>foo()</tt>. Prav tako ne veste, kje v izvirni datoteki je ta funkcija. V tem primeru vam lahko pomaga <tt>ctags</tt>. Ko ga zaženete, program v trenutnem imeniku ustvari datoteko z imenom <tt>tags</tt>, ki obsega seznam vseh funkcij, podatke, v katerih datotekah so te funkcije in kje so v datotekah said. Datoteka <tt>tags</tt> je videti nekako tako: <tscreen><verb> ActiveIconManager iconmgr.c /^void ActiveIconManager(active)$/ AddDefaultBindings add_window.c /^AddDefaultBindings ()$/ AddEndResize resize.c /^AddEndResize(tmp_win)$/ AddFuncButton menus.c /^Bool AddFuncButton (num, cont, mods, func, menu, item)$/ AddFuncKey menus.c /^Bool AddFuncKey (name, cont, mods, func, menu, win_name, action)$/ AddIconManager iconmgr.c /^WList *AddIconManager(tmp_win)$/ AddIconRegion icons.c /^AddIconRegion(geom, grav1, grav2, stepx, stepy)$/ AddStartResize resize.c /^AddStartResize(tmp_win, x, y, w, h)$/ AddToClientsList workmgr.c /^void AddToClientsList (workspace, client)$/ AddToList list.c /^AddToList(list_head, name, ptr)$/ </verb></tscreen> Da bi uredili npr. funkcijo <tt>AddEndResize()</tt> v programu <tt>vim</tt>, zaženite: <tscreen><verb> vim -t AddEndResize </verb></tscreen> S tem boste ustrezno datoteko odprli v urejevalniku, kazalec pa bo na začetku funkcije. <sect1>Zakaj se sendmail ob zagonu v distribuciji RedHat obesi za 5 minut? <p> To je precej pogosta težava, skoraj že FAQ. Ne vem, ali jo je RedHat odpravil v svoji distribuciji, lahko pa jo odpravite sami. Poglejte v datoteko <tt>/etc/hosts</tt> in ugotovili boste, da je videti nekako tako: <tscreen><verb> 127.0.0.1 localhost vasaskatla </verb></tscreen> Ko se <tt>sendmail</tt> zažene, poišče ime gostitelja (v tem primeru vasaskatla). Potem ugotovi, da je IP za vasaskatla 127.0.0.1. <tt>Sendmail</tt> tega ne mara, zato začne novo iskanje. To nadaljuje tako dolgo, dokler končno ne obupa in konča. To težavo je mogoče zelo enostavno odpraviti. Uredite datoteko <tt>/etc/hosts</tt> in jo preoblikujte nekako tako: <tscreen><verb> 127.0.0.1 localhost 10.56.142.1 vasaskatla </verb></tscreen> <sect1>Kako lahko preuredim distribucijo RedHat tako, da bom lahko uporabljal ukaz ls z barvami? <p> Distribucija RedHat ima barvni <tt>ls</tt>, ne vem pa, zakaj ne omogočijo uporabe barv kot privzete nastavitve. Težavo rešite tako: Najprej vnesite <tt>eval 'DIRCOLORS'</tt>. Nato <tt>alias ls='ls --color=auto'</tt>. In vstavite <tt>'alias.....'</tt> v datoteko <tt>/etc/bashrc</tt>. <sect1>Kako lahko ugotovim, v kateri knjižnici v /usr/lib je določena funkcija? <p> Kaj storiti, če prevajate neki program in pozabite vključiti potrebno knjižnico? Vsa poročila gcc so funkcijska imena.Tu je preprost ukaz, ki bo našel, kar iščete: <tscreen><verb> for i in *; do echo $i:;nm $i|grep tgetnum 2>/dev/null;done </verb></tscreen> Kjer je <tt>tgetnum</tt> ime funkcije, ki jo iščete. <sect1>Prevedel sem preizkusni programček v jeziku C, ko pa ga poženem, ne dobim nobenega rezultata! <p> Verjetno ste program prevedli v binarno datoteko z imenom <tt>test</tt>, mar ne? Linux ima program z imenom <tt>test</tt>, ki preveri, ali je določen pogoj izpolnjen, in rezultata nikoli ne izpiše na zaslon. Namesto vnosa <tt>test</tt> uporabite <tt>./test</tt>. <sect>Podrobni nasveti <p> <sect1>Deljenje izmenjalnih particij med Linuxom in Windows <p> <enum> <item>Sformatirajte particijo kot particijo za DOS in na njej ustvarite izmenjalno datoteko za Windows, vendar operacijskega sistema Windows še ne zaženite (naj izmenjalna datoteka zaenkrat ostane prazna, da jo je mogoče dobro stisniti). <item>Znova zaženite računalnik v Linuxu in shranite particijo v datoteko. Npr. če je bila to particija <tt>/dev/hda8</tt>: <tscreen><verb> dd if=/dev/hda8 of=/etc/dosswap </verb></tscreen> <item>Stisnite izmenjalno datoteko za DOS; ker je navidezno prazna, jo je mogoče zelo dobro stisniti: <tscreen><verb> gzip -9 /etc/dosswap </verb></tscreen> <item>Da bi pripravili in namestili izmenjalno datoteko v Linuxu, dodajte v datoteko <tt>/etc/rc</tt> naslednje: <tt><em>XXXXX</em></tt> je število blokov v navidezni particiji <tscreen><verb> mkswap /dev/hda8 XXXXX swapon -av </verb></tscreen> Preverite, ali ste v datoteko <tt>/etc/fstab</tt> dodali vnos za izmenjalno particijo. <p> <item>Če vaš osnovni/zagonski paket podpira <tt>/etc/brc</tt> ali <tt>/sbin/brc</tt>, v datoteko <tt>/etc/brc</tt> dodajte naslednje (drugače to opravite ročno, ko želite računalnik zagnati v DOS|OS/2 in poskušate izmenjalno particijo pretvoriti nazaj v različico za Dos/Windows): <tscreen><verb> swapoff -av zcat /etc/dosswap.gz | dd of=/dev/hda8 bs=1k count=100 </verb></tscreen> # Ne pozabite, da se tako zapiše nazaj na particijo samo prvih sto blokov. Empirično sem ugotovil, da to zadošča. </enum> >>Kakšne so prednosti in pomanjkljivosti takega početja? Prednost: prihranite precejšno količino prostora na disku. Pomanjkljivost: Če 5. korak ni avtomatiziran, boste morali to postoriti ročno. To bo upočasnilo vnovični zagon za nanosekundo :-) <sect1>Obnavljanje zbrisanih datotek <p> Tu je zvijača, ki sem jo moral uporabiti že večkrat. Obnovitev zbrisane tekstovne datoteke obupanega uporabnika. Če po nesreči odstranite tekstovno datoteko, npr. neko elektronsko sporočilo ali rezultate nočne programerske seanse, ni nujno, da je vse izgubljeno. Če je datoteka bila na disku in na njem ostala več kot 30 sekund, je njena vsebina morda še vedno na particiji diska. Vsebino datoteke na particiji diska lahko poiščete z ukazom <tt>grep</tt>. Na primer, pred kratkim sem zbrisal del elektronskega sporočila. Takoj sem prekinil vse operacije, ki bi particijo lahko spremenile: v tem primeru sem se samo izognil shranjevanju datotek, prevajanju itd. V drugih primerih sem moral sistem celo privesti na način enega samega uporabnika in odklopiti datotečni sistem. Na particiji diska sem potem uporabil ukaz <tt>egrep</tt>: v mojem primeru je bilo elektronsko sporočilo v imeniku <tt>/usr/local/hime/michael</tt>. Iz izhoda ukaza <tt>df</tt> sem lahko ugotovil, da je ta na particiji <tt>/dev/hdb5</tt>: <tscreen><verb> sputnik3:~ % df Filesystem 1024-blocks Used Available Capacity Mounted on /dev/hda3 18621 9759 7901 55% / /dev/hdb3 308852 258443 34458 88% /usr /dev/hdb5 466896 407062 35720 92% /usr/local sputnik3:~ % su Password: [root@sputnik3 michael]# egrep -50 'ftp.+COL' /dev/hdb5 > /tmp/x </verb></tscreen> Kadar delam s particijami diska, sem zelo previden. Torej sem si privoščil kratek premor in pred potrditvijo preveril, ali res razumem pomen ukaza. V tem primeru je bila v elektronskem sporočilu beseda '<tt>ftp</tt>', ki ji je sledilo besedilo in na koncu še beseda '<tt>COL</tt>'. Sporočilo je bilo dolgo okrog 20 vrstic, torej sem uporabil 50, da bi dobil vse vrstice okrog izraza. Včasih sem uporabljal tudi 3000 in s tem zagotovil, da sem dobil nazaj vse vrstice izvirne kode. Rezultat sem iz ukaza <tt>egrep</tt> usmeril na drugo particijo diska in s tem preprečil, da bi se sporočilo, ki ga iščem, prepisalo. Izhod sem preiskal z uporabo ukaza <tt>strings</tt>: <tscreen><verb> strings /tmp/x | less </verb></tscreen> in seveda našel elektronsko sporočilo. Ta metoda ni zanesljiva. Morda je bilo nekaj prostora ali pa ves prostor na disku znova uporabljen. Ta zvijača je verjetno uporabna samo v sistemih z enim uporabnikom. V sistemih z več uporabniki z visoko dejavnostjo diskov se je morda prostor na disku, ki ste ga sprostili, znova porabil. Prav tako večina izmed nas ne more kar tako preprečiti uporabe računalnika drugim uporabnikom, kadar želimo obnoviti neko datoteko. V domačem sistemu me je ta zvijača v zadnjih nekaj letih rešila približno trikrat, po navadi takrat, ko sem pomotoma zavrgel rezultate celodnevnega dela: če moje delo preživi do točke, ko me prevzame občutek, da sem dosegel pomemben napredek, to delo shranim na disketo in te zvijače sploh ne uporabljam pogosto. <sect1>Kako uporabljati oznake za nespremenljivost <p> Uporabite oznako za nespremenljivost. <p> Takoj po tem, ko boste namestili in nastavili svoj sistem, preglejte datoteke <tt>/bin/sbin</tt>, <tt>/usr/bin</tt>, <tt>/usr/sbin</tt>, <tt>/usr/lib</tt> (in še nekatere druge običajne osumljence) in brez predsodkov uporabite ukaz <tt>chattr +i</tt>. To vrstico dodajte tudi v datoteke jedra v korenskem imeniku. Naredite nov imenik '<tt>mkdir /etc/.dist/</tt>' in prekopirajte vsebino imenika <tt>/etc</tt> (to naredim v dveh korakih z uporabo <tt>/tmp/etcdist.tar</tt> in se s tem izognem podvajanju) v ta novi imenik. (Lahko bi tudi ustvarili imenik <tt>/etc/.dist.tar.gz</tt> -- in ga označili kot nespremenljivega). Vzrok za vse to delo je zmanjšanje škode, ki bi jo lahko naredili, kadar boste prijavljeni kot korenski uporabnik. Tako ne boste mogli prepisati datotek z napačnim preusmeritvenim operatorjem in s presledkom v ukazu '<tt>rm -fr</tt>' (še vedno lahko naredite veliko škodo, ampak vsaj vaše knjižnice in binarne datoteke bodo bolj zaščitene). <p> S tem boste tudi onemogočili ali vsaj otežili uporabo številnih varnostnih in preklicnih storitev (ker večina temelji na prepisovanju datotek med izvajanjem programa SUID, ki <em>ne ponuja poljubnih ukazov lupine</em>). <p> Edina neprijetnost bo nastala pri gradnji in izvajanju ukaza "<tt>make install</tt>" na različnih vrstah sistemskih binarnih datotek. Po drugi strani pa boste s tem preprečili, da bi '<tt>make install</tt>' prepisal datoteke. Kadar pozabite prebrati <tt>Makefile</tt> in <tt>chattr -i</tt>, datoteke, ki bodo prepisane (in imenike, katerim želite datoteke dodati) -- in se ukaz <tt>make</tt> ne izvede, samo uporabite ukaz <tt>chattr</tt> in ga znova zaženite. Izkoristite lahko tudi priložnost in prestavite stare binarne datoteke, knjižnice ali karkoli je že v imeniku <tt>.old/</tt>, jih preimenujete, stisnete ali počnete z njimi, kar pač želite. <sect1>Nasveti, kam dati nove stvari <p> Vse nove stvari se začnejo pod <tt>/usr/local</tt>! Ali v <tt>/usr/local/'hostname'</tt>. Če je vaša distribucija ena tistih, ki pusti imenik <tt>/usr/local</tt> prazen, tvorite svoje imenike <tt>/usr/local/src</tt>, <tt>/usr/local/bin</tt>, itd. in jih uporabljajte. Če vaša distribucija v drevesno strukturo imenika <tt>/usr/local</tt> shrani stvari, boste verjetno uporabili ukaz '<tt>mkdir /usr/local/'hostname'</tt>' in mu podelili 'wheel' group <tt>+w</tt> (prav tako jih naredim SUID in SGID in s tem zagotovim, da lahko vsak član skupine wheel upravlja samo svoje datoteke in vse ustvarjene datoteke pripadajo skupini wheel). Disciplinirajte se in nove pakete <em>vedno!, vedno!, vedno!</em> shranite v <tt>/usr/local/src/.from/$KJERKOLI_SEM_JIH_DOBIL/</tt> (za <tt>.tar</tt> oz. katerekoli datoteke) in jih zgradite v imeniku <tt>/usr/local/src</tt> (ali <tt>/$HOSTNAME/src</tt>). Preverite, ali se namesti pod lokalno ureditev. Če je paket <em>nujno treba</em> namestiti v <tt>/bin</tt>, <tt>/usr/bin</tt> ali kjerkoli drugje, podajte symlink od lokalne ureditve do vsakega posameznega elementa. Vzrok za to -- čeprav je več dela -- je pomoč pri osamitvi tistih stvari, za katere je treba narediti varnostne kopije, jih obnoviti ali znova namestiti pri opravilu popolne vnovične namestitve z distribucijskega nosilca (navadno s plošče CD). Z uporabo imenika <tt>/usr/local/.from</tt> vzdržujete tudi dnevnik z informacijami, kje ste dobili izvirno kodo -- kar vam je v pomoč pri iskanju novih različic -- je pa nujno potreben, kadar nadzorujete sezname objav o varnosti. Eden mojih domačih sistemov (s katerega kličem) je bil sestavljen, preden sem začel uporabljati tak sistem. Še vedno ne <em>poznam</em> vsega, po čemer se razlikuje od sistema, pripravljenega po namestitvi. To se mi dogaja, kljub temu da zelo malo delam s konfiguracijo domačega sistema in sem <em>edini</em>, ki ga uporablja. V primerjavi s tem so vsi sistemi, ki sem jih nastavil v službi (ko so mi zaupali vlogo sistemskega upravitelja), nastavljeni tako -- in čeprav so jih upravljali različni ljudje in so bili velikokrat nadgrajeni, dobro vem, kateri elementi so bili dodani <em>naknadno</em>, po začetni namestitvi in nastavitvi. <sect1>Kako spremeniti vse velike črke v imenih datotek v male črke <p> V razdelku 2c nasvetov 12. izdaje sem opazil kar nekaj prezahtevnih ali nepotrebnih postopkov. Ker jih je več, vam jih pošiljam: <tscreen><verb> #!/bin/sh # lowerit # spremeni vse velike črke v imenih datotek v trenutnem imeniku v male črke # uporabna samo za navadne datoteke -- ne spreminja imen imenikov # preden prepiše datoteko, boste morali to potrditi for x in `ls` do if [ ! -f $x ]; then continue fi lc=`echo $x | tr '[A-Z]' '[a-z]'` if [ $lc != $x ]; then mv -i $x $lc fi done </verb></tscreen> Uh, to je pa dolg skript. Za izvajanje tega opravila jaz ne bi pisal skripta. Namesto tega bi v ukazni vrstici uporabil ukaz: <tscreen><verb> for i in * ; do [ -f $i ] && mv -i $i `echo $i | tr '[A-Z]' '[a-z]'`; done; </verb></tscreen> Avtor pravi, da je skript zapisal v tej obliki zaradi večje razumljivosti (glej spodaj). V naslednjem zgledu, o dodajanju in odstranjevanju uporabnikov, Geoff dela dokaj dobro, razen v zadnjem koraku. Vnovični zagon? Resno upam, da avtor računalnika ne zaganja znova vedno, kadar odstrani uporabnika. Opraviti morate samo prva dva koraka. Kakšne procese pa naj bi uporabnik sploh uporablja? Morda irc bot? Postopek ubijete z enostavnim ukazom <tscreen><verb> kill -9 `ps -aux |grep ^<username> |tr -s " " |cut -d " " -f2` </verb></tscreen> Zgled; uporabniško ime je foo <tscreen><verb> kill -9 `ps -aux |grep ^foo |tr -s " " |cut -d " " -f2` </verb></tscreen> S tem je delo opravljeno; gremo naprej k pozabljenemu korenskemu geslu. Rešitev, ki je navedena v glasilu, je najbolj univerzalna, ne pa tudi najenostavnejša. Z LILO in loadlin lahko vsak poda zagonski parameter "single" in računalnik se neposredno zažene v privzeti lupini brez poziva za prijavo in geslo. V tem primeru lahko pred vnosom "init 3" za zagon večuporabniškega načina vsakdo spremeni ali zbriše katerokoli geslo. Število vnovičnih zagonov v tem primeru: 1, število vnovičnih zagonov v drugih primerih: 2 Justin Dossey <sect1>Kako nadgraditi sendmail <p> Začeli bomo z neobdelano, čisto izvirno kodo. Najprej si priskrbite izvirno kodo Sendmaila. Zajel sem različico 8.9.0, kar pa je zelo zahtevno opravilo, kakor boste ugotovili. Kodo sem dobil na <url url="ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.9.0.tar.gz">. Dolga je okrog 1 MB in glede na to, da uporabljam 8.7.6, mislim, da je vredna truda. Če bo to delovalo, boste nedvomno izvedeli, drugače ne bom mogel izdati nove različice HOWTO :) Ko ste kodo prenesli, jo razpakirajte. V trenutnem imeniku bom ustvaril imenik z imenom <tt>sendmail-8.9.0</tt>. Premaknite se v ta imenik ter preberite datoteki <tt>README</tt> in <tt>RELESE_NOTES</tt> (presenečeni boste nad opravljenimi nadgraditvami). Premaknite se zdaj v <tt>src</tt>. V tem imeniku boste opravili večino dela. Kratko sporočilo: Sendmail je kratek, zelo uporaben, dobro napisan program. Binarna datoteka se v računalniku 5x86 133 z 32 MB RAM prevede v manj kot 5 minutah! Celotno prevajanje in namestitev (brez nastavitev) traja manj kot 15 minut! Navadno v svojem sistemu ne zaganjam BIND, zato sem našel naslednje vrstice: <tscreen><verb> # ifndef NAMED_BIND # define NAMED_BIND 1 /* uporabi berkeleyjski internetni strežnik */ # endif </verb></tscreen> in spremenil 1 v 0: <tscreen><verb> # ifndef NAMED_BIND # define NAMED_BIND 0 /* uporabi berkeleyjski internetni strežnik */ # endif </verb></tscreen> Pri distribuciji Debian 1.3.1 se <tt>db.h</tt> glede na privzeto vrednost namesti v <tt>/usr/include/db</tt>, namesto v <tt>/usr/include</tt>, kjer jo <tt>sendmail</tt> poskuša najti. Pojdite v imenike <tt>src</tt>, <tt>mailstats</tt>, <tt>makemap</tt>, <tt>praliases</tt> in <tt>smrsh</tt> in tam izvedite naslednji ukaz: <tscreen><verb> ./Build -I/usr/include/db </verb></tscreen> Ko boste s tem gotovi, <tt>cd ..</tt> in vnesite <tt>make install</tt>. Tako! Program sendmail različice 8.9.0 naj bi bil zdaj nameščen! V tem primeru sem predpostavil, da ste prej že opravili izvirno nastavitev. Da bi v mojem sistemu vse potekalo gladko, saj gostim brezplačne poštne sezname za tiste, ki uporabljajo <tt>majordomo</tt>, sem moral na začetek datoteke <tt>/etc/sendmail.cf</tt> dodati: <tscreen><verb> O DontBlameSendmail=forwardfileinunsafedirpath, forwardfileinunsafedirpathsafe </verb></tscreen> Dandanes je <tt>sendmail</tt> zelo občutljiv za dovoljenja imenikov in datotek ter bo sporočal napake o imenikih in datotekah v privzetih imenih ali datotekah <tt>.forward</tt>, ki jih lahko spreminjajo skupine ali so prosto dostopne. Ker ni dobro odpraviti te občutljivosti, uporabljam v konzoli samo način enega uporabnika in se mi je zdelo, da je v redu tudi, če je na voljo ta mala razpoka v sistemu varnosti. YMMV <sect1>Nekaj nasvetov za nove sistemske upravitelje <p> Ustvarite in vzdržujte <tt>/README.'hostname'</tt> in/ali <tt>/etc/README.'hostname'</tt> [ali, če je le mogoče, <tt>/usr/local/etc/README.'hostname'</tt> - Vzdrževalec.] Od prvega dne upravljanja sistem zapisuje stvari v omrežni dnevnik. Morda boste v rootov /bash_logout vnesli vrstico "<tt>vi /README.$(ime gostitelja)</tt>". To lahko opravite tudi tako, da napišete skript za <tt>su</tt> ali <tt>sudo</tt>, ki počne nekaj podobnega: <tscreen><verb> function exit \ { unset exit; exit; \ cat ~/tmp/session.$(date +%y%m%d) \ >> /README.$(hostname) && \ vi /README.$(hostname) } script -a ~/tmp/session.$(date +%y%m%d) /bin/su.org - </verb></tscreen> (Dnevnik ustvarite z ukazom <tt>typescript</tt>. Prav tako ustvarite funkcijo, ki bo avtomatizirala, dopolnjevala in posodabljala dnevnik.) Priznati moram, da te avtomatizacije nisem vgradil. Do zdaj sem se zanašal na samodisciplino. Kakorkoli že, s to zamislijo sem se igral (naredil sem celo prototip skripta in funkcije lupine, kot lahko vidite.) Nekaj, kar me pri tem moti, je ukaz '<tt>script</tt>' sam. Mislim, da bom moral zajeti izvire in dodati nekaj parametrov ukazne vrstice (za prekinitev/zaustavitev shranjevanja skriptov iz ukazne vrstice), preden bom začel uporabljati ta način. Moj zadnji nasvet (v tem trenutku): Korenska pot mora biti sestavljena iz '<tt>PATH= /bin</tt>' To je to. Nič drugega v korenski poti. Za vse, kar počne korenski uporabnik, poskrbi symlink iz <tt>/bin</tt>, privzeto ime ali funkcija lupine, oziroma je skript ali binarna različica v <tt>/bin</tt> ali pa je izpisana z eksplicitno potjo. S tem se vsi, ki se prijavljajo kot korenski uporabnik, zavedajo (včasih zelo boleče), kako zaupajo binarnim različicam. Pameten sistemski upravitelj z več uporabniki bo redno pregledoval datoteke <tt>/bin</tt> in <tt>/.*history</tt>, da bi našel vzorce in zančne napake. Zares dobro motivirani sistemski upravitelji bodo poiskali opravila, ki jih je mogoče avtomatizirati, mesta, na katerih je mogoče vnesti logična preverjanja in opravila (zagon urejevalnikov, MTA in druge obsežne interaktivne programe, z izpopolnjenimi lastnostmi skriptov, ki jih je mogoče vnašati v prosojne ali podatkovne datoteke, kot je neslavni <tt>vi ./.exrc</tt> in <tt>emacs ./.emacs</tt> in celo bolj zahrbten <tt>$EXINIT</tt> in vgrajeni makri v glavi/nogi), ki jih je treba opravljati brez korenskih privilegijev. Seveda je take vrste ukaze mogoče zaganjati s: <tscreen><verb> cp $data $some_users_home/tmp su -c $origcommand $whatever_switches cp $some_users_home/tmp $data </verb></tscreen> (kjer so specifikacije odvisne od ukaza). Večina teh zadnjih varnostnih ukrepov prenese na domačo delovno postajo ali postajo z enim samim uporabnikom, so pa zelo dober način upravljanja večjega števila uporabnikov, še posebej javnosti izpostavljeni sistemi (kot tisti pri netcomu.) <sect1>Kako nastaviti xdm-ovega izbiralca za izbor gostitelja <p> <enum> <item>Uredite datoteko, ki zažene <tt>xdm</tt> (najverjetneje je to datoteka <tt>/etc/rc/rc.6</tt> ali <tt>/etc/rc.local</tt>), tako da bo imela v razdelku za zagon <tt>xdm</tt> naslednje vrstice: <tscreen><verb> /usr/bin/X11/xdm exec /usr/bin/X11/X -indirect hostname </verb></tscreen> <item>Uredite datoteko <tt>/usr/lib/X11/xdm/Xservers</tt> in odstranite znak za komentar v vrstici, ki zažene strežnik v krajevnem računalniku (npr. z začetnim nizom <tt>0:</tt>) <item>Znova zaženite računalnik in delo je opravljeno. </enum> To sem dodal zato, ker sem ga hotel nastaviti tudi za svojo podmrežo, pa sem za odpravo vseh težav potreboval skoraj en teden. Opozorilo: s starimi distribucijami SLS (1.1.1) lahko po vrstici za klic <tt>xdm</tt> izpustite <tt>-nodaemon</tt>: to NE deluje pri poznejših izdajah. <sect>Administrativni podatki <p> <sect1>Zahvale <p> Nasvete v tem spisu so dodali Alan Cox <A.Cox@swansea.ac.uk>, Arrigo Triulzi <a.triulzi@ic.ac.uk>, Barry Tolnas <tolnas@nestor.engr.utk.edu>, Dale Lutz, <dal@wimsey.com>, Didier Juges <dj@destin.nfds.net>, Hans Zoebelein <zocki@gold-fish.cube.net>, Jim Dennis <jadestar@rahul.net>, Jon Tombs <jon@gtex02.us.es>, Justin Dossey <dossey@ou.edu>, Michael Hamilton <michael@actrix.gen.nz>, Mick Ghazey <mick@lowdown.com>, Mike Dickey <mdickey@thorplus.lib.purdue.edu>, Otto Hammersmith <ohammers@cu-online.com>, Paul Anderson <paul@geeky1.ebtech.net>, Pawel Veselow <vps@unicorn.miimm.spb.su>, Raul Deluth Miller <rockwell@nova.umd.edu>, Simon Amor <simon@foobar.co.uk>, Ted Stern <stern@amath.washington.edu> in Tony Acero <ace3@midway.uchicago.edu>. <sect1>Najnovejše različice <p> Najnovejšo različico prevoda tega spisa dobite na naslovu <url url="http://www.lugos.si/delo/slo/HOWTO-sl/Tips-HOWTO-sl.html">. </article>