Update: Linux-sokszorosito...

Ime az atalakitott clone.sh - Chain-Q 'Linux-sokszorosító nagyüzem' bejegyzese nyoman.
Csak az volt a cel, hogy az eredetiben szuksegtelenul szereplo reszek le legyenek egyszerusitve.

Eloszor a script aljan lathato feltetellel ellenorizzuk, hogy van-e 'sdb', majd ha ez igaz, esz nelkul letrehozunk rajta egy darav ext3 particiot. Ezt mountoljuk /mnt ala, majd a futo rendszer / alatti konyvtarait atmasoljuk fapad 'cp -a'-val, nehany kivetellel. Vegul a grub atirasa utan umount-oljuk az 'uj' diszket.

Raktam bele par magyar kommentet is, hatha valakinek igy megkonnyitem a dolgat, de konnyen ki is lehet oket szedni ;-) Az echo-zott uzenetek maradtak angolul.

A script velemenyem szerint annyira specifikus es kezdetleges, hogy nincs ertelme beemelni a wikibe.
Ha en irnek egyet, ugy kezdenem, hogy legalabb ne csak Linuxon legyen kepes futni. Rengeteg resz van, aminek biztosan csak Charlie-eknal van ertelme, ezeket meg sem kisereltem modositani. Minden kritika mellett, amit hozzairtam, tisztaban vagyok vele, hogy nem volt tobb ido az eredetit csiszolgatni.

Hasonlo celokra Hubert Feyrer g4u-jat ('Ghost for Unix') szokas hasznalni, ami a dd-re alapoz, sajnos mindenfele optimalizalas (pl bs= megadasa) nelkul, igy nem a leggyorsabb. Viszont script, igy konnyen fel lehet hasznalni.

FIGYELEM! A scriptet jelen formajaban NEM teszteltem, fogalmam sincs, hogy mukodik-e egyaltalan, van-e benne szintaktikai hiba vagy barmi egyeb!!!


#!/bi<m>n/bash

# Script for cloning the filesystem structure of the running system
# WARNING: the script works only for  the target 'sdb',
# and won't test if it is currently in use or not!
# The original lines were NOT kept, please diff ;-)

# |---| Script a futo rendszer masik diszkre 'klonozasahoz' (valojaban nem klonozas)
# |---| FIGYELEM! a script csak 'sdb' diszkre van megirva,
# |---| es nem ellenorzi, hogy 'sdb' hasznalatban van-e!


# Definition of internal variables

# |---| A script valtozoinak meghatarozasa

# CURRDIR=$(pwd) # not referenced anymore
TARGETDRIVE=sdb
TARGETDEV=/dev/$TARGETDRIVE
TARGETDIR=/mnt
TARGETPART=$TARGETDEV\1

# Path to binaries (everything is ref'd with a full path):
# We assume that the following common programs are under /bin :
# echo mount umount mkdir cp mv rm grep ls cat sed awk cut head sort
# We use variables for less common programs
# Even your distro may change the package ;-)

# |---| Minden binarisra teljes utvonallal hivatkozunk,
# |---| A kovetkezokrol feltetelezzuk, hogy a /bin alatt vannak:
# |---| echo mount umount mkdir cp mv rm grep ls cat sed awk cut head sort
# |---| A tobbire viszont valtozokat allitunk be, hiszen
# |---| ezek az aberralt disztribuciok varialhatjak a csomagokat ;-)
# |---| A sorok vegen a szokasos csomagok nevei szerepelnek

MKE2FS=$(which mke2fs)  # package name is usually 'e2fsprogs'
TUNE2FS=$(which tune2fs)        # dito
PARTED=$(which parted)  # package name is usually 'parted'
GRUB=$(which grub)      # package name is usually 'grub'

# Main function - in fact, the only one ;-)
# |---| A fo funkcio, egyben az egyetlen ;-)

