Linked Clones VMs mit VMware vSphere 4

4-mal dasselbe bitte…

Letztens kam mal wieder jemand an und wollte mal eben, aber immerhin nur temporär vier PCs mit der selben Softwareausstattung für einen Datenexport haben. – Gut, er meinte natürlich, dass ich ihm vier VMs anlegen solle. So ist das halt, wenn man mittels Server-Virtualisierungsumgebung schneller als jeder andere in der EDV Abteilung Maschinen bereit stellen kann…

Moment mal…

Da fiel mir ein, dass ich vor einiger Zeit gelesen hatte, dass VMware vSphere (auch ESX 4 genannt) linked Clones beherrscht, also VMs mit einer gemeinsamen virtuellen Basis-Festplatte. – Das hier schien mir der optimale Zeitpunkt das mal auszuprobieren. Gedacht ist die ganze Sache eigentlich wohl für “VMware View”, der Haus-eigenen VDI-Lösung. – Technisch gesehen kann man die API wohl auch “so” ansprechen, und linked Clones oder “Linked Virtual Machines”, wie es offiziell heißt erstellen. Infos hier: Linked Virtual Machines – VMware Technical Note

Die Fertigmischung…

Da es keinen Button oder eine Option in den weiten der Menüs des vCenter Clients dafür gibt (halt nur in View…), wäre wohl Skripten angesagt. Aber auch hier gilt: Man muss ja nicht immer das Rad neu erfinden! – William Lam von yirtuallyGhetto hat das schon erledigt: vGhettoLinkedClone.pl

An die Arbeit

Nulltens

Für das Ganze brauchen wir das “VMware vSphere CLI” aus dem VMware Downdload Center. Weiterhin muss das dort enthaltene Perl-Modul apps\AppUtil.pm im Perl-Suchpfad sein. Bei meiner Standard-Installation unter Windows XP musste ich C:\Programme\VMware\VMware vSphere CLI\Perl\apps\AppUtil berücksichtigen. Der genutzte vSphere/ ESX Server muss außerdem von einem Virtual Center verwaltet werden.

Eine Grundlage schaffen

Wir gewünscht eine Windows XP VM “export1” deployed und die benötigte Software installieren lassen. Hiermit hatten wir schon mal eine VM.

Bitte recht freundlich

Erstmal einen Schnappschuss, äh Snapshot von unserer Basis-VM machen, einfach mit dem vCenter Client. Es macht Sinn einen Namen ohne Lehrzeichen zu verwenden. z.B. “Clone_Basis”

Und jetzt Klonen

Während das Original läuft jetzt auf der Kommandozeile mit dem Perl-Skript einfach die Klone erstellen:

C:\>perl .\vGhettoLinkedClone.pl --server vcenter.mein.netz
--username vcadmin --vmhost esx22.mein.netz --vmname
export1 --vmname_destination export2 --snapname Clone_Basis

Enter password:

Link Cloning virtual machine 'export2' from 'export1' ...

Clone 'export2' of virtual machine 'export1' successfully created.

Das ganze dauerte nicht wirklich lange. Ist ja auch kein Wunder, da ja im Gegensatz zu einer “normalen” Dublette einer VM  ja nicht alle Dateien einmal auf dem Storage kopiert werden müssen, sondern  nur die relativ kleinen Konfigurationsdateien für eine VM erstellt werden, wo die ursprüngliche vHDD Datei als Basis-Disk eingetragen wird und eine vHDD Datei für die zu schreibenden, geänderten Blöcke wie eine Snaphot-Datei eingetragen.

Das Skript eben noch für die weiteren zwei VMs laufen gelassen und fertig.

Et voila

Wenn man sich nun auf dem ESX Host umschaut, sieht man die Platz-Erparniss:

[root@esx22 VMSTORAGE]# ll -h export*
export1:
total 12G
-rw------- 1 root root 2.6G Aug 22 10:46 export1-000001-delta.vmdk
-rw------- 1 root root  294 Aug 22 10:47 export1-000001.vmdk
-rw------- 1 root root  17M Aug 22 11:28 export1-000002-delta.vmdk
-rw------- 1 root root  277 Aug 22 10:46 export1-000002.vmdk
-rw------- 1 root root 1.0G Aug 17 17:42 export1-8d3ef1db.vswp
-rw------- 1 root root  15G Aug 18 11:04 export1-flat.vmdk
-rw------- 1 root root 8.5K Aug 19 13:04 export1.nvram
-rw------- 1 root root 1.1G Aug 18 11:05 export1-Snapshot1.vmsn
-rw------- 1 root root  543 Aug 22 10:52 export1.vmdk
-rw-r--r-- 1 root root  503 Aug 22 11:20 export1.vmsd
-rwxr-xr-x 1 root root 2.7K Aug 22 10:46 export1.vmx
-rw-r--r-- 1 root root  266 Aug 17 17:42 export1.vmxf
-rw-r--r-- 1 root root 216K Aug 17 17:31 vmware-1.log
-rw-r--r-- 1 root root 231K Aug 22 11:21 vmware.log

export2:
total 2.0G
-rw------- 1 root root  1.0G Aug 22 10:56 export2-8d3ef1dc.vswp
-rw------- 1 root root 1009M Aug 22 11:29 export2-delta.vmdk
-rw------- 1 root root  8.5K Aug 22 11:03 export2.nvram
-rw------- 1 root root   387 Aug 22 10:56 export2.vmdk
-rw-r--r-- 1 root root     0 Aug 22 10:56 export2.vmsd
-rwxr-xr-x 1 root root  2.8K Aug 22 11:28 export2.vmx
-rw-r--r-- 1 root root   266 Aug 22 11:15 export2.vmxf
-rw-r--r-- 1 root root  216K Aug 22 10:56 vmware-1.log
-rw-r--r-- 1 root root  113K Aug 22 11:28 vmware.log

export3:
total 2.0G
-rw------- 1 root root 1.0G Aug 22 10:56 export3-8d3ef1dd.vswp
-rw------- 1 root root 993M Aug 22 11:28 export3-delta.vmdk
-rw------- 1 root root 8.5K Aug 22 10:55 export3.nvram
-rw------- 1 root root  387 Aug 22 10:55 export3.vmdk
-rw-r--r-- 1 root root    0 Aug 22 10:56 export3.vmsd
-rwxr-xr-x 1 root root 2.8K Aug 22 11:28 export3.vmx
-rw-r--r-- 1 root root  266 Aug 22 11:14 export3.vmxf
-rw-r--r-- 1 root root 216K Aug 22 10:55 vmware-1.log
-rw-r--r-- 1 root root  63K Aug 22 10:55 vmware-2.log
-rw-r--r-- 1 root root 113K Aug 22 11:28 vmware.log

export4:
total 2.0G
-rw------- 1 root root 1.0G Aug 22 10:53 export4-8d3ef1de.vswp
-rw------- 1 root root 993M Aug 22 11:28 export4-delta.vmdk
-rw------- 1 root root 8.5K Aug 22 10:53 export4.nvram
-rw------- 1 root root  387 Aug 22 10:52 export4.vmdk
-rw-r--r-- 1 root root    0 Aug 22 10:52 export4.vmsd
-rwxr-xr-x 1 root root 2.8K Aug 22 11:27 export4.vmx
-rw-r--r-- 1 root root  266 Aug 22 11:14 export4.vmxf
-rw-r--r-- 1 root root 216K Aug 22 10:52 vmware-1.log
-rw-r--r-- 1 root root 113K Aug 22 11:27 vmware.log

VM export1 belegt 12GB (und würde noch mehr belegen, wenn die vHDD nicht Thin Provisioned wäre) während export2 bis export4 nur 2GB belegen, wovon ein GB jeweils für die beim Einschalten einer jeden VM erstellte Swapdatei in Größe des konfigurierten vRAMs drauf geht…

 

