Naprej Nazaj Kazalo

3. Podrobni nasveti

3.1 Deljenje izmenjalnih particij med Linuxom in Windows

  1. 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).
  2. Znova zaženite računalnik v Linuxu in shranite particijo v datoteko. Npr. če je bila to particija /dev/hda8:
    dd if=/dev/hda8 of=/etc/dosswap
    
  3. Stisnite izmenjalno datoteko za DOS; ker je navidezno prazna, jo je mogoče zelo dobro stisniti:
    gzip -9 /etc/dosswap
    
  4. Da bi pripravili in namestili izmenjalno datoteko v Linuxu, dodajte v datoteko /etc/rc naslednje: XXXXX je število blokov v navidezni particiji
    mkswap /dev/hda8 XXXXX
    swapon -av
    
    Preverite, ali ste v datoteko /etc/fstab dodali vnos za izmenjalno particijo.

  5. Če vaš osnovni/zagonski paket podpira /etc/brc ali /sbin/brc, v datoteko /etc/brc 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):
    swapoff -av
    zcat /etc/dosswap.gz | dd of=/dev/hda8 bs=1k count=100
    
    # Ne pozabite, da se tako zapiše nazaj na particijo samo prvih sto blokov. Empirično sem ugotovil, da to zadošča.
>>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 :-)

3.2 Obnavljanje zbrisanih datotek

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 grep.

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 egrep: v mojem primeru je bilo elektronsko sporočilo v imeniku /usr/local/hime/michael. Iz izhoda ukaza df sem lahko ugotovil, da je ta na particiji /dev/hdb5:

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
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 'ftp', ki ji je sledilo besedilo in na koncu še beseda 'COL'. 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 egrep 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 strings:

strings /tmp/x | less
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.

3.3 Kako uporabljati oznake za nespremenljivost

Uporabite oznako za nespremenljivost.

Takoj po tem, ko boste namestili in nastavili svoj sistem, preglejte datoteke /bin/sbin, /usr/bin, /usr/sbin, /usr/lib (in še nekatere druge običajne osumljence) in brez predsodkov uporabite ukaz chattr +i. To vrstico dodajte tudi v datoteke jedra v korenskem imeniku. Naredite nov imenik 'mkdir /etc/.dist/' in prekopirajte vsebino imenika /etc (to naredim v dveh korakih z uporabo /tmp/etcdist.tar in se s tem izognem podvajanju) v ta novi imenik. (Lahko bi tudi ustvarili imenik /etc/.dist.tar.gz -- 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 'rm -fr' (še vedno lahko naredite veliko škodo, ampak vsaj vaše knjižnice in binarne datoteke bodo bolj zaščitene).

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 ne ponuja poljubnih ukazov lupine).

Edina neprijetnost bo nastala pri gradnji in izvajanju ukaza "make install" na različnih vrstah sistemskih binarnih datotek. Po drugi strani pa boste s tem preprečili, da bi 'make install' prepisal datoteke. Kadar pozabite prebrati Makefile in chattr -i, datoteke, ki bodo prepisane (in imenike, katerim želite datoteke dodati) -- in se ukaz make ne izvede, samo uporabite ukaz chattr in ga znova zaženite. Izkoristite lahko tudi priložnost in prestavite stare binarne datoteke, knjižnice ali karkoli je že v imeniku .old/, jih preimenujete, stisnete ali počnete z njimi, kar pač želite.

3.4 Nasveti, kam dati nove stvari

