08 Dez

Datum von Bilddateien anhand der EXIF Information setzen

Der folgende Befehl sucht alle im aktuellen Ordner befindlichen JPG-Dateien, liest aus dessen EXIF-Daten das Aufnahmedatum des Fotos aus und setzt den Timestamp der Dati auf das ausgelesene Datum:

find -name '*.jpg' -o -name '*.jpeg' -o -name '*.JPG' -o -name '*.JPEG' | while read PIC; do
 DATE=$(exiftool -p '$DateTimeOriginal' $PIC |
 sed 's/[: ]//g')
 touch -t $(echo $DATE | sed 's/\(..$\)/\.\1/') $PIC
 mv -i $PIC $(dirname $PIC)/$DATE.jpg
 done

WICHTIG: Vor der Ausführung sollte man für alle Fälle ein Backup haben!

05 Okt

Zimbra – externe Accounts über (selbst-signiertes) SSL

Um bei Zimbra einen externen Account anzubinden, welcher über SSL angesteuert werden soll und das Zertifikat auf der anderen Seite selb-signiert ist, müssen folgende Optionen auf dem Server gesetzt sein:

Für pop3:

su - zimbra
zmlocalconfig -e javamail_pop3_enable_starttls=false

Für imap:

su - zimbra
zmlocalconfig -e javamail_imap_enable_starttls=false

dann:

zmlocalconfig -e ssl_allow_untrusted_certs=true
zmlocalconfig -e data_source_trust_self_signed_certs=true
zmmailboxdctl restart

21 Sep

KVM: Windows VM mit eigener Grafikkarte und 3D-Beschleunigung

Wer kennt das Problem nicht? Zum arbeiten, surfen, musik hören und viele weitere Dinge möchte man seine lieblings Linux-Distribution nutzen.

Ab und an möchte man allerdings auch gerne mal zocken und stößt dabei auf die fehlende Linux-Unterstützung bei den gewünschten Spielen.
Auch wenn es immer mehr Spiele für Linux gibt, kann man viele Klassiker und Neuheiten nur über Umwege (z. B. per WINE) benutzen, was aus meiner Sicht eigentlich immer mehr Aufwand verursacht hat, als das es Nutzen bringt.

Bisher hatte man eigentlich nur  folgende zwei Möglichkeiten:

  • Einrichten von Dual-Boot, um bei Bedarf ein Windows starten zu können
  • und einen weiteren Rechner, welcher ein Windows installiert hat.

Aus meiner Sicht sind beide dieser Möglichkeiten umständlich, oder teuer.

Wer kennt es nicht? – Beim booten gerade mal was zu trinken holen – und schon hat man den Bootloader verpasst, bei dem man Windows hätte auswählen müssen und darf von vorne beginnen…

Die Abhilfe – vfio!

Seit der Kernel-Version 3.9 wird VGA-Passthrough durch das vfio Modul unterstüzt, was es einem erlaubt eine Grafikkarte an eine virtuelle Maschine durchzuschleifen und somit in einer virtualisierten Windows-Umgebung zocken zu können – Wahnsinn!

Folgend beschreibe ich mein Vorgehen für die Einrichtung von vfio, sowie die VM-Installation und Konfiguration.
Die kleine Anleitung ist für ein XUbuntu 14.04 (Trusty Tahr) 64 Bit.

Requirements

Damit dieses Feature genutzt werden kann, benötigt man Hardware, die sowohl Hardware-Virtualisierung, als auch IOMMU unterstützt (Diese müssen ggf zunächst im BIOS aktiviert werden).
HINWEIS: Eine durchgereichte Grafikkarte ist vom Hauptsystem nicht nutzbar, da sie komplett von der Ziel-VM belegt wird. Also sollte man zwei Grafikkarten verbauen.

Module laden

Die folgende Liste beinhaltet alle benötigten Module (/etc/modules):

pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel

HINWEIS: Hat man eine AMD CPU, muss kvm_intel durch kvm_amd ersetzt werden (no shit?)

grub Konfiguration

