Kapitel 9. Systemtipps

Inhaltsverzeichnis

9.1. Tipps für die Konsole
9.1.1. Shell-Aktivitäten sauber aufzeichnen
9.1.2. Das Programm screen
9.1.3. Durch Verzeichnisse navigieren
9.1.4. Readline-Wrapper
9.1.5. Durchsuchen eines Quellcode-Baums
9.2. Anpassen von vim
9.2.1. Anpassen von vim mit internen Funktionalitäten
9.2.2. Anpassen von vim mit externen Paketen
9.3. Datenaufzeichnung und -darstellung
9.3.1. Der log-Daemon
9.3.2. Analyseprogramme für Logdateien
9.3.3. Angepasste Anzeige von Textdaten
9.3.4. Angepasste Anzeige von Datum und Uhrzeit
9.3.5. Farbige Shell-Ausgabe
9.3.6. Farbige Befehle
9.3.7. Aufzeichnen von Editor-Aktivitäten für komplexe Wiederholungen
9.3.8. Die Bildschirmanzeige einer X-Anwendung aufzeichnen
9.3.9. Aufzeichnen von Änderungen in Konfigurationsdateien
9.4. Überwachen, Steuern und Starten von Programmaktivitäten
9.4.1. Zeitmessung für einen Prozess
9.4.2. Die Ablaufpriorität
9.4.3. Der Befehl ps
9.4.4. Der Befehl top
9.4.5. Dateien auflisten, die von einem Prozess geöffnet wurden
9.4.6. Programmaktivitäten verfolgen
9.4.7. Identifikation von Prozessen, die Dateien oder Sockets verwenden
9.4.8. Einen Befehl mit festem Intervall wiederholt ausführen
9.4.9. Einen Befehl wiederholt mit einer Schleife über verschiedene Dateien ausführen
9.4.10. Ein Programm aus der grafischen Oberfläche heraus starten
9.4.11. Anpassen des zu startenden Programms
9.4.12. Einen Prozess beenden (kill)
9.4.13. Einmalige Aufgaben planen
9.4.14. Regelmäßige Aufgaben planen
9.4.15. Scheduling tasks on event
9.4.16. Die Alt-SysRq-Tastenkombination
9.5. Tipps zur Systempflege
9.5.1. Wer ist/war im System aktiv?
9.5.2. Allen eine Warnung schicken
9.5.3. Hardware-Identifikation
9.5.4. Hardware-Konfiguration
9.5.5. System- und Hardware-Zeit
9.5.6. Die Terminal-Konfiguration
9.5.7. Die Audio-Infrastruktur
9.5.8. Deaktivieren des Bildschirmschoners
9.5.9. Ausschalten von Pieptönen
9.5.10. Arbeitsspeichernutzung
9.5.11. Systemsicherheits- und Integritätsüberprüfung
9.6. Tipps zur Speicherung von Daten
9.6.1. Verwendung des Plattenplatzes
9.6.2. Konfiguration der Festplattenpartitionen
9.6.3. Zugriff auf Partitionen über die UUID-Kennung
9.6.4. LVM2
9.6.5. Konfiguration von Dateisystemen
9.6.6. Dateisystemerzeugung und Integritätsüberprüfung
9.6.7. Optimierung von Dateisystemen über mount-Optionen
9.6.8. Optimierung von Dateisystemen über den Superblock
9.6.9. Optimierung der Festplatte
9.6.10. Optimierung von Solid State Disks
9.6.11. SMART verwenden, um Festplattenausfälle vorherzusehen
9.6.12. Angeben eines Verzeichnisses für temporäre Dateien über $TMPDIR
9.6.13. Vergrößerung des nutzbaren Speicherplatzes mittels LVM
9.6.14. Vergrößerung des nutzbaren Speicherplatzes über das Einbinden anderer Partitionen
9.6.15. Vergrößerung des nutzbaren Speicherplatzes, indem ein anderes Verzeichnis mit "mount --bind" eingebunden wird
9.6.16. Vergrößerung des nutzbaren Speicherplatzes, indem ein anderes Verzeichnis mit "Overlay-mounting" eingebunden wird
9.6.17. Vergrößerung des nutzbaren Speicherplatzes über einen symbolischen Link
9.7. Das Festplatten-Abbild
9.7.1. Erzeugung der Festplatten-Abbild-Datei
9.7.2. Direkt auf eine Festplatte schreiben
9.7.3. Einbinden der Festplatten-Abbild-Datei
9.7.4. Eine Festplatten-Abbild-Datei bereinigen
9.7.5. Eine leere Abbild-Datei erstellen
9.7.6. Erstellen einer ISO9660-Abbild-Datei
9.7.7. Direkt auf die CD/DVD-R/RW schreiben
9.7.8. Einbinden einer ISO9660-Abbild-Datei
9.8. Binärdaten
9.8.1. Betrachten und Bearbeiten von Binärdaten
9.8.2. Manipulieren von Dateien ohne Einbinden der Festplatte
9.8.3. Datenredundanz
9.8.4. Datenwiederherstellung und forensische Analyse
9.8.5. Aufsplitten einer großen in mehrere kleine Dateien
9.8.6. Leeren von Dateiinhalten
9.8.7. Dummy-Dateien
9.8.8. Eine vollständige Festplatte löschen
9.8.9. Einen ungenutzten Bereich einer Festplatte löschen
9.8.10. Wiederherstellen von gelöschten, aber noch geöffneten Dateien
9.8.11. Alle harten Links suchen
9.8.12. Unsichtbarer Verbrauch von Festplattenplatz
9.9. Tipps zur Datenverschlüsselung
9.9.1. Verschlüsselung von Wechseldatenträgern mit dm-crypt/LUKS
9.9.2. Einbinden verschlüsselter Laufwerke mit dm-crypt/LUKS
9.10. Der Kernel
9.10.1. Kernel-Parameter
9.10.2. Kernel-Header
9.10.3. Kompilieren des Kernels und dazugehöriger Module
9.10.4. Kompilieren des Kernel-Quellcodes: Empfehlung des Debian-Kernel-Teams
9.10.5. Hardware-Treiber und Firmware
9.11. Virtualisierte Systeme
9.11.1. Virtualisierungs- und Emulationswerkzeuge
9.11.2. Arbeitsablauf bei Virtualisierung
9.11.3. Einbinden des virtuellen Festplatten-Images
9.11.4. Chroot-System
9.11.5. System mit mehreren Arbeitsplatzumgebungen

Hier beschreibe ich einige grundlegende Tipps zur Konfiguration und Verwaltung des Systems, überwiegend für die Konsole.

Es gibt einige Hilfsprogramme, die Sie bei Ihren Konsolenaktivitäten unterstützen können:


Die schlichte Verwendung von script(1) wie in Abschnitt 1.4.9, „Aufzeichnen der Shell-Aktivitäten“ erzeugt eine Datei mit Steuerzeichen. Sie können dies durch Nutzung von col(1) wie folgt beheben:

$ script
Script started, file is typescript

Machen Sie irgendetwas … und drücken Sie Strg-D, um script zu beenden.

$ col -bx < typescript > cleanedfile
$ vim cleanedfile

Es gibt alternative Methoden, um Shell-Aktivitäten aufzuzeichnen:

  • Verwendung von tee (auch verwendbar während des Boot-Vorgangs in der initramfs):

    $ sh -i 2>&1 | tee typescript
  • Verwendung von gnome-terminal erweitertem Zeilenpuffer, um zurückscrollen zu können.

  • Verwendung von screen mit "^A H" (siehe Abschnitt 9.1.2, „Das Programm screen“), um eine Konsolensitzung aufzuzeichnen.

  • Verwendung von vim mit ":terminal", um in den Terminal-Modus zu wechseln. (Mit "Ctrl-W N" kommen Sie vom Terminal-Modus zurück in den Normalmodus.) Geben Sie ":w typescript" ein, um den Puffer in eine Datei zu schreiben.

  • Verwendung von emacs mit "M-x shell", "M-x eshell" oder "M-x term", um eine Konsolensitzung aufzuzeichnen. Um den Puffer in eine Datei zu schreiben, verwenden Sie "C-x C-w".

screen(1) bietet nicht nur die Möglichkeit, in einem Terminal-Fenster mehrere Prozesse laufen zu lassen, sondern erlaubt auch einem Remote-Shell-Prozess, Verbindungsunterbrechungen zu überstehen. Hier ein typisches Anwendungsszenario für screen(1):

  1. Sie melden sich auf einer fernen Maschine an.

  2. Sie starten screen auf einer einfachen Konsole.

  3. Sie führen mehrere Programme in screen-Fenstern aus, die Sie über ^A c ("Strg-A" gefolgt von "c") erzeugen.

  4. Sie können mittels ^A n ("Strg-A" gefolgt von "n") zwischen den verschiedenen screen-Fenstern hin- und herschalten.

  5. Plötzlich müssen Sie Ihr Terminal verlassen, aber Sie möchten Ihre aktuelle Arbeit nicht verlieren und deshalb die Verbindung erhalten.

  6. Sie können die Verbindung zur screen-Sitzung durch eine der folgenden Methoden lösen:

    • Ganz brutal: die Netzwerkverbindung trennen;

    • Tippen Sie ^A d ("Strg-A" gefolgt von "d") und melden Sie sich händisch von der Fernverbindung ab;

    • Tippen Sie ^A DD ("Strg-A" gefolgt von "DD"), damit screen die Verbindung löst und Sie abmeldet.

  7. Sie melden Sich am gleichen fernen Rechner erneut an (funktioniert sogar bei Anmeldung über ein anderes Terminal).

  8. Sie starten screen über "screen -r".

  9. screen verbindet ganz von selbst alle vorherigen screen-Fenster mit allen aktuell laufenden Programmen.

