Linux-sokszorosító nagyüzem

 ( Chain-Q | 2008. május 26., hétfő - 23:17 )

A mai műsor Linuxok nagyüzemi másolása volt. Írtam ennek segítésére két scriptet, amit most közzétennék, különösebb kommentár nélkül, hátha másnak is hasznos lesz - részben vagy egészében.

Az első egy "hótprimitív" script annak ellenőrzésére, hogy van-e második HDD a gépben.

#!/bin/bash

# checks for presence of secondary hard disk
DRIVEPRESENT=`dmesg | grep sdb | wc -l`
if [ "$DRIVEPRESENT" -ge "1" ]; then
    echo "Target drive available."
else
    echo "ERROR: Target drive unavailable!"
fi

A második versenyző pedig maga a "klónozó" script:

#!/bin/bash

# very simple HDD clone script

CURRDIR=`pwd`
TARGETDRIVE="sdb"
TARGETDEV="/dev/"$TARGETDRIVE
TARGETDIR="/mnt"
TARGETPART=$TARGETDEV"1"

function clone() {
    # (re)partition the disk
    echo "Partitioning the disk... $TARGETDEV"
    parted -s $TARGETDEV -- mklabel msdos
    parted -s $TARGETDEV -- mkpart primary ext3 0 -1
    parted -s $TARGETDEV -- set 1 boot on

    # make filesystem
    echo "Creating filesystem on... $TARGETPART"
    mke2fs -j $TARGETPART

    # mount newly created filesystem
    echo "Filesystem created, mounting $TARGETPART to $TARGETDIR..."
    mount $TARGETPART $TARGETDIR
    cd $TARGETDIR

    # create directories which won't be copied
    mkdir proc
    mkdir sys
    mkdir mnt

    # copy the rest of the filesystem
    cd /
    for direntry in $( ls -w 1 --hide=mnt --hide=proc --hide=sys --hide=lost+found / ); do
        echo "Copying $direntry..."
        cp -a /$direntry $TARGETDIR
    done

    # revert cloner machine boot config to normal desktop
    cd $TARGETDIR/boot/grub
    rm -f menu.lst
    mv menu.lst.normal menu.lst
    cd $TARGETDIR/usr/bin
    rm -f check
    rm -f clone
    cd $TARGETDIR/root
    rm -f check.sh
    rm -f clone.sh
    cd /

    # clone ID, for fstab mount
    echo "Setting up UUID in fstab and grub menu"
    OLDUUID=`cat $TARGETDIR/etc/fstab | grep UUID | head -1 | cut -d= -f2 | awk '{ print $1}'`
    NEWUUID=`tune2fs -l $TARGETPART | grep UUID | awk '{ print $3}'`
    echo "old UUID: $OLDUUID"
    echo "new UUID: $NEWUUID"
    sed -i "s/$OLDUUID/$NEWUUID/" $TARGETDIR/etc/fstab
    sed -i "s/$OLDUUID/$NEWUUID/" $TARGETDIR/boot/grub/menu.lst

    # unmount the newly copied filesystem
    umount $TARGETDIR

    # make it bootable with grub
    echo "Making new filesystem bootable..."
    echo "device (hd0) $TARGETDEV
    root (hd0,0)
    setup (hd0)" | grub --batch --device-map=/dev/null
    echo "New harddisk is now bootable."

    # return to the directory where we were
    cd $CURRDIR

    echo "Done."
}

# checks for presence of target hard disk
DRIVEPRESENT=`dmesg | grep $TARGETDRIVE | wc -l`
if [ "$DRIVEPRESENT" -ge "1" ]; then
    echo "Target drive available, cloning process started."
    clone
else
    echo "ERROR: Target drive unavailable!"
fi

Lehet, hogy van szebb, jobb, szinesebb-szagosabb, konyhakészebb megoldás, de a céljukat tökéletesen ellátják, és csak a mai nap kb. néhány száz Linuxos desktop született a segítségükkel. Kérdés, óhaj-sóhaj, anyázás, fikázás kommentbe jöhet (legfeljebb leszarom :).

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

