Anwendungen
Portal
Forum
Wiki
Ikhaya
Planet
Mehr
Anmelden

14. Oktober 2014

Linux Software-RAID Metadaten

Permalink [ENC]BladeXP's Blog

Linux Software-RAID ist eine gerne verwendete Lösung, um auf die schnelle ein RAID System an dem einen oder anderem Server zu realisieren. In den meisten Fällen funktioniert dies auch einfach so, doch lästige moderne Systeme haben durch zunehmend dynamischere Hardware (USB, SATA, …) und stetige Verbesserungen am Init Prozess (z.B. Upstart, systemd) ein großartiges Potential sich bei der beliebten Kombination RAID und LVM in den Fuß zu schießen.

Doch auch andere Kombinationen sind möglich, genau genommen jede Option, bei welcher eine Anwendung oder ein Systembestandteil pauschal alle Block Devices nach einem bestimmten Header durchsucht. Auf einem RAID System können genau diese Header, in exakt gleicher Form, nämlich auf mehreren Block Devices zur gleichen Zeit vorhanden sein. Problematisch ist dies vor allem bei RAID1, aber ich gehe davon aus das auch andere RAID-Level hier Probleme bereiten könnten.

Um das Problem zu verstehen, muss man dessen Ursache kennen, daher ein kleiner Überblick über die gängigen RAID Metadatenversionen:

0.90
Dabei handelt es sich um das nach wie vor oft verwendete, aber inoffiziell als PITA bezeichnete Metadatenversion. Limitierungen sind u.a. maximal 2TB bei einem RAID-Level größer oder gleich 1 und zusätzlich die Limitierung auf maximal 28 Geräte im Verbund, welche weniger problematisch sein sollte. Dummerweise ist bei dieser Metadatenversion je nach Partitionierung auch nicht definiert ob sich ein RAID Verbund über die gesamte Platte oder nur einen Teil davon (Partition) erstreckt.
1.0
Das neue Metadatenformat, hier liegt der RAID Header genauso wie beim 0.90er Format am Ende der Partition/Platte. Die Bugs aus 0.90 wurden hierbei gefixt und es gibt auch einen Satz neue Features welche in der Manpage erläutert werden.
1.1
Wie 1.0, jedoch liegt der RAID Header hier nicht am Ende, sondern am Anfang einer Partition/Platte.
1.2
Wie 1.0, jedoch liegt der RAID Header hier nicht am Ende der Platte/Partition, sondern 4KB nach dem Startsektor derselben.

Das PITA (0.90) Format möchten wir wirklich nicht mehr einsetzen, aber die anderen Versionen klingen doch sehr verlockend. Aufpassen muss man hier aber bei der Wahl der Version, den einzig 1.1 sorgt dafür das am Anfang der Partition der RAID Header ist. Dadurch erkennen die meisten Tools welche ihre Header ebenfalls am Start der Partition/Platte erwarten dort keinen eigenen Header mehr und kommen nicht auf die blöde Idee diesen zu verwenden.

Durch eine ungünstige Situation (z.B. eine Race Condition) kann es z.B. beim Startvorgang vorkommen das so /dev/sda1 in eine LVM Volume Group aufgenommen wird obwohl nur wenig später das richtige Block Device, nämlich /dev/md0 zu Verfügung stehen würde. Der Schutz durch das RAID besteht so ggf. nicht, im schlimmsten Fall überschreiben sich das Software-RAID und LVM gegenseitig die Daten, ein großartiges Szenario.

Beobachten konnte ich das recht theoretische Problem bisher 2-3x auf meinem Homeserver, durch viele Schutzmaßnahmen ist aber nichts passiert, mal davon abgesehen das die gängige LVM Befehle auf einmal jammerten, dass keine PVs verfügbar wären, obwohl das System schon seit Wochen stabil läuft. Beobachten konnte ich ebenfalls das dieses Problem nur auftritt wenn der lvmetad verwendet wird, dies ist z.B. bei Arch Linux der Fall. Ich gehe auch davon aus das dieses LVM spezifische Problem eher dort zu suchen ist, unabhängig davon gibt es neben LVM noch einige andere Dinge die gerne mal Metadaten am Anfang der Partition/Platte suchen, durch die Wahl der richtigen Metadatenversion können hier schon beim erstellen des RAIDs potentielle Probleme vermieden werden.

13. Oktober 2014

rtorrent monit- und Init-Skript

Permalink Falk Husemanns Blog

Wer rtorrent regelmäßig und dauerhaft einsetzt, wünscht sich eine elegantere Lösung, als das händische Starten und Stoppen einer screen-Sitzung. Ohne viele weitere Ausschweifungen folgt meine Lösung für diesen Wunsch: Ein Init-Skript und eine Konfigurationsdatei für monit. Monit ist eine Prozessüberwachungs-Software.

Im Gegensatz zu den anderen kursierenden Skripten kann mit dem hier vorgestellten sowohl die niceness (CPU-Priorität) als auch die I/O-Klasse eingestellt werden, sodass rtorrent nicht mehr alle Prozessoren und jede Eingabe-/Ausgabe-Operation für sich beanspruchen kann. Dazu absolut zu empfehlen ist die manpage von ionice und nice. Wer noch nicht reingesehen hat, verpasst was.

rtorrent Init-Skript

Das Init-Skript wird im Verzeichnis /etc/init.d/ unter dem Namen rtorrent-beispielUser abgelegt. Mit dem Befehl update-rc.d rtorrent-beispielUser defaults kann es in den Startprozess eingebunden werden.

#!/bin/bash
### BEGIN INIT INFO
# Provides:          rtorrent-beispielUser
# Required-Start:    $syslog $local_fs
# Required-Stop:     $syslog $local_fs
# Should-Start:      $remote_fs
# Should-Stop:       $remote_fs
# X-Start-Before:    xdm kdm gdm ldm sdm
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: rtorrent
# Description:       Load up rtorrent in a screen session
### END INIT INFO

###############
#
# TO INSTALL RUN
# sudo /usr/sbin/update-rc.d rtorrent defaults
#
##################


. /lib/lsb/init-functions

# EDIT THIS VARIABLE TO THE USER THAT YOU WANT RTORRENT TO RUN AS
USER=beispielUser
# Where to store the pidfile
PIDFILE="/var/run/rtorrent-${USER}.pid"
# Path to screen
SCREEN="/usr/bin/screen"
# Name of screen (visible via screen -ls)
SCREEN_NAME="rtorrent-${USER}"
RTORRENT="/usr/local/bin/rtorrent"
# Default (0), lowest=7, highest=0
IOPRIO="7"
# Default (0), lowest=19, highest=-19
NICE="5"

case "$1" in
  start)
    log_daemon_msg "Starting rtorrent"
    start-stop-daemon --start --background --oknodo \
    --pidfile "$PIDFILE" --make-pidfile \
    --chuid $USER --iosched best-effort:$IOPRIO --nicelevel $NICE \
    --exec $SCREEN -- -DmUS $SCREEN_NAME $RTORRENT
    if [ $? -gt 0 ]; then
        log_failure_msg "FAILED."
        log_end_msg 1
        exit 0
    else
        log_end_msg 0

    fi
    ;;
  stop)
    log_daemon_msg "Stopping rtorrent"
    start-stop-daemon --stop --oknodo --pidfile "$PIDFILE"
    if [ $? -gt 0 ]; then
      log_failure_msg "FAILED."
      log_end_msg 1
    else
      log_end_msg 0 
    fi
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  *)
    echo "usage: $0 {start|stop|restart}"
esac
exit 0

rtorrent Monit-Konfigurationsdatei

Die Monit-Konfigurationsdatei wird im Verzeichnis /etc/monit/conf.d/ unter dem Namen rtorrent-beispielUser abgelegt. Nach einem Neustart kann der Status von rtorrent abgerufen werden.

check process rtorrent-beispielUser with pidfile /var/run/rtorrent-beispielUser.pid
	start program = "/etc/init.d/rtorrent-beispielUser start"
	stop program = "/etc/init.d/rtorrent-beispielUser stop"
        # Nur bei aktiviertem scgi_port 127.0.0.1:5001 wirksam, sonst auskommentieren
        if failed host 127.0.0.1 port 5001 type tcp then restart
        if 5 restart within 5 cycles then timeout

Apache Module aufräumen

Permalink Finns Blog

Auf der Suche nach Leistungsengpässen habe ich in meinem letzten Beitrag festgestellt, dass der Apache Webserver selbst bei scheinbar geringer Anzahl an Anfragen teilweise an seine Grenzen stößt und viel Last erzeugt. Der Einsatz eines Cache-Speichers kommt nicht in Frage, da es sich bei den Anfragen nur selten um herkömmliche Webseiten handelt. Auch möchte ich keinen anderen Webserver wie z.B. nginx einsetzen, da ich mit dem Apache sehr vertraut bin. Der erste Ansatz ist nun, die Apache Module ein wenig aufzuräumen.