[Tipp] Tipp

Bei Verbindungen, die über Zeit oder Volumen abgerechnet werden, können Sie mit screen Kosten sparen, indem Sie einen Prozess aktiv laufen lassen, während die Verbindung aber unterbrochen ist, und die Sitzung später erneut verbinden, wenn Sie sich wieder einwählt haben.

In einer screen-Sitzung werden alle Tastatureingaben zu Ihrem aktuell laufenden screen-Fenster gesendet, außer Befehlseingaben. Alle screen-Befehlseingaben werden mittels ^A ("Strg-A") plus einer einzelnen Taste [plus eventuellen Parametern] eingegeben. Hier einige wichtige zur Erinnerung:


Lesen Sie screen(1) bezüglich weiterer Details.

Lesen Sie tmux(1) für Funktionalitäten einer Alternative zum Befehl screen.

In Abschnitt 1.4.2, „Anpassen der bash“ finden Sie 2 Tipps, die eine schnelle Navigation durch Verzeichnisse ermöglichen: $CDPATH und mc.

Wenn Sie einen Unschärfe-Textfilter verwenden, müssen Sie dabei nicht einmal den exakten Pfad angeben. Für fzf geben Sie dazu folgendes in ~/.bashrc ein:

FZF_KEYBINDINGS_PATH=/usr/share/doc/fzf/examples/key-bindings.bash
if [ -f $FZF_KEYBINDINGS_PATH ]; then
  . $FZF_KEYBINDINGS_PATH
fi

Beispiele:

  • Sie können mit minimalem Aufwand in ein sehr tief verschachteltes Unterverzeichnis springen. Zunächst geben Sie "cd **" ein und drücken Tab. Es werden Ihnen jetzt die in Frage kommenden Pfade angezeigt. Durch Eingabe von Teilen des Pfads, z.B. s/d/b foo, schränken Sie die Kandidaten weiter ein. Den gewünschten Pfad wählen Sie mittels cd und Pfeil-/Entertasten aus.

  • Sie können ganz einfach und effizient einen Befehl aus der Befehlshistorie aufrufen. Drücken Sie dazu am Eingabe-Prompt Strg-R. Es werden Ihnen die in Frage kommenden Befehle angezeigt. Durch Eingabe von Teilen des Befehls, z.B. vim d, schränken Sie die Kandidaten weiter ein. Den gewünschten Befehl wählen Sie mittels Pfeil-/Entertasten aus.

Nachdem Sie die Grundlagen von vim(1) in Abschnitt 1.4.8, „Verwenden von vim“ kennengelernt haben, lesen Sie bitte Bram Moolenaars "Seven habits of effective text editing (2000)", um zu verstehen, wie vim genutzt werden sollte.

Das Verhalten von vim kann signifikant verändert werden, indem über Ex-Modus-Befehle interne Funktionalitäten aktiviert werden, wie z.B. "set ..." zum Setzen von vim-Optionen.

Diese Ex-Modus-Befehle können in der vimrc-Datei des Benutzers (traditionell "~/.vimrc", oder auch git-freundlich "~/.vim/vimrc") eingefügt werden. Hier ein einfaches Beispiel [2]:

""" Generic baseline Vim and Neovim configuration (~/.vimrc)
"""   - For NeoVim, use "nvim -u ~/.vimrc [filename]"
set nocompatible                " :h 'cp -- sensible (n)vim mode
syntax on                       " :h :syn-on
filetype plugin indent on       " :h :filetype-overview
set encoding=utf-8              " :h 'enc (default: latin1) -- sensible encoding
""" current vim option value can be verified by :set encoding?
set backspace=indent,eol,start  " :h 'bs (default: nobs) -- sensible BS
set statusline=%<%f%m%r%h%w%=%y[U+%04B]%2l/%2L=%P,%2c%V
set listchars=eol:¶,tab:⇄\ ,extends:↦,precedes:↤,nbsp:␣
set viminfo=!,'100,<5000,s100,h " :h 'vi -- bigger copy buffer etc.
""" Pick "colorscheme" from blue darkblue default delek desert elflord evening
""" habamax industry koehler lunaperche morning murphy pablo peachpuff quiet ron
""" shine slate torte zellner
colorscheme industry
"colorscheme default
set scrolloff=5                 " :h 'scr -- show 5 lines around cursor
set laststatus=2                " :h 'ls (default 1)  k
""" boolian options can be unset by prefixing "no"
"set list                        " :h 'list (default nolist)
set smartcase                   " :h 'scs -- Override the 'ignorecase' option
set autoindent                  " :h 'ai
set smartindent                 " :h 'si
set nowrap                      " :h 'wrap
set nolist                      " :h 'list -- (enable when needed)
set noerrorbells                " :h 'eb
set novisualbell                " :h 'vb
set t_vb=                       " :h 't_vb -- termcap visual bell
set spell                       " :h 'spell
set spelllang=en_us,cjk         " :h 'spl -- english spell, ignore CJK
set clipboard=unnamedplus       " :h 'clipboard -- cut/copy/paste with other app

The keymap of vim can be changed in user's vimrc file. E.g.:

[Achtung] Achtung

Versuchen Sie nicht ohne guten Grund, die Standard-Tastaturkürzel zu ändern.

""" *** popular mappings ***
""" Window moves without using CTRL-W which is dangerous in INSERT mode
nnoremap <C-H> <C-W>h
nnoremap <C-J> <C-W>j
nnoremap <C-K> <C-W>k
silent! nnoremap <C-L> <C-W>l
""" nohlsearch with <ESC> (<C-L> is mapped as above)
inoremap <ESC> <CMD>noh<CR><ESC>
nnoremap <ESC> <CMD>noh<CR><ESC>
""" execute macro recorded with <ESC>qq.....<ESC>q with Q
nnoremap Q @q
""" center after jump next
nnoremap n nzz
nnoremap N Nzz
""" fast "jk" to get out of INSERT mode (<ESC>)
inoremap  jk        <ESC>
""" double <ESC> to get out of TERM mode (CTRL-\ CTRL-N)
tnoremap <ESC><ESC> <C-\><C-N>
""" fast "jkjk" to get out of TERM mode (CTRL-\ CTRL-N)
tnoremap jkjk <C-\><C-N>
"""
""" *** nvim default mappings (no need for nvim) ***
""" copy to EOL (no delete) like D for d
noremap Y y$
""" disable prefix repeats for erases
inoremap <C-U> <C-G>u<C-U>
inoremap <C-W> <C-G>u<C-W>
""" search visual selected string for visual mode
xnoremap * y/\V<C-R>"<CR>
xnoremap # y?\V<C-R>"<CR>
""" repeat last substitute and *KEEP* flags
nnoremap & :&&<CR>

Damit die oben aufgeführten Tastaturkürzel korrekt funktionieren, muss das Terminal-Programm so konfiguriert sein, dass es "ASCII DEL" für die Backspace-Taste und "Escape sequence" für die Entf-Taste generiert.

Other miscellaneous configuration can be changed in user's vimrc file. E.g.:

""" Force to use underline for spell check results
augroup SpellUnderline
  autocmd!
  autocmd ColorScheme * highlight SpellBad term=Underline gui=Undercurl
  autocmd ColorScheme * highlight SpellCap term=Underline gui=Undercurl
  autocmd ColorScheme * highlight SpellLocal term=Underline gui=Undercurl
  autocmd ColorScheme * highlight SpellRare term=Underline gui=Undercurl
augroup END
"
""" highlight tailing spaces except when typing as red (set after colorscheme)
highlight TailingWhitespaces ctermbg=red guibg=red
""" \s\+     1 or more whitespace character: <Space> and <Tab>
""" \%#\@<!  Matches with zero width if the cursor position does NOT match.
match TailingWhitespaces /\s\+\%#\@<!$/
"
""" Retain last cursor position :h '"
augroup RetainLastCursorPosition
  autocmd!
  autocmd BufReadPost *
    \ if line("'\"") > 0 && line ("'\"") <= line("$") |
    \   exe "normal! g'\"" |
    \ endif
augroup END

Interessante externe Plugin-Pakete finden Sie unter:

Plugin packages in the vim-scripts package can be enabled using user's vimrc file. E.g.:

packadd! secure-modelines
packadd! winmanager
let mapleader = ' '
" Toggle paste mode with <SPACE>p for Vim (no need for Nvim)
set pastetoggle=<leader>p
" IDE-like UI for files and buffers with <space>w
nnoremap <leader>w         :WMToggle<CR>

