Logitech Media Server mit Raspberry Pi 3 B+ und 3.2″ TFT Display

Meine Begeisterung vom Squeezebox Ökosystem begann schon vor etlichen Jahren. Die erste Squeezebox habe ich mir 2005 zugelegt. Es war eine Squeezebox2 mit sehr gut lesbarer Vakuum-Fluoreszenzanzeige und tollem Klang dank hochwertigem Digital-Analog-Wandler. Damals hieß die Firma noch Slim Devices, wurde aber 2006 von Logitech übernommen. Es folgten noch einige sehr interessante Geräte, aber 2012 stellte Logitech die Produktion der Squeezeboxen leider ein. Seitdem gibt es die Geräte nur noch gebraucht zu kaufen oder solche vom Typ Eigenbau. Ich bin dem System bis heute treu geblieben, da ich noch nichts Vergleichbares gefunden habe, dass auch nur annähernd so praktisch und flexibel ist. 

Der Logitech Media Server, früher auch SlimServer, SqueezeCenter oder Squeezebox Server genannt, ist das Herz des Squeezebox Ökosystems. Da er von Slim Devices von Anfang an als Open Source zur Verfügung gestellt wurde, wird die Software bis heute noch weiterentwickelt. Mein Server läuft inzwischen schon einige Jahre auf einem Raspberry Pi 3 B+ problemlos vor sich hin. Jetzt möchte ein guter Freund von mir auch einen günstigen Squeezebox Server installieren, was mich auf die Idee gebracht hat, eine kleine Anleitung dafür zu schreiben.

Hardware

Für einen Logitech Media Server sind im Grunde nicht sehr viele Bauteile nötig, einige davon liegen vielleicht sogar ungenutzt schon irgendwo herum. Die Liste ist daher auch nicht besonders lang. Das Display ist nur eine kleine Spielerei und eigentlich nicht nötig:

  • Raspberry Pi 3 B+ mit passendem Netzteil
  • microSD Karte, 8GB oder größer
  • externe USB Disk, Größe je nach Umfang der Musiksammlung
  • Waveshare 3.2" TFT Display
  • Joy-it 3.2" Display-Gehäuse

Bauteile für Logitech Media Server

Das Display wird einfach auf die GPIO Ports des Raspberry gesteckt und anschließend das Gehäuse zusammengesteckt. Das Ganze dauert keine 5 Minuten. Zum Gehäuse gibt es auch eine Anleitung auf der JOY-IT Webseite.

Installation Raspberry Pi OS

Im nächsten Schritt wird das Betriebssystem des Raspberry Pi installiert. Für den Logitech Media Server würde eigentlich das Raspberry Pi OS Lite ausreichen. Da ich jedoch noch einen Systemmonitor installieren werde, der den Desktop benötigt, brauche ich folglich das Raspberry Pi OS with desktop. Die Installation erfolgt am Einfachsten mit dem Raspberry Pi Imager. Die derzeitig aktuelle Version ist Debian Buster.

Raspberry Pi Imager

Nachdem das Betriebssystem auf die SD Karte geschrieben ist, muss die Karte noch vorbereitet werden, damit sich der Raspberry mit dem WLAN verbinden kann und ein Zugang per SSH möglich ist. Dazu entfernt man die Karte kurz und schiebt sie wieder in den PC. Jetzt sollte ein neues Laufwerk mit der /boot Partition der SD Karte verfügbar sein. 

Zur Konfiguration des WLANs wird eine Datei mit dem Namen wpa_supplicant.conf und folgendem Inhalt auf die Karte kopiert. Die Felder für das Land, SSID und Passwort müssen entsprechend angepasst werden.

country=XX
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
       ssid="WLAN_NAME"
       psk="WLAN_PASSWORT"
       key_mgmt=WPA-PSK
}

Für den SSH Zugriff muss lediglich eine leere Datei mit dem Namen ssh auf die Karte kopiert werden.

Jetzt kann die SD Karte in den Raspberry Pi gesteckt und der Rechner gebootet werden. Nach dem Bootvorgang kann man am Router kontrollieren, ob der Raspberry korrekt gestartet hat und welche IP Adresse er hat. Er erscheint in der Liste der Verbindungen unter dem Namen raspberrypi. Dann kann man sich (am einfachsten mit PuTTY) per SSH auf dem Raspberry mit dem Default Login pi/raspberry einloggen.

Es empfiehlt sich, zunächst das Default Passwort zu ändern und anschließend das System mit den Kommandos

sudo apt-get update
sudo apt-get upgrade

auf den neuesten Stand zu bringen. Das kann einige Minuten dauern. Zuletzt wird noch die Zeitzone auf den passenden Wert gesetzt. In meinem Fall ist das

sudo timedatectl set-timezone Europe/Vienna

