Tips en Trucs 2012

Harde schijf voorbereiden met SystemRescueCD

Nu openSUSE 12.2 is verschenen, ga ik tegelijkertijd met het installeren van openSUSE 12.2 mijn notebook helemaal vernieuwen. Als eerste stap heb ik de harde schijf vervangen door een SSD-schijf (sneller, zuiniger en dus koeler). Mijn oude schijf hou ik als backup achter de hand (in een USB-kastje gemonteerd). Zowel de BIOS van de computer als de firmware van de SSD kregen een update naar de laatste versie. Kwestie van alles optimaal te laten presteren.

Aangezien ik voor het werk nog steeds Windows nodig heb, moet de laptop ook de preview van Windows 8 kunnen starten. Daarnaast moet openSUSE 12.2 als hoofdsysteem draaien. En daar ik mijn laptop vooral gebruik als testcomputer om bijvoorbeeld deze tips te schrijven, moet er een herstelpartitie op basis van de SystemRescueCD zorgen voor het starten van zowel Windows 8, openSUSE 12.2, de SystemRescueCd en het aanmaken en terugzetten van backups.

Na het downloaden van de SystemRescueCD maak ik een opstartbare USB-stick (zie richtlijnen SystemRescueCD site)(wie liever met CD's werkt, kan het ISO-bestand op een CD branden). Met de aangemaakte USB-stick of CD wordt de computer vanaf de USB-stick of CD opgestart (kan enkel als je weet welke toets je bij het opstarten van de computer moet drukken om het startmedium zelf te kiezen). Na het doorstarten van de SystemRescueCD, vergeet daarbij niet een Belgisch toetsenbord (keymap be) te selecteren, kom je in een root terminal. Met de opdracht wizard en het bevestigen van de standaard Xorg configuratie start de grafische omgeving op. Om de schijf volledig leeg te maken, start je onderaan in de balk het programma GParted. Via het menu Device > Create Partition Table... heb ik een nieuwe partitietabel van het type gpt op /dev/sda geplaatst (let op: hiermee verwijder je in een fractie van een seconden alle gegevens op de schijf /dev/sda). Ik koos daarbij voor het nieuwe gpt formaat omdat zowel Windows 8 als Linux daar vandaag de dag mee kunnen werken. Na het uitloggen (eerste knop onderaan in de balk) en het afsluiten van de computer (opdracht halt) is de harde schijf klaar voor het installeren van de besturingssystemen.

Windows 8

Aangezien Windows meestal voor de meeste problemen zorgt, heb ik eerst Windows 8 geïnstalleerd en de schijfindeling aan Windows 8 overgelaten. De installatie van Windows 8 maakt daarbij twee partities op de schijf aan (een kleine om op te starten en een grote met het systeem en al de rest). Zonder waarschuwing heeft de installatieprocedure van Windows 8 de partitietabel terug op het oude msdos gezet (zou Windows 8 dan alleen maar met UEFI in staat zijn om gpt partities te gebruiken?). M.a.w. de installatie van Windows 8 zorgt ervoor dat ik noodgedwongen verder moet met een oude msdos partitionering. Na de installatie van Windows 8, heb ik via Windows 8 de tweede partitie verkleind tot 41 GB.

Partitionering

Na de installatie van Windows 8 heb ik de computer herstart met de SystemRescueCD om met GParted de volgende partities aan te maken: Het Linux (openSUSE) besturingssysteem wordt dus gescheiden van de documenten waardoor later een upgrade naar bijvoorbeeld openSUSE 12.3 de documenten in de aparte partitie niet stoort. Ook het aanmaken en herstellen van back-ups wordt door de gescheiden opbouw een stuk eenvoudiger.

SystemRescueCD

Start SystemRescueCD vanaf de USB stick of CD op. Met de opdracht
mount /dev/sda3 /mnt/backup
koppel je de toekomstige SystemRescueCD partitie aan de map /mnt/backup. Met de opdracht
cd /mnt/backup
open je de map. De nieuwe bootmanager Grub 2 is in staat besturingssystemen in ISO bestanden te starten, m.a.w. je kunt SystemRescueCD via Grub 2 rechtstreeks starten vanuit het gedownloade ISO-bestand zonder deze op de harde schijf te installeren. Om het maken en herstellen van back-ups te vereenvoudige gebruik ik een SystemRescueCD autorun script. Dit moet vanuit het ISO bestand opgestart worden. Om het autorun script eenvoudig te kunnen aanpassen, plaats ik in het ISO-bestand een autorun script met als enige opdracht het uitvoeren van het autorun script op de harde schijf op de opstartpartitie van SystemRescueCD. Met de volgende opdrachten voeg ik een autorun script aan het ISO-bestand toe.
Koppel de linux systeempartitie aan de map /mnt/custom (werkruimte voor de aanmaak van het ISO-bestand)
mount /dev/sda6 /mnt/custom
Verwijder indien aanwezig de van vroeger overgebleven map met werkruimte voor de aanmaak van het ISO-bestand
rm -rf /mnt/custom/customcd/
Maak de nodige werkmappen aan
mkdir -p /mnt/custom/customcd/isoroot
Kopieer het SystemRescueCD systeem naar de aangemaakte map
cp -a /livemnt/boot/* /mnt/custom/customcd/isoroot/
Voeg het autorun script toe aan de werkmap met de inhoud van het toekomstige ISO-bestand
echo '#!/bin/bash' > /mnt/custom/customcd/isoroot/autorun
echo 'sh /livemnt/isostore/autorun' >> /mnt/custom/customcd/isoroot/autorun
Indien je SystemRescueCD vanaf een USB-stick is opgestart, moet je de opstartprocedure naar CD wijzigen (enkel door de naam van een configuratiebestand en map aan te passen, wat is linux toch heerlijk eenvoudig)
mv /mnt/custom/customcd/isoroot/syslinux/syslinux.cfg /mnt/custom/customcd/isoroot/syslinux/isolinux.cfg
mv /mnt/custom/customcd/isoroot/syslinux /mnt/custom/customcd/isoroot/isolinux
Maak het ISO-bestand aan
/usr/sbin/sysresccd-custom isogen sysrcd
Verplaats het aangemaakte ISO-bestand naar de SystemRescueCD partitie (let daarbij op de datum en tijd in de naam van het aangemaakte ISO-bestand)
mv /mnt/custom/customcd/isofile/sysresccd-20120909-1951.iso /mnt/backup/systemrescuecd.iso
Verwijder de werkmap
rm -rf /mnt/custom/customcd/

Grub 2 bootmanager

Nu het SystemRescueCD systeem klaar is, moeten we enkel nog de Grub 2 bootmanager installeren en configureren. Installeer en activeer de bootmanager op de SystemRescueCD partitie met de opdracht
grub2-install --root-directory=/mnt/backup /dev/sda
Maak in het nieuwe bestand /mnt/backup/boot/grub2/grub.cfg met behulp van een editor (grafisch of in de terminal) het volgende bootmenu aan:
# Global options
set timeout=90
set default=0
set fallback=1
set pager=1

menuentry 'openSUSE 12.2' {
	set root='hd0,msdos6'
	linux	/boot/vmlinuz root=/dev/sda6 video=1366x768 resume=/dev/sda5 splash=silent quiet showopts
	initrd	/boot/initrd
}
menuentry 'Windows 7' {
	set root='hd0,msdos1'
	chainloader +1
}
menuentry 'Linux terugzetten' {
	loopback loop /systemrescuecd.iso
	linux (loop)/isolinux/rescue64 isoloop=systemrescuecd.iso setkmap=be restorelinux 
	initrd (loop)/isolinux/initram.igz
}
menuentry 'Windows terugzetten' {
	loopback loop /systemrescuecd.iso
	linux (loop)/isolinux/rescue64 isoloop=systemrescuecd.iso setkmap=be restorewindows 
	initrd (loop)/isolinux/initram.igz
}
menuentry 'SystemRescueCD' {
	loopback loop /systemrescuecd.iso
	linux (loop)/isolinux/rescue64 isoloop=systemrescuecd.iso setkmap=be
	initrd (loop)/isolinux/initram.igz
}
menuentry 'Rsync backup' {
	loopback loop /systemrescuecd.iso
	linux (loop)/isolinux/rescue64 isoloop=systemrescuecd.iso setkmap=be backuprsync
	initrd (loop)/isolinux/initram.igz
}
menuentry 'Linux backuppen' {
	loopback loop /systemrescuecd.iso
	linux (loop)/isolinux/rescue64 isoloop=systemrescuecd.iso setkmap=be backuplinux
	initrd (loop)/isolinux/initram.igz
}
menuentry 'Windows backuppen' {
	loopback loop /systemrescuecd.iso
	linux (loop)/isolinux/rescue64 isoloop=systemrescuecd.iso setkmap=be backupwindows
	initrd (loop)/isolinux/initram.igz
}
Na het opslaan van het bootmenubestand kun je de computer afsluiten met de opdracht
halt

Na het verwijderen van de SystemRescueCD USB stick of de CD kun je de bootmanager testen. Aangezien enkel Windows 8 en de SystemRescueCD partitie klaar is, zullen enkel deze bootmenukeuze's werken.

Indien het SystemRescueCD systeem vanaf de harde schijf start, kun je met de volgende opdracht de SystemRescueCD partitie beschrijfbaar maken om eventueel aanpassingen aan te brengen:
mount /dev/sda3 /livemnt/isostore -o rw, remount
Aangezien de bestanden nu aan de map /livemnt/isostore gekoppeld zijn, moet je ze daar ook gaan aanpassen.

Bij een volgende gelegenheid beschrijf ik hoe je de Grub 2 manager een grafisch thema laat gebruiken.

openSUSE 12.2 installeren

Bij de installatie van openSUSE 12.2 moet je ervoor zorgen dat het installatieprogramma de vooraf met GParted aangemaakte partities gebruikt. En eigenlijk kun je niet anders, het door openSUSE 12.2 gebruikte partitioneringdprogramma parted blijkt niet in staat de door de Windows 8 aangemaakte partitietabel te lezen. Wel kun je de partities naar keuze aan een map koppelen:

Windows 8 en openSUSE 12.2 (linux) conflicten en oplossingen

Windows gebruikt standaard de lokale computertijd, terwijl Linux standaard de standaard UTC (Coordinated Universal Time) tijd gebruikt. Dit heeft als gevolg dat in België de tijd in Windows en Linux in de zomer een tijdverschil van 2 uur oplevert. Ofwel stel je Windows in zodat deze eveneens de standaard UTC tijd gebruikt, ofwel stel je Linux in zodat deze de lokale computertijd gebruikt. In openSUSE 12.2 stel je het gebruik van lokale tijd in met de volgende opdrachten:
su
echo "0.0 0 0.0" > /etc/adjtime
echo "0" >> /etc/adjtime
echo "LOCAL" >> /etc/adjtime
exit

Bij de volgende herstart van de computer wordt in zowel openSUSE als Windows de juiste tijd weergegeven.

Het bootmenu vervolledigen met extra functies

Om de bootmenu's Linux terugzetten, Windows terugzetten, Rsync backup, Linux backuppen en Windows backuppen te laten werken, maak je het bestand /livemnt/isostore/autorun aan met de volgende inhoud:
#!/bin/bash
setterm -blank 0 # Schakel de schermbeveiliging uit
snt="(C) Stedelijke Nijverheids- & Taalleergangen, Brugge, Dany Pinoy, `date -r /livemnt/isostore/autorun +'%d %B %Y'`"
titel="Automatisch systeemherstel"
function herstart
{
	$(dialog --title "$titel" \
		--infobox "De computer wordt automatisch herstart.\nU hoeft enkel te wachten..............." 0 0 2>&1 1>$(tty))
	init 6
	sleep 3000	
}
function afsluiten
{
	$(dialog --title "$titel" \
		--infobox "De computer wordt automatisch afgesloten.\nU hoeft enkel te wachten..............." 0 0 2>&1 1>$(tty))
	init 0
	sleep 3000
}
function herafsluiten
{
	keuze=$(dialog --backtitle "$snt" \
		--title "$titel" \
		--menu "       Backup teruggezet, wat nu?" 0 0 0 \
		"1" "Computer uitschakelen" \
		"2" "Computer opnieuw starten" \
		2>&1 1>$(tty))
	case "$keuze" in
		"1" ) afsluiten;;
		"2" ) herstart;;
	esac
}
part=""
if [ -e /dev/hda2 ]; then	# Harde schijf aangesloten via IDE
	part="hda"
elif [ -e /dev/sda2 ]; then 	# Harde schijf aangesloten via SCSI of SATA
	part="sda"
else	# Harde schijf aangesloten via SCSI of SATA
	echo `grep "[sh]d[abcd]" /proc/partitions | head -1` | cut -d ' ' -f4 > /tmp/hardeschijf
	part="`cat /tmp/hardeschijf`"
	keuze=$(dialog --backtitle "$snt" \
		--title "$titel" \
		--msgbox "Er is geen tweede primaire partitie op deze computer.\nPinBack zal pas functioneren na het partitioneren van de harde schijf." 7 70 \
		2>&1 1>$(tty))
fi
# Bepaal of er een tweede harde schijf is, en van welk type
part1=$(cat /proc/partitions | grep -w hda)	# tweede schijf is hda
if [ "$part1" ]; then
	part1=$(echo $part1 | awk '{print $4}')
fi
if [ "$part1" = "$part" ]; then	# Neen, de eerste schijf is hda
	part1=""
fi
if [ ! "$part1" ]; then
	part1=$(cat /proc/partitions | grep -w sda)	# tweede schijf is sda
	if [ "$part1" ]; then
		part1=$(echo $part1 | awk '{print $4}')
	fi
	if [ "$part1" = "$part" ]; then	# Neen, de eerste schijf is sda
		part1=""
	fi
fi
if [ ! "$part1" ]; then
	part1=$(cat /proc/partitions | grep -w hdb)	# tweede schijf is hdb
	if [ "$part1" ]; then
		part1=$(echo $part1 | awk '{print $4}')
	fi
fi
if [ ! "$part1" ]; then
	part1=$(cat /proc/partitions | grep -w sdb)	# tweede schijf is sdb
	if [ "$part1" ]; then
		part1=$(echo $part1 | awk '{print $4}')
	fi
fi
if [ "`grep backuplinux /proc/cmdline`" ]; then
	mount /dev/"$part"3 /livemnt/isostore -o rw,remount
	if [ -e /livemnt/isostore/backup/linux.partclone.gz ]; then
		$(dialog --backtitle "$snt" \
			--title "$titel" \
			--yesno "Wilt u de oude backup behouden?" 5 35 2>&1 1>$(tty))
		if [ $? -eq "0" ]; then
			mv -f /livemnt/isostore/backup/linux.partclone.gz /livemnt/isostore/backup/linux.partclone.gz.ori
		fi						
	fi
	clear
	echo "Linux backuppen"
	printf '================\n'
	partclone.extfs --clone --source /dev/"$part"6 | gzip -c > /livemnt/isostore/backup/linux.partclone.gz
	if [ $? ]; then
                $(dialog --backtitle "$snt" \
			--title "$titel" \
			--msgbox "Backup met succes afgerond." 5 47 2>&1 1>$(tty))
	else
                $(dialog --backtitle "$snt" \
			--title "$titel" \
			--msgbox "Backup onderbroken met foutmelding." 5 47 2>&1 1>$(tty))
                fi
	mount /dev/"$part"3 /livemnt/isostore -o ro,remount
	herafsluiten
	afsluiten
fi
if [ "`grep restorelinux /proc/cmdline`" ]; then
	clear
	echo "Linux terugzetten"
	printf '=================\n'
	zcat /livemnt/isostore/backup/linux.partclone.gz | partclone.restore --output /dev/"$part"6
	herafsluiten
	afsluiten
fi
if [ "`grep reversessh /proc/cmdline`" ]; then
	echo "/livemnt/isostore/rev_ssh.sh" >> /root/.zshrc
fi
if [ "`grep backupwindows /proc/cmdline`" ]; then
	mount /dev/"$part"3 /livemnt/isostore -o rw,remount
	if [ -e /livemnt/isostore/backup/windows7.img.gz ]; then
		$(dialog --backtitle "$snt" \
			--title "$titel" \
			--yesno "Wilt u de oude backup behouden?" 5 35 2>&1 1>$(tty))
		if [ $? -eq "0" ]; then
			mv -f /livemnt/isostore/backup/windows7.img.gz /livemnt/isostore/backup/windows7.img.gz.ori
		fi						
	fi
	clear
	echo "Windows backuppen"
	printf '=================\n'
	ntfsclone --save-image -o - /dev/"$part"2 | gzip -c > /livemnt/isostore/backup/windows7.img.gz
	if [ $? ]; then
                $(dialog --backtitle "$snt" \
			--title "$titel" \
			--msgbox "Backup met succes afgerond." 5 47 2>&1 1>$(tty))
	else
                $(dialog --backtitle "$snt" \
			--title "$titel" \
			--msgbox "Backup onderbroken met foutmelding." 5 47 2>&1 1>$(tty))
                fi
	mount /dev/"$part"3 /livemnt/isostore -o ro,remount
	herafsluiten
	afsluiten
fi
if [ "`grep restorewindows /proc/cmdline`" ]; then
	clear
	echo "Windows terugzetten"
	printf '===================\n'
	gunzip -c /livemnt/isostore/backup/windows7.img.gz | ntfsclone --restore-image --overwrite /dev/"$part"2 -
	herafsluiten
	afsluiten
fi
if [ "`grep backuprsync /proc/cmdline`" ]; then
	printf '\033[0m'; clear # Kleuren standaard
	echo "Uitvoeren Rsync backup:"
	printf '=======================\n'
	backupip=$(dialog --backtitle "$snt" \
                --title "$titel" \
                --inputbox "\n Welk IP-adres heeft de Rsync server?" 0 0 "192.168.1." \
                2>&1 1>$(tty))
	ip a
	rsync $backupip::
	if [ $? -ne 0 ]; then
		printf '\033[1;31;40m Kon geen verbinding met backupserver opbouwen.\033[0m\n' # Rode letters
		printf '\033[1;32;40m Druk Return om door te gaan.' # Groene letters op zwarte achtergrond
		read Keypress
	else
		rsync -avHxh --numeric-ids --progress --delete --exclude="lost+found/" /livemnt/isostore/ $backupip::backup/s760/backup 2>>/tmp/rsync.error | tee -a /tmp/rsync.log
		mount /dev/"$part"7 /mnt/backup
		rsync -avHxh --numeric-ids --progress --delete --exclude="lost+found/" /mnt/backup/ $backupip::backup/s760/documenten 2>>/tmp/rsync.error | tee -a /tmp/rsync.log
		umount -l /dev/"$part"7
		rsync /tmp/rsync.log $backupip::s760
		rsync /tmp/rsync.error $backupip::s760
		touch /tmp/stop
		rsync /tmp/stop $backupip::backup
		printf '\033[1;32;40m De computer wordt binnen de minuut afgesloten.' # Groene letters op zwarte achtergrond
 		sleep 60
 		afsluiten
	fi
	herafsluiten
	afsluiten
fi
if [ "`grep rsyncserver /proc/cmdline`" ]; then
	echo "uid = root" > /etc/rsyncd.conf
	echo "gid = root" >> /etc/rsyncd.conf
	echo "[backup]" >> /etc/rsyncd.conf
	echo "path = /livemnt/isostore" >> /etc/rsyncd.conf
	echo "comment = Backup" >> /etc/rsyncd.conf
	rsync --daemon
	$(dialog --backtitle "$snt" \
		--title "$titel" \
		--msgbox "Rsync daemon gestart.\nHet IP-adres van deze computer is `/sbin/ifconfig eth0 | grep 'inet ' | cut -d : -f2 | cut -d ' ' -f1`" 0 0 2>&1 1>$(tty))
	herafsluiten
	afsluiten
fi
if [ "`grep httpserver /proc/cmdline`" ]; then
	thttpd -r -d /livemnt/isostore/opensuse4pinda/repos
	$(dialog --backtitle "$snt" \
		--title "$titel" \
		--msgbox "HTTP server gestart.\nHet IP-adres van deze computer is `/sbin/ifconfig eth0 | grep 'inet ' | cut -d : -f2 | cut -d ' ' -f1`" 0 0 2>&1 1>$(tty))
	herafsluiten
	afsluiten
fi
exit
Daarbij zal de Rsync backup bootmenukeuze pas werken als er een Rsync backupserver in het netwerk actief is. Om een backup aan te maken moet je de map /livemnt/isostore/backup aanmaken. M.a.w. dit script werkt bij ons perfect, maar is zeker voor verbetering vatbaar.