Der Apache Webserver erhält viele seiner bekannten Funktion erst durch den Einsatz verschiedener Module. Je mehr Module Apache mit sich herumtragen muss, desto höher ist der Speicherverbrauch. Unbenutzte Module sind also nicht nur überflüssig, sondern verbrauchen unnötig Arbeitsspeicher und können unter Umständen die Beantwortung der Anfragen verlangsamen. Es ist also eine gute Idee, unbenötigt Module zu deaktivieren, man darf hiervon aber keine Performance-Wunder erwarten, weshalb ich mir auch Vorher/Nachher Benchmarks erspare.

Da ich nicht jedes Apache Modul auswendig kenne, ist ein Blick in die Dokumentation hilfreich. Ich verwende Apache 2.2, der Link zur Dokumentation lautet:
http://httpd.apache.org/docs/2.2/mod/
Nutzer der Version 2.4 verwenden entsprechend diesen Link:
http://httpd.apache.org/docs/2.4/mod/

Nachdem man nun weiß, wo man Informationen zu den Modulen selbst findet, möchte man herausfinden, welche Module im Moment geladen sind. Das geschieht mit dem Befehl

apachectl -M
 . Nun stellt sich die Frage, wo die gewünschten Module deaktivieren kann, dies ist auch noch schnell und einfach erledigt. In der Regel werden die meisten Module (zumindest bei einem CentOS System) in der Datei 
/etc/httpd/conf/httpd.conf
  geladen. Um herauszufinden, wo welche Module geladen werden, kann man mit grep danach suchen:

