lean debian

Ein schlankes Debian mit dem Window-Manager dwm aufsetzen

Patrick Bucher
2. Januar 2014

Debian 7 (Codename: Wheezy) liefert zum ersten mal den GNOME-3-Desktop mit einem stable-Release aus. Das Bedienkonzept hat sich gegenüber GNOME 2 deutlich geändert, sodass man seine Gewohnheiten im Umgang mit dem Desktop anpassen muss: ein Umlernen ist vonnöten. Meiner Meinung nach lohnt sich das nicht, zumal sich GNOME 3 zu träge anfühlt und ich die Bedienkonzepte für ineffizient halte. Wenn schon umlernen, dann richtig: die Stärken von Linux und allen UNIX-artigen Betriebssystemen liegen in der mächtigen Shell; statt sich mit der Bedienung der GNOME-Shell zu befassen, übt man besser die Arbeit mit der richtigen Shell, sprich bash. Für Anwendungen wie Browser, PDF-Betrachter und Video-Player braucht man aber dennoch eine grafische Oberfläche.

GNOME, wie auch KDE, Xfce und andere Linux-Desktops, greifen für die grafische Ausgabe auf das X Window System zurück. Statt nun einer der genannten Schwergewichte zu installieren, kann man es auch mit einem Leichtgewicht wie dwm versuchen. Hierbei handelt es sich nur um einen Window-Manager, nicht um eine komplette Desktop-Umgebung wie GNOME oder KDE mit einer ganzen Reihe von Zusatzprogrammen. Erklärtes Projektziel von dwm ist es, einen möglichst einfachen Window-Manager mit maximal 2'000 Zeilen C-Programmecode umzusetzen. Die aktuelle Version 6.0 ist zwar 2'146 Zeilen, mit Konfiguration 2'291 Zeilen lang, dennoch handelt es sich bei dieser Software um ein Leichtgewicht.

Die folgenden Zeilen beschreiben mein Installationsszenario von Debian 7.1 auf einem etwas angestaubtem Lenovo-Laptop (Baujahr: 2009) mit amd64-Architektur. Der Zeitaufwand sollte sich für jemanden, der schon einmal Debian installiert hat, auf ein bis zwei Stunden belaufen.

Hinweis: In den grauen Kästen weisen Zeilen, die mit $ beginnen, auf Shell-Befehle hin. Steht # vorne, handelt es sich um Shell-Befehle, die man als root ausführen muss.

Installationsmedium

Ein aktuelles Image lässt sich über die offizielle Debian-Webseite mit wget beziehen:

$ wget http://cdimage.debian.org/debian-cd/7.1.0/amd64/iso-cd/debian-7.1.0-amd64-netinst.iso

Das Image passt auf einen 256 MB grossen USB-Stick und lässt sich (als root) mit dd auf diesen Datenträger schreiben:

# dd if=debian-7.1.0-amd64-netinst.iso of=/dev/sdb bs=4096

Grundinstallation

Bei der Debian-Grundinstallation ist es wichtig, dass man bei der Paketauswahl nur Standard system utilities auswählt, also auf eine Desktop-Umgebung verzichtet.

Bevor man Pakete via apt-get installiert, sollte man unbedingt die Recommendations und Suggestions deaktivieren. Ansonsten wird die Festplatte mit mutmasslich unnötigen Paketen belastet. (Wir wollen ein schlankes Debian installieren!) Dazu legt man (als root) eine Datei /etc/apt/apt.conf mit folgendem Inhalt an:

APT::Install-Recommends "0";
APT::Install-Suggests "0";

dwm und dmenu installieren