Damit iommu aktiviert wird, muss die grub cmdline angepasst werden (/etc/default/grub):

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1"

HINWEIS: Hat man eine AMD CPU, muss intel_iommu=on durch amd_iommu=on ersetzt werden.

Grafikkarte blacklisten

Damit das Host-Betriebssytem die Grafikkarte für die Windows-VM nicht selbst benutzt, muss diese geblacklistet werden. Dazu wird die ID der entsprechenden Karte benötigt, welche man über lspci -nn herausfinden kann:

[...]
02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106 [GeForce GTX 660] [10de:11c0] (rev a1)
02:00.1 Audio device [0403]: NVIDIA Corporation GK106 HDMI Audio Controller [10de:0e0b] (rev a1)
05:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106 [GeForce GTX 650 Ti] [10de:11c6] (rev a1)
05:00.1 Audio device [0403]: NVIDIA Corporation GK106 HDMI Audio Controller [10de:0e0b] (rev a1)
[...]

Die IDs für Grafikkarte und Audio (HDMI) gehören komma getrennt nach /etc/initramfs-tools/modules:

pci_stub ids=10de:11c0,10de:0e0b

Anschließend werden die Änderungen mit dem Befehl

update-initramfs -u

bekannt gegeben. Nach einem Neustart, dürfte die Grafikkarte nicht mehr vom System genutzt werden.

vfio Konfiguration

Für jede Grafikkarte wird eine eigene Konfigurationsdatei benötigt, welche unter /etc/vfio_<CUSTOM_NAME>.cfg gespeichert wird.

Jede Datei beinhaltet lediglich die PCI Adresse der jeweiligen Karte, die ebenfalls mit dem Befehl lspci -nn abgefragt werden kann:

[...]
02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106 [GeForce GTX 660] [10de:11c0] (rev a1)
02:00.1 Audio device [0403]: NVIDIA Corporation GK106 HDMI Audio Controller [10de:0e0b] (rev a1)
05:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106 [GeForce GTX 650 Ti] [10de:11c6] (rev a1)
05:00.1 Audio device [0403]: NVIDIA Corporation GK106 HDMI Audio Controller [10de:0e0b] (rev a1)
[...]

In diesem Fall handelt es sich um die Adressen 02:00.0 und 02:00.1, welche in nach /etc/vfio_1.cfg geschrieben werden (Man beachte die vier führenden Nullen)

0000:02:00.0
0000:02:00.1

Start Skript

Man legt eine Datei unter /usr/sbin/start_windows_vm an, welche folgenden Inhalt hat:

#!/bin/bash

configfile=/etc/vfio_1.cfg

vfiobind() {
    dev="$1"
        vendor=$(cat /sys/bus/pci/devices/$dev/vendor)
        device=$(cat /sys/bus/pci/devices/$dev/device)
        if [ -e /sys/bus/pci/devices/$dev/driver ]; then
                echo $dev > /sys/bus/pci/devices/$dev/driver/unbind
        fi
        echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id
   
}

modprobe vfio-pci

cat $configfile | while read line;do
    echo $line | grep ^# >/dev/null 2>&1 && continue
        vfiobind $line
done

qemu-system-x86_64 -display none -enable-kvm -M q35 -m 4096 -cpu host,kvm=off \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/qemu/bios.bin -vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=02:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=02:00.1,bus=root.1,addr=00.1 \
-device ahci,id=ahci0 \
-drive if=none,file=/dev/sdb,id=drive-sata0-0-0,format=raw \
-device ide-drive,bus=ahci0.0,drive=drive-sata0-0-0,id=sata0-0-0 \
-device virtio-net-pci,netdev=net0,mac=AA:BB:CC:DD:EE:FF -netdev tap,id=net0 \
-drive file=/tmp/windows.iso,id=isocd -device ide-cd,bus=ide.1,drive=isocd \
-usb -usbdevice host:046d:c30e -usbdevice host:046d:c068 \
-boot menu=on

exit 0