Das neue native Vim-Paketsystem funktioniert sehr gut mit "git" und "git submodule". Eine solche Beispielkonfiguration finden Sie in meinem git-Repository: dot-vim. Was sie bewirkt, ist letztlich:

  • Durch Verwenden von "git" und "git submodule werden die aktuellsten externen Pakete in ~/.vim/pack/*/opt/ abgelegt, z.B. für "name" in ~/.vim/pack/*/opt/name, und entsprechend für andere Pakete.

  • Indem eine :packadd! name-Zeile zur vimrc-Datei des Benutzers hinzugefügt wird, werden die entsprechenden Pakete im runtimepath abgelegt.

  • Vim lädt diese Pakete während der Initialisierung aus dem runtimepath.

  • Am Ende der Initialisierung werden die Marker (Tags) für die installierten Dokumente mit "helptags ALL" aktualisiert.

Wenn Sie es genauer wissen möchten, starten Sie vim mit "vim --startuptime vimstart.log", um die aktuell ausgeführte Startsequenz sowie die für jeden Schritt benötigte Zeit kontrollieren zu können.

Es kann sehr verwirrend sein, wenn es zu viele Wege [3] für die Verwaltung und das Herunterladen externer vim-Pakete gibt. Sich an die Original-Informationen zu halten, ist dann die beste Hilfe.


Obwohl Pager wie more(1) und less(1) (lesen Sie dazu Abschnitt 1.4.5, „Der Pager“) sowie spezielle Werkzeuge für Hervorhebung und Formatierung (Näheres dazu in Abschnitt 11.1.8, „Hervorheben und Formatieren von reinen Textdaten“) Text gut anzeigen können, sind normale Texteditoren (Details in Abschnitt 1.4.6, „Der Texteditor“) vielseitiger und besser anzupassen.

[Tipp] Tipp

Bei vim(1) und seinem Pager-Modus alias view(1) wird über ":set hls" die Suche mit Hervorhebung aktiviert.

Das Standard-Anzeigeformat von Datum und Uhrzeit bei dem Befehl "ls -l" hängt vom gewählten Gebietsschema (locale) ab (siehe dazu auch Abschnitt 1.2.6, „Zeitstempel“). Die Variable "$LANG" wird als erstes abgefragt, der Wert kann jedoch mittels der "$LC_TIME"- oder "$LC_ALL"-Variable überschrieben werden.

Das letztlich verwendete Anzeigeformat für das jeweilige Gebietsschema hängt von der verwendeten Standard-C-Bibliothek (aus dem libc6-Paket) ab. Aufgrunddessen hatten verschiedene Debian-Veröffentlichungen unterschiedliche Standardeinstellungen. Bezüglich der ISO-Formate besuchen Sie ISO 8601.

Wenn Sie das Anzeigeformat von Datum und Uhrzeit wirklich über die locale-Einstellung hinaus anpassen möchten, sollten Sie die Option time style value setzen, entweder über das "--time-style"-Argument oder über den Wert der Variable "$TIME_STYLE" (Näheres unter ls(1), date(1) und "info coreutils 'ls invocation'").


[Tipp] Tipp

Sie können die Eingabe langer Optionsparameter auf der Befehlszeile vermeiden, indem sie einen Befehls-Alias verwenden (siehe Abschnitt 1.5.9, „Befehls-Alias“):

alias ls='ls --time-style=+%d.%m.%y %H:%M'

Die Shell-Ausgabe der meisten modernen Terminals kann über ANSI-Escape-Codes farbig gestaltet werden (lesen Sie dazu auch "/usr/share/doc/xterm/ctlseqs.txt.gz").

Probieren Sie zum Beispiel folgendes:

$ RED=$(printf "\x1b[31m")
$ NORMAL=$(printf "\x1b[0m")
$ REVERSE=$(printf "\x1b[7m")
$ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"

Sie können Editor-Aktivitäten aufzeichnen, um sie später für komplexe Wiederholungen wiederzuverwenden.

Bei Vim wie folgt:

  • "qa": Aufnahme der eingegebenen Zeichen in das Register "a" starten;

  • … Editor-Aktivitäten;

  • "q": Aufnahme der eingegebenen Zeichen beenden;

  • "@a": Ausführen des Inhalts von Register "a".

Bei Emacs wie folgt:

  • "C-x (": Definition eines Tastaturmakros starten;

  • … Editor-Aktivitäten;

  • "C-x )": Definition des Tastaturmakros beenden;

  • "C-x e": Ausführen des Tastaturmakros.

Programmaktivitäten können mittels spezieller Werkzeuge überwacht und kontrolliert werden:

Tabelle 9.8. Liste von Werkzeugen zur Überwachung und Steuerung von Programmaktivitäten

Paket Popcon Größe Beschreibung
coreutils V:880, I:999 18307 nice(1): ein Programm mit veränderter Ablaufpriorität ausführen
bsdutils V:519, I:999 356 renice(1): die Ablaufpriorität eines laufenden Prozess verändern
procps V:766, I:999 2389 Werkzeuge für das "/proc"-Dateisystem: ps(1), top(1), kill(1), watch(1), …
psmisc V:420, I:775 908 Werkzeuge für das "/proc"-Dateisystem: killall(1), fuser(1), peekfd(1), pstree(1)
time V:7, I:132 129 time(1): ein Programm ausführen und die Zeit ausgeben, während der Ressourcen verbraucht wurden
sysstat V:148, I:170 1904 sar(1), iostat(1), mpstat(1), …: Werkzeuge zur Messung der System-Performance unter Linux
isag V:0, I:3 109 Interaktive grafische Darstellung der Systemaktivität, basierend auf sysstat
lsof V:422, I:945 482 lsof(8): mit der Option "-p" diejenigen Dateien auflisten, die von einem gerade laufenden Prozess geöffnet wurden
strace V:12, I:119 2897 strace(1): Systemaufrufe und -signale verfolgen
ltrace V:0, I:16 330 ltrace(1): Bibliotheksaufrufe verfolgen
xtrace V:0, I:0 353 xtrace(1): Kommunikation zwischen X11-Client und -Server verfolgen
powertop V:18, I:217 677 powertop(1): Informationen über verbrauchte Systemleistung
cron V:872, I:995 244 Prozesse laut dem Ablaufplan des cron(8)-Daemons im Hintergrund ausführen
anacron V:396, I:479 93 cron-ähnlicher Programmablauf-Planer für Systeme, die nicht 24 Stunden am Tag laufen
at V:101, I:154 158 at(1) oder batch(1): einen Prozess zu einer bestimmten Zeit oder unterhalb einer bestimmten Systembelastung ausführen

[Tipp] Tipp

Das procps-Paket enthält sehr grundlegende Werkzeuge zum Überwachen, Steuern und Starten von Programmaktivitäten. Sie sollten sich mit diesen vertraut machen.

Es gibt verschiedene Wege, um einen Befehl zu wiederholen und jedes Mal eine andere Datei aus einer bestimmten Menge von Dateien (hier z.B. ausgewählt über ein glob-Suchmuster auf "*.ext") als Argument zu verwenden.

for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done
  • Kombination aus find(1) und xargs(1):

find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command
  • find(1) mit "-exec"-Option und einem Befehl:

find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;
  • find(1) mit "-exec"-Option und einem kurzen Shell-Skript:

find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;

Die obigen Beispiele wurden geschrieben, um auch eine korrekte Behandlung von komischen Dateinamen, wie z.B. solche mit Leerzeichen, sicherzustellen. Lesen Sie dazu auch Abschnitt 10.1.5, „Aufrufe für die Auswahl von Dateien“; dort finden Sie außerdem weitergehende Verwendungen des Befehls find(1).

Auf der Befehlszeile (command-line interface, CLI) wird das erste Programm mit dem passenden Namen ausgeführt, das in den durch die Umgebungsvariable $PATH definierten Verzeichnissen gefunden wird. Lesen Sie dazu auch Abschnitt 1.5.3, „Die "$PATH"-Variable“.

Bei einer zum freedesktop.org-Standard konformen grafischen Oberfläche (graphical user interface, GUI) enthalten die *.desktop-Dateien in dem Verzeichnis /usr/share/applications/ alle nötigen Attribute für die Anzeige der Programmeinträge im grafischen Menü. Jedes Paket, das mit dem xdg-Menüsystem von Freedesktop.org konform ist, installiert seine Menüdaten (für die "*.desktop"-Dateien) unter "/usr/share/applications/". Moderne Arbeitsplatzumgebungen gemäß Freedesktop.org-Standard verwenden diese Daten, um mittels dem xdg-utils-Paket das Programmmenü zu erstellen. Näheres dazu in "/usr/share/doc/xdg-utils/README".

Im folgenden Beispiel definiert die Datei chromium.desktop die Attribute für den "Chromium-Webbrowser", z.B. "Name" für den Programmnamen, "Exec" für den Pfad zum auszuführenden Programm mit zugehörigen Argumenten, "Icon" für das verwendete Icon-Symbol usw. (Details finden Sie unter Desktop Entry Specification):

[Desktop Entry]
Version=1.0
Name=Chromium Web Browser
GenericName=Web Browser
Comment=Access the Internet
Comment[fr]=Explorer le Web
Exec=/usr/bin/chromium %U
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=chromium
Categories=Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https;
StartupWMClass=Chromium
StartupNotify=true

Dies ist eine vereinfachte Beschreibung. Die *.desktop-Dateien werden wie folgt eingelesen:

Die Desktop-Umgebung setzt die Umgebungsvariablen $XDG_DATA_HOME und $XDG_DATA_DIR. Unter GNOME3 z.B.:

  • $XDG_DATA_HOME wird nicht genutzt (der Standardwert aus $HOME/.local/share wird verwendet).

  • $XDG_DATA_DIRS wird auf /usr/share/gnome:/usr/local/share/:/usr/share/ gesetzt.

Daher werden die Basisverzeichnisse (lesen Sie XDG Base Directory Specification) und applications-Verzeichnisse wie folgt gesetzt:

  • $HOME/.local/share/$HOME/.local/share/applications/

  • /usr/share/gnome//usr/share/gnome/applications/

  • /usr/local/share//usr/local/share/applications/

  • /usr/share//usr/share/applications/

Die *.desktop-Dateien aus diesen applications-Verzeichnissen werden in obiger Reihenfolge eingelesen.

[Tipp] Tipp

Ein benutzerdefinierter Menüeintrag für die grafische Oberfläche kann erstellt werden, indem eine *.desktop-Datei zum Verzeichnis $HOME/.local/share/applications/ hinzugefügt wird.

[Tipp] Tipp

The "Exec=..." line isn't parsed by the shell. Use the env(1) command if environment variables need to be set.

[Tipp] Tipp

Ähnlich dazu verhält es sich, wenn eine *.desktop-Datei zum autostart-Verzeichnis in diesen Basisverzeichnissen hinzugefügt wird: das in der *.desktop-Datei definierte Programm wird beim Start der grafischen Benutzeroberfläche automatisch ausgeführt (z.B. nach dem Anmelden). Lesen Sie dazu Desktop Application Autostart Specification.

[Tipp] Tipp

Ähnlich ist es auch, wenn eine *.desktop-Datei im $HOME/Desktop-Verzeichnis erstellt wird und die grafische Umgebung die Funktionalität der Programmstarter-Icons (desktop icon launcher) unterstützt: das definierte Programm wird bei Anklicken des Icons ausgeführt. Bitte beachten Sie, dass der eigentliche Name des $HOME/Desktop-Verzeichnisses letztlich vom Gebietsschema (Locale) abhängt; Näheres dazu finden Sie in xdg-user-dirs-update(1).

Einige Programme starten automatisch weitere Programme. Hier einige Punkte bezüglich der Anpassung dieses Prozesses.

[Tipp] Tipp

update-mime(8) aktualisiert die "/etc/mailcap"-Datei unter Verwendung von "/etc/mailcap.order" (Näheres in mailcap.order(5)).

[Tipp] Tipp

Das debianutils-Paket stellt sensible-browser(1), sensible-editor(1) und sensible-pager(1) bereit; diese treffen eine sinnvolle Auswahl, welcher Editor, Pager bzw. Webbrowser aufgerufen wird. Ich empfehle, dass Sie diese Shell-Skripte lesen.

[Tipp] Tipp

Um eine Konsolen-Applikation (hier mutt) im GUI als bevorzugte Anwendung festzulegen, sollten Sie wie folgt ein Startskript für die Applikation erzeugen (in diesem Fall "/usr/local/bin/mutt-term") und dieses als bevorzugt zu startende Anwendung konfigurieren:

# cat /usr/local/bin/mutt-term <<EOF
#!/bin/sh
gnome-terminal -e "mutt \$@"
EOF
# chmod 755 /usr/local/bin/mutt-term

Verwenden Sie cron(8), um regelmäßig wiederkehrende Aufgaben zu planen. Lesen Sie dazu crontab(1) and crontab(5).

Sie können Prozesse zur Ausführung durch einen normalen Benutzer, z.B. den Benutzer foo, einplanen, indem Sie mit dem Befehl "crontab -e" eine crontab(5)-Datei namens "/var/spool/cron/crontabs/foo" erstellen.

Hier ein Beispiel einer crontab(5)-Datei:

# use /usr/bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to paul, no matter whose crontab this is
MAILTO=paul
# Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)
# run at 00:05, every day
5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 14:15 on the first of every month -- output mailed to paul
15 14 1  * *   $HOME/bin/monthly
# run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:
0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
5  4 *   * sun echo "run at 04:05 every Sunday"
# run at 03:40 on the first Monday of each month
40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args
[Tipp] Tipp

Auf Systemen, die nicht ständig laufen, installieren Sie das anacron-Paket, um regelmäßige Aufgaben auszuführen, sobald nach entsprechender Maschinen-Einschaltdauer ein festgelegter Intervall abgelaufen ist. Näheres unter anacron(8) und anacrontab(5).

[Tipp] Tipp

Geplante Skripte zur Systemwartung können Sie vom root-Konto aus wiederholt ausführen, indem Sie solche Skripte in "/etc/cron.hourly/", "/etc/cron.daily/", "/etc/cron.weekly/" oder "/etc/cron.monthly/" einfügen. Der Ausführungszeitpunkt dieser Skripte kann über "/etc/crontab" und "/etc/anacrontab" angepasst werden.

Systemd gewisse Fähigkeiten, um die Ausführung von Programmen ohne den cron-Daemon zu planen. Zum Beispiel werden über /lib/systemd/system/apt-daily.timer und /lib/systemd/system/apt-daily.service tägliche Download-Aktivitäten von apt geplant. Näheres in systemd.timer(5) .

Alt-SysRq (auf deutschen Tastaturen das Drücken von Alt+Druck) gefolgt von einer weiteren Taste löst verschiedene, fast magische Aktionen aus, um im Notfall die Kontrolle über das System wiederzuerlangen:


Weitere Details finden Sie im Linux kernel user’s and administrator’s guide » Linux Magic System Request Key Hacks.

[Tipp] Tipp

Von einem SSH-Terminal u.ä. können Sie die Alt-SysRq-Funktionalität nutzen, indem Sie in "/proc/sysrq-trigger" schreiben. Zum Beispiel werden durch "echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger" alle eingebundenen Dateisysteme synchronisiert und mittels umount aus der Einbindung gelöst.

Der aktuelle Debian amd64 Linux-Kernel (Stand 2021) hat /proc/sys/kernel/sysrq=438=0b110110110:

  • 2 = 0x2 - Aktivieren der Kontrolle über das Konsolen-Log-Level (AN)

  • 4 = 0x4 - Aktivieren der Kontrolle über die Tastatur (SAK, unraw) (AN)

  • 8 = 0x8 - Aktivieren von Speicher-Dumps der Prozesse zwecks Fehlersuche (Debugging) usw. (AUS)

  • 16 = 0x10 - Aktivieren des sync-Befehls (AN)

  • 32 = 0x20 - Aktivieren von Neueinbinden mit Nur-Lese-Berechtigung (remount read-only) (AN)

  • 64 = 0x40 - Aktivieren des Sendens von Signalen an Prozesse (term, kill, oom-kill) (AUS)

  • 128 = 0x80 - Erlauben von Neustart/Ausschalten (AN)

  • 256 = 0x100 - Erlauben von nice-Prioritäten für all Echtzeit-(RT-)Prozesse (AN)

Obwohl der größte Teil der Hardware-Konfiguration auf modernen GUI-Arbeitsplatzsystemen wie GNOME und KDE über entsprechende GUI-Werkzeuge verwaltet werden kann, ist es eine gute Idee, zumindest einige grundlegende Methoden für deren Konfiguration zu kennen.


ACPI ist ein neueres Rahmenwerk für das Power Management und der Nachfolger für das ältere APM.

[Tipp] Tipp

Die Skalierung der CPU-Frequenz wird auf modernen Systemen durch Kernel-Module wie acpi_cpufreq abgewickelt.

Über folgende Befehle wird die System- und Hardware-Zeit auf MM/DD hh:mm, CCYY (MM - Monat, DD - Tag, hh - Stunde, mm - Minute, CCYY - Jahr) gesetzt:

# date MMDDhhmmCCYY
# hwclock --utc --systohc
# hwclock --show

Zeiten werden auf einem Debian-System normalerweise in der Lokalzeit angezeigt, aber die Hardware- und Systemzeit verwenden üblicherweise UTC (GMT).

Wenn die Hardware-Zeit (teilweise auch als BIOS-/UEFI- oder CMOS-Uhr bezeichnet) auf UTC eingestellt ist, ändern Sie die Einstellung in "/etc/default/rcS" auf "UTC=yes".

Mit folgendem Befehl konfigurieren Sie die vom Debian-System verwendete Zeitzone neu:

# dpkg-reconfigure tzdata

Falls Sie die Systemzeit über das Netzwerk aktualisieren möchten, sollten Sie die Verwendung des NTP-Dienstes in Erwägung ziehen; dazugehörige Pakete sind ntp, ntpdate und chrony.

[Tipp] Tipp

Unter systemd sollten Sie stattdessen systemd-timesyncd für die Netzwerk-Zeitsynchronisation verwenden. Lesen Sie dazu systemd-timesyncd(8).

Hier finden Sie weitere Informationen:

[Tipp] Tipp

ntptrace(8) aus dem ntp-Paket kann eine Hintereinanderschaltung mehrerer NTP-Server zu deren primärer Quelle zurückverfolgen.