Der Window-Manager dwm (mit der Zusatzsoftware dmenu lässt sich entweder über apt-get installieren oder – die harte Tour – direkt aus dem Code erstellen. Da dwm ausschliesslich über den Programmcode konfiguriert werden kann, rate ich zur zweiten Variante.

dwm und dmenu per apt-get installieren

# apt-get install dwm dmenu

dwm und dmenu selber bauen

Der Quellcode von dwm und dmenu lässt sich mit wget von der Suckless-Seite herunterladen, zum Beispiel ins Verzeichnis /usr/local/src. Dann entpackt man die Archive mit tar:

$ wget http://dl.suckless.org/dwm/dwm-6.0.tar.gz
$ wget http://dl.suckless.org/tools/dmenu-4.5.tar.gz
$ tar xvf dwm-6.0.tar.gz
$ tar xvf dmenu-4.5.tar.gz

Um die Software kompilieren zu könne, benötigt man neben make, gcc und pkg-config – und natürlich dem X-Window-System – auch noch eine Reihe von X-Libraries:

apt-get install make gcc libc6-dev pkg-config xorg libx11-dev libxinerama-dev

Dann lässt sich die Software wie gewohnt mit make kompilieren und installieren

# pwd
/usr/local/src
# cd dwm-6.0
# make
# make install
# make clean
# cd ../dmenu-4.5
# make
# make install
# make clean

Zum komfortablen Start des X Window System empfiehlt es sich, einen symbolischen Link namens x auf das Programm startx anzulegen:

# ln -s $(which startx) /usr/bin/x

Damit dwm bei Aufstarten des X Window System mitgestartet wird, legt man eine Datei namens .xinitrc in seinem home-Verzeichnis mit folgendem Inhalt an:

exec dwm

Tippt man nun x [Enter] auf der Konsole, verschwindet diese – und dwm erscheint!

Eine Statuszeile definieren

Oben rechts erscheint standardmässig die nicht sehr informative Zeichenkette "dwm-6.0". An dieser Stelle könnte man beispielsweise Datum, Uhrzeit und sonstige Statusinformationen des Computers anzeigen, gerade bei Laptops ist die Information über den Batterienladestand sehr hilfreich. Im folgenden Beispiel werden Datum, Uhrzeit (über date) und der Batterieladestand sowie die vorhergesehene Auf- bzw. Entladungsdauer ausgegeben. Dazu wird folgender Code oberhalb des vorher eingefügten Befehls exec dwm eingefügt:

while true; do
    date_str=$(date +"%d.%m.%Y %H:%M")
    energy_str=$(acpi | cut -d, -f2-)
    xsetroot -name "$date_str - power:$energy_str"
    sleep 5
done &

# diese Zeile war schon drin
exec dwm

Hierbei handelt es sich um eine Endlosschleife (while true; do), die alle fünf Sekunden durchläuft (sleep 5). Bei jedem Durchlauf wird das aktuelle Datum und die aktuelle Uhrzeit einem bestimmten Format (z.B. 31.08.2013 19:08) ausgelesen. Mit dem Programm acpi lassen sich Informationen über den Akku ermitteln, cut entfernt die weniger wichtigen Informationen. Das Programm xsetroot setzt dann mithilfe des Parameters -name diesen String zusammengesetzt in die rechte obere Ecke des Bildschirms. Sicherlich lohnt es sich, mit der Dauer des sleep-Parameters etwas herumzuprobieren. Jeder Schleifendurchlauf startet fünf Programme (date, acpi, cut, xsetroot und sleep) – eine Belastung, die man sich (und seiner CPU) nicht zwingend jede Sekunde gönnen muss. Ein Intervall von fünf oder zehn Sekunden sollte genügen. Wegen der Darstellung der Uhrzeit sollte die Schleife aber mindestens einmal pro Minute durchlaufen.

Kontrolle der Lautstärke

Mein Laptop hat drei Knöpfe zur Lautstärkeregelung: leiser, lauter und mute. In dwm lassen sich diese Knöpfe in der Datei config.h an einen Befehl koppeln. Dazu benötigt man zwei Arten von Informationen: 1. die Keycodes der Knöpfe und 2. die bei Knopfdruck auszuführenden Befehle.

Keycodes

Die Keycodes lassen sich mit dem Programm xev herausinden. Dieser Befehl öffnet ein X-Fenster, das sämtliche entgegengenommene Events protokolliert. Nach dem Programmstart drückt man einmal auf jede Taste, von der man den Keycode ausfindig machen will. Ich empfehle, die Ausgabe in eine Datei umzuleiten.

xev > xev.log

Die Logdatei kann recht gross werden. Am besten durchsucht man sie nach der Zeichenkette XF86Audio:

$ grep XF86Audio xev.log
state 0x0, keycode 122 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
state 0x0, keycode 122 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
state 0x0, keycode 123 (keysym 0x1008ff13, XF86AudioRaiseVolume), same_screen YES,
state 0x0, keycode 123 (keysym 0x1008ff13, XF86AudioRaiseVolume), same_screen YES,
state 0x0, keycode 121 (keysym 0x1008ff12, XF86AudioMute), same_screen YES,
state 0x0, keycode 121 (keysym 0x1008ff12, XF86AudioMute), same_screen YES,

Wichtig sind nur die hexadezimalen Zahlen, die sich (durch ein Komma getrennt) vor den XF86Audio-Bezeichnungen befinden, also in meinem Fall: 0x1008ff11 für leiser, 0x1008ff12 für lauter und 0x1008ff13 für mute.

Befehle

Die Lautstärke lässt sich mit amixer festlegen. Die folgenden Befehle verringern bzw. erhöhen die Master-Lautstärke jeweils um 2 und setzen die Ausgabe auf unmute. Der dritte Befehl setzt die Ausgabe des Masters auf mute, ohne den Wert für die Lautstärke zu ändern.

amixer set Master 2- unmute
amixer set Master 2+ unmute
amixer set Master mute

Keymappings in dwm definieren

Die Befehle und Keymappings müssen in dwm über die Datei config.h konfiguriert werden. Dazu sucht man sich die Definition des Arrays keys[] und trägt oberhalb davon die obengenannten Befehle folgendermassen ein:

static const char *downvol[] = {"amixer", "set", "Master", "2-", "unmute", NULL};
static const char *upvol[] = {"amixer", "set", "Master", "2+", "unmute", NULL};
static const char *mute[] = {"amixer", "set", "Master", "mute", NULL};

Die Keymappings können nun in keys[] folgendermassen definiert werden, indem man die ermittelten Keycodes mit einem der zuvor definierten Befehle verknüpft:

static Key keys[] = {
    /*
     * bisherige Definitionen
     */
    { NULL, 0x1008ff11, spawn, {.v = downvol}}, // neue Definition
    { NULL, 0x1008ff13, spawn, {.v = upvol}}, // neue Definition
    { NULL, 0x1008ff12, spawn, {.v = mute}} // neue Definition
};

Danach speichert man die Datei und kompiliert und installiert dwm neu.

Das Beep-Geräusch loswerden

Das teils nervice Beep-Geräusch wird man los, indem man der Datei /etc/inputrc folgende Zeile hinzufügt bzw. das Kommentarzeichen am Anfang dieser Zeile entfernt:

set bell-style none

Scrollen per Touchpad

Funktioniert das Scrollen per Touchpad nicht, schafft man sich Abhilfe, indem man die Datei /etc/X11/xorg.conf mit folgenden Inhalt anlegt bzw. erweitert:

Section "InputClass"
        Identifier      "Touchpad"
        MatchIsTouchpad "yes"
        Driver          "synaptics"
        Option          "VertEdgeScroll"    "1"
EndSection

Tastaturlayout per Windows-Taste umstellen

Ich benötige abwechselnd die Tastaturlayouts ch (Schweizerdeutsch) und ru (Russisch). Zum komfortablen Umschalten zwischen diesen beiden Layouts eignet sich die Windows-Taste, da sie bisher noch nicht belegt ist.

Das switchkeyboard-Skript

Mit dem Programm setxkbmap lässt sich das Tastaturlayout umstellen und ermitteln. Das folgende Skript bestimmt das aktuelle Tastaturlayout und stellt es jeweils auf das andere Layout um, also auf ru wenn ch ausgewählt ist und umgekehrt.

#!/bin/bash

layout="$(setxkbmap -query | grep layout | egrep -o [a-z]{2}$)"
if [ "$layout" == "ch" ]; then
    setxkbmap ru
elif [ "$layout" = "ru" ]; then
    setxkbmap ch
fi

Keymapping in dwm definieren

In der Datei config.h fügen wir folgende Zeile hinzu, die den Aufruf des vorher erwähnten Skripts definiert:

static const char *switchkeyboard[] = {"switchkeyboard", NULL};

Das keys-Array muss ebenfalls erweitert werden, wobei wir den Keycode für die Windows-Taste (Super_L) per xev ermitteln:

$ xev | grep Super_L    
    state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,

Auf meinem Rechner lautet der Hex-Code für die Windows-Taste 0xffeb. Er lässt sich folgendermassen in config.h dem switchkeyboard-Befehl zuordnen:

static Key keys[] = {
    /*
     * bisherige Definitionen
     */
    { NULL, 0xffeb, spawn, {.v = switchkeyboard}} // neue Definition
};

Danach muss dwm wie gewohnt kompiliert und neu installiert werden.

Links

  1. dwm – dynamic window manager
  2. X Window System
  3. Getting Debian – offizielle Webseite für Debian-Images
  4. Sucklesssoftware that sucks less