grep -ir LoadModule /etc/httpd/conf/* /etc/httpd/conf.d/* /etc/httpd/vhosts/*

Hinweis: Die Pfade sind höchstwahrscheinlich unterschiedlich, da meine Konfiguration auf 3 Verzeichnisse verteilt ist.

Die größte Frage lautet jedoch: Welche Module mann man deaktivieren?
Da jeder Webserver andere Funktionen bewältigen muss, gibt es keine pauschale Antwort. Es gibt aber zwei Lösungsansätze:

  1. Man schaut nach, welche Anforderungen die auf dem Webserver eingesetze Software hat.
  2. Man guckt in die Dokumentation und überlegt, ob dieses oder jenes Modul überhaupt verwendet wird. Hierbei kann ein greppen der Konfigurationsdateien hilfreich sein.

Kleiner Tipp: Die Module sollten am besten durch auskommentieren deaktivieren, so kann man sie bei Fehlern oder falls man sie später doch benötigen sollte, schnell wieder aktivieren.

Die Datei 

/etc/httpd/conf/httpd.conf
  zeigt nun also beispielsweise einige aktivierte proxy Module. Falls man sich nicht sicher ist, ob diese wirklich benötigt werden, sollte man seine Konfiguration durchsuchen:

grep -ir proxy /etc/httpd/conf/* /etc/httpd/conf.d/* /etc/httpd/vhosts/*

Werden hier keine (nicht auskommentierte) Zeilen angezeigt, wird das Proxy Modul höchstwahrscheinlich nicht verwendet. Nun kann man die entsprechenden Zeilen in der 

httpd.conf
  auskommentieren und nach erfolgreichem Config-Test den Webserver sanft neustarten:
service httpd configtest
service httpd graceful

Sollte der Config-Test fehlschlagen, muss das kürzlich deaktivierte Modul natürlich wieder aktiviert werden. Auch wenn die Verwendung der Module sich auf den meisten Systemen unterscheidet, hier für diejenigen, die es interessiert, meine Liste der nun deaktiverten Module:

#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule info_module modules/mod_info.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule proxy_balancer_module/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule disk_cache_module modules/mod_disk_cache.so
#LoadModule cgi_module modules/mod_cgi.so
#LoadModule version_module modules/mod_version.so

Der Nutzen dieses Vorhabens ist zwar nicht gigantisch und ein wenig aufwändig, aber auch Kleinvieh macht schließlich Mist.

Probleme mit der Netzwerkbrücke

Permalink Invictus deus ex machina

Für einen Server hatte ich vor einigen Tagen unter Ubuntu 14.04 LTS eine Netzwerkbrücke eingerichtet. Die /etc/network/interfaces Datei sah danach in etwa so aus:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto br0
iface br0 inet dhcp
bridge_ports eth0

Nach einem Neustart gab es dann allerdings ein Problem. Der Server war nicht mehr erreichbar. Der Grund dafür war simpel — es fehlte das Paket bridge-utils — nach der Installation desselben mittels:

apt-get install bridge-utils

funktionierte die Netzwerkbrücke wieder ohne Probleme.

12. Oktober 2014

Definition Freier Inhalte

Permalink deesaster.org

Frei oder offen? Die Freie-Software-Welt streitet sich schon länger über diese Begrifflichkeiten und immer wieder sorgen die unterschiedlichen Interpretationen für Missverständnisse in der Kommunikation. Die Open Definition will nun zumindest für Freie Inhalte klären, was offen ist. Soweit verständlich?

Open Definition 2.0

Die Open Definition wurde letzte Woche in der neuen Version 2.0 (nach 1.1) veröffentlicht und soll klar definieren, was man unter dem Begriff „offen“ versteht, den man im Deutschen eher mit „frei“ übersetzen würde – und dann wieder in die Bredouille gerät, zwischen Freiheit (etwas zu tun) und Freibier (kostenlos) unterscheiden zu müssen.

Dieser letzte Unterschied, der bei Freien Lizenzen wichtig ist, stellt sich aber bei Freien Inhalten gemäß der Open Definition aber nicht. Denn allgemeiner ausgeweitet auf den Begriff Wissen heißt es (Zitat):

„Knowledge is open if anyone is free to access, use, modify, and share it — subject, at most, to measures that preserve provenance and openness.“

Zu Deutsch: „Wissen ist frei, wenn jeder ohne Beschränkung darauf zugreifen, es benutzen, verändern und teilen kann – mit der maximalen Einschränkung, diese Freiheit und die Urheber beizubehalten.“

Die Open Definition lehnt sich damit sehr stark an der Definition für „Free Cultural Works“ an.

Genaue Definition

Damit ein Inhalt/ein Werk offen – oder frei – sein kann, muss es drei Bedingungen genügen:

  1. Es muss unter einer Freien Lizenz veröffentlicht werden. Die Definition für eine Freie Lizenz leitet sich dabei von der Open Source Definition ab und enthält die vier wichtigen Grundsätze, dass jeder ohne Einschränkung das Programm ausführen, untersuchen, verändern und verbreiten darf.
  2. Das Werk muss als Ganzes ohne besondere Kosten (ausgenommen sind einmalige Herstellungskosten, z.B. für das Brennen einer CD) zur Verfügung gestellt werden. Lizenzangaben müssen dem Werk beiliegen.
  3. Das Werk muss in einem offenen Format vorliegen, dass keinen Patenten oder besondere Lizenzen unterliegt. Dabei ist die Definition eines offenes Formates aber so weit abgeschwächt, dass es ausreicht, wenn ein FLOSS-Programm den Inhalt verarbeiten kann.

Vor allem der zweite Punkt unterscheidet Freie Inhalte von Freier Software, da letztere auch explizit gegen Entgelt vertrieben werden kann. Dabei hat der Käufer aber dann die oben aufgeführten Rechte, den Quellcode einsehen und bearbeiten zu können. Die Open Definition will dagegen explizit sicherstellen, dass das Wissen der Freien Inhalten sich ohne Zugangsbeschränkung (und dazu zählen auch monetäre Mittel) verbreiten kann.

Erlaubte Einschränkungen

Die Nutzung einer Freien Lizenz erlaubt dabei gewisse Einschränkungen. So ist es erlaubt, dass der Urheber immer mit angegeben werden muss. Zusätzlich darf die Lizenz auch ein Copyleft haben, sodass abgeleitete Inhalte unter einer gleichen Lizenz veröffentlicht werden müssen. Es gibt noch mehr Einschränkungen, doch dies sind die zwei wichtigsten.

Damit kann man per Definition die (meisten) Creative-Commons-Lizenzen für Freie Inhalte benutzen und erfüllt damit die Open Definition. Das Copyleft wird beispielsweise durch die Share-Alike-Klausel sichergestellt.

Wichtig: Die beiden Creative-Commons-Lizenztypen Non-Derivative (keine Ableitung erlaubt) und Non-Commercial (kommerzielle Nutzung nicht erlaubt) fallen dabei nicht unter die Open Definition, wie auch der CC-Lizenzseite mit dem Hinweis „Dies ist keine Free-Culture-Lizenz.“ entnommen werden kann. Dies bezieht sich dabei auf die Definition für „Free Cultural Works“ von oben, auf der die Open Definiton basiert.

Nachtrag: Eine Liste der Freien Lizenzen, die die Bedingungen oben erfüllen, findet man auf der Webseite.

Wochenrückblick 41/2014

Permalink deesaster.org

Der Wochenrückblick lässt das Geschehen der vergangenen Woche rund um Ubuntu, Linux und Open Source Revue passieren.

Neues rund um Linux

Netflix für Linux verfügbar

Netflix hat seine Browserweiche inzwischen entfernt, die Linux-Nutzern den Zutritt zum Streaming-Dienst verboten hat. So ist es nun möglich, auf einem System mit aktuellen NSS-Bibliotheken und Google Chrome für die DRM-Unterstützung von EME auf Netflix Filme udn Serie auch unter Linux anzuschauen.

Quellen: Ubuntu Insights, heise open, Golem

AMD-Treiber nutzt Open-Source-Basis

AMD hat bestätigt, dass zukünftige der proprietäre Linux-Treiber und der Open-Source-Treiber einen gemeinsamen Unterbau haben werden. Dieser trägt den Namen amdgpu und über eine Dockingschnittstelle können die konkreten Implementierung sich mit dem Basistreiber verbinden.

Quellen: Linux-Magazin, heise open, Pro-Linux

Shellshock überstanden, oder nicht?

Zahlreiche News-Portale meldeten in der letzten Woche eine Übersicht über den aktuellen Zustand der Shellshock-Sicherheitslücke. So sind die aktuellen Bash-Versionen alle gepatcht und keine bisher gefundene Lücke offen. Durch den Exploit-Code von Shellshock war es Angreifern dann aber auch nach dem Fixen noch möglich, in einige Server von Yahoo, Lycos und Winzip einzudringen. Die Server wurden inzwischen vom Netz genommen.

Quellen: Golem 1, Golem 2, heise open, Pro-Linux

Adobes E-Book-Reader spioniert

Was man nicht alles als Feature verkaufen kann. Adobes E-Book-Reader, Digital Editions 4, sammelt Nutzerinformationen wie z.B. welche E-Books installiert sind, welche Seiten gelesen wurden und woher die E-Books kommen. Die Daten werden dann unverschlüsselt an die Server von Adobe übertragen. Laut Adobe sei diese Nutzerüberwachung aber von der Privacy Policy und den AGB gedeckt.

Quelle: Linux-Magazin

Was ist offen/frei?

Diese in Linux-Kreisen eher philosophisch behandelte Frage hat die Open Definition 2.0 geklärt. So muss ein freies Werk sowohl frei gemäß einer freien Lizenz sein, das Format, in dem das Werk vorliegt, muss offen sein und vor allem muss der Zugriff kostenlos (oder zumindest nur gegen einen Unkostenbeitrag) möglich sein.

Quelle: Linux-Magazin, Pro-Linux, heise open

ARD vielleicht mit mehr CC-Inhalten

Eine Arbeitsgruppe der ARD hat den Online-Redakteuren des Senders eine verstärkte Nutzung von Creative-Commons-Lizenzen nahe gelegt. Damit soll der Zugang zu Bildungsinhalten und Angeboten zur Meinungsbildung erleichtert werden. Der Sender will dies entsprechend prüfen, sieht aber vor allem Probleme bei Fremdmaterial wie Aufnahmen von Bildagenturen und Musik, die der GEMA unterliegt.

Quelle: heise open

Spielen unter Linux

Stronghold 3 für Linux

Das Strategiespiel Stronghold 3 ist nach Windows und MacOS X auch für Linux erhältlich. Bei Steam kann der siebte Teil der Reihe gekauft werden. Die gepatchte Gold-Version bessert dabei auch gleich zahlreiche Fehler und Bugs der ersten Version aus.

Quelle: Pro-Linux

Leistungsengpässe unter Linux aufspüren

Permalink Finns Blog

So langsam muss ich feststellen, dass mein Root-Server in einigen Bereichen an seine Grenzen stößt. Ohne Zahlen nennen zu wollen, spüre ich deutlich, dass Datei-, Datenbank und Webserverzugriffe zeitweise nur sehr langsam stattfinden. Für dieses Problem gibt es keine Universallösung, denn die Gründe können vielfältig sein. Bevor ich also über ein Hardware-Upgrade nachdenke, suche ich erst nach Hinweisen, die vielleicht auf ein konkretes Problem mit einer Software oder einem Teil der Hardware hindeuten.

Mit top einen Überblick verschaffen

Das meist verwendete und auf sehr vielen Distributionen standardmäßig vorhandene Tool 

top
gehört zu den Standardanwendungen eines Linux-Administrators. Es zeigt Details zu laufenden Prozesse, der CPU- und Arbeitsspeicher-Auslastung.

top

Die oberen Zeilen zeigen ein paar allgemeine Systeminformationen an und der untere Bereich stellt die laufenden Prozesse dar, standardmäßig sortiert nach der CPU Auslastung. Die Last liegt mit etwa 1.5 im Moment über meinem Durchschnitt von 0.5, bedrohlich ist dieser Wert in einem 4-Kern System aber noch nicht. Arbeitsspeicher ist ebenfalls noch frei und man erkennt schnell, dass ein Großteil der CPU Last zu Kosten von 

httpd
und 
php
verbraucht wird. Die 3. Zeile verrät etwas genauer, was die CPU macht: Die CPU Zeit wird zu 34,2 % für User-Prozesse verbraucht, viel interessanter sind aber die 4,7 % für das Warten auf Festplatten-IO. Das ganze stelle ich mit meinem Monitoring Plugin check_cpu auch grafisch dar, um langfristig einen Überblick darüber haben:

check_cpu

Hier sieht man die CPU Auslastung über einen Zeitraum von 4 Stunden. Da ich die Ausgabe von 

top
heute ein wenig beobachtet habe, kann ich sagen, dass wieder 
httpd
und 
php
diejenigen Prozesse waren, die diese Last erzeugt haben. Besonders unschön finde ich den dunkelroten Bereich, der den IO-Wait Anteil darstellt. Eine Festplatte ist in vielen Systemen häufig der Flaschenhals und die etwa 8,9 ms Zugriffszeit einer gewöhnlichen Festplatte entsprechen aus Sicht der CPU einer Ewigkeit.

Mit iotop herausfinden, wer die Festplatte beansprucht

Nun möchte ich etwas mehr über die Festplattenzugriffe wissen, dazu eignet sich iotop recht gut. Es stellt sowohl die gesamten Lese- und Schreibraten dar als auch die Raten einzelner Prozesse. 

iotop -o
  ist recht praktisch, da es nur IO-aktive Prozesse anzeigt:

iotop

Große Überraschungen habe ich nicht beobachten können, die üblichen Prozesse erzeugen eben ein wenig IO, vor allem Datenbanken lesen und schreiben schließlich viel. An dieser Stelle sei angemerkt, dass mein ownCloud Client im Moment ein wenig mit der Synchronisierung beschäftigt ist. In der Vergangenheit lief dies aber deutlich schneller ab und hat nur eine kaum feststellbare Systemlast erzeugt.

Auch sehr praktisch: iostat

Ohne Parameter aufgerufen zeigt iostat die Anzahl der seit Systemstart gelesenen und geschriebenen Blöcke an. Um aktuelle Werte zu erhalten, kann man z.B. 

iostat 1
  aufrufen:

iostat

Im Mittel verhalten die Platten sich eigentlich recht ruhig, aber hin und wieder schlägt ein Prozess richtig zu und schreibt ca. 20.000 Blöcke (ca. 10 MB bei 512k Blockgröße).

Für das genauere Betrachten der CPU Aktivitäten gibt es noch andere Tools wie 

vmstat
  oder
sar
, das hilft mir an dieser Stelle aber nicht wirklich weiter.

Netzwerkauslastung mit iftop darstellen

Zwar kann ich dieses Problem aufgrund der geringen Schreib- und Leseraten ausschließen, aber vielleicht gibt es ja ungewöhnlichen hohen Netzwerkverkehr. Das kann man mit 

iftop
  oder 
iptraf-ng
  schnell darstellen, wobei ich auf die schnelle lieber iftop verwende:

iftop

Die Netzwerkauslastung ist im Moment verschwindend gering. Der mit 100 MBit/s angebundene Server verwendet im Moment nicht einmal 1Mbit/s, Probleme in diesem Bereich kann ich also ausschließen.

Offene Dateien mit lsof anzeigen

Zuletzt möchte ich noch lsof erwähnen, welches offene Dateien anzeigt. Ohne Parameter wird man von einer Informationsflut erschlagen, aber da ich früher httpd als einen der Verursacher der hohen Last ermitteln konnte, möchte ich jetzt wissen, welche Dateien vom Webserver momentan geöffnet sind, dazu verwende ich 

lsof -u apache -c httpd
  (User apache / Prozess httpd). Nun weiß ich, dass ca. 4000 Dateien vom Apache Webserver geöffnet sind, darunter viele Module und Log-Dateien.

lsof

Ich denke, dass ich im Bereich Apache weiter suchen sollte. Außerdem weiß ich nicht, wie sehr sich das schreiben der Log-Dateien auf die IO-Operationen auswirkt, eventuell kann ich mit einer RAM-Disk für die Log-Dateien die IO-Last ein wenig reduzieren.

Shuttle-Service auf der Ubucon

Permalink Ubucon

Für den Transport zwischen Bahnhof Katlenburg und dem Veranstaltungsort, der Burgbergschule Katlenburg, bzw. zwischen Veranstaltungsort und den Social Events am Freitag und Samstag steht ein Shuttle-Service zur Verfügung.

Dieser kann über die Rufnummer

0151 - 65790940

erreicht werden und ist auch am Bahnhof Katlenburg ausgeschrieben.

Reverse Proxy mit Nginx in Docker Container

Permalink debinux

Das Szenario

– Nginx als SSL Reverse Proxy innerhalb eines Docker Containers
– Externe Domäne www.domain.tld
– Lokaler Webserver auf Port 8080/TCP/HTTP > http://localhost:8080
– Alle Anfragen auf Port 80/TCP/HTTP nach 443/TCP/HTTPS innerhalb des Containers.

Alle Befehle werde ich als Benutzer root ausführen.

Bitte betrachtet den Artikel als Hilfestellung.
Haltet euch immer vorrangig an die offiziellen Dokumentation Nginx’ und Dockers’. :-)

Installation Dockers

Debian Wheezy

Installation des Kernels aus dem Backport Repository mit anschließendem Neustart.
Dies ist notwendig, da erst ein Kernel ab Version 3.10 empfohlen wird.

1
2
3
4
echo deb http://ftp.us.debian.org/debian wheezy-backports main > /etc/apt/sources.list.d/wheezy-backports.list
apt-get update -y
apt-get -t wheezy-backports install linux-image-amd64 -y # Für ein amd64-basierendes System
reboot
OVH VMware vServer Besitzer sollten die Datei “/etc/grub.d/06_OVHkernel” vor dem Neustart löschen und “update-grub2″ ausführen, damit der neue Kernel aktiv wird.
Der OVH Kernel ist leider etwas beschnitten und bietet unter anderem keine cgroups.

Nun Docker installieren (lassen). Vorab “curl” installieren:

1
2
apt-get install curl
curl -sSL https://get.docker.io/ | bash

Ubuntu 14.04

Ich empfehle den Docker Installer zu verwenden. Es wird das offizielle Repository installiert. Auch hier im Vorfeld “curl” installieren:

1
2
apt-get install curl
curl -sSL https://get.docker.io/ubuntu/ | bash

Konfiguration

Ab hier erst einmal einige Informationen zur Auffrischung der Docker-Kenntnisse:

  • Docker Images werden in der Regel aus dem Repository Dockers’ gezogen (“pull”).
  • Images (Ubuntu, Debian, Centos etc., Debian + Apache, Centos + Nginx und viele mehr) können entweder direkt verwendet- oder durch Dockerfiles manipuliert werden.
  • Docker Images sind für Container immer read-only! Images werden bei Ausführung nie verändert!
  • Ein Container benutzt eine Kopie des Images als Basis. 5 Container mit selben Image, benutzen jeweils eigene Kopien des Images.

Als Grundlage des Reverse Proxys dient das aktuellste (> “latest”) Ubuntu Image “Phusion”, das dem offiziellen Ubuntu Image Dockers’ einige Optimierungen voraus hat.

Ein Dockerfile erweitert die Basis-Installation um einen Nginx Server aus dem Nginx Repository.

Ein Blick in diese Datei schadet nicht

  • Die Zeile “FROM dockerfile/ubuntu” ersetzt “sed” später durch das Phusion Image (“phusion/baseimage:latest). Dies ist die Basis.
  • Durch die “RUN” Befehle wird das Image um Nginx aus dem Nginx PPA erweitert, diesem die Daemon-Funktionalität entzogen (notwendig für Docker) und noch einige weitere Kleinigkeiten angepasst.
  • “VOLUME” Anweisungen erstellen “mount points”, auf die von außen zugegriffen werden kann.
  • “WORKDIR” beschreibt das “working directory” (no shit, Sherlock ;-) ). So werden etwa alle “RUN” Anweisungen in diesem Verzeichnis ausgeführt.
  • “CMD” hält die Anweisung bereit, Nginx zu starten.
  • “EXPOSE” beschreibt die Ports, die im Container während der Laufzeit aktiv sein können.

Alle Daten werde ich im Verzeichnis “/opt” ablegen. Der letzte Befehl “docker build” wird das Dockerfile abarbeiten und das veränderte Phusion Image mit der Bezeichnung “phusion/nginx” ablegen.

1
2
3
mkdir /opt/docker_nginx/ ; cd /opt/docker_nginx
wget -q -O - https://raw.githubusercontent.com/dockerfile/nginx/master/Dockerfile | sed "s/dockerfile\/ubuntu/phusion\/baseimage:latest/g" > Dockerfile
docker build -t="phusion/nginx" .

Hat alles geklappt, schließt die Einrichtung mit “Successfully built XYZ” ab. Wobei XYZ einer eindeutigen ID entspricht.
Nun besitzt der Host zwei Images, zu prüfen mit “docker images”:

1
2
3
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
phusion/nginx       latest              19c681f50628        36 minutes ago      309.1 MB
phusion/baseimage   latest              cf39b476aeec        8 days ago          289.4 MB

Das Phusion “baseimage” ist ebenso im lokalen Speicher vorhanden, da es als Basis für das um Nginx erweiterte Image diente.
Dieses könnte durch ein “docker rmi phusion/baseimage” gelöscht werden, ohne das Nginx Image zu zerstören.

Die Verzeichnisse “/etc/nginx/sites-enabled”, “/etc/nginx/certs” sowie “/var/logs/nginx”, möchte ich vom Host in den Container mounten, um die Verwaltung zu erleichtern.
Auf dem Host erstelle ich drei Ausgangspunkte für diese Verzeichnisse:

1
mkdir /opt/docker_nginx/{sites,logs,certs}

Eine einfache Site-Konfiguration für einen Reverse Proxy lege ich unter “sites” ab:

1
nano /opt/docker_nginx/sites/reverse_proxy

Inhalt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
        listen 80;
        return 301 https://www.domain.tld/$request_uri;
}
server {
        listen 443;
        server_name www.domain.tld domain.tld;
        ssl on;
        ssl_certificate         /etc/nginx/certs/www.crt;
        ssl_certificate_key     /etc/nginx/certs/www.key;
        ssl_ciphers 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA';
        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        add_header Strict-Transport-Security max-age=15768000;
 
        location / {
 
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto $scheme;
 
                proxy_pass      http://localhost:8080;
                proxy_redirect  off;
        }
}

Das Zertifikat und der zugehörige Schlüssel liegen im Verzeichnis “/opt/docker_nginx/certs”. Die Namen (www.*) müssen in der Site entsprechend angepasst werden. Der Pfad bleibt bestehen!

Nun darf der Container mit folgendem Parameter erstmalig gestartet werden:

1
docker run -p 443:443 -p 80:80 -d -v /opt/docker_nginx/sites:/etc/nginx/sites-enabled -v /opt/docker_nginx/certs:/etc/nginx/certs -v /opt/docker_nginx/logs:/var/log/nginx phusion/nginx

Durch diese Anweisung werden Port 80/TCP sowie 443/TCP vom Host in den Container weitergeleitet, die drei besagten Verzeichnisse eingebunden (“-v HOST_VERZ:CONTAINER_VERZ”) und der Container “detached” gestartet (> nicht-interaktiv, im Hintergrund).

Ein Zugriff auf www.domain.tld leitet ab diesem Punkt auf die lokale Installation auf Port 8080 weiter.

Zur Verwaltung des Containers:

1
2
3
4
5
6
docker ps # Listet gestartete Container
docker ps -a # Listet gestartete und gestoppte Container
docker images # Listet Images
docker stop CONTAINER_ID # Stop einen vorhandenen Container
docker start CONTAINER_ID # Startet einen vorhandenen, gestoppten Container
docker run XYZ # Erstellt (!) einen neuen Container. Nicht mit "start" zu verwechseln!

Wacom Bamboo Pen fixen

Permalink [ENC]BladeXP's Blog

Seit einiger Zeit verfüge ich ja über ein Grafiktablet vom Typ Wacom Bamboo Pen. Dieses hab eich schon etwas länger nicht mehr benutzt, und durch ein neuliches Update auf eine neuere Version des X-Servers wollte dies nur noch als Mausersatz, nicht aber als Grafiktablet funktionieren.

Durch die Meldungen im Journal bin ich darauf aufmerksam geworden das sich wohl evdev spontan dazu entschieden hat sich um mein Grafiktablet zu kümmern, eine Entscheidung, welche dieser Treiber ohne meine Zustimmung getroffen hat!

Der evdev Treiber bekommt hier unter Arch Linux seine Konfiguration über die Datei /etc/X11/xorg.conf.d/10-evdev.conf. Dort wird, für eine reihe typischer Eingabegeräte, ein sog. Catchall eingerichtet, also eine Regel, die für alle Geräte einer bestimmten Klasse greift. Nachfolgende Regeln müssen daher durch ein # am Anfang der Zeile deaktiviert werden:

Section "InputClass"
        Identifier "evdev tablet catchall"
        MatchIsTablet "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

Section "InputClass"
        Identifier "evdev touchscreen catchall"
        MatchIsTouchscreen "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection
Hintergrund ist, dass so ein Wacom neben der Nutzung als Grafiktablet auch als Mausersatz taugen könnte, das wollen wir nicht, wir haben ja schließlich nicht umsonst den Wacom Treiber xf86-input-wacom installiert. Die Änderungen an dieser Datei greifen übrigens erst nach einem Neustart des X-Servers.

Netflix unter Ubuntu 12.04

Permalink deesaster.org

Eigentlich hatte ich mir gestern Abend vorgenommen einen Artikel zu Netflix zu schreiben, da der Media-Streaming-Dienst ja gerade sehr in ist und selbst Canonical Werbung dafür macht. Nachdem die NSS-Bibliotheken in Ubuntu vor ein paar Wochen aktualisiert wurden und Google Netflix seine Browserweiche in Chrome entfernt hat, die auch Linux nicht mehr aussperrt, sollte das ja kein Problem sein.

Und in der Tat, es war recht langweilig. Von der Chrome-Webseite lädt man das entsprechende Deb-Paket herunter und installiert es. Gemäß Wiki sollte man noch die Datei /etc/default/google-chrome anlegen, damit die Paketinstallation nicht in den Paketquellen herumpfuscht. Chrome ist dabei zwingend Voraussetzung, da es aktuell der einzige Browser auf dem Markt ist, der die DRM-Technik EME unterstützt.

Und nach dem Browserstart einfach bei Netflix zum kostenlosen Probemonat anmelden und fertig. Es gab keinerlei Probleme, Hänger, Tonstörungen oder Ähnliches.

Wieso im übrigen Netflix, wo DRM doch Teufelszeug ist? Zum einen kaufe ich immer weniger DVDs und suche schon länger einen Streaming-Dienst, wo ich auch mal einen Film oder eine Serie anschauen kann. Da das ganze legal sein soll und unter Linux laufen muss, gab es bisher aber kaum gute Möglichkeiten. Vor allem die „deutschen“ Dienste bieten Ihr Material oft nicht in hoher Auflösung und/oder nicht in Originalsprache an. Bei Netflix habe ich beides. Ob ich es nach dem Probemonat noch weiter nutze, wird sich zeigen.

11. Oktober 2014

Kurztipp: Festplatten-Standby mit systemd konfigurieren

Permalink /var/pub/chris_blog

Download PDF

Festplatten lassen sich automatisch mit hdparm in den Ruhezustand versetzen. Während sich der entsprechende Befehl (hdparm -B intervall device) früher einfach in die Datei /etc/rc.local, die bei sysvinit-basierenden Linux-Distributionen nach erfolgtem Boot ausgeführt wurde, geschrieben werden konnte, sieht das bei systemd-basierenden Pinguinen anders aus. Hier empfiehlt sich die Erstellung eines Services.

Es muss zuerst ein systemweiter Dienst erstellt und anschließend aktiviert und gestartet werden:

# vi /usr/lib/systemd/system/sda-spindown.service
[Unit]
Description=Set HDD spindown

[Service]
Type=oneshot
ExecStart=/sbin/hdparm -B 241 /dev/sdb
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

ESC ZZ
# systemctl daemon-reload
# systemctl enable sda-spindown.service
# systemctl start sda-spindown.service

Das erfolgreiche Übernehmen der Werte lässt sich ebenfalls über die Dienstverwaltung überprüfen:

# systemctl status sda-spindown.service
sda-spindown.service - Fix excessive HDD parking frequency
   Loaded: loaded (/usr/lib/systemd/system/sdd-spindown.service; enabled)
   Active: active (exited) since Sa 2014-10-11 14:27:16 CEST; 3min 32s ago
   Process: 4336 ExecStart=/sbin/hdparm -B 241 /dev/sda (code=exited, status=0/SUCCESS)
...

Vielen Dank an dieser Stelle an den folgenden Blog, der mir den entsprechen Tipp gab: [klick mich!]

:)

Download PDF

10. Oktober 2014

Syncthing Webinterface nicht erreichbar

Permalink thomas-leister.de

Syncthing

Syncthing

Heute wollte ich einmal wieder die Synchronisationssoftware Syncthing ausprobieren. Als Frontend wird eine Weboberfläche genutzt, die über localhost:8080 im Webbrowser aufrufbar ist. Obwohl der Syncthing Service gestartet war, konnte die Oberfläche aber nicht geladen werden, weil auf Port 8080 keine Antwort kam.

Beim manuellen Aufruf von „syncthing” in der Kommandozeile wurde folgendes angezeigt:

[monitor] 14:57:50 INFO: Starting syncthing
[MACPC] 14:57:50 INFO: syncthing v0.10.0 (go1.3.3 linux-amd64 default) nobody@var-lib-archbuild-extra-x86_64-flexiondotorg 2014-10-08 11:58:41 UTC
[MACPC] 14:57:50 INFO: My ID: MACXXXX-4QHMPIU-XXXXXXX-XXXXXXX-VD7WFNV-XXXXXXX-3NGHCFX-XXXXXXX
[MACPC] 14:57:50 FATAL: Cannot open database: leveldb: manifest missing comparer name - Is another copy of Syncthing already running?
[monitor] 14:57:50 INFO: Syncthing exited: exit status 1

Offenbar war die Datenbank korrupt, was dazu führte dass Syncthing nicht starten konnte.

Durch das Löschen des „index” Verzeichnisses im User Home und einen anschließenden Syncthing Neustart konnte ich den Fehler beheben:

rm -r ~/.config/syncthing/index

 

Quelle: https://github.com/syncthing/syncthing/issues/535

Ubuntu und Microsoft Exchange

Permalink Linuxvoodoo – Thorstens Technikkruscht

Wenn man in einer Firma arbeitet die vorwiegend auf Microsoft Produkte in der Infrastruktur setzt muss man als Linux User manchmal sehr kreativ werden. Besonders wenn der Exchange Server nur noch das hauseigene MAPI Protokoll zur Verfügung stellt. Zum Glück gibt es hierfür “evolution-mapi”.
Das Modul ist eine Erweiterung für den E-Mail Client Evolution.

Installiert wird das Paket über folgenden Befehl:
sudo apt-get install evolution-mapi

Im Anschluss kann man bei der Erstellung eines neuen E-Mail Kontos den Punkt “Exchange MAPI” auswählen.

E-Mail Konto Auswahl

Ich finde es eine sehr angenehme Alternative gegenüber Outlook. Es funktioniert der E-Mail Abruf und versandt, die Kalender-, Notizen- und Kontaktsynchronisation.

Meine Kalendereinträge des Exchange, Synchronisiert und angezeigt in Evolution:

Kalender Einträge in Evolution

Kalender Einträge in Evolution

9. Oktober 2014

[centos] httpd: Could not open configuration file /etc/httpd/conf/httpd.conf: Permission denied

Permalink itbasic

Bei einem neu aufgesetzten centos System und nach ein wenig Konfiguration hier und da, bekam ich beim starten des Apache folgende Meldung:

/etc/init.d/httpd start
httpd starten: httpd: Could not open configuration file /etc/httpd/conf/httpd.conf: Permission denied [FEHLGESCHLAGEN]

Das Problem ließ sich schnell lösen in dem ich selinux deaktivierte.
Einfach in der Datei /etc/sysconfig/selinux die Zeile SELINUX=enforcing auf SELINUX=disabled ändern und den Server neustarten.

OpenBSD IPv6

Permalink noqqe.de

Was ich ja schon immer komisch fand ist, dass die Dokumentation oder auch uch How-Tos im Netz was das Thema OpenBSD und IPv6 angeht echt ultra duerftig ist.

Da ich meine Debian VM auf der ich weechat, mutt, jabber usw laufen habe vor nem Monat ebenfalls auf OpenBSD umgezogen hab, stellte sich mir das Problem schon wieder.

IPv6 mit Router Adverisement (rtadv)

Am komfortablesten ist natuerlich einfach das rtadv den Hosting Providers herzunehmen. In meinem Fall rootbsd.net haben aber nur kleine Anleitungen fuer FreeBSD.

Um den IP Stack auf IPv6 Advertisements antworten zu lassen muss nur /etc/sysctl.conf editiert werden mit

net.inet6.ip6.accept_rtadv=1

Einmal rebooten oder per Hand sysctl net.inet6.ip6.accept_rtadv=1 ausfuehren.

1
2
3
4
5
6
7
8
9
10
11
$ ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:16:3e:2c:4a:41
        priority: 0
        groups: egress
        media: Ethernet autoselect (1000baseT full-duplex)
        status: active
        inet6 fe80::216:3eff:fe2c:4a41%em0 prefixlen 64 scopeid 0x1
        inet 12.34.56.78 netmask 0xffffff80 broadcast 185.34.0.255
        inet6 2a00:d1e0:1000:3100:dead:beef:4a41 prefixlen 64 autoconf pltime 604729 vltime 2591929
        inet6 2a00:d1e0:1000:3100:dead:beef:df24 prefixlen 64 autoconf autoconfprivacy pltime 18185 vltime 537125

IPv6 mit statischer IP

Wenn der Provider kein Router Advertisment anbietet, aber dafür eine IP assigned und auf diese IP ein eigenens Netz für einen routet.

Konfigurieren der Adressen:

1
2
3
4
5
6
$ vi /etc/hostname.em0
inet 213.95.21.200 255.255.255.0 NONE
inet6 alias 2001:780:3:5::122 64   # Transit IP
inet6 alias 2001:780:132::1 48     # IP aus eigenem Netz
inet6 alias 2001:780:132::2 48     # IP aus eigenem Netz
inet6 alias 2001:780:132::3 48     # IP aus eigenem Netz

Konfiguration des Gateways

1
2
3
vi /etc/mygate 
213.95.21.1
2001:780:3:5::1

Und danach Interface reloaden mit sh /etc/netstart em0.

8. Oktober 2014

Fehlermeldung in Steam

Permalink Intux

Bei einigen Spielen wie Half-Life 2, Counter-Strike etckommt es beim Start zu einer störenden Fehlermeldung durch ein aufpoppendes Fenster.

SetLocale(‘en_US.UTF-8′) failed. Using ‘C’.
You may have limited glyph support.
Please install ‘en_US.UTF-8′ locale.

news-278

Will man diese Meldung eliminieren, so geht man wie folgt vor:

# nano /etc/locale.gen

Nun löscht man # vor dem Eintrag en_US.UTF-8 UTF-8

speichert mit Ctrl + o und Enter und verlässt den Editor mit Ctrl + x.

# locale-gen

Das war’s!

DNS lokal cachen

Permalink onli blogging

Das Herumhantieren mit dem DNS-Server für cloudflare und der Hinweis zu DANE hat mich daran erinnert, dass ich vor einiger Zeit mal einen lokalen Cache für DNS-Anfragen haben wollte. Nach dieser Anleitung ist das mit dnsmasq auch nicht zu schwierig.

Zuerst installieren:

sudo apt-get install dnsmasq

Dann muss die /etc/dnsmasq.conf bearbeitet werden, um Anfragen nur vom eigenen PC zu erlauben:

listen-address=127.0.0.1

Außerdem soll dnsmasq nur DNS anbieten, also:

no-dhcp-interface=eth2

eth2 entsprechend anpassen.

In der /etc/dhcp3/dhclient.conf dann noch diese Zeile einkommentieren:

prepend domain-name-servers 127.0.0.1;

Ich war mir nicht sicher, ob wicd die /etc/resolv.conf in Ruhe lässt. Daher habe ich in dessen Konfiguration für die Kabelverbindung ebenfalls die DNS-Server eingetragen, mit 127.0.0.1 als ersten Server.

Schließlich noch dnsmasq neustarten und es sollte laufen:

sudo service dnsmasq restart

Ob es wirklich funktioniert, kann man mit dig testen:

onli@Fallout:~$ dig www.google.de

; <<>> DiG 9.9.5-3-Ubuntu <<>> www.google.de
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11671
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.google.de.			IN	A

;; ANSWER SECTION:
www.google.de.		288	IN	A	74.125.230.248
www.google.de.		288	IN	A	74.125.230.247

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Oct 08 17:14:49 CEST 2014
;; MSG SIZE  rcvd: 63

Ich hatte das vorher mit dem Paket dnscache-run versucht, was aber leider kaputt ist - zumindest bekam ich es nicht zum Laufen.

Mailserver Installer Fufix v0.5.1

Permalink debinux

Der Installer steht jetzt in Version 0.5 (Anm.: Mit dem 10.10.2014 v0.5.1) zur Verfügung.

Die große Neuerung ist der Roundcube Webmailer.

Ansonsten:

  • Besseres “Dashboard”
  • Nginx + PHP5 stark verbessert
  • Übersichtlichere Readme
  • Dovecot: Trash Quota +100%
  • Postfix: Body size limit angehoben auf 25M
  • Kleinere Fixes

"Sprungbrett" via https://hostname.domain.tld

“Sprungbrett” via https://hostname.domain.tld

Screenshot der gesamten Installation + Dashboard.

Weiter Informationen im Blog: www.debinux.de/fufix
Projekt auf GitHub: github.com/andryyy/fufix

Yet Another Bash Scripting Cheat Sheet

Permalink debinux

Tja, weil es davon ja noch nicht genug gibt… :) Bekanntlich merkt sich der Mensch Dinge ja am besten, wenn er es anderen erklärt. Das versuche ich jetzt auch mal. Heraus kommt soetwas wie ein kleines Cheat Sheet, das ich auch weiterhin pflegen möchte.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
echo ${var1}suffix                          = Gibt $var1 aus und fügt "suffix" an.
echo $prefix{var1}                          = Gibt "prefix" vor $var1 aus.
 
echo ${#var1}                               = Gibt die Anzahl der Zeichen von $var1 aus.
 
echo $((51*2))                              = Rechnet 51 * 2 aus.
echo $((var1*2))                            = Rechnet $var1 * 2 aus.
 
echo ${var1~}                               = Erstes Zeichen eines Strings invertiert ausgeben.
echo ${var1,}                               = Erstes Zeichen eines Strings als Kleinbuchstaben ausgeben.
echo ${var1^}                               = Erstes Zeichen eines Strings als Großbuchstaben ausgeben.
 
echo ${var1,,}                              = Einen String in nur Kleinbuchstaben ausgeben.
echo ${var1^^}                              = Einen String in nur Großbuchstaben ausgeben.
echo ${var1~~}                              = Einen String invertiert ausgeben - etwa A anstatt a.
 
echo ${!H*}                                 = Alle Variablen ausgeben, die mit "H" beginnen.
 
echo ${var1:4}                              = Inhalt von $var1 ab Zeichen 4 ausgeben.
echo ${var1: -4}                            = Inhalt von $var1 ab Zeichen 4 vom Ende an ausgeben. Unbedingt das Leerzeichen beachten.
echo ${var1:4:6}                            = Inhalt von $var1 ab Zeichen 4 ausgeben, 6 weitere Zeichen ausgeben.
 
echo ${var1#string}                         = "string" von $var1 in Richtung links nach rechts abziehen.
                                                Beispiel: "var1=einzeichen", Ausgabe von "echo ${var1#ein}" ist "zeichen".
echo ${var1%string}                         = "string" von $var1 in Richtung rechts nach links abziehen.
                                                Beispiel: "var1=einzeichen", Ausgabe von "echo ${var1%zeichen}" ist "ein".
                                                Alternativ ginge auch: echo ${var1%z*n} für "von z bis n". Für längstes Auftauchen "%%" anstatt "%" verwenden.
                                                Selbiges gilt für "#".
 
cp datei{,.bak}                             = Entspricht "cp datei datei.bak"
cp datei{.bak,}                             = Entspricht "cp datei.bak datei"
mkdir /opt/{dir1,dir2,dir3}                 = Erstellt in /opt dir1, dir2 und dir3
mkdir -p /opt/{,backup}/{dir1,dir2}         = Erstellt dir1 und dir2 in /opt und /opt/backup
                                                Lässt sich mit beliebigen Befehlen kombinieren.
 
echo ${var1/suchen_und/ersetzen_durch}      = Erstes Auftreten eines Zeichens oder einer Zeichenfolge in $var1 ersetzen.
echo ${var1//suchen_und/ersetzen_durch}     = Jedes Auftreten ersetzen.
echo ${var1/suchen_und_loeschen}            = Erstes Auftreten von "suchen_und_loeschen" in $var1 löschen.
echo ${var1//suchen_und_loeschen}           = Jedes Auftreten von "suchen_und_loeschen" in $var1 löschen.
 
echo ${var1:-print_this_text}               = Wenn "var1" nicht gesetzt und auch <strong>nicht leer</strong> ist, wird "print_this_text" ausgegeben ("default"), ansonsten der Inhalt von Variable $var1.
echo ${var1-print_this_text}                = Wenn "var1" nicht gesetzt oder leer ist, wird "print_this_text" ausgegeben ("default"), ansonsten der Inhalt von Variable $var1.
echo ${var1:-$var2}                         = Selbiges, jedoch mit zwei Variablen.
echo ${var1:+alt_value}                     = Wenn "var1" gesetzt ist (auch leer), lautet die Ausgabe "alt_value"
echo ${var1:+$var2}                         = Selbiges, jedoch mit zwei Variablen.
 
    
## Kürzel, die besonders in Scripts hilfreich sein können:
echo $#             = Anzahl an Parametern
echo $@             = Alle Parameter anzeigen
echo $?             = Exit Status des letzten Befehls, hier "echo $@".
echo $$             = PID der aktuellen Shell
echo $0             = Shellname oder Name des Scripts
echo $!             = PID des zuletzt in den Hintergrund gelegten Prozesses (z.B. mit "iked &")
 
## Dateipfade
var1=/ein/pfad/zu/einer/datei.mit.erweiterung
echo ${var1}        = /ein/pfad/zu/einer/datei.mit.erweiterung
echo ${var1#*.}     = mit.erweiterung
echo ${var1##*.}    = mit
echo ${var1%/*.*}   = /ein/pfad/zu/einer
file=${var1##/*/}   = datei.mit.erweiterung
echo ${file%.*}     = datei.mit
echo ${file%%.*}    = datei
 