Gerätetreiber für Soundkarten werden in aktuellen Linux-Systemen von Advanced Linux Sound Architecture (ALSA) bereitgestellt. ALSA enthält zwecks Kompatibilität auch einen Emulationsmodus für das ältere Open Sound System (OSS).

Anwendungssoftware kann konfiguriert sein, nicht die Soundkarte direkt anzusprechen, sondern über standardisierte Sound-Server-Systeme darauf zuzugreifen. Derzeit werden PulseAudio, JACK und PipeWire als Sound-Server-Systeme genutzt. Schauen Sie im Debian-Wiki unter Sound, wie die aktuelle Situation ist.

Es gibt normalerweise für jede populäre Arbeitsplatzumgebung eine Sound-Engine. Für jede Sound-Engine, die von einer Anwendung verwendet wird, kann ausgewählt werden, mit welchem der verschiedenen Sound-Server sie sich verbindet.

[Tipp] Tipp

Verwenden Sie "cat /dev/urandom > /dev/audio" oder speaker-test(1), um die Lautsprecher zu testen (^C zum stoppen).

[Tipp] Tipp

Falls Sie keinen Ton hören, sind Ihre Lautsprecher möglicherweise an einem stummgeschalteten Ausgang angeschlossen. Moderne Sound-Systeme haben oft mehrere Ausgänge. alsamixer(1) aus dem alsa-utils-Paket ist nützlich für die Einstellung von Lautstärke und Stummschaltung.


Schlechte Systemwartung könnte Ihr System für Angriffe von extern anfällig machen.

Um eine Systemsicherheits- und Integritätsüberprüfung durchzuführen, sollten Sie mit folgendem beginnen:


Hier ein einfaches Skript, um nach Dateien mit typischerweise falschen Dateiberechtigungen (schreibbar für alle) zu suchen:

# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
[Achtung] Achtung

Da das debsums-Paket MD5-Prüfsummen verwendet, die lokal gespeichert sind, kann ihm als Sicherheits-Audit-Werkzeug gegen bösartige Angriffe nicht vollständig vertraut werden.

Indem Sie Ihr System mit einer Linux Live-CD oder einer Debian-Installer-CD im Rettungsmodus starten, können Sie auf einfache Weise den Speicher auf Ihrem Boot-Laufwerk neu konfigurieren.

Teilweise werden Geräte vom grafischen Arbeitsplatzsystem automatisch eingebunden. Solche Geräte müssen Sie dann händisch über die Befehlszeile vom System trennen (mittels umount(8)), bevor Sie daran arbeiten können.

Bei der Konfiguration von Laufwerkspartitionen können Sie erwägen, parted(8) zu verwenden (obwohl fdisk(8) lange als Standard angesehen wurde). Die Begriffe "Partitionstabelle", "Disk partitioning data", "Partition map" und "Disk label" werden alle gleichbedeutend verwendet.

Ältere PCs verwenden das klassische Schema des Master Boot Record (MBR) und legen die Partitionstabelle im ersten Sektor, also im LBA-Sektor 0 (512 Byte) ab.

Aktuelle PCs mit Unified Extensible Firmware Interface (UEFI), inklusive Intel-basierten Macs, verwenden teilweise das GUID Partition Table (GPT)-Schema, bei dem die Partitionstabelle nicht im ersten Sektor liegt.

Obwohl fdisk(8) lange Zeit das Standardwerkzeug zur Laufwerkspartitionierung war, ist parted(8) dabei, ihm den Rang abzulaufen.


[Achtung] Achtung

Obwohl parted(8) vorgibt, Dateisysteme erzeugen und auch nachträglich in der Größe verändern zu können, ist es sicherer, für solche Dinge gut betreute und spezialisierte Werkzeuge wie mkfs(8) (mkfs.msdos(8), mkfs.ext2(8), mkfs.ext3(8), mkfs.ext4(8), …) und resize2fs(8) zu verwenden.

[Anmerkung] Anmerkung

Um zwischen GPT und MBR zu wechseln, müssen Sie die ersten paar Blöcke der Platte löschen (lesen Sie dazu Abschnitt 9.8.6, „Leeren von Dateiinhalten“) und "parted /dev/sdx mklabel gpt" oder "parted /dev/sdx mklabel msdos" nutzen, um die gewünschte Einstellung neu zu setzen. Bitte beachten Sie, dass hierbei "msdos" für MBR verwendet wird.

LVM2 ist ein Logical Volume Manager für den Linux-Kernel. Mit LVM2 können Partitionen auf logischen Volumes erzeugt werden statt auf physikalischen Festplatten.

LVM erfordert folgendes:

  • device-mapper-Unterstützung im Linux-Kernel (Standardeinstellung für Debian-Kernel);

  • die Userspace-Bibliothek zur Unterstützung von device-mapper (libdevmapper*-Paket);

  • die Userspace-LVM2-Werkzeuge (lvm2-Paket).

Lehrreiche Informationen über LVM2 finden Sie mittels folgender Handbuchseiten:

  • lvm(8): Grundlagen des LVM2-Mechanismus' (Liste aller LVM2-Befehle);

  • lvm.conf(5): Konfigurationsdatei für LVM2;

  • lvs(8): Informationen über logische Volumes ausgeben;

  • vgs(8): Informationen über Volume-Gruppen ausgeben;

  • pvs(8): Informationen über physikalische Volumes ausgeben.

Für das ext4-Dateisystem enthält das e2fsprogs-Paket folgendes:

  • mkfs.ext4(8) zur Erzeugung neuer ext4-Dateisysteme;

  • fsck.ext4(8) zur Überprüfung und Reparatur vorhandener ext4-Dateisysteme;

  • tune2fs(8) zur Konfiguration des Superblocks von ext4-Dateisystemen;

  • debugfs(8) für interaktive Fehlersuche in ext4-Dateisystemen (es enthält den undel-Befehl, um gelöschte Dateien wiederherzustellen).

Die Befehle mkfs(8) und fsck(8) werden durch das e2fsprogs-Paket bereitgestellt und sind Frontends für Dateisystem-abhängige Programme (mkfs.dateisystemtyp und fsck.dateisystemtyp). Für ext4 sind das mkfs.ext4(8) und fsck.ext4(8) (dies sind symbolischer Link auf mke2fs(8) und e2fsck(8)).

Ähnliche Befehle sind für jedes von Linux unterstützte Dateisystem verfügbar.


[Tipp] Tipp

Ext4 ist das Standard-Dateisystem für Linux-Systeme und Sie sollten dies verwenden, außer Sie haben einen bestimmten Grund, ein anderes zu nutzen.

Den aktuellen Status zu Btrfs finden Sie im Debian Wiki und im kernel.org Wiki. Man geht davon aus, dass dies nach ext4 das neue Standard-Dateisystem wird.

Einige Werkzeuge erlauben den Zugriff auf Dateisysteme ohne entsprechende Unterstützung im Linux-Kernel (lesen Sie dazu Abschnitt 9.8.2, „Manipulieren von Dateien ohne Einbinden der Festplatte“).

Die Charakteristik eines Dateisystems kann über seinen Superblock optimiert werden; verwenden Sie dazu den Befehl tune2fs(8):

[Tipp] Tipp

Ungeachtet seines Namens funktioniert tune2fs(8) nicht nur für ext2-Dateisysteme, sondern auch für ext3 und ext4.

Eine Solid State Disk (SSD) wird mittlerweile automatisch detektiert.

Reduzieren Sie unnötige Laufwerkszugriffe, um die Laufwerksabnutzung zu minimieren, indem Sie "tmpfs" für das Einbinden schnell veränderlicher Daten in Ihrer /etc/fstab verwenden.

Sie können Ihre Festplatte mit dem smartd(8)-Daemon überwachen und protokollieren, sofern diese mit dem SMART-Standard kompatibel ist:

  1. Aktivieren Sie die SMART-Funktionalität im BIOS.

  2. Installieren Sie das Paket smartmontools.

  3. Identifizieren Sie Ihre Festplatten, indem Sie sie mit df(1) auflisten.

    • Wir gehen hier davon aus, dass die zu überwachende Festplatte als "/dev/hda" auftaucht.

  4. Überprüfen Sie die Ausgabe von "smartctl -a /dev/hda", um festzustellen, ob die SMART-Funktionalität derzeit wirklich aktiv ist.

    • Falls nicht, aktivieren Sie sie mit "smartctl -s on -a /dev/hda".

  5. Aktivieren Sie den smartd(8)-Daemon wie folgt:

    • Entfernen Sie das Kommentarzeichen vor "start_smartd=yes" in der Datei "/etc/default/smartmontools".

    • Führen Sie einen Neustart des smartd(8)-Daemons über "sudo systemctl restart smartmontools" durch.

[Tipp] Tipp

Die Einstellungen des smartd(8)-Daemons können über die /etc/smartd.conf-Datei angepasst werden; dazu gehört auch die Einstellung, auf welchem Wege Sie über Warnungen informiert werden möchten.

Partitionen, die bei der Installation über den Logical Volume Manager (LVM) (Linux-Funktionalität) erzeugt wurden, können einfach und ohne größere System-Neukonfiguration in der Größe verändert werden, indem Speicherplatz hinzugefügt oder entfernt wird, und zwar über die Grenzen einzelner Laufwerke hinweg.