clone() {
    # (re)partition the disk
    # |---| a diszk particionalasa
    /bi<m>n/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 ext3 filesystem
    # |---| ext3 FS letrehozasa; '-j' = journal (naplo)
    /bi<m>n/echo "Creating filesystem on... $TARGETPART"
    $MKE2FS -j $TARGETPART

    # mount newly created filesystem
    # |---| az uj FS mountolasa
    /bi<m>n/echo "Filesystem created, mounting $TARGETPART on $TARGETDIR..."
    /bi<m>n/mount $TARGETPART $TARGETDIR

    # create directories which won't be copied
    # |---| a nem masolando konyvtarak letrehozasa
    /bi<m>n/mkdir $TARGETDIR/proc/
    /bi<m>n/mkdir $TARGETDIR/sys/
    /bi<m>n/mkdir $TARGETDIR/mnt/

    # copy the rest of the filesystem
# This is lame; I would name all directories under / explicitly instead.
# |---| A tenyleges adatmasolas egy elegge bena modszerrel

    for direntry in $(/bi<m>n/ls -w 1 --hide=mnt --hide=proc --hide=sys --hide=lost+found /); do
        /bi<m>n/echo "Copying $direntry..."
        /bi<m>n/cp -a /$direntry $TARGETDIR
    done

    # revert the boot config of the cloned machine to normal desktop
    # |---| a celrendszer boot menujenek visszairasa asztali gepnek megfeleloen
    /bi<m>n/rm -f $TARGETDIR/boot/grub/menu.lst
    /bi<m>n/mv $TARGETDIR/boot/grub/menu.lst.normal $TARGETDIR/boot/grub/menu.lst

#
# remove clone scripts and links ??? - this is a bloody idea;
# such scripts should be stored under, for example, /root/bi<m>n/
# it is absolutely unnecessary to remove them, a 'chmod -x ...' will just do it...
# unnecessary 'cd's were weeded out
#
# |---| felesleges scriptek/linkek leszedese; ez hulyeseg, az ilyen scripteknek nem itt a helye,
# |---| illetve felesleges torolgetni, sima 'chmod -x' is megtenne peldaul,
# |---| vagy betenni /tmp/clone/ ala stb...
# |---| A sok felesleges 'cd' ki lett irtva

    /bi<m>n/rm -f $TARGETDIR/usr/bi<m>n/check
    /bi<m>n/rm -f $TARGETDIR/usr/bi<m>n/clone
    /bi<m>n/rm -f $TARGETDIR/root/check.sh
    /bi<m>n/rm -f $TARGETDIR/root/clone.sh

    # clone ID, for fstab mount
    # |---| UUID klonozasa az fstab-hoz
    /bi<m>n/echo "Setting up UUID in fstab and grub menu"
    OLDUUID=$(/bi<m>n/awk '{ FS = "[= ]" } /UUID/ {print $2}' $TARGETDIR/etc/fstab | /bi<m>n/head -1)
    NEWUUID=$($TUNE2FS -l $TARGETPART | /bi<m>n/awk '/UUID/ { print $3}')
    /bi<m>n/echo "old UUID: $OLDUUID"
    /bi<m>n/echo "new UUID: $NEWUUID"
    /bi<m>n/sed -i "s/$OLDUUID/$NEWUUID/" $TARGETDIR/etc/fstab
    /bi<m>n/sed -i "s/$OLDUUID/$NEWUUID/" $TARGETDIR/boot/grub/menu.lst

    # unmount the newly copied filesystem
    # |---| az uj FS umount-olasa
    /bi<m>n/umount $TARGETDIR

    # make it bootable with grub
    # |---| az uj diszk bootolhatova tetele a GRUB altal
    /bi<m>n/echo "Making new filesystem bootable..."
    /bi<m>n/echo "device (hd0) $TARGETDEV
    root (hd0,0)
    setup (hd0)" | $GRUB --batch --device-map=/dev/null
    /bi<m>n/echo "New harddisk is now bootable."
    /bi<m>n/echo "Done."
}

# check if we have 'sdb', the installation target device.
# |---| Ellenorizzuk, hogy van-e legalabb 1 darab 'sdb' eszkozunk ;-)
## DRIVEPRESENT=`dmesg | grep sdb | wc -l`
# -- sdb may be unavailable since last detection

DRIVEPRESENT=$(/bi<m>n/grep -c sdb /proc/partitions)
if [ "$DRIVEPRESENT" -ge 1 ]; then
    /bi<m>n/echo "Target drive is available, cloning process is started."
    clone
else
    /bi<m>n/echo "ERROR: Target drive is unavailable!"
    exit 1
fi

Hozzászólások

Na, kiderult, hogy a *bin/ okozta a problemat, javitottam, itt van teljes szepsegeben...

Persze a kodban a FAQ-ban leirtakkal ellentetben rendesen latszodnak a 'workaround' tagek, igy azokat ki kell szedegetni.

nah, busybox ash-sel is működik?

riszpekt neked

ami át van húzva, azt teljesen fölösleges elolvasni. az olyan, mintha ott sem lenne