## "Cases"
## Die Endung ";;&" führt den nächsten Test aus.
## Die Endung ";&" führt die nächste Anweisung aus, egal, ob der Test wahr, falsch oder ein Dummy ist.
example_cases()
{
  case "$1" in
    [[:print:]] )   echo "$1 is a printable character.";;&
    [[:alnum:]] )   echo "$1 is an alpha/numeric character.";;&
    [[:alpha:]] )   echo "$1 is an alphabetic character.";;&
    [[:lower:]] )   echo "$1 is a lowercase alphabetic character.";;&
    [[:upper:]] )   echo "$1 is a uppercase alphabetic character.";;&
    [[:upper:]]* )  echo "$1 begins with an uppercase alphabetic character.";;&
    [a-zA-Z]* )     echo "$1 begins with a-z or A-Z.";;&
    [!a-zA-Z]* )    echo "$1 begins not with a-z or A-Z.";;&
    [[:digit:]] )   echo "$1 is a numeric character.";;&
    *[0-9]* )   echo "$1 contains a numeric character.";;&
    123[[:digit:]] ) echo "$1 is a number starting with 123.";&
    dummypattern )  echo "Example for \";&\".";;
  esac
}

Firefox 35 erscheint eine Woche später

Permalink Sören Hentzschel

In wenigen Tagen erscheint Firefox 33, aber die Planung ist natürlich schon etwas weiter. Und so steht nun fest, dass die Veröffentlichung von Firefox 35 um eine Woche nach hinten verschoben wird.

