// Raspberry Pi: Basteln mit dem PiFace Control and Display

Neulich bin ich auf das PiFace Control and Display aufmerksam geworden. Die Erweiterungsplatine für den Raspberry Pi verfügt neben einem bequem mit Python programmierbaren Display über einen IR-Receiver, 5 Taster und einen Navigationsschalter. Die Dokumentation des Boards ist sehr ausführlich und enthält zahlreiche Beispiele.
Ich habe vor mit dem Board (und natürlich einem Pi) ein auf dem Musik Player Demon (MPD) basierenden Musikplayer zu basteln. Da ich die Hardware erst bestellt habe und noch nicht in den Händen halte, kann ich in diesem Post leider nur die beiden Komponenten – den Musikserver und das Erweiterungsboard – vorstellen und ein wenig auf die Möglichkeiten eingehen.

Hardware – PiFace Control and Display

Der IR-Receiver kann von LIRC verwendet werden, was die Hardware äußerst interessant macht. So kann der Pi prinzipiell von jeder IR-Fernbedienung aus gesteuert werden. Damit ist z.B. ein Musikplayer sehr gut realisierbar – von überall im Raum kann die Playlist gewechselt, die Musik pausiert oder die Lautstärke verändert werden.
Auch Timer (etwa nach 10min Pause) oder gar Weckzeiten könnte man damit einstellen. Mit den zusätzlich auf dem Board angebrachten Schaltern und Tastern lässt sich dies natürlich auch direkt am Pi erledigen.
Auf dem Displays des Boards können zusätzlich zahlreiche Informationen wie Musiktitel, Künstler, Lautstärke und Dauer dargestellt werden.

Musikserver – Musik Player Demon (MPD)

Musik höre ich in den eigenen 4 Wänden mit dem Musikserver Musik Player Demon (MPD). Die Software ist als Client/Server aufgebaut, wobei MPD eigentlich nur den Server bereitstellt.

  • Der Server (MPD) gibt die Musik wieder und verfügt über die Musiksammlung. Da der Server wenn möglich immer verfügbar sein sollte, macht es Sinn hier einen kleinen sparsamen Rechner zu verwenden, der außerdem passiv gekühlt/leise ist. Der Raspberry Pi erfüllt genau diese Eigenschaften und verfügt auch gleich über ein Audiointerface.
  • Der Client, der nun z.B. die Playlists erstellt und auswählt, die Lautsärke regelt, die Musik pausiert und fortsetzt, kann dann ein anderer Rechner mit entsprechender Software oder ein Smartphone mit passender App sein.

Aber auch eine Steuerung direkt auf dem Pi ist möglich und genau hier kommt nun das PiFace Control and Display zum Einsatz. Durch die zahlreichen Mensch-Maschine-Schnittstellen (IR-Fernbedienung, Taster/Schalter, Display) bietet es sich sehr gut zur Steuerung von MPD und zur Präsentation der relevanten Daten an.

Vorausblick – Wie gehts weiter?

Genug geschrieben, in der nächsten Zeit werde ich mich (sobald ich die Hardware habe) mit der Steuerung von MPD mit dem PiFace Control and Display beschäftigen …und mich in Python einarbeiten :-)
Zunächst habe ich vor einzelne Aktionen wie Pausieren der Musik oder Anpassung der Lautstärke über die Taster und später dann natürlich auch per IR-Fernbedienung zum Laufen zu bekommen. Das Display werde ich dann nach und nach einbinden. Wobei ich hier noch gespannt bin, wie das alles läuft.
Interessant ist auch die Anzeige des Wetters (siehe Beispiel) oder die Integration einer Weckerfunktion. Doch dazu in den nächsten Wochen mehr!

// Kurztipp: BIND – Cache leeren

Nachdem diese NoIP Geschichte nun doch noch ein gutes Ende genommen hatte, musste ich ein paar Backup MX-Einträge wieder zurückbiegen, die ich nach dem Domainklau durch Microsoft verbiegen durfte. In diesem Zusammenhang nochmal vielen Dank an die Redmonder ;-)
Wenn man Änderungen an DNS Records kontrollieren will, muss man wegen den Verzögerungen/Caching/TTL im Domainsystem meistens etwas warten (teilweise bis zu 24h). Ein eigener Resolver wie z.B. BIND verkürzt diese Wartezeit extrem, wenn man dessen Cache leert. Dies geht bei BIND mit dem Tool rndc:

$ sudo rndc flush       # mit Root-Rechten ausführen!

Die Änderungen kamen ca. 15min. später an! MX-Einträge lassen sich übrigens sehr gut mit nslookup oder host überprüfen:

$ nslookup -q=mx domain.tld
$ host -t mx domain.tld

// Kurztipp: Einem NIC eine weitere IP-Adresse mit IP hinzufügen

Wenn auf einem NIC (Network Interface Controller) eine weitere IP-Adresse benötigt wird, wird dies oft via Ifconfig mit einem virtuellen Interface bewerkstelligt, welches in der /etc/network/interfaces eingetragen wird:

auto eth0:1
iface eth0:1 inet static
    address 192.168.10.10
    netmask 255.255.255.0

Hier möchte als Alternative die Methode via IP kurz vorstellen. Zunächst fügen wir die IP-Adresse 192.168.10.10 mit der Subentzmaske 255.255.255.0 bzw. /24 dem Interface eth0 hinzu:

$ sudo ip addr add 192.168.10.10/24 dev eth0

…und schon ist unser Rechner über die bereits erwähnte Adresse erreichbar:

$ ip addr        #Ausgabe gekürzt
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    inet 192.168.9.10/24 brd 192.168.9.255 scope global eth0
    inet 192.168.10.10/24 scope global eth0
       valid_lft forever preferred_lft forever
 
$ ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.044 ms

Ebenfalls zu erwähnen ist, wie einfach diese Einstellung wieder wiederrufen werden kann:

$ sudo ip addr del 192.168.10.10/24 dev eth0
 
$ ip addr        #Ausgabe gekürzt
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    inet 192.168.9.10/24 brd 192.168.9.255 scope global eth0
       valid_lft forever preferred_lft forever
 
$ ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
^C
--- 192.168.10.10 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1000ms

Soll diese Einstellung nun bootfest gemacht werden, kann dies beispielsweise durch einen Eintrag in der /etc/network/interfaces geschehen, der so aussehen könnte:

#Definition von eth0
auto eth0
iface eth0 inet static
    address 192.168.9.10
    netmask 255.255.255.0
    gateway 192.168.9.1
    up ip addr add 192.168.10.10/24 dev eth0       #weitere IP-Adresse beim Start von eth0 hinzufügen
    down ip addr del 192.168.10.10/24 dev eth0     #...und beim Beenden wieder entfernen 

// Virt-resize – wenn die virtuelle Platte zu klein wird

Zur Virtualisierung einiger VMs verwende ich libvirt mit KVM. Leider waren die ursprünglichen 4GB Festplattenimage pro Ubuntu VM dann doch zu wenig. Die Debian Gäste kommen seltsamerweise bis jetzt mit 3GB aus :-)
Also musste ich die „Platten“ der VMs vergrößern. Die libvirt Doku verweist hierbei auf virt-resize. Dieses Tool ist in dem Paket libguestfs-tools enthalten und spart einem eine Menge Arbeit.

Schritt für Schritt

Zuerst muss man herausfinden, welche Partition der VM vergrößert werden soll. Dazu reicht ein einfaches df oder mount innerhalb der VM. Alternativ kann man auch vom Host aus virt-filesystems verwenden.
Nachdem man zusätzlich herausgefunden hat, wo das Image der VM liegt (z.B mit virsh dumpxml oder virsh edit), schaltet man die betroffene VM aus – keine Angst, die Prozedur dauert höchstens 5 Minuten. Wer über entsprechende Dumper für VMs verfügt (z.B. dieses Skript), könnte zuvor auch noch ein Backup des betroffenen Gastes ziehen.
Anschließend geht man wie in der Doku beschrieben vor (hier eine leicht angepasste Vorgehensweise):

$ cd /var/lib/libvirt/images                                       #In das Verzeichnis des Images wechseln
/var/lib/libvirt/images$ sudo mv VM.img VM.img.bak                 #VM.img anpassen
/var/lib/libvirt/images$ sudo truncate -r VM.img.bak VM.img
/var/lib/libvirt/images$ sudo truncate -s +3G VM.img               #Vergrößerung um 3GB
/var/lib/libvirt/images$ sudo virt-resize --expand /dev/sda1 VM.img.bak VM.img    #/dev/sda1 evtl. anpassen
Examining VM.img.bak ...
**********
 
Summary of changes:
 
/dev/sda1: This partition will be resized from 3,5G to 6,5G.  The 
    filesystem ext4 on /dev/sda1 will be expanded using the 'resize2fs' 
    method.
 
/dev/sda2: This partition will be left alone.
 
**********
Setting up initial partition table on VM.img ...
Copying /dev/sda1 ...
 100% ⟦▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓⟧ 00:00
Copying /dev/sda2 ...
 100% ⟦▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓⟧ --:--
Expanding /dev/sda1 using the 'resize2fs' method ...
 
Resize operation completed with no errors.  Before deleting the old 
disk, carefully check that the resized disk boots and works correctly.

Das schöne ist, dass hierbei auch gleich das Dateisystem der Partition (hier /dev/sda1 mit ext4) vergrößert „resized“ wird. Es ist also keine weitere Arbeit nötig. Der Gast kann sofort wieder gestartet werden.
Sollte bei dem obigen Vorgang etwas schief gelaufen sein, liegt noch ein Backup der Disk (VM.img.bak) vor. Virt-resize kann übrigens auch mit LVM umgehen – siehe Doku.

Hello World!

This is the personal website of Christoph Winkler aka chrisge.
Here you will find a sort of blog and some information about me and my projectshave fun!

Recent Comments
Latest Tweets

Follow me on Twitter...

QR-Code: aktuelle Seiten-URL
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 3.0 Unported