Vse nove stvari se začnejo pod /usr/local! Ali v /usr/local/'hostname'. Če je vaša distribucija ena tistih, ki pusti imenik /usr/local prazen, tvorite svoje imenike /usr/local/src, /usr/local/bin, itd. in jih uporabljajte. Če vaša distribucija v drevesno strukturo imenika /usr/local shrani stvari, boste verjetno uporabili ukaz 'mkdir /usr/local/'hostname'' in mu podelili 'wheel' group +w (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 vedno!, vedno!, vedno! shranite v /usr/local/src/.from/$KJERKOLI_SEM_JIH_DOBIL/ (za .tar oz. katerekoli datoteke) in jih zgradite v imeniku /usr/local/src (ali /$HOSTNAME/src). Preverite, ali se namesti pod lokalno ureditev. Če je paket nujno treba namestiti v /bin, /usr/bin 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 /usr/local/.from 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 poznam 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 edini, 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 naknadno, po začetni namestitvi in nastavitvi.

3.5 Kako spremeniti vse velike črke v imenih datotek v male črke

V razdelku 2c nasvetov 12. izdaje sem opazil kar nekaj prezahtevnih ali nepotrebnih postopkov. Ker jih je več, vam jih pošiljam:

#!/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
Uh, to je pa dolg skript. Za izvajanje tega opravila jaz ne bi pisal skripta. Namesto tega bi v ukazni vrstici uporabil ukaz:
for i in * ; do [ -f $i ] && mv -i $i `echo $i | tr '[A-Z]' '[a-z]'`; done;
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

kill -9 `ps -aux |grep ^<username> |tr -s " " |cut -d " " -f2`
Zgled; uporabniško ime je foo
kill -9 `ps -aux |grep ^foo |tr -s " " |cut -d " " -f2`
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

3.6 Kako nadgraditi sendmail

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 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 sendmail-8.9.0. Premaknite se v ta imenik ter preberite datoteki README in RELESE_NOTES (presenečeni boste nad opravljenimi nadgraditvami). Premaknite se zdaj v src. 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:

# ifndef NAMED_BIND
#  define NAMED_BIND    1     /* uporabi berkeleyjski internetni strežnik */
# endif
in spremenil 1 v 0:
# ifndef NAMED_BIND
#  define NAMED_BIND    0     /* uporabi berkeleyjski internetni strežnik */
# endif
Pri distribuciji Debian 1.3.1 se db.h glede na privzeto vrednost namesti v /usr/include/db, namesto v /usr/include, kjer jo sendmail poskuša najti. Pojdite v imenike src, mailstats, makemap, praliases in smrsh in tam izvedite naslednji ukaz:
./Build -I/usr/include/db
Ko boste s tem gotovi, cd .. in vnesite make install. 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 majordomo, sem moral na začetek datoteke /etc/sendmail.cf dodati:
O DontBlameSendmail=forwardfileinunsafedirpath, forwardfileinunsafedirpathsafe
Dandanes je sendmail zelo občutljiv za dovoljenja imenikov in datotek ter bo sporočal napake o imenikih in datotekah v privzetih imenih ali datotekah .forward, 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

3.7 Nekaj nasvetov za nove sistemske upravitelje

Ustvarite in vzdržujte /README.'hostname' in/ali /etc/README.'hostname' [ali, če je le mogoče, /usr/local/etc/README.'hostname' - Vzdrževalec.]

Od prvega dne upravljanja sistem zapisuje stvari v omrežni dnevnik. Morda boste v rootov /bash_logout vnesli vrstico "vi /README.$(ime gostitelja)". To lahko opravite tudi tako, da napišete skript za su ali sudo, ki počne nekaj podobnega:

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 -
(Dnevnik ustvarite z ukazom typescript. 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 'script' 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 'PATH= /bin'

To je to. Nič drugega v korenski poti. Za vse, kar počne korenski uporabnik, poskrbi symlink iz /bin, privzeto ime ali funkcija lupine, oziroma je skript ali binarna različica v /bin 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 /bin in /.*history, 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 vi ./.exrc in emacs ./.emacs in celo bolj zahrbten $EXINIT in vgrajeni makri v glavi/nogi), ki jih je treba opravljati brez korenskih privilegijev. Seveda je take vrste ukaze mogoče zaganjati s:

cp $data $some_users_home/tmp
su -c $origcommand $whatever_switches
cp $some_users_home/tmp $data
(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.)

3.8 Kako nastaviti xdm-ovega izbiralca za izbor gostitelja

  1. Uredite datoteko, ki zažene xdm (najverjetneje je to datoteka /etc/rc/rc.6 ali /etc/rc.local), tako da bo imela v razdelku za zagon xdm naslednje vrstice:
    /usr/bin/X11/xdm
    exec /usr/bin/X11/X -indirect hostname
    
  2. Uredite datoteko /usr/lib/X11/xdm/Xservers in odstranite znak za komentar v vrstici, ki zažene strežnik v krajevnem računalniku (npr. z začetnim nizom 0:)
  3. Znova zaženite računalnik in delo je opravljeno.
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 xdm izpustite -nodaemon: to NE deluje pri poznejših izdajah.


Naprej Nazaj Kazalo