Auf Mozillas Veröffentlichungs-Zyklus von Firefox ist Verlass: alle sechs Wochen am Dienstag erscheint ein neuer Major-Release mit neuen Features. Aber eine Ausnahme gab es die letzten Jahre immer und so auch dieses Jahr: die erste Version nach Weihnachten erscheint später und damit auch alle darauffolgenden Versionen, die Entwicklung wird quasi um eine Woche verlängert, weil auch bei Mozilla über die Weihnachtsfeiertage naturgemäß weniger passiert als sonst. Konkret bedeutet dies eine Verlängerung der Nightly-Phase von Firefox 37, der Aurora-Phase von Firefox 36 sowie der Beta-Phase von Firefox 35, dessen finale Ausgabe statt am 6. Januar 2015 demnach voraussichtlich am 13. Januar 2015 erscheinen wird. Zunächst erscheint am kommenden Dienstag aber erst einmal Firefox 33.

7. Oktober 2014

rtorrent für Debian wheezy kompilieren (UPDATE)

Permalink Falk Husemanns Blog

rtorrentlogo

Wenn es etwas aktueller sein muss, lässt sich rtorrent einfach aus den Quellen kompilieren. Das kann zum Beispiel dann der Fall sein, wenn die beliebte Weboberfläche rutorrent eingesetzt werden soll. Diese benötigt eine rtorrent Version mit Unterstützung von Umlauten in der xmlrpc Kommunikation.

