28.102015

Vagrantmaschine mit zweiter Festplatte

Heute wende ich mit an all jene, die mit Vagrant entwickeln und denen die synced Folder einfach zu langsam sind. Sie mögen vielleicht für kleine Projekte sinnvoll sein, aber sobald ein Projekt aus vielen Daten besteht, zeigen sich sehr schnell die Geschwindigkeitsnachteile. "Ja aber" wird jetzt vielleicht der ein oder andere denken, dann speichere ich die Daten halt in der Vagrantmaschine und gebe sie ggf. per Samba oder NFS frei. Das ist zwar schön und gut, was passiert aber mit den Daten, wenn die Vagrant-Maschine zerstört wird?

Richtig, die Daten werden ebenfalls gelöscht.

Die Lösung, die ich heute vorstellen möchte, verwendet eine zweite Festplatte, die einfach zusätzlich in der Vagrant-Maschine eingebunden wird, auf der die eigentlichen Projektdaten gespeichert werden. Ändert sich die Vagrant-Maschine oder muss sie neu erzeugt werden, so sind die Projektdaten weiterhin vorhanden. Nur halt auf einem separaten Laufwerk, dass in der Vagrant-Maschine verwendet werden muss.

Als Grundlage für meine Implementierung habe ich die aus einer Diskussion auf GitHub Gist entstandene Script-Sammlung von darrenleeweber genommen und in meiner eigenen Vagrant-Maschine verbaut.

Das einzige "Problem" der bereitgestellten Scripte, sie sind nur für die Verwendung unter Linux ausgelegt. Dieses kleine Problem, aus Sicht von Windows-Usern, kann aber auch recht einfach behoben werden, indem zum Einen das Installations-Verzeichnis von Virtualbox (unter Windows 7 64Bit: c:\Program Files\Oracle\Virtualbox\) zu den PATH-Festlegungen des Betriebssystems hinzugefügt wird und zum Anderen, das verwendete Commando zum Überprüfen, ob Virtualbox installiert ist, etwas angepasst wird.

Aus

def vbox_manage?
@vbox_manage ||= ! `which VBoxManage`.chomp.empty?
end

im Script data_disk.rb macht man einfach


def which(cmd)
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
exts.each { |ext|
exe = File.join(path, "#{cmd}#{ext}")
return exe if File.executable?(exe) && !File.directory?(exe)
}
end
return nil
end

VBOXMANAGE_EXEC="\"" + which("VBoxManage") + "\""

def vbox_manage?
@vbox_manage ||= ! which("VBoxManage").chomp.empty?
end

Dies ersetzt zuerst einmal das verwendete which-Commando durch eine Ruby-Implementierung, die sowohl unter Linux als auch Windows funktioniert. Anschliessend wird dann noch der gefundene Befehl für VBoxManage als Konstante VBOXMANAGE_EXEC gemerkt, die im weiteren Script anstelle der direkten Aufrufe von VBoxManage verwendet wird.

Beim Starten der Vagrant-Maschine ist dann zu Beachten, dass zwar beim ersten Start die Disk für die zweite Platte erzeugt wird, an die Vagrant-Maschine wird sie aber erst nach einem vagrant halt und vagrant up angehängt, da beim ersten Start der Name der Virtualbox-Maschine noch nicht feststeht.

Anschliessend kann man nun auch unter Windows mit einer zweiten Festplatte arbeiten und seine darauf gespeicherten Daten per Samba oder NFS freigeben.