Wenn Sie freien Platz auf einer anderen Partition haben (mit 2 Verzeichnissen wie "/pfad/zu/leer" und "/pfad/zu/arbeit"), können Sie dort ein Verzeichnis erstellen und dieses einem anderen alten Verzeichnis (z.B. "/pfad/zu/alt") "überstülpen", in dem Sie mehr Platz benötigen. Dies wird ermöglicht durch die OverlayFS-Funktionalität im Linux-Kernel 3.18 oder neuer (ab Debian Stretch 9.0).

$ sudo mount -t overlay overlay \
  -olowerdir=/path/to/old-dir,upperdir=/path/to/empty,workdir=/path/to/work

Hierbei sollten "/pfad/zu/leer" und "/pfad/zu/nutzverzeichnis" auf einer schreibbaren (RW) Partition liegen, um "/pfad/zu/alt" zu überlagern.

Hier wird die Veränderung eines Festplatten-Abbilds behandelt.

Die Festplatten-Abbild-Datei ("disk.img") eines nicht eingebundenen Gerätes, z.B. der zweiten SCSI- oder Serial-ATA-Festplatte "/dev/sdb", kann mit cp(1) oder dd(1) wie folgt erzeugt werden:

# cp /dev/sdb disk.img
# dd if=/dev/sdb of=disk.img

Ein Abbild des Master Boot Record (MBR), wie er in traditionellen PCs verwendet wird (lesen Sie auch Abschnitt 9.6.2, „Konfiguration der Festplattenpartitionen“) und der im ersten Sektor der primären IDE-Festplatte abgelegt ist, kann mit dd(1) erstellt werden, wie hier:

# dd if=/dev/hda of=mbr.img bs=512 count=1
# dd if=/dev/hda of=mbr-nopart.img bs=446 count=1
# dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66
  • "mbr.img": der MBR mit der Partitionstabelle

  • "mbr-nopart.img": der MBR ohne Partitionstabelle

  • "mbr-part.img": die Partitionstabelle nur vom MBR

Falls Sie eine SCSI- oder Serial-ATA-Festplatte als Boot-Festplatte haben, ersetzen Sie "/dev/hda" durch "/dev/sda".

Falls Sie ein Abbild einer einzelnen Partition der Festplatte erstellen möchten, ersetzen Sie "/dev/hda" z.B. durch "/dev/hda1".

Das Festplatten-Abbild "partition.img", welches ein einfaches Partitions-Abbild enthält, kann mittels einem loop device wie folgt eingebunden und anschließend wieder gelöst werden:

# losetup -v -f partition.img
Loop device is /dev/loop0
# mkdir -p /mnt/loop0
# mount -t auto /dev/loop0 /mnt/loop0
...hack...hack...hack
# umount /dev/loop0
# losetup -d /dev/loop0

Das kann noch weiter vereinfacht werden:

# mkdir -p /mnt/loop0
# mount -t auto -o loop partition.img /mnt/loop0
...hack...hack...hack
# umount partition.img

Jede Partition des Festplatten-Abbilds "disk.img", das mehrere Partitionen enthält, kann mittels loop device eingebunden werden. Da das loop device standardmäßig keine Partitionen verwaltet, muss es wie folgt zurückgesetzt werden:

# modinfo -p loop # verify kernel capability
max_part:Maximum number of partitions per loop device
max_loop:Maximum number of loop devices
# losetup -a # verify nothing using the loop device
# rmmod loop
# modprobe loop max_part=16

Jetzt kann das loop device bis zu 16 Partitionen verwalten.

# losetup -v -f disk.img
Loop device is /dev/loop0
# fdisk -l /dev/loop0

Disk /dev/loop0: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x452b6464

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1         600     4819468+  83  Linux
/dev/loop0p2             601         652      417690   83  Linux
# mkdir -p /mnt/loop0p1
# mount -t ext4 /dev/loop0p1 /mnt/loop0p1
# mkdir -p /mnt/loop0p2
# mount -t ext4 /dev/loop0p2 /mnt/loop0p2
...hack...hack...hack
# umount /dev/loop0p1
# umount /dev/loop0p2
# losetup -d /dev/loop0

Alternativ können Sie ähnliche Funktionalitäten auch erreichen, indem Sie wie hier die device-mapper-Geräte nutzen, die von kpartx(8) aus dem kpartx-Paket erzeugt werden:

# kpartx -a -v disk.img
...
# mkdir -p /mnt/loop0p2
# mount -t ext4 /dev/mapper/loop0p2 /mnt/loop0p2
...
...hack...hack...hack
# umount /dev/mapper/loop0p2
...
# kpartx -d /mnt/loop0
[Anmerkung] Anmerkung

Sie können auch eine einzelne Partition eines solchen Festplatten-Abbilds mit einem loop device einbinden, indem Sie ein Offset verwenden, um den MBR usw. zu überspringen. Dies ist allerdings fehleranfälliger.

Ein leeres Festplatten-Abbild "disk.img", das bis zu einer Größe von 5 GiB anwachsen kann, erzeugen Sie mit dd(1) wie folgt:

$ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G

Statt dd(1) kann hier auch das dafür spezialisierte fallocate(8) verwendet werden.

Mittels eines loop device erstellen Sie auf diesem Festplatten-Abbild "disk.img" wie folgt ein ext4-Dateisystem:

# losetup -f -v disk.img
Loop device is /dev/loop1
# mkfs.ext4 /dev/loop1
...hack...hack...hack
# losetup -d /dev/loop1
$ du  --apparent-size -h disk.img
5.0G  disk.img
$ du -h disk.img
83M disk.img

Die Dateigröße von "disk.img" ist 5.0 GiB, aber der aktuell von ihm verwendete Speicherplatz ist lediglich 83 MiB. Diese Diskrepanz ist möglich, da ext4 die Verwendung von Sparse-Dateien unterstützt.

[Tipp] Tipp

Der wirklich genutzte Speicherplatz von Sparse-Dateien wächst mit den Daten, die in diese hineingeschrieben werden.

Die Nutzung von Befehlen ähnlich denen aus Abschnitt 9.7.3, „Einbinden der Festplatten-Abbild-Datei“ auf Geräten, die von loop device oder device-mapper-Geräten erzeugt wurden, erlaubt Ihnen ebenfalls, das Abbild "disk.img" über parted(8) oder fdisk(8) zu erzeugen, sowie Dateisysteme mit mkfs.ext4(8), mkswap(8) usw. zu erstellen.

Eine ISO9660-Abbild-Datei "cd.iso" aus einem Quellverzeichnisbaum (hier in "quell_verzeichnis") kann mit genisoimage(1) aus dem cdrkit-Paket erstellt werden:

#  genisoimage -r -J -T -V volume_id -o cd.iso source_directory

Ähnlich dazu kann ein boot-fähiges ISO9660-Abbild "cdboot.iso" aus einem Verzeichnisbaum ("quell_verzeichnis") erstellt werden, der dem des debian-installer ähnelt:

#  genisoimage -r -o cdboot.iso -V volume_id \
   -b isolinux/isolinux.bin -c isolinux/boot.cat \
   -no-emul-boot -boot-load-size 4 -boot-info-table source_directory

Hier wird der Isolinux-Bootloader zum Booten verwendet (Näheres in Abschnitt 3.1.2, „Stufe 2: der Bootloader“).

Sie können die Berechnung der md5sum-Prüfsumme und die Erstellung eines ISO9660-Abbilds direkt von der CD-ROM durchführen, wie hier gezeigt:

$ isoinfo -d -i /dev/cdrom
CD-ROM is in ISO 9660 format
...
Logical block size is: 2048
Volume size is: 23150592
...
# dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum
# dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso
[Warnung] Warnung

Sie müssen wie oben gezeigt dafür sorgen, dass Sie nicht von einem Fehler im Linux-Kernel ("ISO9660 filesystem read ahead bug") betroffen werden; nur so können Sie korrekte Ergebnisse erhalten.

Hier behandeln wir das Bearbeiten von Binärdaten auf einem Speichermedium.

Hier einige Programme für Datenwiederherstellung und forensische Analysen:


[Tipp] Tipp

Sie können gelöschte Dateien auf einem ext2-Dateisystem wiederherstellen, indem Sie list_deleted_inodes und den undel-Befehl von debugfs(8) (aus dem e2fsprogs-Paket) verwenden.

Mit physikalischem Zugriff auf den Rechner kann jeder ganz einfach uneingeschränkte Rechte und Zugriffe auf alle Dateien auf Ihrem PC erlangen (lesen Sie dazu Abschnitt 4.6.4, „Sichern des root-Passworts“). Das passwortgeschützte Anmeldesystem ist nicht in der Lage, Ihre Privatsphäre und sensible Daten vor einem möglichen Diebstahl Ihres PCs zu schützen. Dies kann nur durch Verwendung einer Technologie zur Datenverschlüsselung erreicht werden. Obwohl GNU Privacy Guard (Näheres in Abschnitt 10.3, „Datensicherheits-Infrastruktur“) Dateien verschlüsseln kann, bedeutet es für den Benutzer einigen Aufwand.

dm-crypt ermöglicht eine automatische Datenverschlüsselung über native Linux-Kernel-Module mittels device-mapper bei minimalem Aufwand für den Benutzer.


[Achtung] Achtung