Für die Integration von aus den Quellen kompilierter Software steht in den Debian Paketquellen das Programm checkinstall zur Verfügung, dass einfache Debian Pakete automatisch erzeugen kann. Checkinstall wird hier eingesetzt.

Zuerst werden die Abhängigkeiten installiert, die über die offiziellen Paketquellen verfügbar sind.

apt-get install checkinstall build-essential pkg-config libsigc++-2.0-dev libcurl4-openssl-dev libncurses5-dev libxml2-dev

Ergänzend wird eine aktuelle Version von xmlrpc-c benötigt. Diese kann wie folgt oder per Hand von hier heruntergeladen werden.

wget -O xmlrpc.tgz "http://downloads.sourceforge.net/project/xmlrpc-c/Xmlrpc-c%20Super%20Stable/1.25.26/xmlrpc-c-1.25.26.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fxmlrpc-c%2Ffiles%2FXmlrpc-c%2520Super%2520Stable%2F1.25.26%2F&amp;ts=1385046127&amp;use_mirror=heanet"

Dann wird die gewünschte Version von rtorrent und der zugehörigen libtorrent heruntergeladen.

wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.13.4.tar.gz
wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.9.4.tar.gz

Zuerst wird die heruntergeladene Version von xmlrpc-c entpackt und kompiliert. Nach der Installation mittels checkinstall kann das Paket mit dem Befehl apt-get remove xmlrpc-c wieder entfernt werden.

