Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[TOOL] GentooCloner 0.5.1 beta
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools)
View previous topic :: View next topic  
Author Message
teknux
Guru
Guru


Joined: 19 Feb 2003
Posts: 517
Location: Rome, IT

PostPosted: Tue May 23, 2006 12:27 pm    Post subject: [TOOL] GentooCloner 0.5.1 beta Reply with quote

Salve a tutti,

GentooCloner è uno script in grado di clonare/ripristinare la vostra gentoo box senza troppi sforzi. Crea un backup dell'MBR, della tavola delle partizioni e procede alla creazione di uno stage4 (escludendo i soliti path di default e prevedendo path opzionali da aggiungere nella sezione di configurazione). Lo script è utile nel caso in cui si voglia creare un backup della propria macchina, oppure effettuare più installazioni su macchine gemelle (è questo il motivo per cui ho creato lo script: avevo 10 rack identici).

Nel caso in cui si cambi macchina (in particolare geometria del disco) non è un problema, perchè rimane comunque un archivio stage4 da scompattare a mano.

A grandi linee ecco cosa permette di fare:

DUMP: MBR + partition table + stage4 del sistema (lanci il dump e ti vai a prendere un caffè)
RESTORE: MBR + partition table + sistema da stage4 (lanci il restore e te ne vai in pausa pranzo, quando torni fai il reboot ed è pronta)

naturalmente per il restore è ottimale un livecd (in modalità cdcache se si dispone di un solo drive di lettura).

ecco il sorgente:
Code:

#!/bin/bash
# GentooCloner 0.5.1 (still beta!) - clone your gentoo on identical/similar machines or just do a stage4 :)

AUTHOR="Copyright (C) 2006 Andrea "teknux" Pavoni (teknux@gmail.com)"

LICENSE="
Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:
 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
 3. All advertising materials mentioning features or use of this software
    must display the following acknowledgement:
      This product includes software developed by Andrea Pavoni.
 4. The name Andrea Pavoni or teknux may not be used to endorse or promote
    products derived from this software without specific prior written
    permission.

 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 SUCH DAMAGE.
"

##### BEGIN USER CONFIGURATION ####################################

# which disk to be considered for partition table infos
DISK=/dev/sda

# name of the output file
OUT_NAME="stage4-`hostname`-`date +\%Y\%m\%d`"

# optional files/paths to be excluded (syntax examples: /dir1/:dir2/*:/path/file)
OPT_EXCLUDE_LIST="/data/*:/usr/src/*:/home/*/*:/usr/portage/*:/var/log/*/*:/root/*"

# this is your root-mount-point where to restore the system
# if you're using a gentoo live-cd leave this setting :)
RESTORE_LOCATION=/mnt/gentoo/
##### END USER CONFIGURATION #######################################

dump_stage4 ()
{
   LOCATION=$1
   
   #telinit 1
   
   echo "Creating $LOCATION directory"
   mkdir -p $LOCATION

   # copy this script in $LOCATION for future restoring
   cp $0 $LOCATION

   echo "Saving partition table "

   # backup patition table info
   dd if=$DISK of=$LOCATION/mbr.save count=1 bs=446
   /sbin/sfdisk -d $DISK > $LOCATION/hdtable.save
   
   # backup filesystem info, first one is the root ('/') dir
   grep $DISK /etc/fstab | awk '{ print $2"\t"$1"\t"$3 }' | sort >> $LOCATION/fs.save

   # exclude some default paths
   DEFAULT_EXCLUDE_LIST="/tmp/*:/var/tmp/*:/dev/*:/proc/*:/mnt/*:/sys/*:$LOCATION/*"

   EXCLUDE_LIST=`get_exclude_list`

   echo "Creating $OUT_NAME in $LOCATION"

   tar cjvpf $LOCATION/$OUT_NAME.tar.bz2 $EXCLUDE_LIST / 1>$LOCATION/$OUT_NAME.log 2>&1

   printf "\n\nDONE\n"

   exit 0
}