Windows 98 mittels VMware Converter und VMware Player virtualisieren (P2V)

Wie es begann

Letztens kam jemand um die Ecke und meinte “Du machst Doch Virtualisierung und so?!”. Ich: “Ja…”.

Dann kam’s: Es gab da einen (ur-)alten PC mit MS Windows 98 als Betriebssystem (sofern man das so nennen sollte). Dieser PC fing langsam an Mucken zu machen und weigerte sich das ein- oder andere Mal zu starten. Ob ich den nicht virtualisieren könne.

Und los geht’s

Ich schaute mir also das für IT-Zeitrechnung schon ziemlich historische Gerät an: Intel Pentium Prozessor, 32MB RAM und 2GB IDE-Festplatte (von 1997!). – Mit der RAM-Ausstattung entfiel schon mal die Möglichkeit direkt mit einer CD eines aktuellen Platten-Imaging Produktes zu booten.

Wie es doch ging

Also Platte raus, in einen mittelalten PC mit IDE Controller als zweite Platte rein, dann von CD gebootet und mir Acronis ein Image geschossen. Soweit so gut.

Jetzt virtuell

Den PC gebootet (Windows XP, ähem also auch nicht das neueste) und den VMware Converter Standalone angeschmissen. Option Dritthersteller Images konvertieren und Ziel-System?! Naja, gönnen wir uns mal das neueste und vermeintlich beste, was da ist: VM für VMware Player v. >2.5.

(Virtuell) Fertig und los

Gesagt, etwas gewartet und fertig. – Dann das Windows 98 in der VM mit VMware Player 3 gebootet und los ging der “Spaß”. Das Plug’n’Play fand ein Gerät nach dem anderen, und vor allem PCI-Bridges bis zum Abwinken! Der “Neue Hardware” Assistenten lief und lief und würde wohl heute noch laufen, wenn ich nicht abgebrochen hätte.

Zurück in die (virtuelle) Steinzeit

Tja, mein gut gemeinter Wunsch eine VM für VMware Player v. > 2.5 zu erstellen hatte mir VMware virtuelle Hardware Version 7 beschert. Da gibt es so spannende Features wie 32(!) PCI Bridges und vieles derer mehr. – Für ein alten System wie Windows 98 eine nicht wirklich gute Idee.

Also nochmals den VMware Converter angeworfen und die VM in eine für u.a. VMware Player v. 1 konvertiert: VMware virtuelle Hardware Version 4…

Zurück auf Los (und keine 4000 Mark…)

Die VM gebootet, einmal den Hardware-Assi durchgeklickt, VMware Tools für Pre Windows 2000 rausgesucht und installiert, nochmal den Hardware Assistenen “Fertig” geklickt und gut war.

Fazit

Also lerne ich daraus: Das Neueste ist (auch virtuell) nicht immer das Beste.

Bei einem älteren Betriebssystem in einer VM darf es auch ruhig eine ältere virtuelle Hardware-Version (v. 4 für z.B. VMware Player 1) sein.

 

KMail will nicht IMAP mit Dovecot bei “listen localhost” sprechen

Um auf meinem Netbook unabhängig vom Mail-Client zu sein, habe ich fix Dovecot lokal als Imap-Server installiert und konfiguriert, mit OfflineImap mein Imap-Postfach vom Server synchronisiert und wollte jetzt (auch) mit KMail lokal drauf zugreifen…

Aber im Gegensatz zu Alpine oder Evolution (und natürlich OfflineImap) erzählte KMail mir immer wieder, dass es keine Verbindung zum Imap-Server aufbauen könne!

Alles Mögliche in KMail probiert: Statt “localhost” mal “127.0.0.1” als Imap-Server eingetragen, mal einen weiteren hosts-Eintrag gemacht und diesen genutzt, aber nichts half…

