Eine eigene Vagrant-Box von Grund auf erstellen
Erfahren Sie, wie Sie eigene Vagrant-Boxen für VirtualBox und VMware Fusion von Grund auf erstellen. Diese Schritt-für-Schritt-Anleitung deckt alles von der Erstellung der VM bis zum Packen ab und hilft Ihnen, schlanke, wiederverwendbare Entwicklungsumgebungen zu schaffen, die genau so funktionieren, wie Sie es brauchen.

Zunächst klären wir, was eine „.box“-Datei überhaupt ist. Eine Vagrant-„.box“ ist schlicht ein mit tar und gzip gepacktes Archiv, das mindestens die Metadateien der VM, das bzw. die Festplatten-Images sowie eine metadata.json enthält, die angibt, für welchen Provider die Box erstellt wurde. Weitere optionale Dateien, etwa ein eigenes Vagrantfile, können bei Bedarf mit in die Box gepackt werden.
Plausibilitätsprüfung
Vorab eine kurze Plausibilitätsprüfung: Die Anleitung ist allgemein gehalten und sollte mit den meisten Hosts und Gästen mit ähnlicher Konfiguration funktionieren. Getestet wurden jedoch nur die unten aufgeführten. Es gibt also keinerlei Garantie, weder ausdrücklich noch stillschweigend.
Unser Host
Dieser Artikel geht von einer Entwicklungsumgebung unter OS X aus. Sofern nicht anders angegeben, ist bei sämtlicher Software auf dem Host die OS-X-Version gemeint.
- Apple OS X Mountain Lion (10.7.5)
- VirtualBox 4.2.12
- VMware Fusion 5.0.4
- Vagrant 1.2.2
- Vagrants VMware-Fusion-Provider 0.6.3 mit gültiger Lizenz.
Mögliche Gäste
Alle getesteten Gäste sind 64-Bit-Linux-Distributionen.
- CentOS 6.4
- Debian 7.0
- Scientific Linux 6.4
- Ubuntu 12.10 Desktop
- Ubuntu 12.10 Server
Die virtuelle Maschine erstellen
Starten Sie zunächst die Virtualisierungssoftware und erstellen Sie eine VM, auf der unsere Vagrant-Box basieren wird. Für die Definition der VM werden folgende Konfigurationsoptionen empfohlen:
VirtualBox
Erstellen Sie in VirtualBox eine neue VM:
- Name: vagrant-<distro><arch>, z. B. vagrant-centos64
- Typ: Linux
- Version: <distro> (64-bit)
- Speichergröße: 1024MB*
- Neue virtuelle Festplatte:
- Typ: VMDK (dynamisch alloziert)
- Maximale Größe: 40GB
Passen Sie die Einstellungen der VM an:
- Audio deaktivieren
- USB deaktivieren
- Sicherstellen, dass Netzwerkadapter 1 auf NAT eingestellt ist
- Eine Portweiterleitungsregel wie folgt hinzufügen:
- Name: SSH
- Protokoll: TCP
- Host-IP:
- Host-Port: 2222
- Gast-IP:
- Gast-Port: 22
- Das ISO-Image der Linux-Distribution einbinden
VMware Fusion
Erstellen Sie mit dem Assistenten eine neue virtuelle Maschine:
- Wählen Sie „Continue without disc“
- Wählen Sie „Choose a disc or disc image…“
- Suchen Sie das ISO-Image der Distribution, die Sie installieren möchten, und wählen Sie „Open“
- Deaktivieren Sie das Kontrollkästchen „Use Easy Install“
- Wählen Sie „Customize Settings“
- Geben Sie einen Namen für die VMware-Datei ein und wählen Sie „Save“
Passen Sie die Einstellungen der VM an:
- Gemeinsame Ordner (Shared Folders) aktivieren
- Das Netzwerk auf Internet Sharing > Share with my Mac (also NAT) umstellen
- Die Festplattengröße auf 40 GB ändern und „Split into 2GB files“ deaktivieren
- Die Soundkarte deaktivieren
- „Share Bluetooth devices with Linux“ deaktivieren
Das Gastbetriebssystem installieren
Starten Sie die VM, installieren Sie das Gastbetriebssystem und passen Sie bei den entsprechenden Abfragen folgende Einstellungen an:
- Hostname: vagrant-<distro><arch>
- Root-Passwort: vagrant
- Vollständiger Name: vagrant
- Benutzer: vagrant
- Passwort: vagrant
Das Gastbetriebssystem einrichten
Dies sind die minimal nötigen Schritte, um Ihr Gastbetriebssystem startklar zu machen. Ich persönlich empfehle, Ihre Box nicht mit unnötigen Extras zu überfrachten. Zusätzliche Softwarepakete lassen sich mit einem Provisioning-Tool hinzufügen. So bleibt Ihre Basis-Box über Projekte oder Teams hinweg wiederverwendbar.
Die sudoers-Datei anpassen
Der Benutzer vagrant erledigt die ganze Arbeit für uns. Er benötigt sudo-Rechte ohne Passwort und muss ohne TTY (ein Terminal) laufen können.
Da die meisten Linux-Distributionen nur den Benutzer root der sudoers-Gruppe zuordnen, müssen wir unseren Benutzer vagrant zur sudoers-Datei hinzufügen. Das müssen wir als root erledigen:
$ su -
$ visudo
Ubuntu-Distributionen fügen den während der Installation angelegten Benutzer der sudoers-Liste hinzu. Obwohl der Benutzer damit sudo-Rechte hat, müssen wir die Einstellungen dennoch anpassen.
Fügen Sie die folgenden Zeilen hinzu bzw. ändern Sie sie bei Bedarf:
Defaults:vagrant !requiretty
#Defaults !visiblepw
Defaults env_keep = "SSH_AUTH_SOCK"
vagrant ALL=NOPASSWD: ALL
Speichern Sie die Änderungen und beenden Sie Ihren Editor. Verlassen Sie bei Bedarf die Root-Shell. Der Benutzer vagrant sollte sudo nun ohne Passwort verwenden können. Überprüfen Sie das, indem Sie folgenden Befehl im Terminal ausführen:
$ sudo pwd
Pakete aktualisieren
An dieser Stelle empfiehlt es sich, die installierten Pakete zu aktualisieren.
RHEL6
$ sudo yum update -y
Debian
$ sudo apt-get upgrade -y
Starten Sie die VM nach Abschluss der Updates neu, damit diese korrekt übernommen werden. Mit folgendem Befehl im Terminal wird die VM sofort neu gestartet:
$ sudo shutdown -r now
Vagrants unsicheren Schlüssel herunterladen
Unser Benutzer vagrant verwendet einen SSH-Schlüssel, um autorisierten Zugriff auf die Box zu erhalten.
$ mkdir -p /home/vagrant/.ssh
$ chmod 0700 /home/vagrant/.ssh
$ wget --no-check-certificate
https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
-O /home/vagrant/.ssh/authorized_keys
$ chmod 0600 /home/vagrant/.ssh/authorized_keys
$ chown -R vagrant /home/vagrant/.ssh
OpenSSH Server installieren und konfigurieren
Der Benutzer vagrant greift per SSH auf die Box zu und konfiguriert sie.
RHEL6
$ sudo yum install -y openssh-server
$ sudo chkconfig sshd on
Debian
$ sudo apt-get install -y openssh-server
Bearbeiten und aktualisieren Sie die Konfiguration des OpenSSH Servers.
$ sudo vi /etc/ssh/sshd_config
Fügen Sie die folgenden Zeilen hinzu bzw. ändern Sie sie:
Port 22
PubKeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication no
Speichern und schließen Sie die Datei. Starten Sie den SSH-Dienst neu.
RHEL6
$ sudo service sshd restart
Debian
$ sudo service ssh restart
Gasterweiterungen installieren
Die Gasterweiterungen der virtuellen Maschine sorgen für bessere Performance und eine komfortablere Verwaltung des Gastbetriebssystems. Vagrant nutzt sie außerdem, um Freigaben zwischen Host- und Gastbetriebssystem einzurichten.
Bevor wir die Guest Additions bzw. VMware Tools installieren, benötigen wir zusätzliche Entwicklungspakete, damit sich die Tools korrekt kompilieren und installieren lassen.
RHEL6
$ sudo yum install -y gcc make kernel-devel
Debian
# Server
$ sudo apt-get install -y gcc build-essential linux-headers-server
# Desktop
$ sudo apt-get install -y gcc build-essential linux-headers-$(uname -r)
Installieren Sie als Nächstes die Gasterweiterungen für die jeweilige Virtualisierungssoftware.
VirtualBox
Binden Sie zunächst die Guest Additions ein. Wählen Sie dazu in der Menüleiste Devices > Install Guest Additions…
$ cd /media/VBOXADDITIONS_4.2.12_84980
$ sudo ./VBoxLinuxAdditions.run
$ sudo umount /media/VBOXADDITIONS_4.2.12_84980 | cd ~
VMware Fusion
Binden Sie zunächst die VMware Tools ein, indem Sie in der Menüleiste Virtual Machines > Install VMware Tools wählen.
$ sudo mkdir -p /mnt/cdrom
$ sudo mount /dev/cdrom /mnt/cdrom
$ tar xzvf /mnt/cdrom/VMwareTools-9.2.2-893683.tar.gz -C /tmp
$ cd /tmp/vmware-tools-distrib/
$ sudo ./vmware-install.pl
Aufräumen
Bevor wir die Box packen, räumen wir sie auf, um ihre Größe zu minimieren.
RHEL6
$ sudo yum clean all
Sobald Sie mit dem Zustand der VM zufrieden sind, fahren Sie sie herunter, um sie für das Packen vorzubereiten.
$ sudo shutdown -h now
Die Box packen
Beim Packen der VM entsteht die zuvor beschriebene .box-Datei.
VirtualBox
Vagrant erstellt die .box-Datei in dem Verzeichnis, in dem der Befehl vagrant package ausgeführt wird. Wenn die Box an einem bestimmten Ort erstellt werden soll, wechseln Sie vor dem Ausführen von vagrant package in dieses Verzeichnis. Im folgenden Beispiel packen wir einen CentOS-Gast.
$ mkdir -p ~/workspace/centos64/
$ cd ~/workspace/centos64/
$ vagrant package --base vagrant-centos64
VMware Fusion
Bei VMware Fusion ist zum Packen unserer VM etwas mehr Handarbeit nötig. Im Terminal:
Navigieren Sie zum Speicherort Ihrer vmwarevm. Standardmäßig ist das ~/Virtual Machines/.
Klicken Sie mit der rechten Maustaste auf die .vmwarevm-Datei und wählen Sie „Show Package Contents“
Erstellen Sie eine Datei namens metadata.json mit folgendem Inhalt:
{"provider": "vmware_fusion"}
- Erstellen Sie eine Datei namens Vagrantfile mit folgendem Inhalt:
# -*- mode: ruby -*-
# vi: set ft=ruby
Vagrant.configure("2") do |config|
config.vm.provider :vmware_fusion do |v, override|
v.gui = true
end
end
- Als Nächstes optimieren wir die Box, um ihre Größe zu reduzieren:
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -d Virtual Disk.vmdk
$ /Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager -k Virtual Disk.vmdk
- Zum Schluss komprimieren Sie die Box:
$ tar cvzf package.box ./*
Die Box testweise starten
$ vagrant box add testbox package.box
$ vagrant init testbox
$ vagrant up
War die Erstellung Ihrer Box erfolgreich, gibt vagrant up Folgendes aus:
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'testbox'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
Um sich vom Host aus am Gast anzumelden, führen Sie Folgendes aus:
$ vagrant ssh