tar xzf xmlrpc.tgz
cd xmlrpc-c-1.25.26
./configure --with-libwww-ssl --enable-libxml2-backend
make
checkinstall make install
cd ..

Dann wird die Bibliothek libtorrent kompiliert. Aufgrund einiger Randfälle im Installationsteil des Makefiles lässt sich die Bibliothek nicht als Paket installieren.

tar xzf libtorrent-0.13.4.tar.gz
cd libtorrent-0.13.4
CFLAGS="-Os -march=native" ./configure --with-posix-fallocate --enable-ipv6
make && make install
cd ..

Zuletzt wird rtorrent selbst entpackt und kompiliert. Das resultierende Paket lässt sich mit dem Befehl apt-get remove rtorrent wieder deinstallieren.

tar xzf rtorrent-0.9.4.tar.gz
cd rtorrent-0.9.4
CFLAGS="-Os -march=native" ./configure --with-xmlrpc-c --enable-ipv6
make
checkinstall make install

Um direkt nach der Installation rtorrent starten zu können, muss der Bibliotheks-Cache mit dem Befehl ldconfig aktualisiert werden. Eine Konfigurationsdatei die im Stammverzeichnis des Benutzers abgelegt werden muss, der rtorrent ausführen soll, gibt es hier.

Die Datei wird in Voreinstellung am Ort ~/.rtorrent.rc gesucht.

OnePlus One: Recovery installieren und rooten unter Linux

Permalink thomas-leister.de

Gestern habe ich mein OnePlus One Smartphone gerootet. Ein ungerootetes Smartphone ist für mich nur ein halbes Smartphone, deshalb war das eine der ersten Aktionen mit dem neuen Phablet. ;) In dieser kurzen Anleitung für Linux-User erkläre ich, wie ihr ein andere Recovery installiert und das Telefon rootet.

Benötigt wird folgendes:

Fastboot gibt es für die meisten Linux-Distributionen als fertige Paket, das nur installiert werden mmuss.

… und so gehen wir vor:

  • Der Bootloader wird mit Fastboot entsperrt
  • Ein neues Recovery (TWRP) wird installiert
  • Über das neue Recovery wird SuperSU installiert

Bootloader entsperren

Dieser Schritt ist nötig, damit ein neues Recovery installiert und gestartet werden kann. Aktiviert zunächst die Entwickleroptionen. Diese sind standardmäßig ausgeblendet, können aber durch mehrmaliges Tippen auf den Menüpunkt „Build-Nummer” in Einstellungen => Über das Telefon aktiviert werden. Danach wird auf der Hauptseite der Einstellungen unten ein neuer Menüpunkt „Entwickleroptionen” eingeblendet. Hier aktiviert ihr das „Erweiterte Neustartmenü”.

Nun wird das OnePlus One in den Fastboot-Modus versetzt. Drückt den Power Button des Smartphones so lange, bis das Shutdown-Menü erscheint. Wählt „Neu starten” und dann „Bootloader”.

Das OnePlus One schaltet sich aus und startet in den Fastboot-Modus. Verbindet das OPO via USB mit eurem Rechner.  Sobald „Fastboot Mode” aus dem Display erscheint, wird der Bootloader mit diesem Befehl entsperrt (Vorsicht! Alle auf dem Gerät befindlichen Daten werden hierbei gelöscht!):

sudo fastboot oem unlock

Das Smartphone startet neu und bootet in Android.

Recovery installieren

Jetzt, wo das Smartphone schon gestartet ist, kann auch gleich die SuperSU ZIP-Datei in den internen Speicher kopiert werden. Wer das schon vorher erledigt hat, muss diesen Schritt wiederholen, denn durch das Entsperren des Bootloaders wurden alle Daten gelöscht ;)

Auch die Entwickleroptionen und das erweiterte Neustartmenü müssen erneut (wie oben beschrieben) aktiviert werden. Dann wird wieder in den Fastboot Mode gestartet (siehe oben).

Über Fastboot wird die Recovery ISO Datei (heißt bei mir recovery.img) auf das Gerät kopiert:

sudo fastboot flash recovery recovery.img
sudo fastboot boot recovery.img