en a copyt rsync-el szoktam megcsinalni: rsync -arv /innen/ /ide, vagy valami hasonlo (fejbol nemtudom)

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

dd? :)

dd-vel csak a copyloopot meg az mke2fs-t tudnam kivaltani, a tobbi reszet a scriptnek nem. Es szandekosan nem dd-s, mert ha kulonbozo meretu celwinyokra kell masolni, akkor meg kepbe jon a resize2fs-sel valo magiazas, maskepp nem latja az egesz particiot, meg minden ilyesmi. Ami a nemszeretem kategoria, mert parszor mar beszoptam vele. Arrol nem is beszelve, hogy mivan, ha a "master" gepben levo winyohoz kepest kisebb HDD-re kell masolni. Ja es, ha dd-vel masolnek, akkor nem artana unmountolt filerendszert masolni, ami azt jelenti, hogy egy 3. winyot is a gepbe kene tenni... Szoval nem azert csinaltam igy, mert nem ismerem a dd parancsot... :P

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

csunyak a szoveget parse-olo reszek benne...

Ha majd eszembe jut, otthon megnezem linux alatt, es beirom a javaslataimat (habar egy bash guru nalam is jobban csinalna), alapvetoen csomo dolog osszevonhato:

grep foo | wc -l # grep -c foo
grep foo | awk '{print $n}' # awk '/foo/ {print $n}'

stb

update:

`cat $TARGETDIR/etc/fstab | grep UUID | head -1 | cut -d= -f2 | awk '{ print $1}'` # $(awk '{ FS = "[= ]" } /UUID/ {print $2}' $TARGETDIR/etc/fstab | head -1)

- meg a head-et kellene valahogy intelligensen helyettesiteni awk-ban, de ennyire nem masztam bele... Az mindenesetre latszik, hogy az awk egymaga 5 parancsot (lenne) kepes kivaltani, es a sor is rovidebb ;-)

A 'csucs' persze a perl lenne, de meg csak par napja ismerkedem vele ;-)

Javaslom kivaltani a valtozokban hasznalt parancsbehelyettesiteseket a fenti formaban ( `ls` helyett $(ls) ).

Idézet:
csunyak a szoveget parse-olo reszek benne...

Csunyanak csunya, de mukodik. Ilyen az, mikor az ember siet, es peldakbol, meg Guglirol ollozza ossze a temat. :) Egyebkent kosz az updateket, johet meg ilyen. :)

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

Diszkek ellenorzesere javaslat:
Ugyebar ha valami allat pl egy pendrive-ot hagyott a gepben, az bekavarhat... foleg ha pl ki is lett huzva. A dmesg semmi hasznos infot nem ad a *jelenlegi* diszkekrol. Arrol nem is beszelve, hogy neha hd* is lehet a device neve. Ehelyett javaslom a /proc/partitions vizsgalatat - ebben elvileg minden ervenyes diszk benne van, de pl a CDROM nincs ;-)
A fajl elso ket sora nem relevans:


# cat /proc/partitions
major minor #blocks name


3 0 39082680 hda
3 1 506016 hda1
3 2 5076540 hda2
3 3 27270337 hda3

Egy ilyet talaltam ki:


grep -o ' .d.$' /proc/partitions

Ez a sorvegi " XdY" stringeket talalja meg (ott a szokoz is a device neve elott). Nyilvan hda, hdb, hdb, sda, sdb, sdc es hasonlok fordulhatnak elo. Egy -c opcioval rogton meg is lehet szamolni. Es meg a regexp-et be sem kellett vetni ;-)

(tudnam, mi a ferde f.sznak vesz el a code tag formazasa, ha kozben van egy ures sor is...)

...

En valahogy ugy csinalnam, hogy az elejen vennem a device-ok listajat, es osszevetnem az fstab-bal vagy a mountolt filerendszerekkel, nehogy elo dolgot irjak felul...

