View previous topic :: View next topic |
Author |
Message |
teknux Guru
Joined: 19 Feb 2003 Posts: 517 Location: Rome, IT
|
Posted: Tue May 23, 2006 12:27 pm Post subject: [TOOL] GentooCloner 0.5.1 beta |
|
|
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 |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Tue May 23, 2006 3:10 pm Post subject: |
|
|
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 ?
Coda |
|
Back to top |
|
|
Kernel78 Moderator
Joined: 24 Jun 2005 Posts: 3654
|
Posted: Tue May 23, 2006 3:18 pm Post subject: |
|
|
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 ?
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 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 _________________ 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 |
|
|
teknux Guru
Joined: 19 Feb 2003 Posts: 517 Location: Rome, IT
|
Posted: Tue May 23, 2006 3:58 pm Post subject: |
|
|
@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
saluti,
tek |
|
Back to top |
|
|
Kernel78 Moderator
Joined: 24 Jun 2005 Posts: 3654
|
Posted: Wed May 24, 2006 6:19 am Post subject: |
|
|
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
|
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 ), 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 |
|
|
teknux Guru
Joined: 19 Feb 2003 Posts: 517 Location: Rome, IT
|
Posted: Wed May 24, 2006 10:33 am Post subject: |
|
|
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 ), 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 |
|
|
makoomba Bodhisattva
Joined: 03 Jun 2004 Posts: 1856
|
Posted: Wed May 24, 2006 10:48 am Post subject: |
|
|
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 |
|
|
Kernel78 Moderator
Joined: 24 Jun 2005 Posts: 3654
|
Posted: Wed May 24, 2006 11:00 am Post subject: |
|
|
@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è _________________ 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 |
|
|
teknux Guru
Joined: 19 Feb 2003 Posts: 517 Location: Rome, IT
|
Posted: Wed May 24, 2006 2:27 pm Post subject: |
|
|
@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 |
|
|
makoomba Bodhisattva
Joined: 03 Jun 2004 Posts: 1856
|
Posted: Wed May 24, 2006 3:53 pm Post subject: |
|
|
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 |
|
|
teknux Guru
Joined: 19 Feb 2003 Posts: 517 Location: Rome, IT
|
Posted: Wed May 24, 2006 4:10 pm Post subject: |
|
|
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 |
|
|
makoomba Bodhisattva
Joined: 03 Jun 2004 Posts: 1856
|
Posted: Wed May 24, 2006 5:33 pm Post subject: |
|
|
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 |
|
|
fbcyborg Advocate
Joined: 16 Oct 2005 Posts: 3056 Location: ROMA
|
Posted: Fri Jul 14, 2006 4:51 pm Post subject: |
|
|
Domanda:
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) _________________ [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 |
|
|
^Stefano^ Guru
Joined: 20 Nov 2005 Posts: 394 Location: Ferrara
|
|
Back to top |
|
|
fbcyborg Advocate
Joined: 16 Oct 2005 Posts: 3056 Location: ROMA
|
|
Back to top |
|
|
randomaze Bodhisattva
Joined: 21 Oct 2003 Posts: 9985
|
Posted: Fri Jul 21, 2006 11:43 am Post subject: |
|
|
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 |
|
|
fbcyborg Advocate
Joined: 16 Oct 2005 Posts: 3056 Location: ROMA
|
|
Back to top |
|
|
randomaze Bodhisattva
Joined: 21 Oct 2003 Posts: 9985
|
Posted: Fri Jul 21, 2006 11:52 am Post subject: |
|
|
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 _________________ Ciao da me! |
|
Back to top |
|
|
fbcyborg Advocate
Joined: 16 Oct 2005 Posts: 3056 Location: ROMA
|
|
Back to top |
|
|
fbcyborg Advocate
Joined: 16 Oct 2005 Posts: 3056 Location: ROMA
|
|
Back to top |
|
|
lavish Bodhisattva
Joined: 13 Sep 2004 Posts: 4296
|
Posted: Mon Jul 09, 2007 9:43 pm Post subject: |
|
|
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 |
|
|
|
|
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
|
|