Klonen mit Knoppix

pingu3

Script Download

#! /bin/sh
#----------------------------------------------------------------------
# kn-klon.sh
# Description: Partitionsimage erstellen und uebertragen
# Author: Werner P. Schulz <Diese E-Mail-Adresse ist vor Spambots gesch├╝tzt! Zur Anzeige muss JavaScript eingeschaltet sein!>
# Created at: Thu Oct 14 19:38:15 CEST 2010
# License: This file is licensed under the GPL v2.
#----------------------------------------------------------------------
# Dies Script wurde erstellt, um eine Ubuntu-Installation zu
# sichern und dann als Klon auf eine Vielzahl von Computern
# in einem Schulungsraum aufzuspielen.
# Last change: Tue, 12 Jun 2012 17:34:50 +0200 [wps]
driveselect() {
# alle zur Verfuegung stehenden Laufwerke inclusive Typ und Groesse zeigen
if ! [ -n "${DRIVELIST[*]}" ]; then
  for i in $(ls -d /sys/block/sd? | sed 's,/sys/block/,,'); do
    drive="${i##}"
    DRIVELIST[$((count++))]="$drive"
    DRIVELIST[$((count++))]="$(cat /sys/block/$i/device/vendor) \
      $(awk '{print ($1 / 2048) " MB"}' /sys/block/$i/size 2>/dev/null) \
      $(cat /sys/block/$i/device/model)"
  done
fi
SEL=`dialog --title "Festplatte auswaehlen" --aspect 12 --colors --menu \
    "$1" 0 0 0 "${DRIVELIST[@]}" 3>&1 1>&2 2>&3`
if [ $? = 1 ]; then
  exit 1
fi
}
partselect() {
# alle zur Verfuegung stehenden Partitionen inclusive Typ und Groesse zeigen
if ! [ -n "${PARTLIST[*]}" ]; then
  for i in $(cat /proc/partitions | sed -n '/sd.[0-9]/p' | awk '{print $4}'); do
    part="${i##}"
    PARTLIST[$((count++))]="$part"
    PARTLIST[$((count++))]="$(cat /sys/block/$(expr substr $i 1 3)/device/vendor) \
      $(awk '{print ($1 / 2048) " MB"}' \
      /sys/block/$(expr substr $i 1 3)/$i/size 2>/dev/null) \
      $(blkid -o list /dev/$i | sed -n '3p' | awk '{print $2}')"
  done
fi
SEL=`dialog --title "Partiton auswaehlen" --aspect 12 --colors --menu \
    "$1" 0 0 0 "${PARTLIST[@]}" 3>&1 1>&2 2>&3`
if [ $? = 1 ]; then
  exit 1
fi
}
finput() {
# Eingabebox fuer Namen des Klon
NAME=""
NAME=`dialog --title "$TL" --aspect 12 --colors --inputbox \
"\n$1" 0 0 3>&1 1>&2 2>&3`
}
fknicreate() {
# Image von Ubuntu-Installation erstellen
START=$(date +'%s')
TL=$1
TM="\n\Z2Von welcher Partition soll Image erstellt werden?\Zn"
PARTLIST=()
count=0
partselect "$TM"
PART=$SEL
DRIVE=$(expr substr $PART 1 3)
TM="\n\Z5Und auf welche Partition der USB-Platte \
\nsoll gesichert werden?\Zn"
partselect "$TM"
while [ $SEL == $PART ]; do
  TM="Fuer die Sicherung muss eine \Zb\Z1andere Partition\Zn \
\nals \Zb\Z1/dev/$PART\Zn gewaehlt werden!"
  partselect "$TM"
done  
STOR=$SEL
mount | grep -q "dev/$STOR" || mount /media/$STOR
# Wert bei Bedarf (mehr als 5 MB) anpassen fuer grosse Partitionsimages
MIN_FREE=5000000
HD_FREE=$(df /media/$STOR | tail -n1 | awk '{print $4}')
if [ $MIN_FREE -ge $HD_FREE ]; then
  dialog --aspect 12 --colors --title "$TLF" --msgbox \
	"\nNicht genug freier Platz auf der Festplatte \
\nfuer ein neues PartImage von Ubuntu!" 0 0
  exit 1
fi
TM="Welchen Namen soll die Datensicherung haben (z.B.: xyz_comp_0212)?"
finput "$TM"
while [ -z "$NAME" ]; do
  TM="\Zb\Z1Es muss ein Name vergeben werden!\Zn"
  finput "$TM"
done
while ! [[ $NAME =~ ^[a-zA-Z_0-9]*$ ]]; do
  TM="Bitte ausser Alphabet, Ziffern und \
\nUnterstrich (_) \Zbkeine Sonderzeichen\Zn verwenden."
  finput "$TM"
done  
# Verzeichnis auf USB-Platte vorbereiten
mkdir /media/$STOR/$NAME
dialog --title "$TL" --aspect 12 --colors --yesno \
"\nVon \Zb/dev/$PART\Zn wird folgendes Image \
\n\Zb/media/$STOR/$NAME/partimg.gz\Zn erstellt.\n \
\n\n\n\ZBSollen wir weitermachen?\Zn" 0 0
[ $? = 1 ] &&  exit 1
# Bildschirmschoner zeitweilig deaktivieren
xscreensaver-command -exit
START=$(date +'%s')
# MBR und Partitionstabelle fuer den Notfall sichern
dd if=/dev/$DRIVE of=/media/$STOR/$NAME/backup_mbr count=1 bs=512
sfdisk -d /dev/$DRIVE > /media/$STOR/$NAME/backup_sf
# Partitionsgroesse speichern
echo "$(awk '{print ($1 / 2048) " MB"}' \
  /sys/block/$DRIVE/$PART/size 2>/dev/null)" \
  > /media/$STOR/$NAME/partition_size
# Partitions-Image erstellen
partimage -z1 -o -d -M save /dev/$PART /media/$STOR/$NAME/partimg.gz
su knoppix -c "xscreensaver -nosplash &"
TM="Die jetzt im Verzeichnis \Zb/media/$STOR/$NAME\Zn \
\nerstellten Dateien muessen nun in unserer Knoppix-HD- \
\n-Installation in das Verzeichnis \Zb/opt/knx/knoppix\Zn \
\nkopiert werden. Anschliessend eine DVD remastern."
TT="\nEnde! Zeitdauer: $(expr $(expr $(date +'%s') - $START) / 60) min. \
and $(expr $(expr $(date +'%s') - $START) % 60) sek.\n"
dialog --title "$TL" --aspect 12 --colors --msgbox \
"\n$TT\n$TM" 0 0
exit 0
}
fknicopy() {
# Ubuntu-Image auf Festplatte uebertragen
# Pfad zum Ubuntu-Image
STOR=/mnt-system
TL=$1
START=$(date +'%s')
TM="\nAuf welche Festplatte soll das Image \
\nvon Ubuntu kopiert werden?"
DRIVELIST=()
count=0
driveselect "$TM"
DRIVE=$SEL
# Partitionsgroesse angezeigen, von welcher das Image erstellt wurde
TM="\nMit \Zb\Z1GParted\Zn eine Partition von mindestens \
  \Zb$(cat $STOR/partition_size)\Zn \
  \nfuer das Image einrichten und mit ext3 formatieren. \
  \n\nZusaetzlich eine swap-Partition von ungefaehr 500 MB."
dialog --title "$TL" --aspect 12 --colors --msgbox "$TM" 0 0
[ $? = 1 ] &&  exit 1
gparted /dev/$DRIVE
PART="$(sfdisk -l /dev/$DRIVE | fgrep -i linux | fgrep -iv swap | \
 sed 's#/dev/##' | awk '{print $1}')"
GROss="$(sfdisk -s /dev/$PART | awk '{print ($1 / 1024) " MB"}')"
# Partition darf nicht gemountet sein
mount | grep -q "dev/$PART"  && umount /dev/$PART
TM="\nDas auf dieser Knoppix-DVD gesicherte PartitionsImage \
\nwird jetzt nach \Zb/dev/$PART\Zn geschrieben.\n\nWeitermachen?"
dialog --title "$TL" --aspect 12 --colors --yesno "$TM" 0 0
[ $? = 1 ] &&  exit 1
# Bildschirmschoner zeitweilig deaktivieren
xscreensaver-command -exit
cd $STOR/
# Header entfernen ausser in partimg.gz.000
toskip=0
{
for partfile in partimg.gz.*; do
  zcat $partfile | dd bs=512 skip=$toskip 2> /dev/null
  toskip=1
  done;
} | partimage -b -M -o -d -e restore /dev/$PART stdin
# Partitionsgroesse anpassen
clear
e2fsck -f /dev/$PART
resize2fs -p /dev/$PART
mount /media/$PART
rm /media/$PART/etc/udev/rules.d/70-*
dialog --title "$TL" --aspect 12 --infobox \
"Jetzt wird noch Grub in den MBR installiert." 0 0
mount --bind /dev /media/$PART/dev
mount -t proc proc /media/$PART/proc
mount -t sysfs sysfs /media/$PART/sys
chroot /media/$PART grub-install /dev/$DRIVE
chroot /media/$PART update-grub /dev/$DRIVE
umount /media/$PART/dev
umount /media/$PART/proc
umount /media/$PART/sys
TT="\nEnde! Zeitdauer:\n$(expr $(expr $(date +'%s') - $START) / 60) min. \
and $(expr $(expr $(date +'%s') - $START) % 60) sek.\n"
TM="Der Computer wird jetzt neu gestartet. Bitte die DVD \
\nentnehmen, wenn die Aufforderung dazu erscheint."
dialog --title "$TL" --msgbox \
"\n$TT\n\n$TM" 0 0
reboot
}
# ------------------------- main -------------------------
TL="Mit Knoppix 'klonen'"
W1="Ubuntu-Image auf Festplatte uebertragen"
W2="Image von Ubuntu-Installation erstellen"
WAHL=`dialog --title "$TL" --aspect 12 --colors --menu \
"\nWas soll gemacht werden?" 0 0 0 \
  "$W1" "" "$W2" "" 3>&1 1>&2 2>&3`
case "$WAHL" in
  $W1) fknicopy "$W1";;
  $W2) fknicreate "$W2";;
  *) break
esac

 Top