Also Debug-Logging auf Dovecot und tcpdump angeschmissen und siehe da: KMail versuchte sich irgendwie gar nicht richtig an localhost Port 143 anzumelden. Hmm…

Da ich Dovecot nur lokal verwende wollte, sollte der Imap-Daemon dann auch nur lokal lauschen. – Ergo hatte ich:

listen = localhost

in der 

/etc/dovecot/dovecot.conf

gesetzt. Testweise habe ich dann mal

listen *

gesetzt. – Und schwups, KMail zeigte mir mein Postfach an…

Als Workaround habe ich das dann erst mal akzeptiert und noch eine IPChains Regel (mittels ufw) gebaut, dass von außen nicht zugegriffen werden kann…

Da werd’ ich wohl noch ein wenig nach dem wirklichen Grund graben müssen, was KMail hier anders macht als andere (Imap-Clients).

gdebi – Lokale deb Pakete mit ihren Abhängigkeiten installieren

Neulich stand ich mal wieder vor dem Problem, dass ich ein deb Paket heruntergeladen hatte und dieses dann auch gerne installiert hätte, und zwar mit seinen Abhängigkeiten.
Nun können die apt-Tools (apt-get, aptitude und Freunde) aus Repositories (“Repos”) Pakete installieren und dabei die Abhängigkeiten berücksichtigen. Aber für auf der lokalen Platte liegende Pakete ohne Meta-Informationen eines Repos geht’s nicht… – Auch ein lokales Repo kann man selber bauen, aber ich befand das als ein kleines bischen Overkill: Mit Kanonen auf Spatzen…
Dann gibt es natürlich dkpg -i. – Hier muss man aber nun mal per Pfote die für die Abhängigkeiten benötigen Pakete einspielen.

Doch ich fand dann das Tool, was die Nachteile der beiden für diesen Anwendungsfall nicht hat:

gdebi

“man gdebi” meint dazu:
gdebi lets you install local deb packages resolving and installing its dependencies. apt does the same, but only for remote (http, ftp) located packages.

Einziger Wermutstropfen ist, dass gdebi als Parameter nur EIN deb Paket akzeptiert. Wenn man mehrere lokale Pakete hat, dann muss man das ggf. in ihrer möglicherweise vorhandenen Abhängigkeitsreihenfolge machen. – Aber gut, bei zu vielen lokalen Paketen mit Abhängigkeiten untereinander, kann man ja auch ein Repo draus bauen…

Shell-Script: Welcher Tag ist der 6. Arbeitstag im Monat?

Letztens wollte ich in einem Shell-Script bestimmen ob der n-te Tag eines Monats ein Arbeitstag (Montag bis Freitag) ist…

Log geht’s mit “cal”:

$ cal -m
     April 2011
Mo Di Mi Do Fr Sa So
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

Die ersten beiden Zeilen müssen weg! Hier hilft uns awk weiter. Alle Records (sprich Zeilen) >2 ausgeben:

$ cal -m | awk 'NR>2'
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

Dann die beiden rechten Spalten, also die Samstage und Sonntage abschneiden. Auch ein job für awk. Nur die ersten 14 Zeichen…

$ cal -m | awk 'NR>2' | awk '{print substr($0,0,14)}'
             1
 4  5  6  7  8
11 12 13 14 15
18 19 20 21 22
25 26 27 28 29

Und jetzt zusammen:

$ cal -m | awk 'NR>2 {print substr($0,0,14)}'
             1
 4  5  6  7  8
11 12 13 14 15
18 19 20 21 22
25 26 27 28 29

Jetzt sind schon mal nur alle Arbeitstage (Mon – Fr) übrig. – Wär’ noch schick das alles in einer Zeile zu haben. Also weg mit den Zeilenumbrüchen. Ein Job für tr (=translate):

$ cal -m | awk 'NR>2' | awk '{print substr($0,0,14)}' | tr "\n" " "
             1  4  5  6  7  8 11 12 13 14 15 18 19 20 21 22 25 26 27 28 29