Datenverschlüsselung kostet CPU-Zeit usw. Verschlüsselte Daten sind nicht mehr zugänglich, wenn das zugehörige Passwort verloren ist. Bitte wägen Sie Kosten und Nutzen gegeneinander ab.

[Anmerkung] Anmerkung

Mit dem debian-installer (Lenny und später) kann ein vollständiges Debian-System auf einer verschlüsselten Festplatte installiert werden; dabei werden dm-crypt/LUKS und initramfs verwendet.

[Tipp] Tipp

In Abschnitt 10.3, „Datensicherheits-Infrastruktur“ finden Sie Infos über eine Verschlüsselungslösung, die komplett auf Benutzerebene abläuft: GNU Privacy Guard.

Sie können die Inhalte eines Wechseldatenträgers, wie z.B. eines USB-Sticks auf "/dev/sdx", mit dm-crypt/LUKS verschlüsseln. Formatieren Sie ihn einfach wie folgt:

# fdisk /dev/sdx
... "n" "p" "1" "return" "return" "w"
# cryptsetup luksFormat /dev/sdx1
...
# cryptsetup open /dev/sdx1 secret
...
# ls -l /dev/mapper/
total 0
crw-rw---- 1 root root  10, 60 2021-10-04 18:44 control
lrwxrwxrwx 1 root root       7 2021-10-04 23:55 secret -> ../dm-0
# mkfs.vfat /dev/mapper/secret
...
# cryptsetup close secret

Dann kann er in einer modernen Arbeitsplatzumgebung wie ein normaler USB-Stick unter "/media/benutzername/datenträgername" eingebunden werden (Näheres hierzu in Abschnitt 10.1.7, „Wechseldatenträger“), nur dass dabei nach dem Passwort gefragt wird; dazu wird das Paket udisks2 genutzt. Der Unterschied ist, dass jegliche Daten, die auf den Stick geschrieben werden, verschlüsselt sind. Der Passworteintrag kann auch automatisch über einen Schlüsselbund erfolgen (Näheres dazu in Abschnitt 10.3.6, „Passwort-Schlüsselbund“).

Alternativ können Sie solche Medien auch mit anderen Dateisystemen formatieren, z.B. ext4 mit "mkfs.ext4 /dev/mapper/sdx1". Falls btrfs genutzt wird, muss das Paket udisks2-btrfs installiert sein. Bei diesen Dateisystemen müssen unter Umständen der Eigentümer und die Berechtigungen der Dateien separat konfiguriert werden.

Debian stellt für unterstützte Architekturen modulare Linux-Kernel als Pakete bereit.

Wenn Sie diese Dokumentation lesen, müssen Sie vermutlich keinen eigenen Linux-Kernel kompilieren.

Debian hat seine eigene Methode zur Kompilierung des Kernels und zugehöriger Module.


Wenn Sie eine initrd wie in Abschnitt 3.1.2, „Stufe 2: der Bootloader“ verwenden, lesen Sie unbedingt die entsprechenden Informationen in initramfs-tools(8), update-initramfs(8), mkinitramfs(8) und initramfs.conf(5).

[Warnung] Warnung

Setzen Sie in den Verzeichnissen Ihres Quellcode-Baums (z.B. "/usr/src/linux*") keine symbolischen Links auf "/usr/include/linux" and "/usr/include/asm" (einige veraltete Dokumentationen empfehlen dies).

[Anmerkung] Anmerkung

Um den aktuellsten Linux-Kernel auf einem Debian-Stable-System zu kompilieren, könnte die Verwendung von rückportierten aktuellen Werkzeugen aus Unstable nötig sein.

module-assistant(8) (oder seine Kurzform m-a) unterstützt Benutzer bei Bau und Installation von Modulpaketen für einen oder mehrere selbst angepasste Kernel.

Dynamic Kernel Module Support (DKMS) ist ein neues distributions-unabhängiges Rahmenwerk, das entwickelt wurde, um die Aktualisierung einzelner Kernel-Module ohne Austausch des kompletten Kernels zu ermöglichen. Dies wird verwendet für die Betreuung von Modulen außerhalb des Linux-Quellcode-Baums. Auch ist es damit sehr einfach, im Zuge der Hochrüstung des Kernels Module neu zu bauen.

Der Hardware-Treiber ist Code, der auf der Haupt-CPU des Zielsystems läuft. Die meisten Hardware-Treiber sind heutzutage als freie Software verfügbar und in den normalen Debian-Kernel-Paketen im main-Bereich des Debian-Archivs enthalten.

  • GPU-Treiber

    • Intel GPU-Treiber (main)

    • AMD/ATI GPU-Treiber (main)

    • NVIDIA GPU-Treiber (main für den nouveau-Treiber, non-free für Treiber, die vom Hersteller als Nur-Binär-Variante bereitgestellt werden)

Die Firmware ist Code, der in das (mit dem Zielsystem verbundene) Gerät geladen wird (z.B. CPU-Mikrocode, Rendering-Code, der auf der GPU läuft, oder FPGA-/CPLD-Daten …). Einige Firmware-Pakete gibt es als freie Software, aber viele davon werden nicht als freie Software bereitgestellt, da sie Binärdaten ohne den zugehörigen Quelltext enthalten. Die Installation dieses Firmware-Codes ist erforderlich, damit das Gerät wie vorgesehen funktionieren kann.

  • Firmware-Pakete, die Daten enthalten, welche in den flüchtigen Speicher des Zielgeräts geladen werden:

    • firmware-linux-free (main)

    • firmware-linux-nonfree (non-free-firmware)

    • firmware-linux-* (non-free-firmware)

    • *-firmware (non-free-firmware)

    • intel-microcode (non-free-firmware)

    • amd64-microcode (non-free-firmware)

  • Pakete mit Firmware-Update-Programmen, die Daten in den nicht-flüchtigen Speicher des Zielgeräts laden:

    • fwupd (main): Firmware-Update-Daemon, der Firmware-Daten vom Linux Vendor Firmware Service herunterlädt

    • gnome-firmware (main): GTK-Frontend für fwupd

    • plasma-discover-backend-fwupd (main): Qt-Frontend für fwupd

Please note that access to non-free-firmware packages are provided by the official installation media to offer functional installation experience to the user since Debian 12 Bookworm. The non-free-firmware area is described in Abschnitt 2.1.5, „Grundlagen über das Debian-Archiv“.

Bitte beachten Sie außerdem, dass die Firmware-Daten, die über fwupd vom Linux Vendor Firmware Service heruntergeladen und in den laufenden Linux-Kernel integriert werden, ebenfalls nicht-frei (non-free) sein könnten.

Die Verwendung eines virtualisierten Systems ermöglicht es uns, mehrere Instanzen eines Systems gleichzeitig auf einer einzigen Hardware laufen zu lassen.

Es gibt verschiedene Virtualisierungs- und Emulations-Plattformen:

  • Vollständige Hardware-Emulations-Pakete, wie die aus dem Metapaket games-emulator

  • Plattformen, bei denen die CPU und einige Eingabe-/Ausgabegeräte überwiegend emuliert werden, wie z.B. QEMU

  • Plattformen, bei denen die CPU und einige Eingabe-/Ausgabegeräte überwiegend virtualisiert werden, wie z.B. Kernel-based Virtual Machine (KVM) (Betriebssystemkern-basierte virtuelle Maschine)

  • Container-Virtualisierung auf Betriebssytemebene mit Kernel-Level-Unterstützung, wie z.B. LXC (Linux Containers), Docker, systemd-nspawn(1), ...

  • Dateisystemzugriff-Virtualisierung auf Betriebssystemebene, bei der der Aufruf der Systembibliotheken über den Dateipfad überschrieben/geändert wird, wie z.B. chroot

  • Dateisystemzugriff-Virtualisierung auf Betriebssystemebene, bei der der Aufruf der Systembibliotheken über die Dateieigentümerschaft überschrieben/geändert wird, wie z.B.fakeroot

  • Betriebssystem-API-Emulation, wie z.B. Wine

  • Virtualisierung auf Interpreter-Ebene mit Überschreiben von Executable Selection und Runtime-Bibliotheken, wie z.B. virtualenv und venv für Python

Die Container-Virtualisierung nutzt Fähigkeiten aus Abschnitt 4.7.5, „Linux Sicherheits-Funktionalitäten“ sowie die Backend-Technologie aus Abschnitt 7.7, „Sandbox“.

Hier einige Pakete, die Ihnen bei der Einrichtung eines virtualisierten Systems helfen:

Tabelle 9.27. Liste von Virtualisierungswerkzeugen

