Home.

Technik-Blog

Willkommen auf meinem
Notiz - Blog
Blog

Kmoser's Tech-Blog

Montag
12
Mai 2014
Klaus Moser
Klaus Moser

VirtualBox Guest Additions auf Ubuntu Server

Zum Testen der Pakete für die NAS habe ich erst mal deren Installation auf einer VirtualBox getestet. Dabei ist die Installation der Guest Additions immer fehlgeschlagen.

Folgende Pakete müssen installiert sein, damit das Erzeugen der Module funktioniert:

sudo apt-get install -y dkms build-essential linux-headers-generic linux-headers-$(uname -r)

Jetzt lassen sich die Module bauen.

sudo /media/me/VBOXADDITIONS_4.3.10_93012/VBoxLinuxAdditions.run

Installation über Repository

In seltenen Fällen hat die Vorgehensweise trotzdem nicht funktioniert. Eine weitere Möglichkeit an die Guest Additions zu kommen, ist über das Ubuntu Software Repository. Die Pakete hier sind allerdings nicht die aktuellsten. Aber besser nicht aktuell wie gar keine, vor allem wenn auf der Tagesordnung etwas anderes steht als dieses Problem zu fixen.

sudo apt-get install virtualbox-guest-dkms

Guest Additions entfernen

Sollte man das Gefühl haben jetzt ist alles völlig verbogen, kann man mit einem uninstall-Script die Guest Additions wieder entfernen um ggf. nochmal von vorne anfangen zu können:

/opt/VBoxGuestAdditions-4.3.10/uninstall.sh

Sonstiges

Etwas das ich noch nicht ausprobiert habe ist den Treiber hier zu aktivieren:

software-properties-gtk --open-tab=4
Sonntag
04
Mai 2014
Klaus Moser
Klaus Moser

Ubuntu 14.04 - DLNA - MediaTomb

Bin zwischenzeilich zu einer anderen Lösung gekommen mit der ich jetzt sehr zufrieden bin. Einfach einen Raspberry Pi nehmen und Kodi installieren. Dann reichen auch normale Dateifreigaben per NFS oder SMB um die eigene Mediensammlung abzuspielen.

DLNA (Digital Living Network Alliance) ist ein Standard für Geräte in der digitalen Unterhaltungselektronik, mit dem es möglich ist unterschiedliche Geräte mit Multimedia-Inhalten zu versorgen.

Unter Ubuntu gibt es eine ganze Reihe freier und kommerzieller DLNA Server. In diesem Beitrag werde ich den DLNA Server MediaTomb testen. Dieser Server wird wohl nicht mehr weiterentwickelt (Projektseite). Laut ChangeLog war die letzte Änderung 2010.

Eine gute Anleitung gibt es wie immer unter ubuntuusers.de.

Installation

Die Installation ist sehr einfach aus den offiziellen Quellen möglich:

sudo apt-get install mediatomb

Konfiguration

Die Konfiguration erfolgt in der Datei /etc/mediatomb/config.xml, welche im XML Format vorliegt und ist etwas anspruchsvoller als z.B. bei minidlna oder ushare.

sudo nano /etc/mediatomb/config.xml

In der Konfigurationsdatei kann man ziemlich viel konfigurieren. Als wichtigste Einstellung legt man den Basispfad der Mediendateien unter config > server > home fest. Also z.B.

<home>/media/data/mediafiles</home>

Umlautprobleme

In der Standardkonfiguration werden Dateinamen mit Umlauten am ersten Umlaut abgeschnitten. Die Lösung hierfür war aber schnell gefunden. Die folgenden Zeilen müssen zusätzlich in die config > import - Sektion in der Konfigurationsdatei /etc/mediatomb/config.xml

<filesystem-charset>UTF-8</filesystem-charset>
<metadata-charset>UTF-8</metadata-charset>
<playlist-charset>UTF-8</playlist-charset>

Danach muss außerdem die Datenbank neu erstellt werden.

Datenbank neu erzeugen

Falls man man die Datenbank neu erzeugen lassen will muss man den Server stoppen

sudo service mediatomb stop

Dann benennt man die alte DB-Datei um. Der Pfad zu der Datei mediatomb.db ist in der der Konfigurationsdatei /etc/mediatomb/config.xml unter

config > server > home

definiert.

cd /var/lib/mediatomb/
sudo mv mediatomb.db mediatomb.db.bak