Jetzt müssen wir nur noch die n-te (also z.B. 6.) Spalte ausgeben. Noch ein job für awk:

$ cal -m | awk 'NR>2' | awk '{print substr($0,0,14)}' | tr "\n" " " | awk '{printf $6}'
8

Also ist der 6. Arbeitstag im April 2011 der 8.4.2011. – Stimmt’s?! 😉

Immer der Stress mit den signierten PGP Keys… – Automagisch neue Signaturen auf PGP Servern veröffentlichen.

Jetzt habe ich soweit alle Leute der letzten PGP Signing Party mit
meinen Signaturen versorgt. – Puh, dank caff aber machbar!

…jetzt bekomme ich aber natürlich auch alle meine PGP IDs (eMail-Adressen…)
unterschrieben von den anderen zugeschickt. Dank caff pro ID eine eMail
von jedem Unterzeichner! – Also z.B. bei meinen 5 IDs und 51 Leuten, die an der
PGP Signing Party teilgenommen haben etwa 250 eMails!!

Jetzt müsste ich um die Signatur in meinen Key zu importieren von jeder
eMail den Anhang entschlüsseln und in eine Datei speichern. – Also
müsste ich den Speichern-Dialog (mit y-Eingabe oder OK-Klicken…) 250
Mal durchlaufen!

Irgendwie habe ich bei den eMail Programmen wie alpine, Evolution und KMail keine
Möglichkeit gefunden von markierten/ ausgewählten eMails die Anhänge in
Dateien zu speichern… :-/ – Wenn jemand weiß, wie das doch geht bitte
ich um Info. 😉

…aber ich habe einen Workaround gebaut:
– Alle “Your signed PGP key…” eMails in einer (MBOX) Datei speichern
(Ich weiß, dass es mit alpine, Evolution, KMail und mutt geht)
– …und einfach das folgende bash-Script “unpack_pgp-sigs.sh” drüber
laufen lassen:
— 8< —

#! /bin/bash

# David Huecking <d.huecking@gmx.net>, 2010-08-31
#
# Quick'n'dirty hack to unpack GPG signatures from eMails stored in mbox
# files.

counter=0
pastepgp=0
pastekey=0

# Loop over mbox file

while read line; do

# If line is
# -----BEGIN PGP MESSAGE-----
# start pasting into a new file
# msg<counter>.pgp
# until and including line
# -----END PGP MESSAGE-----

if [ "$line" == "-----BEGIN PGP MESSAGE-----" ]; then
pastepgp=1
fi

if [ $pastepgp -eq 1 ]; then
echo $line >> msg$counter.pgp
fi

if [ "$line" == "-----END PGP MESSAGE-----" ]; then
pastepgp=0

# Decrypt new msg<counter>.pgp file to
# msg<counter>
gpg msg$counter.pgp

# Extract from msg<counter> the PGP signature
# beginning and including line
# -----BEGIN PGP PUBLIC KEY BLOCK-----
# until and including line
# -----END PGP PUBLIC KEY BLOCK-----
# into new file sig<counter>.asc
while read msgline; do
if [ "$msgline" == "-----BEGIN PGP PUBLIC KEY BLOCK-----" ]; then
pastekey=1
fi

if [ $pastekey -eq 1 ]; then
echo $msgline >> sig$counter.asc
fi

if [ "$msgline" == "-----END PGP PUBLIC KEY BLOCK-----" ]; then
pastekey=0
fi

done < msg$counter

let counter+=1
fi

done < $1

— 8< —

Wenn jetzt noch ein GPG-Agent im Hintergrund läuft, wird man nur einmal
nach seinem GPG-Mantra gefragt und nach ein wenig Rödeln hat man die
PGP-Signaturen in Dateien “sig0.asc” bis “sig<n>.asc” liegen…

Diese kann man dann mit

for f in `ls *.asc`; do gpg --import $f; done

importieren und dann den Key wiederum mit

gpg --send-key

zum PGP-Server hochladen!