Alle fett geschriebenen Einstellungen sind auf die eigene Umgebung und an die eigenen Bedürfnisse anzupassen:

  • -display none
    versteckt das qemu Fenster
  • -m 4096
    Die größe des Arbeitsspeichers in MB
  • kvm=off
    Diese Einstellung verhindert, dass der Grafiktreiber innerhalb der VM erkennt, dass es sich um eine virtuelle Maschine handelt. Die neueren NVIDIA Treiber verhindern andernfalls die korrekte Ausführung.
  • -smp 4,sockets=1,cores=4,threads=1
    Die Anzahl der zu verwendenen CPUs, Sockets, Kerne und Threads
  • host
    Die PCI-Adresse der Grafikkarte und des ggf zugehörigen HDMI Audio Devices
  • file=/dev/sdb
    Die Festplatte, die man der VM zuweisen möchte. Natürlich kann auch ein zuvor erstelltes Image benutzt werden (worauf ich in dieser Anleitung jedoch nicht eingehen möchte, weil es genügend Anleitungen dazu zu finden gibt).
  • mac=AA:BB:CC:DD:EE:FF
    Eine eindeutige MAC Adresse für die Netzwerkkarte der VM
  • file=/tmp/windows.iso
    Beschreibt den Pfad zum Windows Installations-Image, von dem beim ersten Start installiert wird.
    ANMERKUNG: möchte man virtio Treiber nutzen, so müssen diese zunächst bei der Windows-Installation geladen werden (man kann problemlos mehrere Laufwerke auf gleiche Weise mit unterschiedlichen ISO-Dateien einbinden). Da die 64-Bit Treiber nicht signiert sind, muss man mit der 32-Bit Version Vorlieb nehmen, oder diese selber signieren.
  • host:XXXX:YYYY
    Die ID der Maus, bzw. Tastatur, welche ebenfalls über lsusb ermittelt werden kann:

    [...]
    Bus 004 Device 003: ID 046d:c068 Logitech, Inc. G500 Laser Mouse
    Bus 004 Device 002: ID 046d:c30e Logitech, Inc. UltraX Keyboard (Y-BL49)
    [...]
    

    Natürlich können auch beliebig weitere USB-Geräte weitergeleitet werden, indem man einfach die entsprechende ID hinzufügt.

Anschließend muss die Datei noch ausführbar gemacht werden:

chmod +x /usr/sbin/start_windows_vm

qemu bauen

Wie bereits erwähnt, benötigen wir für beispielsweise NVIDIA Treiber das Argument kvm=off.
Diese Option ist in der qemu-Version von Ubuntu nicht mit einkompiliert, womit wir qemu selber bauen müssen:

  1. Abhängigkeiten installieren:
    sudo apt-get install git build-essential bzr bzr-builddeb cdbs \
        debhelper devscripts dh-make diffutils dpatch fakeroot \
        gnome-pkg-tools gnupg liburi-perl lintian patch patchutils \
        pbuilder piuparts quilt ubuntu-dev-tools wget \
        qemu libglib2.0-dev libsdl1.2-dev \
        libjpeg-dev libvde-dev libvdeplug2-dev libbrlapi-dev \
        libaio-dev libfdt-dev texi2html texinfo info2man pod2pdf \
        libnss3-dev libcap-dev libattr1-dev gcc-4.6-multilib \
        libpixman-1-dev
  2. qemu Quellen laden:
    git clone git://git.qemu-project.org/qemu.git
  3. Configure:
    ./configure \
        --prefix=/usr \
        --disable-tcg-interpreter \
        --enable-trace-backend=nop \
        --disable-debug-tcg \
        --target-list=i386-softmmu,x86_64-softmmu \
        --enable-kvm
  4. Bauen:
    make -j6

    -j6 beschreibt mit wievielen CPU Kernen gebaut werden soll.

  5. Installation abschließen und in die richtigen Pfade kopieren:
    make install

VM starten

Hat alles geklappt, so kann man die VM mit dem Befehl start_windows_vm booten und die Ausgabe auf dem Bildschirm sehen, welcher an der durchgeschliffenen Grafikkarte hängt.