Ezek jo meglatasok, egy altalanos celu scripthez. De esetunkben ismert a hardverkornyezet, amiben a scriptnek futnia kell (dedikalt HDD-masolo gepek vannak). Igy biztositott, hogy a masodik winyo mindig sdb lesz, valamint hogy senki nem fog pendriveot beledugdosni... :) A masolo gep egyebkent single parameterrel, egybol root-ba bootol, ahol a HDD-sokszorositassal megbizott delikvens beirja hogy "clone" es annyi. Lefut a script, utana beirja "halt", es johet a kovetkezo winyo. Nagyuzem.

Ez persze nem negalja amit irsz, es hasznos is, csak jelzem, hogy emiatt nem kell minden lehetseges esetet, meg usererrort kezelni a scriptnek, abban a kornyezetben, amibe keszult.

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

> Ezek jo meglatasok, egy altalanos celu scripthez.

Hogy apamat idezzem: az orokkevalosagnak dolgozunk ;-)

A baj inkabb az, hogy ha valaki ir egy hasznos es valoban jol tesztelt funkciot, az vagy nem mukodik minden OS-en/shellben/kornyezetben, vagy elvesz a www tengereben...

Ja. Igazabol csak amiatt raktam ki, hogy egyreszt mikor evente-felevente elojon a problema, hogy Linuxos winyot kene masolni (akarcsak hazilag, 1-2 darabot) akkor mindig elorol kell elkezdenem a "hogyisvolt" musort, mert pl. a Grub parameterezeset meg a parancsokat rendszeresen elfelejtem annyi ido alatt, meg kezzel csinalni az egeszet sokadszor is, masreszt ha meg mar megtartom a scriptet, akkor meg mar ki is rakhattam ide, hatha masnak is erdekes lehet belole valami. :) De amugy public domain. :P

De ha van idod jatszani vele, atcsinalhatod altalanos celura, aztan kirakhatod a sajat blogodba, talan meg en is hasznalni fogom. :) Egyebkent sok otletem lenne meg, hogy mit lehetne rajta tupirozni, peldaul most csak workstationt kepes masolni, masik klonozo gepet automatikusan nem, mivel letorli/felulirja a klonozo gepen a specifikus dolgokat. Akkor nem biztos, hogy a menu.lst-ben is ugyanaz az UUID van, mint az fstabban, igy az is bebugzhat (ebbe bele is futottam egyszer). Vagy peldaul most nem csinal swap particiot, helyette egy felgigas swap file van a lemezen, abbol a megfontolasbol, hogy veszhelyetben ha kell, akkor lehessen 1 kattintassal Ghostolni is a lemezt a "betanitott szakmunkas" kolleganak, aki esetleg nem ert ilyesmihez ilyen szinten. Tehat a swap particio letrehozasat is bele kene tenni (opcionalisan), plusz ez esetben kiszedni a swapfile-t, stbstbstb... :)

De mivel ez csak egy teendo volt a parszaz kozott amit aznap kellett, igy ennyiben maradt. A celnak mint irtam igy is megfelel. :) De ha van kedved ezzel szopni, en orulnek ha updatelned. :)

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

Hm, hm, klasszikus wiki tema lehetne belole...

Jo otlet. Tamogatom! :) (Es elotted a lehetoseg, mert en nem erek ra, sajna. :)

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

Azt a ki-be cd-zest a cp/rm stb korul is feleslegesnek tartom, hiszen a valtozokat hasznalva a teljes utvonallal lehet masolni, stb.

mkdir $TARGETDIR/proc/

stb

Ja. Ez meg azert volt, mert csak magyar keyboard volt a gepen amin irtam (es lemutotte rola aki csinalta az US keymapot is, okos okos), es magyar billenytuzeten szar helyen van a "$" karakter, es utaltam volna annyiszor beirni, a valtozonevhez... :D

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

Na ne mar, sed/vi szerinted mennyi ido alatt irja at az osszeset? ;-)

Pont harom masodperccel tovabb tart, mint amennyi idom volt az egeszre. :P Szoval sajnos igy maradt. :)

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-