Nach etwa 20 Sekunden bootet das One in das TWRP Recovery. Von hier aus wird der letzte Schritt getan…

SuperSU Root installieren

Jetzt kann endlich SuperSU installiert werden. Die dafür notwendige ZIP Datei habt ihr hoffentlich schon auf das Smartphone kopiert. Wählt im Recovery „Install” und im Dateibrowser die SuperSU ZIP aus. Macht dann eine Swipe-Geste, um den Flashvorgang zu starten.

Es kann nicht schaden, den Android Cache zu löschen. Im TWRP Hauptmenü wird dazu „Wipe Cache/Dalvik” ausgewählt. Das Rooten ist abgeschlossen! Mit „Reboot System” startet ihr das Smartphone neu. „Android wird aktualisiert” erscheint auf dem Bildschirm. Das kann eine Weile dauern.

In euren Apps findet ihr ab sofort die neue SuperSU-App, die den Root-Zugriff verwaltet. Die Entwickleroptionen müssen erneut freigeschaltet werden, wenn ihr sie nutzen wollt.

Recovery beim Update behalten

Bei einem CyanogenMod Systemupdate wird das selbst installierte Recovery wieder entfernt und auch SuperSU muss neu installiert werden. Um sich zumindest eine Neuinstallation des Recoverys zu sparen, kann in den Entwickleroptionen der Haken bei „CM-Recovery aktualisieren” entfernt werden.

Die SuperSU ZIP behält man am besten auf dem Gerät, sodass man sie nach einem Update direkt wieder über das TWRP Recovery installieren kann.

DELL OpenManage Integration Virtual Appliance Update-Probleme

Permalink /var/pub/chris_blog

Download PDF

Für VMware-Kunden bietet DELL eine auf CentOS 5-basierende Linux-Appliance zur Überwachung der physischen Server an. Das auf den Namen “DELL OpenManage Integration for VMware vCenter Appliance” lauschende System integriert sich nahtlos in den VMware vCenter Server (bzw. die Appliance) und ermöglicht die Fernsteuerung der einzelnen Server. Darüber hinaus lassen sich Firmware-Stände aktualisieren und Garantie-Laufzeiten überblicken.

Ich hatte kürzlich das Problem, dass die Appliance nicht über die Web-Oberfläche aktualisiert werden konnte. Zwar wurde das Update gestartet und die Appliance nach einiger Zeit erneut gebootet, jedoch änderte sich die Versionsnummer nicht. In einer älteren Dokumentation habe ich einen Hinweis auf eine Logdatei namens /usr/share/tomcat5/rpmupdate.log gefunden – dort wird der Update-Prozess protokolliert. Da jedoch selbst das Administrator-Konto keinen Shell-Zugriff auf die Appliance hat, müsste hier mit einer Live-CD gearbeitet werden. Dieser Umweg ist glücklicherweise gar nicht notwendig, da in der Web-Oberfläche eine entsprechende Schaltfläche zur Generierung eines Fehlerbehebungspakets existiert. Im angebotenen ZIP-Archiv befindet sich die erwähnte Datei rpmupdate.log(Wenn man die Live CD-Lösung bevorzugt ist die Datei in der Appliance-Version 2.x übrigens unterhalb /usr/share/tomcatSpectre/logs zu finden)

rpmupdate.log in Fehlerbehebungspaket

rpmupdate.log in Fehlerbehebungspaket

In meinem Fall konnte YUM keine RPM-Pakete herunterladen, was das Log eindeutig zeigte:

$ cat rpmupdate.log
Stopping httpd: [  OK  ]
Loaded plugins: fastestmirror
Cleaning up Everything
Cleaning up list of fastest mirrors
Loaded plugins: fastestmirror
Determining fastest mirrors
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package Spectre-OMSA-Repo.i386 0:1.0.3-1 set to be updated
--> Processing Dependency: dell-omsa-esx40 >= 1.0.1 for package: Spectre-OMSA-Repo
...
Total download size: 610 M
Downloading Packages:
http://linux.dell.com/repo/hardware/vcenter-plugin/latest/spectrebinaries/dell-omsa-esxi51-1.0.1-1.i386.rpm: [Errno 12] Timeout: 
Trying other mirror.
http://linux.dell.com/repo/hardware/vcenter-plugin/latest/spectre/spectre-webclient-package-2.2.0-254.1.noarch.rpm: [Errno 12] Timeout: 
Trying other mirror.
http://linux.dell.com/repo/hardware/vcenter-plugin/latest/centos_updates/kernel-2.6.18-371.8.1.el5.i686.rpm: [Errno 12] Timeout: 
Trying other mirror.
http://linux.dell.com/repo/hardware/vcenter-plugin/latest/spectre/spectre-deps-2.2.0-255.1.i386.rpm: [Errno 12] Timeout: 
Trying other mirror.
http://linux.dell.com/repo/hardware/vcenter-plugin/latest/spectrebinaries/dell-dtk-4.0.1-1.i386.rpm: [Errno 12] Timeout: 
Trying other mirror.

Error Downloading Packages:
  dell-dtk-4.0.1-1.i386: failure: spectrebinaries/dell-dtk-4.0.1-1.i386.rpm from Dell_VC_Plugin: [Errno 256] No more mirrors to try.
  dell-omsa-esxi51-1.0.1-1.i386: failure: spectrebinaries/dell-omsa-esxi51-1.0.1-1.i386.rpm from Dell_VC_Plugin: [Errno 256] No more mirrors to try.
  spectre-deps-2.2.0-255.1.i386: failure: spectre/spectre-deps-2.2.0-255.1.i386.rpm from Dell_VC_Plugin: [Errno 256] No more mirrors to try.
  kernel-2.6.18-371.8.1.el5.i686: failure: centos_updates/kernel-2.6.18-371.8.1.el5.i686.rpm from Dell_VC_Plugin: [Errno 256] No more mirrors to try.
  spectre-webclient-package-2.2.0-254.1.noarch: failure: spectre/spectre-webclient-package-2.2.0-254.1.noarch.rpm from Dell_VC_Plugin: [Errno 256] No more mirrors to try.

Mein Netzwerk setzt die Verwendung eines Proxy-Servers zwingend voraus – über die Web-Oberfläche wurde dieser auch korrekt konfiguriert, wie eine Test-Funktion der Appliance bestätigte. Es scheint, als wurde einfach vergessen, die Proxy-Konfiguration auch für YUM zu übernehmen.

Um diesen Fehler zu beheben habe ich das in der Appliance konfigurierte YUM-Repository um eine Proxy-Konfiguration erweitert. Diese Anpassung erfordert die Verwendung einer Live-CD, da die Appliance keinen Shell-Zugriff erlaubt. Auch das Booten im Single-User-Mode ist nicht möglich, da GRUB mit einem Passwort versehen wurde. Die VM muss also anstatt von der Festplatte von einem Linux CD-Abbild booten. Anschließend wird die erkannte Festplatte eingehängt und die Konfiguraiton des YUM-Repositories angepasst:

# mount /dev/sda1 /crash
# vi /crash/etc/yum.repos.d/spectre.repo
...
proxy=http://ip:port

ESC ZZ

Ich rate dringend davon ab, die Aktualisierung der Appliance nach einem chroot direkt über YUM auszuführen, da die Aktualisierung über die Web-Oberfläche anscheinend weitere Schritte ausführt. In meinem Fall wurde die Appliance nach der Anpassung erfolgreich aktualisiert und zweimal neu gestartet. Beim ersten Reboot wurden einige Pakete entfernt, was definitiv nicht über ein herkömmliches “yum update” bewerkstelligt wurde:

Geskriptete Entfernung einiger RPM-Pakete

Geskriptete Entfernung einiger RPM-Pakete

Nach den beiden Reboots der Appliance hat sich die Versionsnummer geändert:

Erfolgreiches Update

Erfolgreiches Update

Download PDF

WordPress “HTTP Error” beim Dateiupload

Permalink thomas-leister.de

Gerade wollte ich ein paar größere Bilddateien für einen neuen Beitrag in WordPress hochladen, doch während des Uploads erschien folgenden Fehlermeldung:

HTTP error.

Sehr aussagekräftig, oder? Mein Webserver läuft mit Nginx und PHP-FPM Anbindung. Also habe ich in den Nginx Errolog geschaut und folgendes gefunden:

2014/10/07 13:52:44 [error] 25154#0: *182780 client intended to send too large body: 2806036 bytes, server: thomas-leister.de, request: "POST /wp-admin/async-upload.php HTTP/1.1", host: "thomas-leister.de", referrer: "https://thomas-leister.de/wp-admin/upload.php"

Der HTTP Body sei also zu groß. Das Limit dafür kann man in der Konfigurationsdatei /etc/nginx/nginx.conf ändern, indem man folgende Zeile zum http {} – Bereich hinzufügt:

client_max_body_size 400m;

… wobei das Limit hier auf 400 MB gesetzt wird. Und schon funktioniert der Upload wieder :)