Startet man jetzt den Server jetzt neu, wird eine neue leere Datenbank angelegt. Hat man keine Verzeichnisse die überwacht werden sollen in der Konfiguration definiert, muss man diese noch über das Web-Interface hinzufügen. Damit ist die Datenbank neu erzeugt.

Verzeichnisse festlegen

Verzeichnisse mit Multimedia-Inhalten kann man entweder über die Web-Oberfläche hinzufügen oder direkt in der Konfigurationsdatei festlegen indem man folgende Zeilen in die <import> - Sektion hinzufügt.

<autoscan use-inotify="auto">
<directory location="/home/media" mode="inotify" recursive="yes" hidden-files="no"/>
</autoscan>

Damit wird das Verzeichnis /home/media und dessen Unterverzeichnisse mittels inotify zu den Autoscan Verzeichnissen hinzugefügt.

Firewall

Sollte eine Firewall auf dem Server aktiv sein, müssen folgende Ports freigeschalten werden:

Weboberfläche

Die Weboberfläche kann man aktivieren indem man in der Konfigurationsdatei das Attribut

ui enabled="yes"

unter config > server > ui setzt. Über die Weboberfläche kann man weitere zu scannende Verzeichnisse festlegen.

Port Protokoll Richtung
1900 TCP beide
1900 UDP beide
49152 TCP beide

Praxis

Auf meinem Samsung UE55H6290 lassen sich mp3s abspielen und es werden auch die AlbumArt Thumbs angezeigt. Vorwärts und rückwärts spulen lässt sich jedoch nicht. Mit BubbleUPNP auf einem Android Gerät funktioniert das Springen innerhalb von mp3 Tracks.

Fehlersuche

Für die Fehlersuche empfiehlt es sich das Log unter /var/log/mediatomb.log im Auge zu behalten:

tail -f /var/log/mediatomb.log

Außerdem kann man mediatomb auch manuell starten und die Debug-Ausgabe aktivieren. Vorher deaktiviert man den Service und führt mediatomb dann über die Kommandozeile aus.

sudo service mediatomb stop
sudo mediatomb -D -u mediatomb -c /etc/mediatomb/config.xml

Das startet mediatomb mit der Konfiguration unter /etc/mediatomb/mediatomb.xml (-c) und mit dem Benutzer mediatomb (-u) und gibt zusätzlich Debug Infos aus (-D).

Auf diese Weise konnte ich feststellen, dass die Abstürze von mediatomb beim Abspielen von Medien-Inhalten verursacht wurden von der Einstellung <mark-played-items> in der Konfigurationdatei. Siehe dazu auch den Bugreport auf launchpad.net.

Fügt man einen Content - Typ innerhalb der <mark-played-items> - Sektion in der Konfigurationsdatei hinzu stürzt mediatomb nicht mehr ab:

<mark-played-items enabled="yes" suppress-cds-updates="yes">
  <mark>
    <content>video</content>
  </mark>
  <string mode="prepend">*</string>
</mark-played-items>

Da diese Funktion tatsächlich nur richtig Sinn bei z.B. TV-Serien macht, habe ich diese auch nur für Video aktiviert.

Transcoding

Script

INPUT="$1"
OUTPUT="$2"
VIDEO_CODEC="mpeg2video"
VIDEO_BITRATE="4096k"
AUDIO_CODEC="mp2"
AUDIO_BITRATE="192k"
AUDIO_SAMPLERATE="48000"
AUDIO_CHANNELS="2"
FORMAT="dvd"
exec /usr/bin/ffmpeg -threads 2 -i "${INPUT}" -vcodec ${VIDEO_CODEC} -b ${VIDEO_BITRATE} \
-acodec ${AUDIO_CODEC} -ab ${AUDIO_BITRATE} -ar ${AUDIO_SAMPLERATE} -ac  {AUDIO_CHANNELS} \
-f ${FORMAT} - > "${OUTPUT}" #2>/dev/null

bla

avconv -i - -codec:v libx264 -s vga -preset ultrafast -f mpegts -codec:a libmp3lame -ac 2 -y OUTFILE

bla

<transcoding enabled="yes">
  <mimetype-profile-mappings>
    <transcode mimetype="video/x-matroska" using="video-common"/>
  </mimetype-profile-mappings>
  <profiles>
    <profile name="video-common" enabled="yes" type="external">
      <mimetype>video/mpeg</mimetype>
      <accept-url>yes</accept-url>
      <first-resource>yes</first-resource>
      <accept-ogg-theora>yes</accept-ogg-theora>
      <agent command="mediatomb-transcode-video-ffmpeg" arguments="%in %out"/>
      <buffer size="10485760" chunk-size="262144" fill-size="524288"/>
    </profile>
  </profiles>
</transcoding>

bla

Parameter Erklärung
-i Lesen von stdin
-codec:v libx264 Benutze den libx264 Codec für die Videoausgabe
-s vga Erzeuge eine Ausgabe in VGA Größe (in a bid to lower computation cost) (qvga, vga, svga)
-preset ultrafast Argument für den libx264 Codec der bestimmt lieber schnell als genau zu sein
-f mp4 Ausgabeformat ist mp4
-codec:a libmp3lame Audio in mp3 kodieren
-ac 2 benutze die ersten beiden Audiokanäle und verwerfe den Rest (x264 doesn't handle >2 audio channels)
-y Überschreiben ohne zu fragen. Ohne kann der Prozess in mediatomb hängen bleiben.

Fazit

 

Ähnliches gilt für uShare. Er ist recht einfach zu installieren nur es fehlen einfach die Zusatzfunktionen, insbesondere auch wieder das Transcoding.

Mediatomb ist der vielseitigste freie DLNA Server mit einem hohen Funktionsumfang. Dafür verlangt er auch ein bisschen mehr Konfigurationsaufwand. Mit der Standardkonfiguration kann man aber schon gut leben, sofern man mal den Bug mit den Abstürzen im Griff hat. Leider scheint mediatomb nicht mehr weiterentwickelt zu werden. Die letzten Änderungen waren 2010. Sehr schade...

Donnerstag
01
Mai 2014
Klaus Moser
Klaus Moser

Ubuntu für SSD optimieren

Solid State Festplatten (SSD) büßen am meißten ihrer Lebensdauer durch Schreibzugriffe ein. Es gibt viele Prozesse und Funktionen bei denen unser Ubuntu Daten auf die Platte schreibt, einige davon laufen in Hintergrund und fallen uns gar nicht so bewusst auf.

Generell ist es sinnvoll für Partitionen auf der SSD den Parameter noatime in der /etc/fstab zu setzen.

/dev/sda1    /    ext4    noatime,errors=remount-ro    0    1

Der Parameter noatime verhindert das setzen des Zeitstempels für den letzten Lesezugriff auf Dateien.

Lese- und Schreibzugriffe

Um herauszufinden wann und was auf unsere Festplatte geschrieben wird, gibt es ein paar Befehle die ganz nützlich sind.

Um z.B. Lese- und Schreibzugriffe auf unsere Platte sehen zu können aktivieren wir das logging dafür mit dem Befehl:

echo 1 >/proc/sys/vm/block_dump

Jetzt kann man mit

tail -f /var/log/syslog

beobachten wann von der Platte gelesen oder auf sie geschrieben wird.

Wir erhalten dabei Ausgaben wie die folgende:

Apr 27 23:03:13 srv1 kernel: [22002.728653] mozStorage #7(4646): WRITE block 11963148 on sda1 (328 sectors)
Apr 27 23:03:13 srv1 kernel: [22002.749616] jbd2/sda1-8(449): WRITE block 94802732 on sda1 (8 sectors)

Wenn wir fertig sind, nicht vergessen das Logging wieder zu deaktivieren. Das geht mit:

echo 0 >/proc/sys/vm/block_dump

Bei mir hat der Prozess jbd2 sehr viele Schreibzugriffe verursacht. Der JBD (journaling block device) ist für ext4 und sitzt zwischen dem System und dem Block Device Treiber.

Verwendung der Swap Partition verringern

Man kann unter Ubuntu einstellen wie stark das System den Swap-Speicher verwenden soll. Den aktuellen Wert der Einstellung kann man ansehen mit:

cat /proc/sys/vm/swappiness

Je niedriger dieser Wert ist um so mehr System Load muss vorhanden sind, bevor das System anfängt den Swap Speicher zu nutzen. Der Standardwert dürfte so bei 60 liegen.

Den Wert kann man anpassen in dem man die Datei /etc/sysctl.conf ändert.

sudo nano /etc/sysctl.conf

An das Ende der Datei folgenden Inhalt einfügen:

# Sharply reduce swap inclination
vm.swappiness=1
# Improve cache management
vm.vfs_cache_pressure=50

Dann den Rechner neu starten und nochmal den Wert ausgeben lassen.

Over-Provisioning

Eine SSD partitioniert man so dass ca. 10-20% unformatierter Speicherplatz auf der Platte übrig bleiben. Das scheint wohl dafür zu sein, um defekte Zellen zu kompensieren. Auch die Schreibgeschwindigkeit soll daudurch positiv beeinflusst werden.

Für die Einrichtung von Over-Provisioning gibt es sogar ein Tool von Samsung, das SSD Magician 3.2.

Logfiles

Da Linux, zum Segen aller Administratoren, recht ausführlich Logfiles schreibt, haben wir natürlich ständig kleine Schreibzugriffe auf unsere Systemfestplatte. Das ist für unsere SSDs natürlich nicht so gut.

Es gibt zwei Möglichkeiten wie wir diese Zugriffe von unserer SSD fernhalten können:

Entweder verwenden wir für die Logfiles einen Flash Speicher, wie z.B. einen alten USB Stick. Das hätte den Vorteil, dass die Logs auch nach einem Neustart noch vorhanden wären, würde aber zum gleichen Problem führen wie wir mit den SSDs schon haben, und zwar dass Schreibvorgänge den Flash-Speicher schnell altern lassen.

Oder man legt die Logs in eine Ramdisk. Das hat den Vorteil, dass wir keinerlei Schreibzugriffe auf persitenten Speichern mehr haben. Der Nachteil ist aber, dass die Logs nach einem Neustart weg sind.

Zuerst einmal können wir prüfen ob wir evtl. ein Logfile haben, in das übermäßig viele Daten geschrieben werden:

ls -hlS /var/log/*log | head

Die Dateien sollten maximal ein paar MB groß sein.

Dann legen wir eine Ramdisk für /var/log an. Dazu legen wir in der Datei /etc/fstab einen neuen Eintrag an:

# Log Dateien
tmpfs /var/log tmpfs defaults,noatime 0 0

Jetzt mal testweise alle Dateien aus /var/log löschen und das Laufwerk mounten.

sudo rm -Rf /var/log/*
sudo mount /var/log

Jetzt werden alle Logdateien in die RAM-Disk geschrieben. Man sollte allerdings beachten dass die Fehleranalyse so bei einem Problem oder Sicherheitsrisiko schwieriger ist.

Logfiles Apache

Läuft auf dem Rechner ein Apache hat man das Problem dass der Apache nicht startet wenn er auf die Logfiles unter /var/log/apache nicht zugreifen kann. Da die Ramdisk aber beim Start leer ist haben wir so ein Problem. Wir brauchen also ein Init-Script, das diese Dateien anlegt, bevor der Apache startet.

sudo nano /etc/init.d/apache2-tmpfs

In die Datei kommt folgender Inhalt:

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          apache2-tmpfs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Required-Start:  
# Required-Stop:   
# Short-Description: Create /var/log/apache2/error.log on tmpfs at startup
# Description:       Create /var/log/apache2/error.log needed by Apache.
### END INIT INFO

#
# main()
#
case "${1:-''}" in
  'start')
   # create the /var/log/apache2/error.log needed by apache
   mkdir /var/log/apache2
   chmod 777 /var/log/apache2
   touch /var/log/apache2/error.log
   chmod 777 /var/log/apache2/error.log
   ;;
  'stop')
   ;;
  'restart')
   ;;
  'reload'|'force-reload')
   ;;
  'status')
   ;;
  *)
   echo "Usage: $SELF start"
   exit 1
   ;;
esac

Das Script noch ausführbar machen

sudo chmod 0755 /etc/init.d/apache2-tmpfs

und das Init-Script dem runlevel hinzufügen. Da der apache am Stellen 91 kommt fügen wir das Script an Stelle 90 ein. In der Beenden Reihenfolge kommt Apache an Stelle 9, also kommt unser Script an Stelle 10.

sudo update-rc.d apache2-tmpfs defaults 90 10

Zum Schluss den Rechner neu starten.

Thanks to Petr Svoboda for this Script (Link).

Temporäres Verzeichnis

Man kann das temporäre Verzeichnis ebenfalls in eine Ramdisk legen. Dazu in der Datei /etc/fstab folgenden Eintrag machen:

tmpfs    /tmp    tmpfs    defaults,noatime,mode=1777    0    0

Weitere Verzeichnisse wären:

tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0
tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0
tmpfs /var/run tmpfs defaults,noatime,nosuid,mode=0755,size=2m 0 0
tmpfs /var/spool/mqueue tmpfs defaults,noatime,nosuid,mode=0700,gid=12,size=30m 0 0
Blog

Kmoser's Tech-Blog