Fazit

Ein Traum wird wahr – Nach der Einrichtung der neuen Windows VM kann ich endlich mit nur einem Rechner all meine Spiele mal eben zocken wenn mir danach ist, indem ich nur den Befehl sudo start_windows_vm ausführe.
Parallel ist das gewohnte Benutzen des Linux-Systems weiterhin möglich.

Benchmark

Vor der Einrichtung von qemu + vfio habe ich auf der nativen Windows-Installation die Demo von 3DMARK laufen lassen und eine Punktzahl von 4443 Punkten erzielt.
Nachdem die VM eingerichtet war, habe ich den Test wiederholt und 4332 Punkte erreicht und somit lediglich eine Effiktivität von ca 97,5% im Vergleich zum nativen System.
Ich denke dieses Ergebnis darf sich sehen lassen.

Quellen

 

20 Sep

XFCE4 – Spotify Media Tasten

Um die nativen Keyboard-Media Tasten für Spotify unter xfce zu nutzen, legt man sich einfach folgende Shortcuts an (Menü -> Einstellungen -> Tastatur -> Tastenkürzel für Anwendungen):

  • Next:
    dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next
  • Prev:
    dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous
  • Play/Pause:
    dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
  • Stop:
    dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Stop

spotify_media_keys_settings

23 Feb

Raspberry PI als Backup-Server

Der Raspberry PI (RPI) eignet sich wunderbar als Backup-Server, welcher in gewünschten Abständen inkrementelle Sicherungen von beliebigen Zielen anfertigt.

Vorbereitung

Als Verwaltungs-Software für die Backups kommt die Open-Source Lösung „Dirvish“ zum Einsatz, welches auf „rsync“ aufsetzt.

Netzwerk AufbauDiese Anleitung geht von der Nutzung in einem lokalen Netzwerk aus und verzichtet daher auf eine sichere (verschlüsselte) Übertragung der zu sichernden Daten über beispielsweise SSH.Stattdessen wird ein rsync-Daemon auf den zu sichernden Systemen vorausgesetzt. Wie dieser eingerichtet wird, kann unter Anderem hier nachgelesen werden.

Benötigt wird:

  • ein Raspberry PI natürlich
  • eine ca. 2GB große SD-Karte
  • die aktuelle Version des Betriebssystems „Raspbian
  • eine externe (USB-) Festplatte mit externer Stromversorgung

Raspberry PI einrichten

Nach dem Download des Raspbian Images, muss dieses mit folgendem Befehl auf die SD-Karte kopiert werden:

dd bs=1M if=<PATH_TO_RASPBIAN.img> of=/dev/sdX

Dadurch wird die SD Karte mit Raspbian beschrieben und ist anschließend nutzbar.

Ist der RPI erst gestartet und das Abarbeiten der Punkte in dem Setup Wizard erledigt, geht es an die Installation des Pakets „dirvish“ mit folgendem Befehl:

sudo aptitude install dirvish

Damit ist bereits die gesamte benötigte Software installiert. Im nächsten Schritt muss die USB Festplatte (automatisch) gemountet werden. Dazu muss die Datei „/etc/fstab“ angepasst werden, indem folgende Zeile angefügt wird:

/dev/sdX    /backup    ext4    defaults    0    0

Dabei muss „/dev/sdX“ durch den dev-Pfad der USB Festplatte ersetzt werden. Diesen bekommt man beispielsweise mit dem Befehl „fdisk -l“ heraus.

Einrichten von Dirvish

Die grundlegende Konfiguration von Dirvish geschieht in der Datei „/etc/dirvish/master.conf“, welche angepasst, bzw. erstellt werden und folgenden Inhalt aufweisen muss:

bank:
                /backup

xdev:           1
index:          gzip
image-default:  %Y%m%d_%H-%M
exclude:
                lost+found/
                core
                .nfs*
                *.tmp
                *.TMP
                .recycle/

Runall:
                fotos

expire-default: +30 days