restore_stage4 ()
{
   LOCATION=$1   

   echo "Restoring $DISK partition table"

   dd if=mbr.save of=$DISK
   sfdisk $DISK < $LOCATION/hdtable.save

   echo "Rebuilding filesystems"

   for i in $(grep reiserfs $LOCATION/fs.save | awk '{ print $2 }') ; do
      mkreiserfs -f -f $i
   done

   for i in $(grep ext3 $LOCATION/fs.save | awk '{ print $2 }') ; do
      mkfs.ext3 $i
   done

   SWAP=`grep swap $LOCATION/fs.save | awk '{ print $2 }'`
   mkswap $SWAP && swapon $SWAP

   # mount the root partition
   mount `get_root_partition $LOCATION` $RESTORE_LOCATION
   
   echo "Creating dir(s) and mounting them"

   for i in $(grep $DISK $LOCATION/fs.save | awk '{print $1}'| egrep '/.'| sed -e 's/\///g') ; do
      mkdir -p $RESTORE_LOCATION/$i
      echo "$i"
      mount `grep $i $LOCATION/fs.save | awk '{print $2}'` $RESTORE_LOCATION/$i
   done

   echo "Restoring stage4 from `ls $LOCATION/*.tar.bz2` to $RESTORE_LOCATION"
   tar xfjvp `ls $LOCATION/*.tar.bz2` -C $RESTORE_LOCATION

   cp -Rp /dev/* $RESTORE_LOCATION/dev/

   printf "\n\nDONE\n"

   exit 0
}

# discover where is the / (root) partition
get_root_partition ()
{
   LOCATION=$1
   LINE_N=`grep $DISK $LOCATION/fs.save | awk '{ print $1 }' | egrep -n ^/$ | cut -d':' -f1`
   FS_LINES=`wc -l $LOCATION/fs.save | awk '{ print $1 }'`
   echo `cat $LOCATION/fs.save | head -n$FS_LINES | tail -n1 | awk '{ print $2 }'`
}

# handle the (default/optional)-exclude-list of files and dirs
get_exclude_list ()
{
   EXCL_TMP=""
   FINAL=$DEFAULT_EXCLUDE_LIST:$OPT_EXCLUDE_LIST
   for i in $(echo $FINAL | awk '{ split($1,path,":") ;for(p in path){if(path[p]!=""){print " --exclude="path[p]}}}') ; do
           EXCL_TMP="$EXCL_TMP $i"
   done

   echo `for i in $EXCL_TMP ; do echo -n "$i " ; done`
}

usage ()
{
   echo "Usage:"
   printf "\t$0 dump WHERE_TO_SAVE_STAGE4_PATH\n\n"
   printf "\t$0 restore WHERE_TO_READ_STAGE4_PATH\n\n"
   exit -1
}


if [ $# != 2 ] ; then
   usage
fi

case "$1" in
   dump ) dump_stage4 "$2";;
   
   restore ) restore_stage4 "$2";;

   * ) usage;;
esac


Il codice è ancora in beta, nel senso che per ora non mi ha dato particolari problemi, ma non è ancora testato al 100% soprattutto il ripristino dell'MBR he ho cambiato in quest'ultima versione.

Consigli, pareri e critiche sono ben accetti :)

saluti,
tek
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3135

PostPosted: Tue May 23, 2006 3:10 pm    Post subject: Reply with quote

figo ;-)
funziona, in generale su architetture differenti ? cioe', sarà/ebbe possibile che io prenda l'installazione di un x86 e la passi ad un ppc confdidando che si occupi lui di ricompilare tutto :P ?

Coda
Back to top
View user's profile Send private message
Kernel78
Moderator
Moderator


Joined: 24 Jun 2005
Posts: 3654

PostPosted: Tue May 23, 2006 3:18 pm    Post subject: Reply with quote

codadilupo wrote:
figo ;-)
funziona, in generale su architetture differenti ? cioe', sarà/ebbe possibile che io prenda l'installazione di un x86 e la passi ad un ppc confdidando che si occupi lui di ricompilare tutto :P ?

Coda

Visto che non ricompila assolutamente nulla ma si limita a creare/scompattare un tar.bz2 direi proprio di no.
Per replicare un'installazione su architetture differenti si potrebbe provare a copiare i file world, make.conf e i vari package.*, fare il link al profilo e copiare tutta /etc, ricompilare il sistema con un bel
Code:
emerge -e world
e incrociare le dita.
Probabilmente ho dimenticato e/o trascurato qualcosa e se vi scoppia il pc o avete qualsiasi tipo di problema non date la colpa a me :wink:
_________________
Le tre grandi virtù di un programmatore: pigrizia, impazienza e arroganza. (Larry Wall).
Prima di postare un file togli i commenti con
Code:
grep -vE '(^[[:space:]]*($|(#|!|;|//)))'
Back to top
View user's profile Send private message
teknux
Guru
Guru


Joined: 19 Feb 2003
Posts: 517
Location: Rome, IT

PostPosted: Tue May 23, 2006 3:58 pm    Post subject: Reply with quote

@coda: purtroppo ha ragione kernel78, lo script si limita a fare un classico stage4, diciamo che il *valore aggiunto* sarebbe la quasi eliminazione dell'intervento a-mano e u-mano :) lo lanci una volta per backuppare il disco, lo rilanci su un'altra macchina (o sulla stessa in caso di recovery) e ti ritrovi tutto tale e quale, partizioni comprese, insomma è un ibrido tra un *kickstart dei poveri* e uno stage4.

@kernel78: questa potrebbe essere un'idea carina ma non credo sia fattibile, visto che puoi anche avere il file world ma non hai i tools e le librerie per compilare su una architettura diversa. anche partendo da un altro stage3 (di un'altra arch quindi), non credo sia possibile fare il merge dei due world (e se lo dovesse essere, è impresa titanica, altro che scriptino bash...). ad ogni modo ti ammazzi di meno rifacendo a zampa da capo :P

saluti,
tek
Back to top
View user's profile Send private message
Kernel78
Moderator
Moderator


Joined: 24 Jun 2005
Posts: 3654

PostPosted: Wed May 24, 2006 6:19 am    Post subject: Reply with quote

teknux wrote:
@kernel78: questa potrebbe essere un'idea carina ma non credo sia fattibile, visto che puoi anche avere il file world ma non hai i tools e le librerie per compilare su una architettura diversa. anche partendo da un altro stage3 (di un'altra arch quindi), non credo sia possibile fare il merge dei due world (e se lo dovesse essere, è impresa titanica, altro che scriptino bash...). ad ogni modo ti ammazzi di meno rifacendo a zampa da capo :P

Premetto che avendo solo un'architettura di macchine su cui ho installato gentoo non ho la più pallida idea se le mie supposizioni siano valide o meno ma pensavo che, una volta completata l'installazione base modificare il file world e fare un bel emerge -e world non fosse molto diverso da dare un emerge di tutti i pacchetti che si vogliono installare ovvero tutti quelli presenti nel file world "originario".
Il tutto posto che tutti i sw siano presenti per le varie architetture coinvolte.

Più che un backup e un ripristino si tratterebbe di un'installazione normale seguita da una customizzazzione istantanea (e da una lunga compilazione :lol: ), dite che non si può fare ?
_________________
Le tre grandi virtù di un programmatore: pigrizia, impazienza e arroganza. (Larry Wall).
Prima di postare un file togli i commenti con
Code:
grep -vE '(^[[:space:]]*($|(#|!|;|//)))'
Back to top
View user's profile Send private message
teknux
Guru
Guru


Joined: 19 Feb 2003
Posts: 517
Location: Rome, IT

PostPosted: Wed May 24, 2006 10:33 am    Post subject: Reply with quote

Quote:
Il tutto posto che tutti i sw siano presenti per le varie architetture coinvolte.


ecco, hai trovato un altro punto cruciale che spiega ancora meglio quali siano le difficoltà di una soluzione simile ;)

Quote:
Più che un backup e un ripristino si tratterebbe di un'installazione normale seguita da una customizzazzione istantanea (e da una lunga compilazione :lol: ), dite che non si può fare ?


mmm, a quel punto prendi uno stage1 universale e con uno scriptino automatizzi la modifica del make.conf e del world per le tue esigenze. insomma uno script che legge un file adeguatamente formattato e contenente i pacchetti che desideri, le use-flags, l'architettura e le ottimizzazioni del compilatore, successivamente lancia il bootstrap ed installa quello che hai specificato.

una cosa simile è già possibile secondo me. anzi, ora che ci penso lo scriptONE (non è più tanto "ino" a quel punto) potrebbe leggere da un sistema preesistente i pacchetti, ottimizzazioni, le use, etc.. e li salva nell'ipotetico file descritto sopra, poi da uno stage1 fa il resto. ad ogni modo la condizione necessaria è che il sistema preesistente sia "pulito" da pacchetti non eliminati etc...

non so se è un'impresa che vale la pena, sarebbe giusto per didattica o quasi, altrimenti si usa catalyst (che ancora non sono riuscito a domare, ma non riprovo da parecchio) e passa la paura ;)

saluti,
tek
Back to top
View user's profile Send private message
makoomba
Bodhisattva
Bodhisattva


Joined: 03 Jun 2004
Posts: 1856

PostPosted: Wed May 24, 2006 10:48 am    Post subject: Reply with quote

uso un approccio simile per clonare le mie installazioni, anche se il mio script funziona in maniera diversa.
volevo postarlo, ma prima chiedo il parere dell'autore del 3d acciocchè non sembri
Quote:
e te pareva che non ci aveva pure lui lo script... a makù, ma allora perchè nun l'hai aperto tu il 3d ?

_________________
When all else fails, read the instructions.
Back to top
View user's profile Send private message
Kernel78
Moderator
Moderator


Joined: 24 Jun 2005
Posts: 3654

PostPosted: Wed May 24, 2006 11:00 am    Post subject: Reply with quote

@makù
che anche tu avessi uno script per l'occasione direi che era scontato, penso che tu abbia anche uno script per fare il caffè :lol:
_________________
Le tre grandi virtù di un programmatore: pigrizia, impazienza e arroganza. (Larry Wall).
Prima di postare un file togli i commenti con
Code:
grep -vE '(^[[:space:]]*($|(#|!|;|//)))'
Back to top
View user's profile Send private message
teknux
Guru
Guru


Joined: 19 Feb 2003
Posts: 517
Location: Rome, IT

PostPosted: Wed May 24, 2006 2:27 pm    Post subject: Reply with quote

@makoomba: se per *autore del thread* ti riferisci a me, accomodati pure, magari possiamo metterli a confronto in senso di idee/soluzioni. del resto se ti fai un giro sul forum e sul gentoo-wiki ci sono già soluzioni simili, io ho solo pubblicato una mia implementazione di un'idea preesistente ;)

saluti,
tek
Back to top
View user's profile Send private message
makoomba
Bodhisattva
Bodhisattva


Joined: 03 Jun 2004
Posts: 1856

PostPosted: Wed May 24, 2006 3:53 pm    Post subject: Reply with quote

premessa: quello che mi serve è poter utilizzare lo stesso stage4 su sistemi differenti (comunque i686 compatibili).
esempio ide/scsi/raid o xeon/pentium/athlon.

per cui lo script esegue i passi:
- partiziona l'hd secondo uno schema hard-coded (è comunque possibile variare la dim. delle singole partizioni)
- crea i fs (hard-coded)
- scompatta lo stage4 che può essere:
a) presente sul cdrom (tar.gz)
b) creato on the fly, specificando l'indirizzo del server da clonare
- installa uno snapshot di portage aggiorando i metadata
- modifica fstab in relazione al block device usato per l'installazione (es /dev/hda, /dev/sda, /dev/cciss/c0d0, etc)
- installa grub in relazione al " "
- invoca uno script per modificare i parametri di rete (ip/mask, hostname, gateway, etc)
- sputa il cd e riavvia il server.

ovviamente, affinchè lo stage4 sia compatibile, dev'essere compilato per i686;
stesso discorso per il kernel che anche includere il maggior numero di drivers (compilati come moduli).

vantaggi
- il processo è completamente automatico
- l'hardware può essere anche molto diverso

svantaggi
- tabella delle partizioni e fs sono hard-coded

nota
logica vorrebbe che includessi anche le istruzioni per creare il livecd modificato (comprendente script, stage4 e binario statico di rsync).
ma ora non ho il tempo....

Code:
#!/bin/bash

# dimensione delle partizioni in mb
BOOT_PT=25
ROOT_PT=1000
USR_PT=6000
VAR_PT=1200
LOG_PT=300
TMP_PT=3000
SWAP_PT=500

RED='\e[1;31m'
GREEN='\e[1;32m'
NC='\e[0m'

source /sbin/functions.sh

function do_cmd()
{
    ebegin $1   
    $2 >/dev/null 2>&1
    if [ $? -eq 0 ]
    then
      eend 0
      return $?
    else
      err=$?
      eend 1
      echo "Errore: $err"
      echo $2
      exit
    fi
}


function mkpartitions()
{
do_cmd "Cancello le partizioni" "parted -s -- ${hd} mklabel msdos"
DISKSIZE=`parted -s ${hd} print | grep 'Disk geometry for' | sed 's/^.*-//g' | sed 's/\..*$//'`
do_cmd "Dimensioni hd: $DISKSIZE" "[ $DISKSIZE -gt 20000 ]"
# boot (primary)
do_cmd "Creo /boot" "parted -s -- ${hd} mkpart primary ext3 0 $BOOT_PT"
do_cmd "Attivo /boot" "parted -s -- ${hd} set 1 boot on"
# extended
do_cmd "Creo la partizione estesa" "parted -s -- ${hd} mkpart extended 25 $DISKSIZE"
# /
let START=$BOOT_PT; let END=$START+$ROOT_PT;
do_cmd "Creo /" "parted -s -- ${hd} mkpart logical ext3 $START $END"
# /usr
let START=$END; let END=$START+$USR_PT;
do_cmd "Creo /usr" "parted -s -- ${hd} mkpart logical ext3 $START $END"
# /var
let START=$END; let END=$START+$VAR_PT;
do_cmd "Creo /var" "parted -s -- ${hd} mkpart logical ext3 $START $END"
# /var/log
let START=$END; let END=$START+$LOG_PT;
do_cmd "Creo /var/log" "parted -s -- ${hd} mkpart logical ext3 $START $END"
# /tmp
let START=$END; let END=$START+$TMP_PT;
do_cmd "Creo /tmp" "parted -s -- ${hd} mkpart logical ext3 $START $END"
# swap
let START=$END; let END=$START+$SWAP_PT;
do_cmd "Creo swap" "parted -s -- ${hd} mkpart logical ext3 $START $END"
# /data
let START=$END; let END=$DISKSIZE;
do_cmd "Creo /data" "parted -s -- ${hd} mkpart logical ext3 $START $END"
}

function mkfs()
{
do_cmd "Creo ext3 su /boot" "mke2fs -j ${hd}${part}1"
do_cmd "Creo ext3 su /" "mke2fs -j ${hd}${part}5"
do_cmd "Creo ext3 su /usr" "mke2fs -j ${hd}${part}6"
do_cmd "Creo ext3 su /var" "mke2fs -j ${hd}${part}7"
do_cmd "Creo ext3 su /var/log" "mke2fs -j ${hd}${part}8"
do_cmd "Creo reiserfs su /tmp" "mkreiserfs -f ${hd}${part}9"
do_cmd "Creo swap" "mkswap ${hd}${part}10"
do_cmd "Attivo swap" "swapon ${hd}${part}10"
do_cmd "Creo ext3 su /data" "mke2fs -j ${hd}${part}11"
}


function _umount()
{
swapoff ${hd}${part}10 2>/dev/null
mount | grep "/mnt/gentoo" | cut -d' ' -f3 | xargs umount 2> /dev/null
mount | grep "/mnt/gentoo" | cut -d' ' -f3 | xargs umount 2> /dev/null
mount | grep "/mnt/gentoo" | cut -d' ' -f3 | xargs umount 2> /dev/null
}



function _mountfs()
{
   mount -t ext3 ${hd}${part}5 /mnt/gentoo && \
   mkdir -p /mnt/gentoo/proc && \
   mkdir -p /mnt/gentoo/sys && \
   mkdir -p /mnt/gentoo/boot && \
   mount -t ext3 ${hd}${part}1 /mnt/gentoo/boot && \
   mkdir -p /mnt/gentoo/usr && \
   mount -t ext3 ${hd}${part}6 /mnt/gentoo/usr && \
   mkdir -p /mnt/gentoo/var && \
   mount -t ext3 ${hd}${part}7 /mnt/gentoo/var && \
   mkdir -p /mnt/gentoo/var/log && \
   mount -t ext3 ${hd}${part}8 /mnt/gentoo/var/log && \
   touch /mnt/gentoo/var/log/lastlog && \
   mkdir -p /mnt/gentoo/tmp && \
   mount ${hd}${part}9 /mnt/gentoo/tmp && \
   chmod 1777 /mnt/gentoo/tmp && \
   mkdir -p /mnt/gentoo/data && \
   mount -t ext3 ${hd}${part}11 /mnt/gentoo/data  && \
   mkdir -p /mnt/gentoo/data/portage
}


function _mountpseudo()
{
   mount -t proc none /mnt/gentoo/proc && \
   mount --bind /dev /mnt/gentoo/dev && \
   mount --bind /dev/pts /mnt/gentoo/dev/pts
}

function _mount()
{
   _umount
   if [ "$1" = "pseudo" ]; then
      _mountfs && _mountpseudo
   else
      _mountfs
   fi
}

function mountdir()
{
   do_cmd "Monto le partizioni" "_mount $1"
}

function umountdir()
{
   do_cmd "Smonto le partizioni" "_umount"
}


function stage4()
{
if [ $getfrom ]; then
    ssh $getfrom "cat /etc/stage4.exclude" | ./rsync -a --progress --exclude-from=- $getfrom:/ /mnt/gentoo/
    #ssh $getfrom "/root/scripts/sendimage.sh" | tar -xzp -C /mnt/gentoo >/dev/null 2>&1
    do_cmd "Scompatto lo stage4 ($getfrom)" "[ $? == 0 ]"
else
    do_cmd "Scompatto lo stage4" "tar -xzpf /mnt/cdrom/stage4/stage4*.tar.gz -C /mnt/gentoo"
fi
}

function portage()
{
do_cmd "Scompatto lo snapshot di portage" "tar -xzpf /mnt/cdrom/stage4/portage*.tar.gz -C /mnt/gentoo/data/portage"
}

function fstab()
{
cat <<EOFSTAB > /mnt/gentoo/etc/fstab
# /etc/fstab: static file system information.
# $Header: /home/cvsroot/gentoo-src/rc-scripts/etc/fstab,v 1.14 2003/10/13 20:03:38 azarah Exp $
#
# noatime turns off atimes for increased performance (atimes normally aren't
# needed; notail increases performance of ReiserFS (at the expense of storage
# efficiency).  It's safe to drop the noatime options if you want and to
# switch between notail and tail freely.
# <fs>             <mountpoint>    <type>     <opts>            <dump/pass>
# NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.
${hd}${part}1      /boot      ext3      noatime,nosuid,noexec,nodev   1 1
${hd}${part}5      /      ext3      noatime            0 1
${hd}${part}6      /usr      ext3      noatime            0 2
${hd}${part}7      /var      ext3      noatime            0 2
${hd}${part}8      /var/log   ext3      noatime,nosuid,noexec,nodev   0 2
${hd}${part}9      /tmp      reiserfs   rw,nosuid,noexec,nodev      0 2
${hd}${part}10      none      swap      sw            0 2
${hd}${part}11      /data      ext3      noatime,nosuid,noexec,nodev   0 2
/dev/cdroms/cdrom0   /mnt/cdrom   iso9660      noauto,ro         0 0
#/dev/fd0      /mnt/floppy   auto      noauto            0 0
# NOTE: The next line is critical for boot!
none         /proc      proc      defaults         0 0
# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for
# POSIX shared memory (shm_open, shm_unlink).
# (tmpfs is a dynamically expandable/shrinkable ramdisk, and will
#  use almost no memory if not populated with files)
# Adding the following line to /etc/fstab should take care of this:
none         /dev/shm   tmpfs      defaults         0 0
EOFSTAB
do_cmd "Sistemo fstab" "[ $? == 0 ]"
}


function _grubinstall()
{
   _mount pseudo
   cat /proc/mounts  | sed -e 's|mnt/gentoo/*||' > /mnt/gentoo/etc/mtab && \
   sed -i -e "s|real_root=[^ ]* |real_root=${hd}${part}5 |i" /mnt/gentoo/boot/grub/grub.conf && \
   chroot /mnt/gentoo /sbin/grub-install --recheck --no-floppy --root-directory=/boot ${hd}
}

function _grubshell()
{
   _mount pseudo
   cat /proc/mounts  | sed -e 's|mnt/gentoo/*||' > /mnt/gentoo/etc/mtab && \
   sed -i -e "s|real_root=[^ ]* |real_root=${hd}${part}5 |i" /mnt/gentoo/boot/grub/grub.conf  && \
   echo "(hd0)     ${hd}" > /mnt/gentoo/boot/grub/device.map
   echo -e "root (hd0,0)\nsetup (hd0)\nquit" | chroot /mnt/gentoo /sbin/grub --batch --device-map=/boot/grub/device.map --no-floppy | grep -i error
   # se grep restituisce 0, vuol dire che la stringa "error" è presente, quindi
   # l'installazione non è andata a buon fine
   [ $? = 0 ] && return 1
   return 0
}

function _grub()
{
   _grubinstall || _grubshell
}


function grub()
{
   do_cmd "Installo il bootloader" "_grub"
}

function portagecache()
{
   do_cmd "Rigenero la cache di portage" "chroot /mnt/gentoo /usr/bin/emerge -uDp world"
}

function _setup()
{
   chroot /mnt/gentoo /root/scripts/setup.sh $1
}

function setup()
{
   do_cmd "Lancio il setup" "_setup"
}


function get_opts()
{
   [ $# -eq 0 ] && help

   while getopts "f:sh" OPT 2>/dev/null; do
      case $OPT in
      f)      getfrom=$OPTARG ;;
      s)      skippart=1;;
      h|?)   help
      esac
   done
   
   shift $(($OPTIND - 1))
   [ $1 ] || help
   [ -b $1 ] || help
   case $1 in
      /dev/c?d?)    part="p" ;;
      *)          part="";
    esac
   hd="$1"
}

function help()
{
   NO=$'\x1b[0;0m'
   BR=$'\x1b[0;01m'
   RD=$'\x1b[31;01m' Rd=$'\x1b[00;31m'
   GR=$'\x1b[32;01m' Gr=$'\x1b[00;32m'
   YL=$'\x1b[33;01m' Yl=$'\x1b[00;33m'
   BL=$'\x1b[34;01m' Bl=$'\x1b[00;34m'
   FC=$'\x1b[35;01m' Fc=$'\x1b[00;35m'
   CY=$'\x1b[36;01m' Cy=$'\x1b[00;36m'
   cat <<EOF
Gentoo autoinstall script ver 0.2

Usage:   $0 [options] blockdevice

   Options
   
   $GR-h$NO       : show this help
   $GR-f$NO ${RD}host${NO}      : get image from ${RD}host${NO}

EOF
   exit 1
}

get_opts  $@

_umount

# in alcuni casi il partizionameto non è visibile nei successivi passi dello script
# in attesa di risolvere il problema, splitto l'esecuzione in due step distinti:
#
# 1 step - partiziono e rilancio il comando con l'opzione -s
# 2 step - skippo il partizionamento e proseguo con l'installazione

[ $skippart ] || {
   mkpartitions
   $0 -s $@
   exit
}
mkfs
mountdir
stage4
portage
fstab
grub
portagecache
setup 60
umountdir

cat <<EOL >> /etc/init.d/halt.sh
/mnt/cdrom/stage4/eject > /dev/null 2>&1
ewarn "Installazione completata, rimuovi il cd e premi invio per riavviare"
read
EOL

do_cmd "Installazione terminata" "[ 1 ]"
reboot > /dev/null 2>&1

_________________
When all else fails, read the instructions.


Last edited by makoomba on Thu May 25, 2006 3:16 pm; edited 1 time in total
Back to top
View user's profile Send private message
teknux
Guru
Guru


Joined: 19 Feb 2003
Posts: 517
Location: Rome, IT

PostPosted: Wed May 24, 2006 4:10 pm    Post subject: Reply with quote

mmm molto interessante, non ho letto il codice ma dalla tua descrizione mi piacciono un paio di punti in particolare:

Quote:
scompatta lo stage4 che può essere:
a) presente sul cdrom (tar.gz)
b) creato on the fly, specificando l'indirizzo del server da clonare
[snip]
invoca uno script per modificare i parametri di rete (ip/mask, hostname, gateway, etc)


per il resto ci sono cose simili, ad esempio nel mio script copio la tabella delle partizioni ed il tipo di filesystem in modo da ricreare perfettamente la stessa situazione (scomodo se hai dischi di geometria differente, ma a quel punto scompatti a mano lo stage4). purtroppo, ora che mi ci fai pensare, ho scoperto un piccolo bug: lo script salva anche i dati di fstab (formattando il testo in modo leggermente diverso) per poi riutilizzarli su un'altra macchina. il problema è che questo meccanismo funziona bene se la macchina è identica (o la stessa, naturalmente). comunque è un problema aggirabile con un paio di modifiche.

voglio vedere come fai il cloning remoto e sistemi i parametri di rete, quello si che è comodo ;)

per quanto riguarda la creazione di un livecd, da parte mia ho pensato che la questione diventava un po' troppo invadente/complicata soprattutto in virtù del fatto che tutto sommato ci sono già i livecd-minimal per fare il boot e che soprattutto per stage4 frequenti (backup o aggiornamento dello snapshot per future installazioni) non vale la pena di creare un disco bootabile. a quel punto uso soluzioni preesistenti (mondorescue et similia).

ora mi studio il tuo script :) saluti,
tek
Back to top
View user's profile Send private message
makoomba
Bodhisattva
Bodhisattva


Joined: 03 Jun 2004
Posts: 1856

PostPosted: Wed May 24, 2006 5:33 pm    Post subject: Reply with quote

teknux wrote:
voglio vedere come fai il cloning remoto e sistemi i parametri di rete, quello si che è comodo ;)

Code:
ssh $getfrom "cat /etc/stage4.exclude" | ./rsync -a --progress --exclude-from=- $getfrom:/ /mnt/gentoo/

$getfrom è l'ip del server che vuoi clonare, /etc/stage4.exclude è una exclude list presente su $getfrom.
teknux wrote:
per quanto riguarda la creazione di un livecd, da parte mia ho pensato che la questione diventava un po' troppo invadente/complicata soprattutto in virtù del fatto che tutto sommato ci sono già i livecd-minimal per fare il boot e che soprattutto per stage4 frequenti (backup o aggiornamento dello snapshot per future installazioni) non vale la pena di creare un disco bootabile. a quel punto uso soluzioni preesistenti (mondorescue et similia).

mi sono espresso male.
il livecd modificato altro non è che il minimal di gentoo con l'aggiunta di una dir /stage4 contenente:
- lo script
- lo stage4
- snapshot di portage
- binario di rsync.
basta montare la iso, copiarne il contenuto, aggiungere la dir e rimasterizzare.

per me è una soluzione obbligata considerato che spesso faccio installazioni in trasferta.

lo script per il setup della rete è questo
Code:
#!/bin/bash

if [ `whoami` != "root" ]; then
   echo "$0 può essere invocato solo da root"
   exit 1
fi

inputbox() {
   eval "value=\$$2"
   dialog --title "Setup del sistema" --cancel-label "Annulla" --inputbox "$1" 8 50 "$value" --stdout > $select 2> /dev/null || return
   eval "$2='$(<$select)'"
   return 0
}


get_info() {
   source /etc/conf.d/hostname
   conf_hostname=$HOSTNAME
   source /etc/conf.d/domainname
   conf_domain=$DNSDOMAIN
   net_cfg=`ifconfig eth0 | grep 'inet addr' | sed -e 's|:|\n|g' | perl -ne '/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/g && print "$1 "'`
   conf_addr=`echo $net_cfg | cut -d' ' -f1`
   conf_broadcast=`echo $net_cfg | cut -d' ' -f2`
   conf_netmask=`echo $net_cfg | cut -d' ' -f3`
   conf_gateway=`ip route show | grep default | perl -ne '/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/g && print $1'`
}

config_hostname() {
   inputbox "Nome host" conf_hostname || return
   inputbox "Dominio" conf_domain || return   
}

config_network() {
   inputbox "Indirizzo ip" conf_addr || return
   inputbox "Netmask" conf_netmask || return
   inputbox "Gateway" conf_gateway || return
   conf_broadcast=`ipcalc -nb $conf_addr/$conf_netmask | perl -ne '/Broadcast\s*:\s*(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/i && print \$1'`
}

save_config() {
   # rete
   perl -pi -e "s/^\s*config_eth0=.+//mgis" /etc/conf.d/net
   echo "config_eth0=( \"$conf_addr netmask $conf_netmask broadcast $conf_broadcast\" )" >> /etc/conf.d/net
   perl -pi -e "s/default via [^\"]+/default via $conf_gateway/gi" /etc/conf.d/net

   # hosts
   perl -pi -e "s/^\s*$conf_addr.+//mgs" /etc/hosts
   echo "$conf_addr   $conf_hostname.$conf_domain      $conf_hostname" >> /etc/hosts
        perl -pi -e "s/\s*HOSTNAME=.+/HOSTNAME=\"$conf_hostname\"/" /etc/conf.d/hostname
        perl -pi -e "s/\s*DNSDOMAIN=.+/DNSDOMAIN=\"$conf_domain\"/" /etc/conf.d/domainname


}

apply_config() {
   save_config
   # rendo attive le modifiche
   /etc/init.d/hostname zap && /etc/init.d/hostname start ; /etc/init.d/domainname restart ;  /etc/init.d/net.eth0 restart
   env-update
   
}

myexit() {
   rm -f $select 2> /dev/null
   clear
   exit $1
}



timeout=${1-0}


reset

if [ $timeout -gt 0 ]; then
   dialog  --exit-label "Configurazione" --pause "Avvio il tool di configurazione ?"  8 40 $timeout && myexit 0
fi

select=`tempfile 2>/dev/null` || tempfile=/tmp/setup
get_info


while [ 1 ]; do
dialog    --title "Setup del sistema" --cancel-label "Esci" --menu "Scegli una opzione" 12 50 5 \
   1 "Hostname" \
   2 "Network" \
   3 "Salva modifiche" \
   4 "Salva e applica modifiche" \
   0 "Esci" \
   --stdout > $select 2>/dev/null  || myexit

case $(<$select) in
   1)
      config_hostname
      ;;
   2)
      config_network
      ;;
   3)
      save_config
      myexit 0
      ;;
   4)
      apply_config
      myexit 0
      ;;
   *)
      myexit 0
      ;;
esac
done

devono essere installati dialog e ipcalc
_________________
When all else fails, read the instructions.
Back to top
View user's profile Send private message
fbcyborg
Advocate
Advocate


Joined: 16 Oct 2005
Posts: 3056
Location: ROMA

PostPosted: Fri Jul 14, 2006 4:51 pm    Post subject: Reply with quote

Domanda: :D
per quanto riguarda lo script di teknux:
lo sto usando per fare un bel backup del mio sistema, poi provvederò manualmente a backupparmi anche la /home, visto che è esclusa...
ma quando vado per ripristinare il tutto, devo seguire la guida per l'installazione di gentoo fino a quando dice di estrarre lo stage(1 2 o 3) e al posto di uno di quelli estrarre (ovviamente) lo stage 4 creato???
Successivamente si segue la guida però senza dover ricompilare nulla?
devo tenere presente che il mio disco è così suddiviso:
Code:
Dispositivo Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1        1953    15687441    7  HPFS/NTFS
/dev/hda2            1954        9964    64348357+   f  W95 Ext'd (LBA)
/dev/hda5            1954        7700    46162746    7  HPFS/NTFS
/dev/hda6            7701        7706       48163+  83  Linux
/dev/hda7            7707        8219     4120641   82  Linux swap / Solaris
/dev/hda8            8220        9964    14016681   83  Linux

quindi non vorrei che poi ci sia qualche problema.. (domando) :D
_________________
[HOWTO] Come criptare la /home usando cryptsetup e luks
[HOWTO] Abilitare il supporto al dom0 XEN su kernel 3.X
Help answer the unanswered
Back to top
View user's profile Send private message
^Stefano^
Guru
Guru


Joined: 20 Nov 2005
Posts: 394
Location: Ferrara

PostPosted: Sat Jul 15, 2006 1:45 pm    Post subject: Reply with quote

Qua ti spiega come ripristinare uno stage4. non usa lo script di teknux, ma il ripristino dovrebbe essere uguale
http://wiki.gentoo-italia.net/index.php/Creare_uno_stage4
_________________
8-09 V-Day con una raccolta firme. Vi aspettiamo
Raccolta Firme
Progetto tRicicloPC con Linux
Back to top
View user's profile Send private message
fbcyborg
Advocate
Advocate


Joined: 16 Oct 2005
Posts: 3056
Location: ROMA

PostPosted: Fri Jul 21, 2006 9:47 am    Post subject: Reply with quote

OK, io ho fatto questa prova su una macchina gemella di un'altra su cui era installata gentoo.
Avevo a disposizione lo stage4 fatto con il DUMP e una volta in /mnt/gentoo ho fatto il restore..
ripristinata la partizione di boot però poi ho ottenuto un kernel panic all'avvio.. strano.
_________________
[HOWTO] Come criptare la /home usando cryptsetup e luks
[HOWTO] Abilitare il supporto al dom0 XEN su kernel 3.X
Help answer the unanswered
Back to top
View user's profile Send private message
randomaze
Bodhisattva
Bodhisattva


Joined: 21 Oct 2003
Posts: 9985

PostPosted: Fri Jul 21, 2006 11:43 am    Post subject: Reply with quote

fbcyborg wrote:
ho ottenuto un kernel panic all'avvio.. strano.


Cosa faceva un'attimo prima di fare la schermata di PANIC?
_________________
Ciao da me!
Back to top
View user's profile Send private message
fbcyborg
Advocate
Advocate


Joined: 16 Oct 2005
Posts: 3056
Location: ROMA

PostPosted: Fri Jul 21, 2006 11:46 am    Post subject: Reply with quote

Se vuoi sapere i messaggi esatti devo farti aspettare mercoledì prossimo, poichè il sistema in questione si trova in un laboratorio in cui non torno fino alla prossima settimana.

Per il resto mi sembrava fosse un processo di boot normale, a parte che non trovava il device indicato nel grub.conf.
_________________
[HOWTO] Come criptare la /home usando cryptsetup e luks
[HOWTO] Abilitare il supporto al dom0 XEN su kernel 3.X
Help answer the unanswered
Back to top
View user's profile Send private message
randomaze
Bodhisattva
Bodhisattva


Joined: 21 Oct 2003
Posts: 9985

PostPosted: Fri Jul 21, 2006 11:52 am    Post subject: Reply with quote

fbcyborg wrote:
Per il resto mi sembrava fosse un processo di boot normale, a parte che non trovava il device indicato nel grub.conf.


Beh, inizierei con l'aggiustare quello allora :roll:
_________________
Ciao da me!
Back to top
View user's profile Send private message
fbcyborg
Advocate
Advocate


Joined: 16 Oct 2005
Posts: 3056
Location: ROMA

PostPosted: Wed Jul 26, 2006 7:04 pm    Post subject: Reply with quote

teknux sei un mito, hai fatto uno script favoloso.
Dunque, poi ho dovuto ricompilarlo il kernel.. successivamente non ho più avuto problemi, tutto perfetto.
_________________
[HOWTO] Come criptare la /home usando cryptsetup e luks
[HOWTO] Abilitare il supporto al dom0 XEN su kernel 3.X
Help answer the unanswered
Back to top
View user's profile Send private message
fbcyborg
Advocate
Advocate


Joined: 16 Oct 2005
Posts: 3056
Location: ROMA

PostPosted: Mon Jul 09, 2007 9:07 pm    Post subject: Reply with quote

Scusate, c'è qualcosa di analogo per RedHat?
Un mio amico mi ha chiesto qualcosa del genere per fare backup "veloci" su RedHat.
Magari ci sono anche dei tools grafici per noob.. che mi dite?
_________________
[HOWTO] Come criptare la /home usando cryptsetup e luks
[HOWTO] Abilitare il supporto al dom0 XEN su kernel 3.X
Help answer the unanswered
Back to top
View user's profile Send private message
lavish
Bodhisattva
Bodhisattva


Joined: 13 Sep 2004
Posts: 4296

PostPosted: Mon Jul 09, 2007 9:43 pm    Post subject: Reply with quote

fbcyborg wrote:
Scusate, c'è qualcosa di analogo per RedHat?
Un mio amico mi ha chiesto qualcosa del genere per fare backup "veloci" su RedHat.
Magari ci sono anche dei tools grafici per noob.. che mi dite?

Ma che dici, forse questo e' un forum gentoo e non RH e non ha molto senso andare OT su questo thread (per rispetto degli autori prima di tutto) ?
Please non proseguiamo ;)
_________________
minimalblue.com | secgroup.github.io/
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum