Monday, February 7, 2011

GNU/Linux auf Netbook installieren und vorinstalliertes Windows 7 Starter in Virtuelle Maschine sperren

Kuerzlich kaufte sich meine Freundin ein Samsung NC10-Ekko Plus Netbook. Man muss nicht lange nachdenken, um zu dem Schluss zu kommen, dass dem vorinstallierte Betriebssystem Windows 7 Starter-Edition nicht die Herrschaft ueber dieses Geraet ueberlassen werden kann. Nun ist es aber manchmal doch sinnvoll ein natives Windows zur Hand zu haben - aus welchen Gruenden auch immer.

Ziel ist also GNU/Linux als primaeres Betriebssystem zu installieren und Windows in eine virtuelle Maschine zu stecken.

WICHTIG! Lizenzbedingungen/EULA beachten! Ich bin kein Jurist, die hier beschriebene Methode ist technisch moeglich. Ich uebernehme keine Gewaehr dafuer, dass sie auch rechtlich einwandfrei ist.

WICHTIG! Recovery-Partition unbedingt sichern! Sie ist unbedingt notwendig, um das Geraet wieder in den Originalzustand zu versetzen. Geht sie verloren muss das Geraet beim Hersteller kostenpflichtig restauriert werden. Ich uebernehme keine Haftung fuer auftretende Schaeden.

WICHTIG! Das vorinstallierte Windows darf nicht aktiviert worden sein. Soweit ich weiss, sind Windows-OEM-Lizenzen auf den Rechner beschraenkt, auf dem sie zuerst aktiviert wurden. Also darf das mitgelieferte Windows erst in der virtuellen Maschine aktiviert werden.

Um diesem Betrag zu verstehen und erfolgreich anzuwenden sollte der Leser zumindest ueber Grundlagenwissen in den Bereichen Linux, Festplatten und Virtualisierung verfuegen oder jemand kennen der Ahnung hat. Verwendete Kommandozeilentools: fdisk, tee, dd, bzip2, split, cat, losetup, mkfifo, chown.

Zeilen die mit ~# oder /some/path# beginnen sind Kommandos, die in einer root-shell ausgefuehrt werden. ~> und /some/path>; bedeuten das gleiche fuer einen "normalen" Benutzer (meine Freundin)


1. Recovery

Zunaechst sollte man eine Komplettwiederherstellung durchfuehren (F4 direkt nach dem Anschalten). Dabei kann und sollte auch gleich noch die Windows Partition verkleinert werden. Zum einen sind 90 GB wohl etwas uebertrieben fuer ein "Notfallsystem", zum anderen wird Platz frei (und der erweiterten Partition zugeschrieben in der schon Laufwerk D: liegt), den man u.a. fuer Swap-Speicher nutzer kann. Nach der Wiederherstellung ist darauf zu achten, dass diese "saubere" Installation niemals mit der Hardware in Beruehrung kommt (also nicht booten).

2. Backup des Kaufzustandes

Jetzt bekommt es der Atom-Prozessor (wahrscheinlich) das erste mal mit einem Linux-Kern zu tun. Von einem externen CD-Laufwerk wird ein Live-System gestartet; die Distribution meiner Wahl war Knoppix.

Nun warden Partitionstabelle, Master-Boot-Sektor, Recovery- und Boot-Partition des Systems gesichert. Als Speicherort waehlte ich die bereits angelegt NTFS-Partition /dev/sda5 (D:).

~# mkdir /mnt/sda5
~# mount -t ntfs /dev/sda5 /mnt/sda5
~# mkdir /mnt/sda5/sda.backup
~# cd /mnt/sda5/sda.backup


Partitionstabelle im Klartext:

/mnt/sda5/sda.backup# fdisk -lu /dev/sda | tee fdisk.log

Die Partitionstabelle wird auf der Konsole ausgegeben und in fdisk.log gespeichert. bei mir sah das folgendermassen aus:

Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x20502758

Device Boot Start End Blocks Id System

/dev/sda1 2048 41945087 20971520 27 Unknown
/dev/sda2 * 41945088 42149887 102400 7 HPFS/NTFS
/dev/sda3 42149888 220407807 89128960 7 HPFS/NTFS
/dev/sda4 220407808 488394751 133993472 f W95 Ext'd (LBA)
/dev/sda5 220409856 488394751 133992448 7 HPFS/NTFS


MBR (sda1 beginnt an block 2048, also MBR von 0 bis 2047, siehe oben):

/mnt/sda5/sda.backup# dd if=/dev/sda of=sda.img count=2048

Recovery-Partition (das sollte ueber Nacht laufen oder man geht derweil ins Kino, ca. 20GB):

/mnt/sda5/sda.backup# dd if=/dev/sda1 | bzip2 -c9 | split -a 1 -b 2GB -d - sda1.img.bz2.part

Bei mir ergab das sechs Dateien mit insgesamt ca. 12,5GB.

Boot-Partition (dieses Image wird auch fuer die VM benoetigt):
/mnt/sda5/sda.backup# dd if=/dev/sda2 of=sda2.img

Wiederherstellung (falls was schief geht):
Live-System booten, Daten-Partition mounten, ins Verzeichnis mit den Images wechseln

dd if=sda.img of=/dev/sda
cat sda1.img.bz2.part? | bzip2 -cd | dd of=/dev/sda seek=2048
dd if=sda2.img of=/dev/sda seek=41945088

neu starten und bei Bedarf Windows-Wiederherstellung starten (F4)

2. GNU/Linux installieren

Endlich ...

Achtung! unbedingt manuell partitionieren. /dev/sda3 (Windows (C:)) nicht aendern.

Die Partitionen /dev/sda1 und /dev/sda2 koennen geloescht und neu angelegt werden. In der erweiterten Partition sda4 ist durch das Verkleinern der Windows-Partition Platz frei geworden. In der neuen Partitionstabelle ist zu beachten, dass sda3 nicht geaendert wurde und sda7 am gleichen Platzt wie vorher sda5 gelegen ist (das ist das ehemalige Windows-Laufwerk D: mit den Images).

Disk identifier: 0x20502758

Device Boot Start End Blocks Id System
/dev/sda1 * 63 1001471 500704+ 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 1001472 42149887 20574208 8e Linux LVM
/dev/sda3 42149888 126935039 42392576 7 HPFS/NTFS
/dev/sda4 126935040 488397167 180731064 5 Extended
/dev/sda5 126935103 133226559 3145728+ 82 Linux swap / Solaris
/dev/sda6 133226623 220409792 43591585 8e Linux LVM
/dev/sda7 220409856 488394751 133992448 7 HPFS/NTFS


Die Installation des Systems erfolgt nun wie gewohnt und gewuenscht. Es muss keine Ruecksicht auf Windows im MBR/Boot-Manager genommen werden.
Bei der Auswahl der Pakete sollte die Virtualisierungssoftware nicht vergessen werden. Mein Favorit ist KVM/QEMU. Der Atom-N450-Prozessor hat aber keine Virtualisierungsunterstuetzung und letztendlich habe ich micht fuer das eh freundinnen-freundlichere VirtualBox entschieden. (Und mahl ehrlich, im Seamless-Mode die Windows Startleiste unten und das Gnome-Panel oben X- und M$-Fenster nebeneinander, eine gemeinsame Zwischenablage ... das ist schon fein).

3. Virtuelle Maschine einrichten

Nachdem Linux installiert und konfiguriert wurde kommen wir nun zum Gastsystem.
  • VirtualBox starten (Konfigurationsverzeichnis wird angelegt)
  • virtuelle Festplatte anlegen (Konsole oeffnen)

    ~> sudo VBoxManage internalcommands createrawvmdk -filename "~freundin/.VirtualBox/HardDisks/sda.win7.vmdk" -rawdisk /dev/sda
    ~> sudo chown freundin "~freundin/.VirtualBox/HardDisks/sda.win7.vmdk"
  • Partition mit den Images (bei mir sda7) mounten
  • sda.img nach ~/.VirtualBox/HardDisks/sda.win7-mbr.vmdk kopieren
  • sda2.img nach ~/.VirtualBox/HardDisks/sda.win7-boot.vmdk kopieren
  • Beschreibungsdatei (sda.win7.vmdk) der virtuellen Festplatte im Editor oeffnen
  • Die folgenden Zeilen beschreiben die virtuelle Festplatte und werden bearbeitet.
  • # Extent description RW 488397168 FLAT "/dev/sda" 0
  • Actung! Als Feldtrenner immer nur ein Leerzeichen, sonst gibt es Format-Fehler.
  • # Extent description RW 2048 FLAT "sda.win7-mbr.vmdk" 0 RW 41943040 FLAT "/dev/zero" 0 RW 204800 FLAT "sda.win7-boot.vmdk" 0 RW 84785152 FLAT "/dev/loop7" 0 RW 361462128 FLAT "/dev/zero" 0

Die erste Zeile blendet den gesicherten originalen MBR mit Partitionstablle in die virtuelle Festplatte ein. Die Recovery-Partition ist nicht vorhanden und wird nicht gebraucht (/dev/zero). Die Boot-Partition kommt ebenfalls aus einem Image. Nun kommt die Windows Partition (C:) (zur Verwendung des Loop-Devices komme ich gleich). Zuletzt noch die restlichen Sektoren der Festplatte mit Nullen fuellen.

In Summe muessen die Groessenangaben in der ersten Spalte gleich dem Wert des urspruenglichen Eintrages sein. Das ist die Groesse in 512Byte-Bloecken wie sie auch fdisk ausgibt. In der zweiten Spalte steht die Groesse der Partition (mit fdisk.log vergleichen: End - Start + 1)

Damit ein Benutzer Schreibzugriff auf die physische Festplatte erhaelt, muss er root sein oder der Gruppe disk angehoeren. Aus Sicherheitsgruenden sind das keine Eigenschaften eines interaktiven Nutzers. Also verwende ich hier ein Loop-Device, das der Freundin uebereignet wird. Folgende Zeilen werden bei jedem Booten ausgefuehrt. Es wird ein Named Pipe erzeugt aus dem in einer im Hintergrund laufenden Endlosschleife gelesen und bei jedem Zeilenwechsel der Besitzer des Loop-Devices gesetzt wird. Das Skript wird auch gleich ausgefuehrt und eine Zeile ins Pipe geschrieben (also Eigentuemer gesetzt).

~# cat >/etc/init.d/boot.local
LOOP_DEV=/dev/loop7
HDPART_DEV=/dev/sda3
UNAME=freundin
CHOWN_PIPE="/home/$UNAME/.VirtualBox/Machines/Windows 7 Starter/chown.pipe"

losetup -d $LOOP_DEV;
losetup $LOOP_DEV $HDPART_DEV
rm -f "$CHOWN_PIPE"
mkfifo -m 240 "$CHOWN_PIPE"
chown $UNAME "$CHOWN_PIPE"
while true; do read <"$CHOWN_PIPE"; chown $UNAME $LOOP_DEV; done &
[Ctrl]+[D]
~# /etc/init.d/boot.local
~# echo >~freundin/.VirtualBox/Machines/Windows 7 Starter/chown.pipe


  • VM anlegen, SATA-Controller, sda.win7.vmdk einhaengen
  • RAM und Grafikspeicher zuteilen (von den vorhandenen 2GB hab ich knapp die Haelfte abgegeben)
Jetzt brauchen wir noch ein Skript, dass die VM startet. Das VirtualBox-FrontEnd ist nicht dazu in der Lage, weil standardmaessig kein Schreibzugriff auf das Loop-Device besteht. Das Skript kann als Starter auf dem Desktop angelegt werden (im Terminal ausfuehren).

~> cat ~/bin/start_vm_win7.sh
#!/bin/sh
echo >"~/.VirtualBox/Machines/Windows 7 Starter/chown.pipe"
VBoxManage startvm "Windows 7 Starter"
sleep 10
[Ctrl]+[D]
~> chmod +x ~/bin/start_vm_win7.sh
4. Windows einrichten und sichern
  • VM starten (~/bin/start_vm_win7.sh)
  • Windows-Setup, Sprache waehlen, EULA akzeptieren, Netzwerk usw.
  • jetzt werden erstmal Treiber und Software installiert - Kaffe, Kino, um Freundin kuemmern
  • Windows aktivieren (Key auf Siegel unter Netbook) 
  • Virtualbox Guest Additions installieren
  • alle Software wieder deinstallieren (ich hab das Handbuch und Office Starter drauf gelassen)
  • essenzielle Einstellungen vornehemen (root-Account anlegen, Freundin zu "Standardbenutzer" degradieren, Auto-Login, Update-Einstellungen ...)
Dieser Zustand wird nun gesichert und kan im Falle eines zerstoerten Windows (nasses Wasser) zurueckgespielt werden.

~# ntfsclone -so - /dev/sda3 | bzip2 -c9 | split -a 1 -b 2GB -d - sda3.ntfs.img.bz2.part

(drei Dateien/6 GB)

Zurueckspielen (alle Daten auf sda3/C: gehen verloren):
~# cat sda3.ntfs.img.bz2.part? | bzip2 -cd | ntfsclone -rO /dev/sda3 -