Die Liste der verfügbaren Zeitzonen liegt im Verzechnis /usr/share/zoneinfo.

Display Treiber

Der Display Treiber wird mit den folgenden Kommandos installiert:

git clone https://github.com/waveshare/LCD-show.git
cd LCD-show
chmod +x LCD32-show
sudo ./LCD32-show

Am Ende startet der Raspberry neu und sollte dann wie folgt aussehen:

Raspberry Pi Desktop

Optimierungen

Zunächst wird der Hostname des Raspberry geändert:

sudo hostname -b SqueezeboxServer
sudo hostnamectl set-hostname SqueezeboxServer
sudo reboot

Danach sollte der Rechner auch am Router unter dem Namen SqueezeboxServer erscheinen.

Es folgen einige Änderungen, um die Lebensdauer der SD Karte zu verlängern, indem die Schreibzugriffe verringert werden. Zunächst wird das Swapping deaktiviert:

sudo service dphys-swapfile stop
sudo systemctl disable dphys-swapfile
sudo apt-get purge dphys-swapfile

Anschließend erfolgt noch ein Eintrag in /boot/cmdline.txt. Der Editor wird mit

sudo nano /boot/cmdline.txt

gestartet. Am Ende der Zeile wird die Option noswap angefügt. Die ganze Zeile schaut dann so aus:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo noswap

Um zu verhindern, dass Logfiles auf die SD Karte geschrieben werden, können temporäre Verzeichnisse in den Arbeitsspeicher verlagert werden. Dazu wird die Datei /etc/fstab mit

sudo nano /etc/fstab

bearbeitet und sollte danach folgendermaßen aussehen:

proc            /proc           proc    defaults          0       0
PARTUUID=afd7b074-01  /boot           vfat    defaults,noatime  0       2
PARTUUID=afd7b074-02  /               ext4    defaults,noatime  0       1

# Log to RAM
tmpfs   /tmp            tmpfs   defaults,noatime,nosuid,mode=1777,size=256m 0 0
tmpfs   /var/log        tmpfs   defaults,noatime,nosuid,mode=0755,size=128m 0 0
tmpfs   /var/tmp        tmpfs   defaults,noatime,nosuid,mode=0755,size=128m 0 0

# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

Nach einem Reboot können die Anpassungen mit dem Kommando

df -h

überprüft werden. Das Ergebnis sollte etwa wie folgt aussehen:

pi@SqueezeboxServer:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  3.2G   25G  12% /
devtmpfs        430M     0  430M   0% /dev
tmpfs           463M     0  463M   0% /dev/shm
tmpfs           463M  6.3M  456M   2% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           463M     0  463M   0% /sys/fs/cgroup
tmpfs           128M     0  128M   0% /var/tmp
tmpfs           256M  4.0K  256M   1% /tmp
tmpfs           128M  216K  128M   1% /var/log
/dev/mmcblk0p1  253M   48M  205M  19% /boot
tmpfs            93M  4.0K   93M   1% /run/user/1000

Externe Festplatte mounten

Die externe Festplatte soll in einem definierten Verzeichnis automatisch gemountet werden. Als Filesystem verwende ich exFAT, damit auch Dateien, die größer als 4GB sind, gespeichert werden können. Zunächst wird das Verzeichnis erstellt und notwendige Pakete installiert:

sudo mkdir /media/usb-drive
sudo chown pi:pi /media/usb-drive/
sudo apt-get install exfat-fuse
sudo apt-get install exfat-utils

Jetzt wird die externe USB Festplatte angeschlossen. Mit dem Kommando

sudo blkid

werden die verfügbaren Partitionen angezeigt. Die Liste schaut beispielsweise folgendermaßen aus:

/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="7616-4FD8" TYPE="vfat" PARTUUID="afd7b074-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="87b585d1-84c3-486a-8f3d-77cf16f84f30" TYPE="ext4" PARTUUID="afd7b074-02"
/dev/mmcblk0: PTUUID="afd7b074" PTTYPE="dos"
/dev/sda1: LABEL="Music" UUID="9292-2EB8" TYPE="exfat" PARTUUID="eefca9f3-01"

Die letzte Zeile zeigt die externe Festplatte. Zum Mounten wird nun die UUID benötigt, in diesem Fall also 9292-2EB8. Jetzt wird wieder die Datei /etc/fstab mit 

sudo nano /etc/fstab

editiert und der Eintrag für diese externe Festplatte eingefügt. Die Datei schaut danach folgendermaßen aus:

proc            /proc           proc    defaults          0       0
PARTUUID=afd7b074-01  /boot           vfat    defaults,noatime  0       2
PARTUUID=afd7b074-02  /               ext4    defaults,noatime  0       1

# Musik Disk
UUID=9292-2EB8 /media/usb-drive exfat utf8,uid=pi,gid=pi,noatime 0

# Log to RAM
tmpfs   /tmp            tmpfs   defaults,noatime,nosuid,mode=1777,size=256m 0 0
tmpfs   /var/log        tmpfs   defaults,noatime,nosuid,mode=0755,size=128m 0 0
tmpfs   /var/tmp        tmpfs   defaults,noatime,nosuid,mode=0755,size=128m 0 0

# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

Nach einem Neustart sollte nun die externe Festplatte unter /media/usb-drive zur Verfügung stehen.

Samba Freigabe einrichten

Damit die Musikdateien bequem vom PC aus auf den Squeezebox Server kopiert werden können, ist es hilfreich, einen freigegebenen Ordner mit Samba zu erstellen. Dazu muss das Samba Paket zunächst installiert werden. Die Frage nach dem WINS Server kann mit No beantwortet werden.

sudo apt-get install samba

Danach wird in der Datei /etc/samba/smb.conf der freigegebene Ordner konfiguriert:

sudo nano /etc/samba/smb.conf

Am Ende der Datei wird die folgende Konfiguration angefügt:

[Musik]
 comment=Raspberry Pi Share
 path=/media/usb-drive
 browseable=Yes
 writeable=Yes
 only guest=no
 create mask=0644
 directory mask=0755
 public=no

Jetzt muss noch ein Samba User angelegt werden. Ich verwende dazu auch den User pi mit dem gleichen Passwort wie oben.

sudo smbpasswd -a pi

Nach einem Neustart das Samba Service mit

sudo service smbd restart

kann man das Netzlaufwerk auf dem PC einbinden. Beim Login gibt man den User an, der gerade angelegt wurde. Jetzt kann man ganz einfach die Musiksammlung auf die Festplatte des Squeezebox Servers kopieren.

Logitech Media Server

Es folgt die eigentliche Server Software. Ich verwende nicht die nighlty Pakete, sondern bleibe auf dem stable Zweig. Für den Raspberry muss die Software für Arm-Architektur heruntergeladen werden. Aktuell ist es die Version 8.2.0.

wget https://downloads.slimdevices.com/LogitechMediaServer_v8.2.0/logitechmediaserver_8.2.0_arm.deb

Die Installation des Pakets und einiger Libraries zum Encoden erfolgt mit

sudo apt-get --fix-broken install libio-socket-ssl-perl
sudo dpkg -i logitechmediaserver_8.2.0_arm.deb
sudo apt-get install -y libsox-fmt-all libflac-dev libfaad2


Das war es auch schon. Der Server ist jetzt unter Port 9000 mit der jeweiligen IP Adresse erreichbar. Bei mir ist das

http://192.168.0.123:9000/

Im Browser öffnet sich dann ein Setup Wizard, mit dem die wichtigsten Grundeinstellungen des Logitech Media Servers vorgenommen werden. Nach Abschluss des Setups erscheint die eigentlichen Startseite.

Logitech Media Server

Allerdings gibt es noch ein kleines Problem. Nach einem Neustart des Raspberry würde der Server nicht mehr starten. Das liegt daran, dass der /var/logs Pfad weiter oben in ein temporäres Verzeichnis verlegt worden ist. Bei der Installation des Server Pakets wurde in dem logs-Verzeichnis ein Unterordner squeezeboxserver erstellt. Da alle Änderungen nur im RAM vorhanden sind, existiert dieses Verzeichnis folglich nach dem Neustart nicht mehr. Eigentlich sollten Services beim Start automatisch die nötigen Verzeichnisse anlegen, aber der Logitech Media Server hat scheinbar ein Problem damit. Daher muss dieses Verzeichnis beim Start des Service angelegt werden. Dazu editiert man das Startskript mit

sudo nano /etc/init.d/logitechmediaserver

und fügt den fett markierten Teil ein:

# Read config file if it is present.
if [ -r /etc/default/$NEWNAME ]; then
        . /etc/default/$NEWNAME
elif [ -r /etc/default/$NAME ]; then
        . /etc/default/$NAME
fi

# Create Logfiles directory
if [ ! -d /var/log/$NAME ]; then
  mkdir /var/log/$NAME/
  chown squeezeboxserver:nogroup /var/log/$NAME/
fi

Damit diese Änderung wirksam wird, muss noch das Kommando

sudo systemctl daemon-reload

ausgeführt werden. Jetzt wird der Squeezebox Server auch nach einem Neustart korrekt hochfahren.

Systemmonitor einrichten

Was fehlt, ist noch ein kleines Programm, um das System zu monitoren und die wichtigsten Daten am Display anzuzeigen. Dazu gibt es einen kleinen, aber vielseitigen Systemmonitor namens Conky. Das Paket wird einfach mit

sudo apt-get install conky

installiert. In einer Konfigurationsdatei wird definiert, welche Objekte wo angezeigt werden sollen. Die Konfiguration wird mit

nano .config/.conkyrc

erstellt und dann der folgende Inhalt hineinkopiert:

conky.config = {
    alignment = 'top_left',
    double_buffer = true,
    background = false,
    border_width = 0,
    cpu_avg_samples = 2,
    default_color = 'white',
    default_outline_color = 'white',
    default_shade_color = 'white',
    draw_borders = false,
    draw_graph_borders = true,
    draw_outline = false,
    draw_shades = false,
    use_xft = true,
    font = 'LiberationMono:bold:size=9',
    gap_x = 0,
    gap_y = 0,
    minimum_width = 315,
    maximum_width = 320,
    minimum_height = 240,
    maximum_height = 240,
    net_avg_samples = 2,
    no_buffers = true,
    out_to_console = false,
    out_to_stderr = false,
    extra_newline = false,
    own_window = true,
    own_window_class = 'Conky',
    own_window_type = 'desktop',
    stippled_borders = 0,
    update_interval = 1.0,
    uppercase = false,
    use_spacer = 'none',
    show_graph_scale = false,
    show_graph_range = false
}

conky.text = [[
${color grey}Time: $color${time %a %d. %b %k:%M}  ${color grey}Uptime: $color$uptime
${color grey}CPU: $color$freq MHz    ${color grey}GPU: $color$freq_g GHz
${color grey}Temperature: $color$acpitemp °C
${color grey}CPU Usage:$color $cpu% ${cpubar 6}
${color grey}RAM Usage:$color $mem/$memmax - $memperc% ${membar 6}
${color grey}Networking:  Up: $color${upspeed wlan0}${color grey} - Down: $color${downspeed wlan0}

${color grey}File systems:
${color grey} SD Card $color${fs_used /}/${fs_size /} ${fs_bar 6 /}
${color grey} Disk    $color${fs_used /media/usb-drive}/${fs_size /media/usb-drive} ${fs_bar 6 /media/usb-drive}

${color grey}Name                PID     CPU%    MEM%
${color lightgrey} ${top name 1}   ${top pid 1}  ${top cpu 1}  ${top mem 1}
${color lightgrey} ${top name 2}   ${top pid 2}  ${top cpu 2}  ${top mem 2}
${color lightgrey} ${top name 3}   ${top pid 3}  ${top cpu 3}  ${top mem 3}
${color lightgrey} ${top name 4}   ${top pid 4}  ${top cpu 4}  ${top mem 4}
]]

Damit Conky nach dem Booten automatisch startet, muss eine entsprechende Datei mit

mkdir -p .config/autostart
nano .config/autostart/conky.desktop

erstellt werden und der folgende Inhalt eingetragen werden:

[Desktop Entry]
Type=Application
Name=Conky
Comment=Conky starten
Exec=/usr/bin/conky -b -c /home/pi/.config/.conkyrc

Um den Screensaver zu deaktivieren, wird wieder eine Datei mit

mkdir -p .config/lxsession/LXDE-pi
nano .config/lxsession/LXDE-pi/autostart

erstellt und dieser Inhalt eingetragen:

@xset s 0 0
@xset s noblank
@xset s noexpose
@xset dpms 0 0 0

Was jetzt noch stört, ist der Mauszeiger mitten im Display. Der kann in der Datei

sudo nano /etc/lightdm/lightdm.conf

konfiguriert werden. Dazu muss man die Zeile

#xserver-command=X

suchen und wie folgt ändern:

xserver-command=X -nocursor

Zuletzt wird noch der Setup Wizard deaktiviert:

sudo rm /etc/xdg/autostart/piwiz.desktop

 

Nach einem finalen Neustart sollte es dann so aussehen. Das Display ist natürlich reine Spielerei und für den Betrieb des Squeezebox Servers nicht notwendig. Aber ich finde es sehr praktisch, immer zu wissen, wie es meinem Server geht :)

Logitech Media Server mit Raspberry Pi 3B+

Damit ist der Logitech Media Server fertig installiert und kann nun seinen Dienst antreten. Wie oben schon geschrieben, läuft das System bei mir nun schon einige Jahre ohne irgendwelche Probleme. Vielleicht werde ich die Festplatte irgendwann durch eine SSD ersetzen, aber das eilt nicht. Ganz wichtig sind aber regelmäßige Backups der Festplatte! In meiner Musiksammlung steckt inzwischen sehr viel Arbeit und ich würde nur ungern wieder von vorne anfangen.

Sollte irgendwas in der Anleitung unklar sein oder sich ein Fehler eingeschlichen haben, hinterlasst mir einfach eine Nachricht.

Konversation wird geladen