expire-rule:
#       Min     Hour    DayoM   Mon     DayoW   STRFTime_FMT
        *       *       1       *       *       +3 months

Erklärung der Einträge der master.conf

bank: …

Beinhaltet den Pfad, indem sich später sämtliche Backups befinden.

xdev: 1

Gibt an, dass symbolischen Links gefolgt werden soll (0 = deaktiviert)

index: gzip

Gibt an, dass die Daten gzip-komprimiert abgelegt werden sollen

exclude: …

Gibt zeilenweise an, welche Dateien, bzw. Ordner, per se vom Backup ausgeschlossen werden sollen.

Runall: …

Hier werden zeilenweise alle Backup-Jobs angegeben, welche später noch erstellt werden.

expire-default: +30 days

Sagt aus, wie lange die getätigten Backups (wenn nicht anders definiert) vorgehalten werden sollen, bevor sie gelöscht werden. In diesem Fall werden Backups, welche älter als 30 Tage sind gelöscht.

expire-rule: …

Hier können konkrete Ablaufzeiten angegeben werden. Das angegebene Beispiel hält alle Backups, die am 1. eines Monats durchgeführt wurden 3 Monate vor.

 

Als nächstes muss für jedes Ziel ein Backup-Job erstellt werden. Dazu wird jeweils ein Ordner im Backup-Verzeichnis, hier „/backup/“ angelegt:

sudo mkdir /backup/backup_job_01

Damit Dirvish den Ordner händeln kann, muss ein Unterordner „dirvish“ mit beinhaltender Konfigurationsdatei „default.conf“ angelegt werden:

sudo mkdir /backup/backup_job_01/dirvish/
touch default.conf

Die Konfigurationsdatei muss nun folgende drei Zeilen beinhalten:

client:        <USER>@<HOSTNAME>
tree:          :<RSYNC_FREIGABE>/<PFAD>
password-file: /backup/password
exclude:
               lost+found/

Erklärung der Einträge der default.conf

client: …

Beinhaltet die Angaben für den Benutzernamen und Hostnamen, bzw. IP des Zielrechners, den es zu sichern gilt. Der Benutzername bezieht sich auf den angelegten des rsync-Daemons.

tree: …

Hier wird der zu sichernde Zielordner angegeben. Dabei bezieht sich „<RSYNC_FREIGABE>“ auf den Eintrag des rsync-Dameons.

password-file: …

Wenn der rsync-Daemon mit einem Passwort versehen wurde, kann man hier den Pfad einer Passwort-Datei angeben, welcher das benötigte Kennwort als Klar-Text beinhaltet.

Zu beachten ist, dass die Passwort-Datei die Rechte 600 haben muss:

sudo chmod 600 /backup/password

exclude: …

Wie auch in der globalen „master.conf“-Datei handelt es sich bei diesem Abschnitt um eine zeilenweise Angabe von zu ignorierenden Dateien, bzw. Ordnern. Die hier angegebenen Elemente werden bei der Sicherung also nicht berücksichtigt.

 

Initialisierung eines Backup-Jobs

Jeder Backup-Job muss nach dem Anlegen einmalig initialisiert werden. Bei diesem Vorgang wird ein „Full-Backup“ durchgeführt, was je nach Größe eine sehr lange Zeit in Anspruch nehmen kann. Die Initialisierung wird durch folgenden Befehl angestoßen:

dirvish --vault backup_job_01 --init

Dieser Vorgang muss für jedes Backup-Ziel wiederholt werden, sodass am Ende ein Ordner für jedes zu sichernde Objekt vorhanden ist.

Der Befehl „dirvish-expire“ sorgt nun dafür, dass alte Backups gelöscht werden, sofern sie den Kriterien aus den oben beschriebenen Einstellungen entsprechen.

Der Befehl „dirvish-runall“ startet alle in der „master.conf“ eingetragenen Jobs (Abschnitt „Runall“).

Die Backups sollten nun eingerichtet sein. Eine automatische Ausführung ist bereits täglich vom Paket her vorgesehen.