Paket Popcon Größe Beschreibung
coreutils V:880, I:999 18307 GNU core utilities which contain chroot(8)
systemd-container V:53, I:61 1330 systemd container/nspawn tools which contain systemd-nspawn(1)
schroot V:5, I:7 2579 spezialisiertes Werkzeug, um Debian-Binärpakete in chroot-Umgebungen auszuführen
sbuild V:1, I:3 243 Werkzeug, um Debian-Binärpakete aus Debian-Quellen zu bauen
debootstrap V:5, I:54 314 Programm zum Bootstrap eines grundlegenden Debian-Systems (geschrieben in sh)
cdebootstrap V:0, I:1 115 Programm zum Bootstrap eines Debian-Systems (geschrieben in C)
cloud-image-utils V:1, I:17 66 cloud image management utilities
cloud-guest-utils V:3, I:13 71 cloud guest utilities
virt-manager V:11, I:44 2296 Virtual Machine Manager: grafische Arbeitsplatzanwendung zur Verwaltung von virtuellen Maschinen
libvirt-clients V:46, I:65 1241 Programme für die libvirt-Bibliothek
incus V:0, I:0 56209 Incus: system container and virtual machine manager (for Debian 13 "Trixie")
lxd V:0, I:0 52119 LXD: system container and virtual machine manager (for Debian 12 "Bookworm")
podman V:14, I:16 41948 podman: engine to run OCI-based containers in Pods
podman-docker V:0, I:0 249 engine to run OCI-based containers in Pods - wrapper for docker
docker.io V:41, I:43 150003 docker: Linux container runtime
games-emulator I:0 21 games-emulator: Debians Emulatoren für Spiele
bochs V:0, I:0 6956 Bochs: IA-32 PC-Emulator
qemu I:14 97 QEMU: schneller generischer Prozessor-Emulator
qemu-system I:22 66 QEMU: Binärdateien zur Emulation eines vollständigen Systems
qemu-user V:1, I:6 93760 QEMU: Binärdateien für User-Mode-Emulation
qemu-utils V:12, I:106 10635 QEMU: Hilfsprogramme
qemu-system-x86 V:33, I:91 58140 KVM: vollständige Virtualisierungslösung auf x86-Hardware mit hardware-unterstützter Virtualisierung
virtualbox V:6, I:8 130868 VirtualBox: x86-Virtualisierungslösung auf i386 und amd64
gnome-boxes V:1, I:7 6691 Boxes: Simple GNOME app to access virtual systems
xen-tools V:0, I:2 719 Werkzeuge zur Verwaltung von virtuellen Debian-XEN-Servern
wine V:13, I:60 132 Wine: Windows-API-Implementierung (Standard-Programm-Suite)
dosbox V:1, I:15 2696 DOSBox: x86-Emulator mit Tandy-/Herc-/CGA-/EGA-/VGA-/SVGA-Grafik, Audioausgabe und DOS
lxc V:9, I:12 25890 Linux-Container verwenden Werkzeuge im User-Space-Bereich
python3-venv I:88 6 venv zur Erzeugung von virtuellen Umgebungen für Python (Systembibliothek)
python3-virtualenv V:9, I:50 356 virtualenv zur Erzeugung isolierter virtueller Umgebungen für Python
pipx V:3, I:19 3324 pipx für die Installation von Python-Applikationen in isolierten Umgebungen

Der Wikipedia-Artikel Comparison of platform virtual machines (Englisch) enthält detaillierte Gegenüberstellungen der verschiedenen Plattform-Virtualisierungslösungen.

[Anmerkung] Anmerkung

Standard-Debian-Kernel unterstützen KVM seit Lenny.

Ein typischer Arbeitsablauf für eine Virtualisierung enthält folgende Schritte:

Wenn Sie eine rohe Image-Datei verwenden, finden Sie die nötigen Informationen in Abschnitt 9.7, „Das Festplatten-Abbild“.

Bei anderen Dateiformaten für virtuelle Festplatten-Images können Sie qemu-nbd(8) verwenden, um diese über das Network Block Device-Protokoll zu exportieren; dann können sie mittels dem nbd-Kernelmodul in das Dateisystem eingebunden werden (mount).

qemu-nbd(8) unterstützt Festplattenformate, die auch von QEMU unterstützt werden. QEMU wiederum unterstützt folgende Formate: roh (raw), qcow2, qcow, vmdk, vdi, bochs, cow (User-Mode-Linux Copy-on-Write), parallels, dmg, cloop, vpc, vvfat (virtuelles VFAT) und host_device.

Das Network Block Device unterstützt Partitionen auf die gleiche Art wie das loop device (Näheres hierzu in Abschnitt 9.7.3, „Einbinden der Festplatten-Abbild-Datei“). Sie können die erste Partition von "disk.img" wie folgt einbinden:

# modprobe nbd max_part=16
# qemu-nbd -v -c /dev/nbd0 disk.img
...
# mkdir /mnt/part1
# mount /dev/nbd0p1 /mnt/part1
[Tipp] Tipp

Eventuell möchten Sie lediglich die erste Partition von "disk.img" exportieren; geben Sie dazu für qemu-nbd(8) die Option "-P 1" an.

Wenn Sie eine neue Debian-Umgebung im Terminal ausprobieren möchten, empfehle ich Ihnen, chroot zu verwenden. Es ermöglicht Ihnen, Konsolenapplikationen aus Debian Unstable und Testing laufen zu lassen ohne die üblichen Risiken, die dies sonst mit sich bringt, und ohne einen Reboot des Systems. chroot(8) ist der elementarste Weg für solch einen Ansatz.

[Achtung] Achtung

Die hier angegebenen Beispiele gehen davon aus, dass sowohl das Elternsystem wie auch das chroot-System die gleiche CPU-Architektur (amd64) haben.

Although you can manually create a chroot(8) environment using debootstrap(1), this requires non-trivial efforts.

The sbuild package to build Debian packages from source uses the chroot environment managed by the schroot package. It comes with helper script sbuild-createchroot(1). Let's learn how it works by running it as follows.

$ sudo mkdir -p /srv/chroot
$ sudo sbuild-createchroot -v --include=eatmydata,ccache unstable /srv/chroot/unstable-amd64-sbuild http://deb.debian.org/debian
 ...

Sie sehen jetzt, wie debootstrap(8) Systemdaten für eine unstable-Umgebung in "/srv/chroot/unstable-amd64-sbuild" anlegt und so ein minimales Build-System erzeugt.

Sie können sich über schroot(1) in dieser Umgebung anmelden.

$ sudo schroot -v -c chroot:unstable-amd64-sbuild

Hier sehen Sie nun, wie eine System-Shell in einer unstable-Umgebung erstellt wird.

[Anmerkung] Anmerkung

Die Datei "/usr/sbin/policy-rc.d", die immer mit dem Rückgabewert 101 beendet wird, verhindert, dass Daemon-Programme automatisch in dieser Debian-Umgebung gestartet werden. Lesen Sie hierzu "/usr/share/doc/init-system-helpers/README.policy-rc.d.gz".

[Anmerkung] Anmerkung

Einige Programme könnten unter chroot Zugriff auf mehr Dateien des Elternsystems erfordern, als sbuild-createchroot mit obiger Vorgehensweise bereitstellt. Zum Beispiel könnte es nötig sein, "/sys", "/etc/passwd", "/etc/group", "/var/run/utmp", "/var/log/wtmp" usw. über bind-mount einzubinden oder zu kopieren.

[Tipp] Tipp

Das sbuild-Paket hilft Ihnen, ein chroot-System zu erstellen mit schroot als Backend, und ein Paket innerhalb dieser Umgebung zu bauen. Dies ist ideal, um Paketabhängigkeiten zu testen. Weitere Informationen finden Sie im Debian-Wiki unter sbuild sowie im sbuild-Konfigurationsbeispiel des "Guide for Debian Maintainers".

[Tipp] Tipp

The systemd-nspawn(1) command helps to run a command or OS in a light-weight container in similar ways to chroot. It is more powerful since it uses namespaces to fully virtualize the the process tree, IPC, hostname, domain name and, optionally, networking and user databases. See systemd-nspawn.

Wenn Sie eine neue grafische Arbeitsplatzumgebung von irgendeinem Betriebssystem ausprobieren möchten, empfehle ich Ihnen, QEMU oder KVM auf einem Debian-Stable-System zu verwenden, um mittels Virtualisierung mehrere Arbeitsplatzumgebungen (Desktops) sicher auf einem System laufen lassen zu können. So ist es möglich, Desktop-Anwendungen aus Debian Unstable und Testing ohne die üblichen damit verbundenen Risiken auszuführen sowie ohne einen Reboot des Systems.

Da reines QEMU sehr langsam ist, wird empfohlen, es mit KVM zu beschleunigen, falls das Host-System dies unterstützt.

Virtual Machine Manager, auch bekannt als virt-manager, ist ein praktisches grafisches Werkzeug für die Verwaltung von virtuellen KVM-Maschinen via libvirt.

Ein Image einer virtuellen Festplatte "virtdisk.qcow2", mit einem Debian-System für QEMU kann z.B. mittels Debian über das Internet installieren wie folgt erzeugt werden:

$ wget https://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso
$ qemu-img create -f qcow2 virtdisk.qcow2 5G
$ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256
...
[Tipp] Tipp

Andere GNU/Linux-Distributionen wie Ubuntu und Fedora mittels Virtualisierung laufen zu lassen ist eine tolle Möglichkeit, Tipps zur Konfiguration zu bekommen. Auch andere proprietäre Betriebssysteme können über diese GNU/Linux-Virtualisierung bequem zum Laufen gebracht werden.

Weitere Tipps finden Sie im Debian Wiki unter SystemVirtualization.



[2] Tiefergehende Anpassungsbeispiele: "Vim Galore", "sensible.vim", "#vim Recommendations" ...

[3] vim-pathogen war sehr populär.