This page contains my brain dump while learning for the LPIC-1 Module 101 certificate. The notes contain German comments – please just ignore them if you don’t speak that language.
Disclaimer: This page does not contain hints about what the exam contained in my case. I won’t tell you! :-)

Sorry about the bad formatting – I just copied and pasted this stuff from my private wiki.

====== LPIC 1 - Prüfung 101 ======
===== 101 - Systemarchitektur =====
==== 101.1 - Hardware-Einstellungen ermitteln und konfigurieren ====
  * /sys/ - Virtuelles Dateisystem, in dem Linux ab Kernel 2.6 Informationen und Konfigurationen abliegt (und teils neue Konfigurationen einlesen kann).
  * /proc - Virtuelles Dateisystem, welches unter Linux/Unix Informationen zu Prozessen enthält.
  * /dev - Virtuelles Dateisystem, welches Linux zum Bereitstellen und Präsentieren von Devices nutzt. Man könnte auch sagen: Die Geräte werden ins Userland exportiert.
  * modprobe - Fügt Module zum Linux-Kernel hinzu oder entfernt diese. -c, --show-depends
  * modinfo -Zeigt Details über ein bestimmtes Modul an.
  * rmmod -Entfernt Module während der Laufzeit.
  * insmod - Integriert Module während der Laufzeit in den Kernel.
  * depmod - Löst Abhängigkeiten zwischen den Modulen ab (siehe Datei modules.dep).
  * lsmod - Formatiert die Ausgabe von cat /proc/modules und zeigt somit an, welche Module derzeit eingehängt sind.
  * lspci - Zeigt Informationen über alle vorhandenen PCI-Schnittstellen und die eingehängten Karten ein. -v
  * lsusb - Zeigt Informationen über alle vorhandenen USB-Schnittstellen und die verbundenen Geräte an. -t, -D <device>
  * Unterschied modprobe - lsmod etc.: modprobe kann Module nachladen und rauschmeissen. Zusätzlich kann es Module auflisten, die nachgeladen werden können.
  * Konfigurationsdateien von modprobe: modules.conf, modprobe.conf, modprobe.conf.local
  * vmlinuz ist ein Symlink unter /boot/, welcher auf den tatsächlichen Namen des Kernels zeigt.
  * Kernel-Module liegen i.d.R. unter /lib/modules. Pro installiertem Kernel wird hier ein Unterverzeichnis angelegt, welches den Kernel-Namen trägt.
  * Die Kernel-Verzeichnisse besitzen meist Unterordner, die nach Kategorien (wie "net") benannt sind.
  * Auf einer Festplatte können i.d.R. nur vier Partitionen erstellt werden.
  * Eine erweiterte Partition kann nicht direkt verwendet werden. Erweiterte Partitionen dienen als eine Art Behälter. Pro Festplatte kann nur eine erweiterte Partition existieren. Eine erweiterte Partition kann bis zu zwölf logische Partitionen beherbergen.
  */proc/interrupts enthält Informationen über die vom System verwendeten Interrupts.
  */proc/ioports enthält die Informationen über die von Hardware-Komponenten verwendeten I/O-Adressen.
  */proc/dma enthält eine Liste an DMA-Kanälen.
  *DMA = Direct Memory Access, eine Zugriffsart, die über ein Bus-System direkt auf den Speicher zugreift. Peripherie (wie beispielsweise eine Netzwerkkarte) kann somit ohne Umwege (also ohne über die CPU gehen zu müssen) direkt mit dem Speicher reden.
  * USB 1.1: Zwei verschiedene USB-Host-Controller-Typen existieren, OHCI (Open Host Controller Interface) und UHCI (Universal Host Controller Interface); Die entsprechenden Treiber dazu: usb-ohci.o sowie usb-uhci.o
  * USB 2.0 kennt nur einen Controller-Typ: EHCI (Enhancend Host Controller Interface); Treiber: usb-ehci.o
  * usbmgr: Daemon, der USB-Geräte verwaltet.
  * hotplug: Daemon, der USB-, PCMCIA- und FireWire-Komponenten verwalten kann.
  * hald: Daemon, der das Hardware Abstraction Layer repräsentiert. Er informiert dbus darüber, wenn Wechsellaufwerke angeschlossen oder entfernt wurden.
  * udev verwaltet als Gerätemanager /dev.
  * USB wird erst ab Kernel 2.2.18 unterstützt.
==== 101.2 - Das System starten ====
  * </var/log/messages - Enthält Informationen zum Boot und die initialisierte Hardware (= Log von dmesg).
  * dmesg ("display message" oder "driver message") - Gibt den Message-Buffer des Kernels aus. -r, -c, -s, -n
  * BIOS
  * Bootloader
  * Kernel
  * init
  * Der MBR (Master Boot Record) gehört keiner Partition an, sondern ist eigenständig. Er ist immer genau 512 Byte groß und befindet sich immer ganz am Anfang einer Festplatte in Sektor 0, Spur 0. Das BIOS liest beim Boot-Vorgang einfach die Spur 0 des Sektors 0 aus (den MBR..).
  * MBR ansehen: dd if=/dev/sda bs=512 count=1 |xxd; Die Partitionstabelle beginnt in der fünfsten Zeile von unten, mit 8010. Der Eintrag für jede Partition entspricht genau einer Zeile. Das Ende der Partitionstabelle wird mit 55aa markiert. Die Partition, die mit 80 beginnt, ist die Startpartition.
  * /etc/lilo.conf
  * /boot/grub/grub.conf
  * Kernel-Parameter köknnen auch während der Startzeit durch den Bootloader übergeben werden. Beispiel: acpi=off apm=off (diese Parameter sind immer durch ein Leerzeichen getrennt).
  * init=/bin/bash als Kernel-Parameter bewirkt, dass man readonly ins System booten kann, z. B. wenn man das Kennwort vergessen hat. Mit mount -o remount,rw / und passwd root kann man dann das Passwort neu setzen.
==== 101.3 - Runleven wechseln, System anhalten und neu starten ====
  * /etc/inittab
  * shutdown fährt das System herunter und benachrichtigt die derzeit angemeldeten Benutzern.
  * shutdown -f -r now bootet das System sofort neu und verhindert, dass ggf. ein Filesystem-Check beim Startvorgang ausgeführt wird.
  * init: Prozess zum Wechseln der Runlevel und Vater aller Prozesse, besitzt daher immer die PID 1.
  * /etc/init.d
  * telinit
  * Ein Runlevel ist ein Zustand bzw. eine Funktionsstufe, in der sich ein Linux befinden kann. Das Runlevel 0 bedeutet ein Herunterfahren des Systems, Runlevel 1 (= Runlevel s) ist ein Single-User-Mode ohne Netzwerkmodus, Runlevel 2 ist meist ein Zustand ohne grafische Unterstützung aber im Multi-User-Mode, Runlevel 3 stellt meist noch Netzwerk- und Grafikfunktionalität bereit, Runlevel 4 wird meist nicht genutzt, Runlevel 5 ist die höchste Stufe und bietet "alles" und Runlevel 6 signalisiert init einen Reboot.
  * /et/inittab legt das default Runlevel für den Systemstart fest. Hier können auch weitere Konsolen hinzugefügt oder festgelegt werden, was beim Drücken von [Strg] + [Alt] + [Del] geschieht.
  * telinit q veranlasst den init-Prozess im laufenden Betrieb die datei inittab neu einzulese.
  * /etc/init.d/sendmail stop oder aber /etc/rc.d/sendmail stop
  * Das Kommando "runlevel" zeigt an, in welchem Runlevel sich das System gerade befindet.
  * Zum Wechseln des Runlevels verwendet man das Kommando init oder telinit.
===== 102 - Linux-Installation und Paketverwaltung =====
==== 102.1 - Festplattenaufteilung planen ====
  * /
  * /var
  * /home
  * Swap
  * Mountpoints
  * Partitionen
  * Sinnvolle Partitionierung: /boot mit max. 50 MB, /home und /var auf eigenen Partitionen, "doppelt so viel Swap wie verfügbarer RAM", Rest auf /. /var mind. 2 GB, /usr mind. 10 GB, /tmp mind. 500 MB.
==== 102.2 - Einen Boot-Manager installieren ====
  * /boot/grub/menu.lst
  * grub-install
  * MBR
  * Superblock
  * /etc/lilo.conf, enthält u.a. die Angaben zu label, map, initrd und root. Map ist meist /boot/boot.b.
  * LILO (Linux Loader)
  * GRUB (Grand Unified Bootloader)
  * Bootloader = Boot-Strap-Loader
  * LILO = Zweistufiger Bootloader, einmal innerhalb vom MBR und eben LILO selbst
  * Die Partitionstabelle ist 64 Byte groß.
  * Das Ende des MBRs benötigt 2 Byte (55 AA = Flags). Sommit bleiben für den LILO gerade mal 512 - 64 - 2 = 446 Byte übrig.
  * LILO beim Boot: Es wird versucht den Schriftzug LILO anzeigen zu lassen. Jeder Buchstabe steht dabei für einen geladenen Zustand. Wird gar nichts angezeigt, so wurde LILO kaum geladen. Wenn nur L da steht, konnte die Datei /boot/boot.b nicht gefunden werden. Wenn LI angezeigt wird, konnte die Datei /boot/boot.b zwar gelesen, aber nicht ausgeführt werden. Bei LIL konnte die Map-Datei nicht gelesen werden. Bei LIL? wurde die zweite Stufe in einen falschen Speicherbereit geleden und LIL ist ein Indikator dafür, dass die Map-Datei ungültig ist. LILO bedeutet, dass der zweite Stage erfolgreich geladen wurde.
  * Bei Änderungen am LILO muss der Map-Installer aufgerufen werden: lilo
  * Grub besitzt im Übrigen mittlerweile drei Stufen: 1, 1,5 und 2. Der erste Stage befindet sich im MBR (eine Kopie davon liegt meist unter /boot/grub/stage1), Stage 1,5 stimmt mit dem Dateisystem überein (z. B. /boot/grub/reiserfs_stage_1_5) und Stage 2 ist in /boot/grub/stage2 zu finden. Dieses Programm stellt das Boot-Menü für den Benutzer bereit und ist auch für das Starten des Kernels zuständig.
  * Manuelles Starten in der Grub-Shell: root (hd0,0); kernel /boot/vml... root=/dev/sda2; initrd /boot/initrd...; boot
  * Die Datei /boot/grub/device.map beinhaltet ein Mapping von Grub-Bezeichnungen auf die realen Devices.
  * menu.lst ist meinst ein Softlink auf grub.conf.
==== 102.3 - Shared Libraries verwalten ====
  * ldd - Identifiziert, von welchen Librarys ein Programm abhängt.
  * ldconfig - List die Datei /etc/ld.so.conf ein und teilt dem dynamischen Linker mit, dass neue Bibliotheken installiert wurden und verfügbar sind.
  * /etc/ld.so.conf - Enthält Verzeichnisse, in denen dynamische Librarys vorhanden sind.
  * LD_LIBRARY_PATH 
  * Libs (Bibliotheken) besitzen unter Windows die Dateiendung .dll, während sie unter Windows Shared Librarys genannt werden und mit .so enden (Shared Object).
  * Programme, die mit solchen Shared Librarys arbeiten, bezeichnet man als synamically linked, während Programme, die den Code der Shared Librarys in sich selbst tragen, als statically linked bezeichnet werden.
  * ldconfig -p |less zeigt den aktuellen Inhalt der /etc/ld.so.cache an.
==== 102.4 - Debian-Paketverwaltung verwenden ====
  * /etc/apt/sources.list
  * dpkg
  * dpkg-reconfigure
  * apt-get
  * apt-cache: apt-cache stats
  * aptitude
  * (Debian-)Pakete folgen meist einer bestimmten Namenskonvention. Beispiel: fortune-mod_1.99.1-3_i386.deb (Name: fortune-mod; Version: 1.99.1; Revisionsnummer/Release:3; Architektur: i386).
  * /etc/dpkg/dpkg.conf
  * /var/lib/dpkg/info: In diesem Verzeichnis befinden sich zu jedem installierten Paket mehrere Scripte und Dateien, die für die korrekte De-/Installation benötigt werden. Dort existiert auch die Datei <App-Name>.list, welche eine Auflistung aller zur Software gehörenden Dateien und Verzeichnisse beinhaltet.
  * /var/lib/dpkg/status: In dieser Status-Datei sind Informationen über bereits installierte Pakete hinterlegt.
  * /var/lib/dpkg/available beinhaltet eine Liste an verfügbaren Paketen.
  * /etc/apt/apt.conf enthält meist nur den Proxy, falls notwendig.
  * /etc/apt/sources.list enthällt die Quellen für apt-get.
  * dpkg -i installiert Pakete, dpkg -r entfernt sie wieder. Mit --purge werde im letzteren Fall auch die Konfigurationsdateien vom System geschmissen.
  * dpkg -s gibt den Status über ein installiertes Paket aus.
  * dpkg -C zeigt Pakete, die nur teilweise auf dem System installiert sind.
  * dpkg -L zeigt die Dateien an, die mit dem Paket auf dem System gelandet sind.
  * dselect ist ein Frontend für dpkg. OMG!
  * dpkg-reconfigure bietet die Möglichkeit, bereits installierte Pakete neu zu konfigurieren. Mit dpkg-reconfigure -a konfiguriert alle Pakete auf dem System neu.
  * alien wandelt rpm, dpkg, tgz, pkg und slp in andere Paketformate um.
==== 102.5 - RPM- und YUM-Paketverwaltung verwenden ====
  * rpm
  * rpm2cpio
  * /etc/yum.conf
  * /etc/yum.repos.d/
  * yum
  * yumdownloader
  * Das Tool "rpm" selbst kann leider keine Abhängigkeiten auflösen. Hierfür verwendet man Frontends wie yum.
  * Die Namenskonventionen von rpm-Paketen sind mit denen von dpkg nahezu identisch - nur wird ein Bindestrich anstelle von einem Unterstrich verwendet: bash-3.0-15.i586.rpm (Name: bash; Version: 3.0; Revisionsnummer/Release: 15; Architektur: i586).
  * Die Hauptkonfigurationsdatei von RPM ist die Datei rpmrc, meist unter /etc/rpmrc (muss manuell erstellt werden), /usr/lib/rm/rpmrc oder /usr/lib/rpmrc zu finden.
  * Die Konfigurationen, welche in /home/<user>.rpmrc hinterlegt werden, gelten nur für einen User.
  * Im Verzeichnis /usr/lib/rpm finden sich einige Scripte, die von RPM verwendet werden.
  * Die Datenbanken mit installierten Paketen, Dependencies, Conflicts und anderen Informationen für RPM befinden sich unter /var/lib/rpm. Diese Dateien können nicht mit einem Editor bearbeitet werden.
  * Tools: rpmbuild, rpme, rpmi, rpmqpack, rpmsign, rpmverify, rpm2cpio, rpmdb, rpmgraph, rpmlocate, rpmquery, rpmu, rpmlead, rpmsignature, rpmheader, rpmarchive und eben rpm selbst. Für die Prüfung ist nur rpm selbst relevant.
  * rpm -i, rpm -U (Aktualisierung, falls Paket noch nicht vorhanden wird es installiert), rpm -F (Aktualisierung, falls installiert), rpm -e (Deinstallation), rpm -h (Progressbar mit Hash-Zeichen #).
  * ACHTUNG: rpm -r steht NICHT für remove, sondern für requires!
  * Ein typisches Kommando wäre: rpm -Uhv <.rpm-Package>
  * rpm --force
  * rpm --nodeps (Keine Prüfung der Dependencies.)
  * rpm-Queries (Abfragen) sind in zwei Bereiche unterteilt: Package Selection Options und Query Options.
  * Ganz allgemein: rpm -q (q für "Query")
  * Package Selection Options = Dient zum Auffinden von Paketen
  * Query Options = Informationen über ein bestimmtes Paket erhalten
  * rpm -qa (qa für query all) liefert eine Liste aller installierten RPM-Pakete.
  * rpm-qR zeigt Abhängigkeiten zu anderen Paketen an.
  * rpm -ql führt die im Paket enthaltenen Dateien auf.
  * rpm -qc zeigt nur die Dokumentationsdateien des Paketes an.
  * rpm -qi zeigt umfangreiche Informationen zu einem Paket an.
  * Falls das Paket noch nicht installiert wurde, aber bereits als Datei vorliegt, muss ein "p" als Option mitgegeben werden: rpm -qpl
  * rpm -V (V für Verify) zeigt an, ob Dateien von einem Paket modifiziert oder gar gelöscht wurden. Indikatoren: S (Size), M (Mode), 5 (MD5), D (Device), L (link), U (User), G (Group) und T(Time).
  * rpm2cpio wandelt rpm-Pakete in .cpio-Packages um. Aus .cpio-Paketen kann man dann einzelne Dateien extrahieren. Bsp.: rpm2cpio samba-3.3.2-0.33.rpm |cpio -ivd /
  * usr/share/man/man7/samba.7
  * /etc/yum.conf, legt u.a. das Cache-Verzeichnis für Yum fest.
  * /var/cache/yum
  * /etc/yum/repos.d
  * yum search <..>
  * yum install <..>
  * yum remove <..>
  * ACHTUNG: yum update aktualisiert alle installierten Pakete und NICHT die Repositories!






===== 103 - GNU- und UNIX-Kommandos =====
==== 103.1 - Auf der Kommandozeile arbeiten ====
  * bash
  * echo
  * env - Zeigt alle gesetzten Environment-Variablen an.
  * exec
  * export
  * pwd
  * set - Zeigt alle gesetzten Shell-Variablen an.
  * unset
  * man
  * uname
  * history
  * Variablen: Umgebungsvariablen werden i.d.R. groß geschrieben (z. B. $VERISON), während Shell-Variablen meist klein geschrieben werden (z. B. $i). Umgebungsvariablen gelten für alle Shells eines Benutzers, während Shell-Variablen nur für die aktuelle "Konsole" zur Verfügung stehen.
  * /etc/profile ist die erste Konfigurationsdatei, die bei der Anmeldung eines Benutzers eingelesen wird. Sie enthält erste Environment-Variablen und die PATH-Anweisung.
  * /etc/bashrc kann von der .bashrc eines Benutzers geladen werden. Sie enthält systemweite Einstellungen, Aliase und Funktionen.
  * ~/.bash_profile wird (falls vorhanden) nur beim Relogin eingelesen und direkt nach /etc/profile ausgeführt.
  * ~/.bash_login ist eine Alternative zu .bash_profile und wird auch nur dann abgearbeitet wenn die Datei .bash_profile nicht existiert.
  * ~/.profile ist die ursprüngliche Konfigurationsdatei der Bash. Sie wird nur während der Anmeldung eingelesen - und das auch nur dann, wenn weder eine .bash_profile- oder eine .bash_login-Datie im User-Verzeichnis existieren.
  * ~/.bashrc ist die andere, ursprüngliche Konfigurationsdatei der Bash. Sie wird in jedem Fall eingelesen, auch beim Aufruf einer neuen Shell.
  * ~/.bash_logout ist eine optionale Datei, die wie der Name schon sagt beim Logout eines Benutzers ausgeführt wird. Sie könnte z. B. den Monitor löschen oder das Backup vom /home-Verzeichnis starten.
  * Variable deklarieren: x=5000; echo $x sollte dann 5000 ergeben; Gilt nur für die aktuelle Shell;
  * Wenn eine Variable auch in anderen Shells verfügbar sein soll, muss diese exportiert werden: export x
  * Alternative Vorgehensweise: Alles in einem Schritt erledigen :)  export x=5000
  * Wenn der Inhalt einer Variable nicht mehr benötigt wird, sollte diese mit "unset" wieder zurück gesezt werden: unset x
  * Beliebte Variable in Prüfungen: $HISTSIZE (definiert die Anzahl der Kommandos, die in der History aufbewahrt werden), wird meist in /etc/profile definiert.
  * Auch beliebt: $PS1 bestimmt das Aussehen der eingabeaufforderung, Bsp.: \u@\h:\w> (ergibt User@Host:<aktuelles Verzeichnis), sollte in /etc/bashrc definiert werden.
  * Ebenfalls beliebt: $?, enthält den Errorlevel des zuletzt ausgeführten Kommandos (Return Value, Exit Level..), i.d.R. bedeutet 0 eine erfolgreiche Ausführung der Applikation, während andere Werte häufig für Fehler stehen. Beliebte Werte sind beispielsweise 1 und 127; 127 steht für "command not found" in der Bash
  * $1, $2 usw. enthalten i.d.R. Optionen und Agumente, die über die Shell an ein Programm übergeben werden.
  * Die Shell-History wird in der Datei .bash_history abgelegt (im Home des jeweiligen Users).
  * Auf die letzten Aktionen kann man zugreifen, in dem man in der Shell die Pfeil-nach-oben-Taste drückt oder !! eingibt. !! bewirkt die Ausführung des letzten Befehls in der History.
  * history listet die letzten Befehle auf, mit !<Zahl> kann man dann darauf zugreifen.
  * !<string..> führt den letzten Befehl aus, der mit <string..> beginnt.
  * !?<string..> führt den letzten Befehl aus, in dem <string..> vorkommt.
  * Mehrere Befehle gleichzeitig ausführen: df -h; free -m
  * Kommandos können über mehrere Zeilen verteilt werden, in dem ein Backslash vor den Zeilenumbruch gestellt wird: less \ [Enter] blabla; Achtung: Hinter dem Backslash darf kein Leerzeichen stehen.
  * ./<command>; "./" repräsentiert das aktuelle Verzeichnis.
  * echo $PATH ausführen, um sich die Pfade anzeigen zu lassen, in denen die Shell nach Tools sucht.
  * uname -r zeigt den aktuellen Kernel auf dem System, uname -a noch ein paar mehr Informationen.
  * Wenn "man <toolname>" aufgerufen wird, konsultiert das Tool die unter $MANPATH festgelegten Verzeichnisse und sucht nach der entsprechenden Manpage. Unter Fedora ist die Variable seltsamerweise leer. Sobald "man" die gewünschte Manpage findet, wird diese dekomprimiert (die Pages liegen für gewöhnlich als gepacktes Archiv vor, um Platz zu sparen) und an einen Pager (wie less) übergeben.
  * Konfigurationsdatei: /etc/manpath.config (unter Fedora heisst die Config anders)
  * Das Programm "manpath" zeigt an, in welchen Verzeichnissen nach Manpages gesucht wird.
  * Beim Entpacken einer Manpage werden die Dateien häufig in /var/cache/man abgelegt. Dieses Verzeichnis wird, mit Hilfe des Cron-Daemons, zyklisch von catman bereinigt.
  * manpath -c zeigt die Cache-Verzeichnisse für "man" an.
  * Das Man-System ist in mehrere Sektionen unterteilt.
  * Sektion 1 vom Man-System zeigt ausführbare Programme für Benutzer.
  * Sektion 2 vom Man-System zeigt Sytemaufrufe (Funktionen, die durch den Kernel unterstützt werden)
  * Sektion 3 vom Man-System zeigt Bibliotheksaufrufe (Libarys)
  * Sektion 4 vom Man-System zeigt besondere Dateien (meist aus /dev)
  * Sektion 5 vom Man-System zeigt Dateiformate und Konventionen.
  * Sektion 6 vom Man-System zeigt Spiele.
  * Sektion 7 vom Man-System gilt sonstigen Dingen ("Misc", e.g. Makro-Pakete, Konventionen).
  * Sektion 8 vom Man-System zeigt administrative Programme, die nur von root verwendet werden.
  * Sektion 9 vom Man-System gilt den Kernel-Routinen.
  * Sektion A vom Man-System enthält mehrteilige Manpages.
  * Mit whatis und aproops kann man die Manpages durchsuchen.
  * whatis durchforstet die Namensfelder der Manpages.
  * apropos durchforstet die Namens- und Description-Felder der Manpages.
  * whereis zeigt an, wo sich ein Programm, seine Config-Files und die zugehörige(n) Manpage(s) befinden.
  * which zeigt den vollständigen Pfad eines Programms an.















==== 103.2 - Textströme mit Filtern verarbeiten ====
  * cat (concatenate, also verketten)
  * cut
  * expand
  * fmt
  * head
  * od
  * join
  * nl
  * paste
  * pr
  * sed
  * sort
  * split
  * tail
  * tr
  * unexpand
  * uniq
  * wc
  * cat kann auch nicht sichtbare Zeichen ausgeben: cat -A <file>
  * tac gibt Files in umgekehrter Reihenfolge aus.
  * head zeigt die ersten 10 Zeilen eines Files, man kann auch mehrere Dateien gleichzeitig ausgeben lassen: head <file1> <file2>; mit dem Parameter "-n X" kann man die anzahl der auszugebenden Zeilen bestimmen, z. B. head -n 1 <file>
  * tail gibt per default die letzten 10 Zeilen einer Datei aus; Wichtigste Parameter: -n X, -f (f für "follow")
  * expand wandelt Tabs in Leerzeichen um; default: 8 Leerzeichen für einen Tabstop;
  * unexpand fasst Leerzeichen zu Tabs zusammen; arbeitet genauso wie expand;
  * fmt ist ein simples Textformatierungsprogramm; es entfernt automatisch Zeilenumbrüche und kann mehrere Texte zu einem einzigen Text zusammen fassen. Wichtigster Parameter: -w (width) (Breite des Textes in Zeichen)
  * nl steht für number lines und nummeriert Zeilen.
  * pr bereitet Dateien für den Druck vor. Bsp.: pr -h <file> (-h für "centered header")
  * wc zählt die Anzahl der Zeilen, Wörter und Bytes in einer Datei. Ohne die Verwendung von Optionen werden diese Drei Eigenschaften in der genannten Reihenfolge angezeigt, also <lines> <words> <bytes> <filename>; die Verwendung von Wildcards ist möglich, also z. B. wc *; wc -c zeigt nur die Anzahl der Bytes an, wc -l die Anzahl der Zeilen, wc -w die Anzahl der Wörter und wc -m die Anzahl der Zeichen. Häufig ist die Anzahl der Bytes = die Anzahl der Zeichen...
  * hexdump zeigt Dateien hexadezimal, dezimal, im ASCII-Format oder als Oktal-Dump. hexdump /dev/sda |head -n 32 stellt nur die ersten 32 Zeilen (=512 Byte, 16 Byte pro Zeile) von /dev/sda und somit den MBR dar.
  * od (octal dump) ist ähnlich wie hexdump, besitzt nur einen kleineren Funktionsumfang. Mit -x kann die Ausgabe auf hexadezimal umgestellt werden.
  * Mit sort können Zeilen von Dateien sortiert werden. -n sortiert dabei nach numerischen Kriterien, -o sort für die Ausgabe in einer Datei, -r gibt das Ergebnis in umgekehrter Reihenfolge aus.
  * uniq kann doppelte Zeilen (sollten diese direkt aufeinander folgen) aus einer Datei tilgen. Liegen diese doppelten Zeilen nicht untereinander, kann man die Datei mit sort entsprechend vorbearbeiten.
  * split verteilt Dateien auf viele kleinere Teile. Bsp.: split -b 11m grosses-paket grosses-paket_ splittet die Datei "grosses-paket" in viele kleine Teile auf, die jeweils mit "grosses-paket_" tituliert werden. An den Unterstrich wird dann eine Nummerierung angefügt. Die Option -b 11m bewirkt, dass split nicht in Zeilen, sondern in Byte denkt. Mit 11m legen wir die Größe der einzelnen Teilpakete fest, also 11 MB. Das Zusammensetzen der Dateien ist dann z. B. mit cat möglich: cat grosses-paket_a >grosses-paket;
  * cut, paste und join werden häufig miteinander kombiniert oder nacheinander angewendet.
  * cut schneidet Spalten aus Dateien aus. Bsp.: cut -d: -f2 <file>, wobei -d für den Delimiter (Trenner) und -f für Spalte steht (f für field). Die Ausgabe erfolgt auf dem Bildschirm (hier wird Spalte 2 ausgegeben und nicht etwa gelöscht).
  * Mit paste können Dateien zusammen geführt werden, allerdings nenbeneinander und nicht untereinander.
  * join verknüpftr Dateien (Achtung: Die Delimiter-Option heisst hier -t und nicht -f!), also z. B. join -t : j 1 <file1> <file2>, wobei hier mit -j der gemeinsame Nenner festgelegt wird.
  * tr (translate) ersetzt einzelne Zeichen in Dateien durch andere, z. B.: cat <datei> | tr n x; Achtung: An "tr" kann keine Datei als Parameter übergeben werden, hier muss man daher die Dateien durch Pipes als Textströme umleiten. Wichtige Optionen: -d für delete, -c für complement ("Ausgabe ins Gegenteil umkehren") und -s für squeee repeats ("Unterdrückung sich wiederholdender Zeichen"). Mit tr kann man beispielsweise auch alle Buchstaben in Großbuchstaben umwandeln: cat <file> |tr a-z A-Z; Man kann also Ranges für den Substitude angeben. Alternative für dieses Beispiel: cat <file> |tr [:lower:] [:upper:]
==== 103.3 - Grundlegende Dateiverwaltung ====
  * cp
  * find
  * mkdir
  * mv
  * ls
  * rm
  * rmdir
  * touch
  * tar
  * cpio
  * dd
  * file
  * gzip
  * gunzip
  * bzip2
  * Dateisuchmuster
  * ls listet Dateien in Verzeichnissen auf, in alphabetischer Reihenfolge. -l gibt an, dass das Listingformat mit Zugriffsberechtigungen und Timestamps verwendet wird. -i kann nur verwendet werden, wenn -l angegeben wurde und zeigt die Inodes an. -a listet auch Dateien, die mit einem Punkt beginnen. -s zeigt in Kombination mit - die Größe jeder Datei in Blocks an. -h bewirkt, dass die Dateigrößen im human readable Format angezeigt werden, benötigt -l.
  * cd wird zum Wechseln der Verzeichnisse verwendet.
  * pwd gibt das aktuelle working directory aus ("print working directory").
  * Die Tilde "~" wird Home-Verzeichnissen voran gestellt.
  * cp kopiert Dateien und Verzeichnisse. -i bewirkt, dass vor dem Überschreiben von bereits existierenden Dateien bzw. Verzeichnissen nachgefragt wird. -f erzwingt den Schreibvorgang, während -p die Beibehaltung des Eigentümers, der Eigentümergruppe sowie deren Berechtigungen und der Timestamps bewirkt. - i für --interactie, -p für --preserve. -R kopiert rekursiv, -a (--archive) bewirkt das gleiche wie -dR --preserve=all.
  * mv verschiebt Dateien und Verzeichnisse. Wenn sich das Ziel auf der gleichen Partition wie die Quelle befindet, so wird nichts verschoben - es werden jediglich die Einträge im Quell- und Zielverzeichnis editiert, um der Verschiebung Rechnung zu tragen. Der Parameter -u erstellt eine Datei nur dann, wenn die bereits existierende Datei älter ist als die zu verschiebende DAtei oder wenn die Zieldatei noch nicht existiert. -i fragt nach, ob bereits existierende Dateien überschrieben werden sollen, während -f einen Schreibvorgang tatsächlich erzwingt.
  * mkdir legt neue Ordner an. Mit -p (--parents) werden auch Verzeichnisse erstellt, wenn die angegebenen Überordner noch nicht existieren - mkdir legt diese dann an. -m stellt gleich den --mode, also die Berechtigungen, für das neue Verzeihcnis ein, Bsp.: mkdir -m 700 Gedichte.
  * rm löscht Dateien und Ordner. -r für rekrusiv, -i für interactive, -f für force (z. B. bei Fehlermeldungen).
  * rmdir entfernt leere Verzeichnisse. Mit -p werden auch darüber liegende Verzeichnisse gelöscht, wenn diese durch die Löschung des eigentlichen Ordners leer werden.
  * touch kann neue Dateien anlegen und den Timestamp von bereits existierenden Dateien verändern. -t setzt den Timestamp auf den gewünschten Wert, während -a nur die access time und -m nur die modify time verändern.
  * find sucht nach Dateien in einer Verzeichnisstruktur. Bsp.: find / -name <filename>.
  * Wildcards werden durch die Shell interpretiert! * ersetzt null oder mehr Zeichen, ? genau eines und [!a-z] ersetzt ein einzelnes Zeichen, welches nicht angegeben ist. find / -name *.log findet alle Log-Dateien auf einem System.
  * tr (tape archiver) wurde ursprünglich entwickelt, um Dateien zu einem Archiv zusammenzufassen und dieses Archiv dann auf einem Bandlaufwerk zu sichern. Optionen können übrigens mit und ohne Strich übergeben werden, also z. B. tar -xvzf <file> oder tar xfvz <file>. -x für extract (entpacken), -z für gzip bzw. gunzip, -v für verbose, -c für create new archive, -t für listet Inhalt eines Archivs als Tabelle auf, -j für bzip2 bzw. bunzip2 und -f für file (Ein- und Ausgabe sind somit eine Datei und nicht /dev/rmt0).
  * Beispiel: Mit bzip2 komprimiertes Archiv der Konfigurationsdateien eines Linux-Systems erzeugen: tar -cvjf backup.tar.bz2 /etc/*
  * Beispiel: tar -tvjf bbackup.tar.bzw |less zeigt den Inhalt eines Archivs an.
  * Beispiel: tar -xvjf backup.tar.bz2 entpackt das Archiv wieder.
  * Also: -t für table, -c für create, -x für entpacken und -j für bzip2! -z steht für gzip!
  * gzip komprimiert Dateien. Mit -c bleibt die Originaldatei erhalten. gzip -l listet den Inhalt eines Archivs auf.
  * gunzip entpackt gzip-Archive.
  * bunzip2 entpackt bzip2-Archive.
  * cpio wird verwendet, um Dateien in Archive hinein oder aus Archiven heraus zu kopieren. cpio -i | --extract aktiviert den Copy-in-Modus. In diesem Modus werden Dateien aus einem Archiv in das Dateisystem kopiert. Das -i sollte daher aus Sicht des Dateisystems gesehen werden... cpio -o | --create steht für das Gegenteil von -i und wird als Copy-out-Modus bezeichnet. Es werden also diesmal Dateien aus dem Filesystem in das Archiv kopiert bzw. zunächst ein Archiv erstellt (create). Mit cpio -p |--pass-through wechselt man in einen besonderen Modus: hier werden zu kopierende Dateien vom default Input-Kanal eingelesen und anschließend in ein per Argument angegebenes Verzeichnis kopiert.
  * Z. B. mit cpio ein Backup von .ods-Dokumenten anlegen lassen: find /home -name *.ods |cpio -pd /backup
  * dd kopiert "Daten". Z. B. dd if=/dev/sda of=/dev/sdb; if=input file, of=output file; Den MBR mit dd betrachten: dd if=/dev/sda bs=512 count=1;
  * file zeigt den Dateityp einer Datei an. z. B. file /bin/bash;
==== 103.4 - Ströme, Pipes und Umleitungen verwenden ====
  * tee
  * Pipes
  * Redirect
  * Dateideskriptoren (Standard-I/Os)
  * Standardeingabekanal stdin (für gewöhnlich die Tastatur), entspricht Dateideskriptor 0
  * Standardausgabekanal stdout (für gewöhnlich ein Terminal), entspricht Dateideskriptor 1
  * Standardfehlerkanal stderr (ähnelt vom Verhalten her stdout, enthält aber nur Fehlermeldungen), entspricht Dateideskriptor 2
  * Redirects werden verwendet, um die Standard-I/Os entweder in eine Datei hinein oder aus einer Datei heraus umzulenken. Bsp.: grep kernel /var/log/messages > kernelmessages (siehe Zeichen ">")
  * Bsp.: script 2>fehler.log 1>erfolg.log loggt die Fehler in einer Datei, und den gewöhnlichen Output in einer anderen Datei mit
  * Bsp.: script >logfile 2>&amp;1 loggt Fehler und normale Meldungen mit. 2>&amp;1 leitet stderr auf stdout um. Das &amp; besagt, dass 1 keine Datei ist. Das Kommando würde ohne das &amp; stderr in die Datei 1 umleiten.
  * >> hängt Daten an eine Datei an, also z. B. grep kernel /var/log/messages >> kernelmessages
  * > ist ein Redirector, >> sind zwei Redirectoren...
  * Achtung: Wenn die Zieldatei bereits existiert und man nur einen Redirector verwendet, so wird die Zieldatei gelöscht und mit neuem Inhalt gefüllt.
  * Bsp. für das Umleiten des Standardeingabekanals: mail -s "Überprüfen!" willi < /var/log/messages (leitet den Inhalt von messages nach mail weiter)
  * Bsp. für das Umlenken von stdout: command > target (überschreibend)
  * Bsp. für das Umlenken von stdout: command 1> target (überschreibend)
  * Bsp. für das Umlenken von stdout: command >> target (append)
  * Bsp. für das Umlenken von stdout: command 1>> target (append)
  * Bsp. für das Umlenken von stderr: command 2> target (überschreibend)
  * Bsp. für das Umlenken von stderr: command 2>> target (append)
  * Bsp. für das Umlenken von stderr und stdout: command > target 2>&amp;1 (gemeinsame Zieldatei)
  * Bsp. für das Umlenken von stderr und stdout: command 1> targetA 2> targetB (getrennte Zieldateien)
  * Bsp. für das Umlenken von stdin: command < source
  * Bsp. für eine Pipe: grep "kernel" /var/log/messages |less (das | ist die Pipe)
  * tee kann den Datenstrom eines Programms gleichzeitig auf der Konsole und in einer Textdatei ausgeben.
  * Bsp. für tee: grep pppd /var/log/messages |tee pppdmessages
  * xargs kann Ergebnisse eines Programms, welches eine mehrzeilige Ausgabe liefert, die Zeilen einzeln an eine andere Applikation übergeben, die immer nur ein Argument gleichzeitig verarbeiten kann.
  * Bsp. für xargs: cut -d " " -f1 /var/log/apache2/access_log |sort | uniq |xargs -n1 host isoliert zunächst die erste Spalte des access_logs (enthält IPs der Besucher), sort sortiert die IPs der Besucher und uniq sorgt dafür, dass jede IP nur einmal auftaucht. xargs übergibt dann jede IP einzeln an das Kommando host. host wird also für jede IP einzeln aufgerufen.
==== 103.5 - Prozesse erzeugen, überwachen und beenden ====
  * &amp;
  * bg
  * fg
  * jobs
  * kill
  * nohup
  * ps
  * top
  * free
  * uptime
  * killall
  * Jedes Programm, welches auf einem Computer läuft, besteht aus mindestens einem Prozess.
  * Prozesse sind in einer Baumhierarchie angeordnet und die Wurzel dieses Baumes ist der Prozess init.
  * Wenn der kernel beim Systemstart alle seine Module initialisiert hat, übergibt er die Kontrolle an den Prozess init.
  * Jedem Prozess wird eine eindeutige ID zugeordnet, die PID (Prozess-ID).
  * init hat immer die PID 1. Die PID 0 gibt es nicht.
  * init ist der erste Prozess, der auf einem System langfristig gestartet wird und der letzte Prozess, der beim Herunterfahren des Systems stirbt.
  * ps zeigt die aktuell auf dem System laufenden Prozesse an.
  * ps a zeigt auch die Prozesse anderer User an. Voraussetzung ist, dass diese Prozesse mit einem Terminal verknüpft sind.
  * ps u zeigt auch die Startzeit, den Pfad zur ausführenden Datei und den ausführenden Benutzer an.
  * ps x führt auch die Prozesse auf, die nicht mit einem Terminal verbunden sind (z. B. init oder cron).
  * ps -C <prozess> sorgt für die Ausgabe aller Instanzen eines in der Shell angegebenen Prozesses.
  * ps -U <user> zeigt die Prozesse eines bestimmten Users an.
  * ps aux ist eine beliebte Kombination. Damit werden sämtliche Prozesse aller User angezeigt.
  * pstree zeigt die Prozesse in ihrer Hierarchie an.
  * pstree -a zeigt zusätzlich die Optionen und Argumente an, die einem Prozess an der Kommandozeile übergeben wurden.
  * pstree -G hat eine Ausgabe im VT100-Modus zur Folge. Führt häufig zu einer optisch ansprechenderen Ausgabe.
  * pstree -p zeigt zusätzlich die PIDs an.
  * pstree -n sorgt für eine Sortierung nach PIDs. Im Normalfall erfolgt die Sortierung alphabetisch.
  * Mein persönlicher Favorit: pstree -Ahapnul
  * top zeigt die laufenden Prozesse in Echtzeit an. Dazu kommen noch Informationen wie Uhrzeit, Uptime, Anzahl der angemeldeten User, die durchschnittliche Systemauslastung, Tasks (Anzahl der Prozesse insgesamt, laufende Prozesse, schlafende Prozesse, gestoppte Prozesse und Zombie-Prozesse), CPU(s) (Benutzung durch Benutzerprozesse, Systemprozesse, IDLE-Prozess), MEM (Speicher insgesamt, in Verwendung, freier Speicher und für Buffer verwendeter Speicher) sowie den SWAP (diverse Werte zur Verwendung der SWAP-Partition(en).
  * Im Interaktivmodus von top tötet "k" einen Prozess. Dabei müssen sowohl die PID als auch das Signal angegeben werden.
  * Im Interaktivmodus von top regelt "n" die Anzahl der auszugebenden Zeilen.
  * Im Interaktivmodus von top regelt "r" den Nice-Wert eines Prozesses zur Laufzeit.
  * Im Interaktivmodus von top gibt "h" die Hilfe aus.
  * Im Interaktivmodus von top erwirkt "q" das Beenden von top.
  * Im Interaktivmodus von top erwirkt "t" die Verwendung von Farben in der Darstellung.
  * top -i zeigt nur die Prozesse an, die aktiv sind. Schlafende Prozesse werden ignoriert.
  * top -b (batch) kann in Kombination mit einem Redirektor verwendet werden, um die Ausgabe in eine Textdatei umzuleiten.
  * top -d (delay) gibt das Aktualisierungsintervall in Sekunden an. Der Standardwert ist eine Sekunde.
  * top -q startet top mit Echtzeitausgabe. Die Aktualisierung wird sehr hochfrequent, was zu einem instabilen System führen kann. Diese Option habe ich im Übrigen weder unter Ubuntu, noch unter Fedora gefunden.
  * Man kann Signale an Prozesse senden. Es gibt insgesamt 64 von Ihnen. kill -l zeigt eine Liste an zur Verfügung stehenden Signalen.
  * Ein wichtiges Signal ist 1 bzw. SIGHUP. Was früher ein Modem zum Auflegen veranlasste, bewirkt heute bei z. B. Daemons (wie bind, Squid..) zu reloaden und dabei die Konfiguration neu einzulesen.
  * Ein wichtiges Signal lautet 9 bzw. SIGKILL und beendet einen Prozess mit Gewalt. Sollte nur im Notfall verwendet werden. Ein mit SIGKILL beendeter Prozess räumt keine temporären Dateien usw. auf.
  * Ein weiteres wichtiges Signal lautet 15 bzw. SIGTERM. SIGTERM fordert einen Prozess auf, sich selbst zu beenden. Der Prozess erhält die Gelegenheit Aufräumaktionen auszuführen.
  * 2 bzw. SIGINT führt einen Programmabbruch aus. Wird gesendet, wenn beispielsweise [Strg] + [c] bestätigt wird.
  * 18 bzw. SIGCONT setzt einen Prozess fort, der zuvir mit SIGSTOP angehalten wurde. Das Signal SIGCONT wird durch die Kommandos fg und bg gesendet.
  * 19 bzw. SIGSTOP hält einen Prozess an. Der Prozess kann später mit SIGCONT fortgesetzt werden.
  * 20 bzw. SIGTSTP hält einen Prozess an. Der Prozess bleibt speicherresident und kann mit SIGCONT fortgesetzt werden. Die Tastenkombination [Strg] + [z] sendet dieses Signal.
  * Mit kill können alle 64 Signale an einen Prozess gesendet werden. kill ist primär dazu gedacht Programme zu beenden.
  * kill ohne Signal sendet per default SIGTERM (15) raus.
  * Wenn man mit kill einen SIGTERM (15) an eine PID senden möchte, existieren hierfür 11 verschiedene Varianten:
  * kill <PID>
  * kill -s 15 <PID>
  * kill -s SIGTERM <PID>
  * kill -s TERM <PID>
  * kill -s sigterm <PID>
  * kill -s term <PID>
  * kill -15 <PID>
  * kill -SIGTERM <PID>
  * kill -TERM <PID>
  * kill -sigterm <PID>
  * kill -term <PID>
  * Prozesse, die darauf nicht reagieren, müssen dann gekillt werden: kill -SIGKILL 3167
  * Bsp. aus den Prüfungen: kill -SIGHUP `cat /var/run/dhcpd.pid`; Hier wird mit Hilfe von cat die PID des dhcpds festgestellt. Die Backquotes sorgen dafür, dass das Ergebnis dieses Kommandos an kill -SIGHUP angehängt wird. Eine andere Variante lautet: kill -SIGHUP $(cat /var/run/dhcpd.pid)
  * killall verwendet im Gegensatz zu kill keine PIDs, sondern Prozessnahmen. Somit muss man also keine PID ermitteln und kann mit nur einem Befehl alle Prozesse mit dem gleichen Namen abschiessen. Bsp.: killall -s 9 mc
  * In einer Shell können beliebig viele Benutzerprozesse (Jobs) gleichzeitig laufen. Programme, die in den Hintergrund transferiert wurden, können den Status "running" oder "stopped" besitzen.
  * Bsp.: Prozess starten und dann mit [Strg] + [z] in den Hintergrund schicken. Hier wird das Signal SIGTSTP (20) an den Prozess gesendet.
  * Einen Prozess kann man in den Hintergrund senden, so dass dieser weiter arbeitet und man gleichzeitig auf der Shell arbeiten kann. Einfach ein "&amp;" anhängen, z. B.: updatedb &amp;
  * Mit jobs kann man sich anzeigen lassen, welche Prozesse der aktuellen Shell derzeit laufen (z. B. im Hintergrund).
  * jobs -l zeigt auch die PIDs der jeweiligen Prozesse.
  * bg <Job-Nummer> sendet ein SIGCONT (18) an den Prozess, so dass dieser im Hintergrund weiter läuft. Der Prozess muss vorher gestoppt gewesen sein.
  * fg <Job-Nummber> holt den Prozess wieder in den Vordergrund (SIGCONT, 18).
  * nohup <command> startet den angegebenen Befehl und macht den daraus resultierenden Prozess immun gegen Signale wie SIGHUB. Zusätzlich wird stdout in eine Datei umgeleitet (meist nohup.out im Home-Dir). Nach einem logout läuft der Job dann sogar ohne Shell weiter.
  * uptime gibt die Uptime, Anzahl der Benutzer sowie die durchschnittliche Anzahl von lauffähigen Jobs in den vergangenen 1, 5 und 15 Minuten aus.
  * w fördert eine ähnliche Ausgabe zu Tage.
  * free zeigt die derzeitige Speicherauslastung eines Systems an.
  * free -b -> Ausgabe in Bytes.
  * free -k -> Ausgabe in KB.
  * free -m -> Ausgabe in MB.
  * free -g -> Ausgabe in G.
  * free -l -> Details aus High- und Low-Memory anzeigen.
  * free -o -> Altes Format für die Darstellung verwenden.
  * free -t -> Summen für RAM und SWAP.
  * free -s n -> Refreshing-Intervall.
  * free -s n -c n -> Wie oft soll aktualisiert werden?
  * free -V -> Zeigt die Version an.
==== 103.6 - Prozess-Ausführungspriorität ändern ====
  * nice
  * ps
  * renice
  * top
  * Manchmal muss man Prozesse mit anderen Prioritäten laufen lassen. 
  * Mit "nice" kann man den Nice-Wert eines Programms schon beim Start festlegen. Ein Aufruf ohne Angabe eines Nice-Levels lässt den Prozess gleich 10 Mal "netter" ausführen.
  * Die Nice-Range reicht von -20 bis +19.
  * Wenn der Wert negativ ist, wird dem Programm eine höhere Priorität zugeordnet.
  * Der Nice-Wert und die Prozesspriorität sind nicht dasselbe. Mit dem "Nicen" von Prozessen kann man lediglich Einfluss auf die Prozesspriorität ausüben.
  * Bsp.: nice -n 12 nano oder nice -12 nano startet nano mit einem positiven Nice-Wert von 12.
  * Bsp.: nice -n -15 pico oder nice --15 pico startet pico mit dem Nice-Wert von -15.
  * renice lässt zu, dass man noch während der Laufzeit Einfluss auf die Prozesspriorität ausübt (alternativ können auch top bq. htop verwendet werden).
  * Bsp.: renice -10 <PID>
  * Bsp.: renice 5 -u <user> beeinflusst alle Prozesse eines Users.
  * Mit top (bzw. htop) und ps kann man sich die aktuellen Prioritäten anzeigen lassen (in ps nach SN+ oder S<+ .. etc. suchen).
  * Im oberen Beispiel steht das N für einen genicten Prozess, das S für interruptible sleep und das + für "wird im Vordergrund ausgeführt". Das < ist ein Indikator dafür, dass der Prozess mit erhöhter Priorität ausgeführt wird.
  * Mit top sieht man das Nice-Level eindeutig.
  * Standardwerte: 16 für Prozesspriorität (wird vom System verwaltet), 0 für den Nice-Wert.
==== 103.7 - Textdateien mit regulären Ausdrücken durchsuchen VALENTIN LESEZEICHEN ====
  * grep
  * egrep
  * fgrep
  * sed
  * regex, regular expressions, regexp
  * Ein regulärer Ausdruck kann als eine Art Beschreibungssprache verstanden werden.
  * Reguläre Ausdrücke werden nicht von allen Programmen gleich interpretiert!
  * Für die Prüfung relevante Tools: grep, sed, vi(m)
  * Metazeichen ^ = Textanker für den Zeilenanfang
  * Metazeichen $ = Textanker für das Zeilenende
  * Metazeichen \< markiert einen Wortanfang
  * Metazeichen \> markiert ein Wortende
  * Metazeichen \ "escaped" ein Zeichen
  * Metazeichen [...] = Der Ausdruck passt auf die in den eckigen Klammern enthaltenden Zeichen. [abc] trifft also zu, wenn ein Ausdruck a, b oder c enthält. Man kann hier auch [a-c] schreiben.
  * Metazeichen[^...] = Der Ausdruck trifft nicht auf "..." zu. Nicht mit dem Metazeichen ^ verwechseln, wenn es alleine steht°
  * Beispiel: ^[^#] erzielt einen Treffer, wenn am Zeilenanfang keine Raute steht.
  * Wildcard * bezeichnet beliebig null oder beliebig viele Wiederholungen des voranstehenden Zeichens.
  * Wildcard ? bezeichnet null oder die einmalige Wiederholung des voranstehenden Zeichens. Ursprünglich wurde dieses Zeichen von sed und grep nicht unterstützt, weshalb viele hier zu egrep griffen.
  * Wildcard + bezeichnet das zumindest einmalige Vorkommen des voranstehenen Zeichens.
  * Wildcard . kann als Platzhalter für ein beliebiges Zeichen (außer Zeilenvorschub) verwendet werden.
  * Achtung: In der Shell ersetzt der Stern mehrere beliebige Zeichen und das Fragezeichen ein beliebiges Zeichen. Hier besteht also Verwechslungsgefahr.
  * grep durchsucht Zeilen einer Datei nach regulären Ausdrücken.
  * grep = search Globally for Regular Expressions and print out
  * grep -v invertiert die Ausgabe. Es werden also Zeilen ausgegeben, auf die der angegebene reguläre Ausdruck nicht zutrifft. Kein Verbose-Mode.
  * grep -n fügt dem Suchergebnis eine Zeilennummerierung hinzu.
  * grep -E aktiviert die Verwendung von extenden regex. Das Tool verhält sich dann wie egrep.
  * grep -c zählt die Anzahl der Übereinstimmungen mit dem Suchmuster.
  * grep -i ignoriert die Groß- und Kleinschreibung.
  * Bsp.: grep [Ww]ill[iy] <file> durchforstet <file> nach Willi, Willy, willi und willy. Ein ähnliches Ergebnis liefert übrigens auch grep -i will[iy].
  * Bsp.: Nur Zeilen ausgeben, die mit einer Route beginnen (= auskommentierte Zeilen): grep [#] <filename>
  * Bsp.: Keine Zeilen mit Raute ausgeben: grep -v [#] <file> oder auch grep [^#] <file>
  * Bsp.: Ignoriere Zeilen, die mit einer Route beginnen: grep -v ^[#] <file> oder auch grep ^[^#] <file>
  * Bsp.: grep -v ^[#] /etc/config.conf |grep -v ^$ macht das gleiche wie oben UND ignoriert zusätzlich Leerzeilen. Der Regex ^$ erkennt Zeilen, in denen der Start und das Ende der Zeile direkt aufeinander folgen - dies muss eine Leerzeile sein.
  * Bsp.: grep '1\{3,5\}' <file> zeigt alle Zeilen, die drei, vier oder fünf aufeinander folgende Einsen enthalten.
  * Bsp.: grep '1\{3,\}' <file> sucht alle Zeilen, die mindestens drei aufeinander folgende Einsen enthalten. Nach oben ist kein Limit gesetzt.
  * Bsp.: grep '[0-9]\{3\}' <file> zeigt alle Zeilen, in denen drei aufeinander Folgende Ziffern vorkommen.
  * Die geschweiften Klammern und eine Zahl darin geben also an, wie häufig sich etwas wiederholen darf: \{3,\}
  * Die Metazeichen ?, +, {, }, |, ( und ) müssen immer escaped werden. Ansonsten sind diese Teil des Suchstrings.
  * Bsp.: Nach mindestens 3-stelligen Dollarbeträgen suchen: grep '\$ [0-9]\{3,\}\>' <file>
  * Bsp.: Suchen nach /var/log: grep '\/var\/log\/' <file>
  * Bsp.: Unter Windows nach c:\windows\system32 suchen: grep 'c:\\windows\\system32\\' <file>
  * Bsp.: Nach Zeilen suchen, die mindestens einen Großbuchstaben enthalten: grep '[A-Z]\+' <file>
  * egrep (extended grep) und fgrep (fixed grep) waren ursprünglich Varianten von grep mit zusätzlichen Fähigkeiten. Beide sind heutzutage nicht mehr notwendig, da grep nun entsprechende erweiterte Optionen bietet.
  * grep -E = egrep
  * grep -F = fgrep
  * agrep führt fehlertolerantes Suchen durch, während zgrep für Suchen in komprimierten Archiven gedacht ist.
  * sed ist ein Stream-Editor.
  * sed bietet Optionen und Kommandos, wobei die Optionen allerdings meist eine eher untergeordnete Rolle spielen.
  * Wenn keine Optionen angegeben werden, kann sed allerdings auch nur ein Kommando mit einer einzigen Befehlszeile entgegen nehmen.
  * sed -e <command> - Optional, wenn nur ein Kommando verwendet wird. Wenn mehrere Kommandos in einer Befehlszeile verwendet werden sollen, muss diese Option jedem Kommando voran gestellt werden.
  * sed -f <script> - Gibt ein Script an, welches Kommandos für sed enthält.
  * sed -g - Alle folgenden Kommandos gelten als global. Ansonsten reagiert sed nur auf das erste vorkommnis eines Suchmusters innerhalb einer Zeile.
  * Per default bearbeitet sed alle Zeilen der angegebenen Datei(en). Wenn dieses Verhalten nicht erwünscht ist, kann man sed die Koordinaten für Beginn und Ende der Arbeiten nennen. Es können dabei eine, zwei oder gar keine Adressen verwendet werden.
  * Es existieren drei Arten von Adressen für sed: Zeilennummern, Dollarzeichen (für die letzte Zeile) und reguläre Ausdrücke (der auf beiden Seiten durch Slashes begrenzt wird, z. B. /regex/).
  * Wenn sed eine Datei vollständig verarbeiten soll, dann gibt man gar keine Adresse ein.
  * Kommandos können in zwei Varianten an sed übergeben werden. Entweder direkt in der Shell oder aber via Script.
  * Kommando y: Wird für die Übersetzungen von einem Zeichen in ein anderes Zeichen verwendet. Achtung: Beim Austausch von Zeichen in einer Zeile muss das Verhältnis 1:1 gegeben sein. Soll heissen: Ein Zeichen ersetzt ein anderes, zwei Zeichen ersetzten zwei andere, drei Zeichen.. usw.
  * Bsp.: Austausch von Komma durch Semikolon: sed 'y/,/;/' file1 > file2
  * Das Kommando "d" löscht ganze Zeilen, wenn ein regulärer Ausdruck zutrifft oder Zeilen mit Adressen angegeben wurden.
  * Bsp.: sed -e '/^$/d' -e '/^#/d' <file>
  * Im obrigen Beispiel bewirkt der voranstehende Befehl das Löschen von Kommentar- und Leerzeilen in einer Datei. ^$ = Leerzeile, ^# = Zeile beginnt mit einer Raute. 
  * Bsp.: sed '25,47d' file1 > file2 löscht adressenbasiert Zeilen.
  * Bsp.: sed '25,47d!' file > file 2 invertiert den Vorgang, soll heissen alles außer Zeilen 25-47 wird gelöscht.
  * Das Kommando "s" kann Zeichen übersetzen. Im Vergleich zu "y" ist es mächtiger, da auch mehrere Zeichen in ein einziges Zeichen überführt werden können (und umgekehrt). Das Verhältnis 1:1 ist hier also gebrochen.
  * Beispiel: sed 's/ue/ü/' <file> ersetzt in jeder Zeile das erste ue durch ein ü.
  * Der obrige Befehl kann durch "g" globalisiert werden. Somit wird jedes vorkommende ue (also auch alle in einer Zeile) durch ein ü ersetzt.
  * Bsp. zur Erklärung, die sich eine Zeile höher befindet: sed 's/ue/ü/g' <file>
  * Beispiele für ein sed-Script:
<code>
archangel:~ # cat sed-umltohtml-script
s/ä/\&amp;auml\;/g;
s/Ä/\&amp;Auml\;/g;
s/ü/\&amp;uuml\;/g;
s/U/\&amp;Uuml\;/g;
s/ö/\&amp;ouml\;/g;
s/Ö/\&amp;Ouml\;/g;
s/ß/\&amp;szlig\;/g;
</code>
sed -f <script> file 1 > file2

Achtung: Wenn ich im sed-Script Adressen angebe, muss ich berücksichtigen, dass sich die Zeilennummerierungen während der Ausführung des Scripts ändern können. Wenn also beispielsweise die erste Zeile in einem sed-Script Zeilen aus einem Text-Stream entfernen und Zeile zwei im Script Zeile 1 adressiert, so könnte der zweite Befehl aus dem Script versehentlich die falsche Zeile modifizieren. Bei der Adressierung von Zeilen ist also Vorsicht geboten!
==== 103.8 - Grundlegendes Editieren von Dateien mit vi ====
  * vi
  * h,j,k,l
  * i,o,a
  * c,d,p,y,dd,yy
  * ZZ, :w!, :q!, :e!
  * vi
  * /, ?
  * vi ist der Nachfolger von ed.
  * Derivate von vi: vim, elvis, vile usw.
  * Mehrere Dokumente in den vi laden: vi <file1> <file2>
  * Mit :n (vorwärts) und :N (rückwärts) kann man dann zwischen den einzelnen Dokumenten wechseln.
  * Kommandomodus (Speichern, im Text fortbewegen, Zwischenablage, Löschen, Suchen, aber KEIN Editieren), direkt nach dem Start vom vi
  * Einfügemodus (i oder a drücken)
  * i wechselt vor der aktuellen Cursorposition in den Einfügemodus, I wechselt am Anfang der aktuellen Zeile in den Einfügemodus, a wechselt hinter der aktuellen Cursorposition in den Einfügemodus und A wechselt am Ende der aktuellen Zeile in den Einfügemodus.
  * Mit [Esc] gelangt man vom Eingabe- zurück in den Kommandomodus.
  * Im Kommandomodus kann man abspeichern. Bsp.:    :w <filename>
  * :w! speichert nach Möglichkeit auch dann, wenn die Datei schreibgeschützt ist.
  * :wq speichert und beendet vi
  * :x  speichert und beendet den Editor
  * ZZ speichert und beendet den vi
  * :q beendet den Editor. Bearbeitete Dateien müssen zuvor abgespeichert worden sein.
  * :q! beendet den vi ohne zu speichern, falls eine Änderung vorliegt.
  * :e <filename> öffnet die angegebene Datei. Die aktuelle Datei wird geschlossen. Die ursprüngliche Datei muss vorher gespeichert werden.
  * Der vi kann NICHT mit [Strg] + [c] beendet werden.
  * Bewegung im Kommandomodus: h = ein Zeichen nach links
  * j = ein Zeichen nach unten
  * k = ein Zeichen nach oben
  * l = ein Zeichen nach rechts
  * G = Ende der Datei
  * H = oberer Bildschirmrand
  * L = unterer Bildschirmrand
  * Durch das Voranstellen von Zahlen kann eine Bewegung gleich mehrmals statt finden, . B. 20j bewegt den Kursor um 20 Zeilen nach unten.
  * Bsp.: Bewegen Sie den Cursor um drei Zeilen nach oben und um vier Zeichen nach rechts = 3k4l; Der vi führt diese Kommandos dann allerdings getrennt aus.
  * yy (yank) kopiert den Inhalt der aktuellen Zeile in die Zwischenablage
  * p (paste) fügt den Inhalt der Zwischenablage unterhalb der aktuellen Zeile ein
  * P (Paste) fügt den Inhalt der Zwischenablage oberhalb der aktuellen Zeile ein
  * dd (delete) löscht die aktuelle Zeile
  * D (Delete) löscht den Text hinter dem Cursor bis zum Ende der Zeile
  * cc (cut copy) schneidet die vollständige aktuelle Zeile aus und kopiert diese in die Zwischenablage. Anschließend wechselt vi automatisch in den Einfügemodus.
  * C (Cut) schneidet den Text hinter dem Cursor bis zum Ende der Zeile aus und kopiert den Krams in die Zwischenablage. Anschließend wechselt vi automatisch in den Einfügemodus.
  * o generiert eine neue Zeile unterhalb der aktuellen und wechselt automatisch in den Einfügemodus.
  * O generiert eine neue Zeile oberhalb der aktuellen und wechselt automatisch in den Einfügemodus.
  * /regex sucht nach der Zeichenkette regex.
  * / sucht nach dem nächsten Vorkommen der Zeickenkette regex.
  * ? sucht rückwärts nach dem Vorherigen Vorkommen der Zeickenkette regex.
  * :!kommando führt das Script mit der Bezeichnung "kommando" aus. Der Editor bleibt hierbei weiterhin geöffnet.
  * Wenn ein Kommando gleich mehrfach ausgeführt werden soll, so stellt man einfach einen numerischen Wert voran.
  * Bsp.: 17dd löscht 17 Zeilen (aktuelle + die kommenden 16 Stück)
  * Bsp.: 54yy kopiert 54 Zeilen in die Zwischenablage
  * 12cc schneidet die aktuelle und folgenden 11 Zeilen aus
  * vi kann mit anfänglichen Bedingungen gestartet werden, z.B. mit einer festgelegten Zeile.
  * Bsp.: vi <file> +65
  * Bsp.: vi <file> +/Pinguin lässt den vi direkt nach dem Öffnen von <file> zum ersten Suchergebnis für Pinguin springen.
  * Diese Befehlszeilenoptionen wurden vom Vorgänger "ex" übernommen.
===== 104 - Geräte, Linux-Dateisysteme, Filesystem Hierarchy Standard =====
==== 104.1 - Partitionen und Dateisysteme anlegen ====
  * fdisk
  * cfdisk als menügeführte Applikation, hier nicht relevant
  * mkfs
  * mkfswap
  * mkfs kann u.a. ext2, ext3, xfs, reiserfs v3 und vfat - Dateisysteme anlegen.
  * Partitionierung aktueller Festplatte ansehen: z.B. via fdisk /dev/sda -l
  * cat /proc/partitions
  * Festplatte mit fdisk partitionieren: fdisk <platte> und dann "n" für new. Interaktiv, ähnlich wie parted. Mit "w" schließt man den Vorgang ab (vermutlich "w" für "write").
  * Alle verfügbaren Optionen von fdisk anzeigen lassen: fdisk eingeben und "m" (für "menu") drücken.
  * fdisk -> m -> a: (activate) legt aktive Partitionen fest, wird als Flag vom BIOS ausgewertet und für Betriebssysteme benötigt, die über kein Startprogramm im MBR verfügen.
  * d (delete) löscht eine Partition
  * l (list) zeigt alle von fdisk unterstützten Dateisysteme an
  * m (men) zeigt das Menü an.
  * n (new) erstellt eine neue Partition.
  * p (print) zeigt die aktuelle Partitionstabelle an.
  * q (quit) verwirft alle Änderungen und beendet fdisk.
  * t (type) ändert den Dateisystemtyp einer Partition.
  * u (units) ändert die Einheit
  * v (verify) überprüft die Partitionstabelle
  * w (write) schreibt alle Änderungen in die Partitionstabelle.
  * x (extra) ergibt ein zusätzliches Menü mit Hardware-nahen Optionen.
  * Typ 83 = Dateisystem vom Typ Linux
  * Typ 82 = Dateisystem vom Typ Swap
  * Typ 7 = HPFS/Windows NTFS
  * Typ 3 = Windows 95 FAT-32 (LBA)
  * Typ f = Windows 95, erweiterte Partition (LBA)
  * Typ 85 = Linux Extended
  * Typ 8e - Linux LVM
  * Nachdem eine Partition erstellt wurde, muss diese noch formatiert werden. Hierbei vollzieht sich die eigentliche Erstellung des Dateisystems. Der fdisk modifiziert lediglich die Partitionstabelle.
  * Das wichtigste Formatierungswerkzeug unter Linux lautet mkfs. Eigentlich handelt es sich hierbei um ein Frontend, welches je nach zu formatierendem Dateisystem ein passendes Backend-Programm ausführt. mkfs ist, inkl. Backends, unter /sbin.
  * mkfs.ext2 erstellt sowohl ext2- als auch ext3-Dateisysteme. Zur Formatierung mit ext3 wird die Option -j verwendet.
  * mkfs.ext3 ist im Normalfall ein Hardlink auf mkfs.ext2. Durch den Aufruf erkennt mkfs.ext2, welches Dateisystem formatiert werden soll.
  * mkfs.reiserfs
  * mkfs.msdos - Von msdos-Partitionen kann kein OS gebootet werden.
  * mkfs.msdos ist in der Regel ein Softlink zu mkdosfs.
  * mkfs.vfat ist ein weiterer Softlink auf mkdosfs.
  * mkfs.ntfs erstellt NTFS-Dateisysteme unterschiedlicher Versionen. Derzeit werden alle Windows-Systeme (bis einschl. Vista) unterstützt.
  * mkfs.xfs erstellt das ursprünglich von Silicon Graphics (SGI) für IRIX entwickelte 64-Bit-Dateisystem XFS. XFS pflegt ein Journal, ähnlich wie ReiserFS, und unterstützt die Verwendung von Zugriffssteuerungslisten (Access Control Lists). Leider sind die Datenverluste bei einem Stromausfall im System relativ groß.
  * mkfs.cramfs erstellt das Dateisystem cramFS. Hierbei handelt es sich um ein kormprimiertes Read-Only-Dateisystem, welches eigentlich ausschließlich für Embedded Systems eingesetzt wird, auf die nicht schreibend zugegriffen werden muss.
  * mkfs.jfs erstellt das Dateisystem JFS, welches ursprünglich für das Betriebssystem AIX entwickelt wurde.
  * Die beiden wichtigsten Frontends zur Formatierung sind mkfs und mke2fs. mke2fs ist ein Hardlink auf mkfs.ext2 bzw. mkfs.ext3.
  * mkfs-Optionen:
  * t für type und den zu formatierenden Dateisystemtyp
  * c für check, prüft das Gerät auf fehlerhafte Sektoren.
  * -v für verbose, erzeugt eine informative Ausgabe.
  * j für journal, erstellt ein Journal für ext3.
  * -L für Label, eine Bezeichnung für ein Volumen.
  * Veränderungen von ext3 gegenüber ext3: Journal, H-Baum-Verzeichnisindizes und Online-Veränderung der Dateisystemgröße.
  * Journal: Ein Journal ist eine reguläre Datei, in die Metadaten (optional die Nutzdaten) geschrieben werden, bevor sie auf das tatsächliche Dateisystem geschrieben werden. Aus einem ext2- kann daher ein ext3-Dateisystem gemacht werden, ohne irgendwelche Daten konvertieren zu müssen.
  * Vorteil vom Journal: Im Journal stehen sozusagen alle Aktionen (und bei Bedarf auch Nutzdaten), die das Filesystem betreffen. Bei einem Crash kann das Dateisystem somit sogar feststellen, welche Änderungen noch auf die Platte geschrieben werden konnten und welche noch durchgeführt werden müssen. Bringt also mehr Stabilität und eine Art "Log".
  * Bsp.: Konvertierung von ext2 nach ext3: Angeblich reicht das Hinzufügen eines Journals: tune2fs -j /dev/hdb3
  * Bsp.: Alternative lautet mkfs -t ext2 -j /dev/sdb1
  * In Wirklichkeit wird bei beiden oberen Kommandos mke2fs aufgerufen.
  * Eine Swap-Partition erzeugen: Zunächst mit fdisk formatieren (Partitionstyp 82), anschließend mkswap /dev/sdb4.
  * Die frisch erstellte Swap-Partition vom Betriebssystem verwenden lassen: swapon -v /dev/sdb4
  * Die Swap-Partition wieder deaktivieren: swapoff -v /dev/sdb4
  * Damit die neue Swap-Partition gleich nach dem Systemstart verfügbar wird, muss die Datei /etc/fstab bearbeitet werden:
  * /dev/sdb4 swap swap pri=42 0 0
  * Im Gegensatz zu Windows verwendet Linux im Normalfall keine Swap-Datei, sondern ganze Swap-Partitionen, wie bereits geschrieben. Das hat vor allem den Vorteil, dass es nicht zu einer Fragmentierung des Auslagerungsbereiches kommen kann. Sollte es aber kurzfristig im Speicher einmal eng werden, können Sie ohne Aufwand schnell eine Swap-Datei (mit all ihren Nachteilen) erzeugen.
  * Bsp.: dd if=/dev/zero of=/swapfile bs=1024 count=524288
  * Linux unterscheidet nicht zwischen einer normalen Datei (z. B. /swapfile) und einer Gerätedatei (z. B. /dev/sdb4).
  * mkswap /swapfile
  * swapon /swapfile, dann in fstab eintragen:
  * /swapfile swap swap defaults 0 0
  * Vergewissern, dass der Swap nun wirklich da ist: cat /proc/swaps
==== 104.2 - Die Integrität von Dateisystemen sichern  ==== 
  * du - Zeigt Platzverbrauch von Dateien und Ordnern an. -a, -c, -h, -s, --time
  * df - Zeigt die Kapazitätsauslastung von Dateisystemen an. -h, -H, -a
  * fsck - Überprüft und repariert ein Linux-Dateisystem. -A, -c
  * e2fsck - Überprüft ein ext2/ext3/ext4 Dateisystem. -f, -p
  * mke2fs - Erstellt ein ext2/ext3/ext4 Dateisystem. -b <bs>, -I <inode size>, -m <reserved size>, -n, -O <feature>, -t <FS-Typ>
  * debugfs - Debuggt ext2/ext3/ext4 Dateisysteme. -b <bs>, -R <comand>
  * dumpe2fs - Zeigt Informationen über ein Filesystem, dessen Blöcke und Inodes. -b, -h, -x
  * tune2fs - Passt Parameter von ext2/ext3/ext4-Dateisystemen an. -c <n>, -C <n>, -e <behavior>, -i <interval, -l (wie dumpe2fs), -m <reserved>, -o <mount options>
  * Info: Der Superblock ist eine Art Info-/Meta-Block, der Informationen über das Dateisystem enthält. Nicht jedes Filesystem besitzt einen solchen Block (z. B. ext2/ext3/ext4 besitzen einen Superblock). Der Superblock startet i.d.R. beim Offset 1024 Byte.
  *  Grobe Struktur eines Unix-Dateisystems: | Boot-Block | Superblock | Inode-Liste | Datenblöcke | 
  * XFS-Tools: xfs_admin, xfs_bmap, xfs_check, xfs_copy, xfs_db, xfs_estimate, xfs_freeze, xfs_fsr. xfs_growfs, xfs_info, xfs_io, xfs_logprint, xfs_mdrestore, xfs_metadump, xfs_mkfile, xfs_ncheck, xfs_quota, xfs_repair, xfs_rtcp
  * fsck = Frontend zur Überprüfung von Dateisystemen. Es ruft andere Tools auf, die ein Filesystem überprüfen können.
  * e2fsck = Frontend zur Überprüfung von ext2- und ext3-Filesystemen. Ist nur ein Hardlink auf fsck.ext2 und fsck.ext3.
  * fsck.reiserfs prüft ReisrFS-Dateisysteme.
  * fsck.minix prüft minix-Dateisysteme.
  * fsck.cramfs prüft cramFS-Dateisysteme.
  * fsck.xfs prüft XFS-Dateisysteme.
  * fsck.jfs prüft JFS-Dateisysteme.
  * fsck.msdos und fsck.vfat sind Links zu dosfck.
  * fsck -f (force) erzwingt die Prüfung, auch wenn das Dateisystem sauber erscheint.
  * fsck -A (all) testet alle Dateisysteme, die in /etc/fstab aufgeführt sind.
  * fsck -t <Dateisystemtyp> (type) sorgt dafür, dass das zum Dateisystem passende Backend gestartet wird.
  * fsck -c (check) sucht nach defekten Blöcken.
  * fsck -b <Blocknummer> (block) gibt einen alternativen Superblock an.
  * fsck -y (yes) beantwortet alle Fragen des Programms mit "yes", damit eine Reparatur unbeaufsichtigt durchgeführt werden kann.
  * fsck sollte nur Dateisysteme prüfen, die gerade nicht eingehängt sind (besonders, wenn zu Reparaturzwecken ein schreibender Zugriff erfolgt). 
  * Ein Dateisystem wird standardmäßig alle 36 Mounts oder alle 180 Tage beim Systemstart geprüft.
  * Um eine solche Überprüfung beim nächsten Systemstart zu unterbinden, kann shutdown -sf now verwendet werden (-f ist hier unser wichtiger Schalter).
  * Mit shutdown -sF now (-F ist hier unser wichtiger Parameter) erzwingen wir die Prüfung beim nächsten Reboot.
  * tune2fs ermöglicht das Bearbeiten der Dateisystemparameter bei einem ext2- oder ext3-Dateisystem.
  * tune2fs -c legt die maximale Anzahl der Mounts zwischen den Dateisystemüberprüfungen fest.
  * tune2fs -C legt fest, wie oft das Dateisystem nach der letzten Überprüfung tatsächlich gemounted wurde.
  * tune2fs -i legt das Intervall zwischen den Dateisystemprüfungen in Tagen, Wochen oder Minuten fest, Ohne Zeitangabe schaltet diese Option die regelmäßige Überprüfung aus.
  * tune2fs -T YYYYMMDD[[HHMM]SS] legt den Zeitpunkt fest, wann die letzte Dateisystemprüfung tatsächlich stattgefunden hat.
  * Wenn ein ext2-Dateisystem in ein ext3 konvertiert werden soll, verwendet man beispielsweise tune2fs -j /dev/sda1. -j für Journal.
  * tune2fs -l /dev/sda1 zeigt Informationen des Superblocks an.
  * debug2fs dient zum interaktiven modifizieren und untersuchen von ext2- sowie ext3-Dateisystemen. Auch kann man mit debugfs gelöschte Dateien wiederherstellen. Dazu muss zunächst das betroffene Dateisystem ausgehängt werden...
  * Mit debugfs -> lsdel kann man sich gelöschte Inodes anzeigen lassen. Mit dump <Inode-Nummer> /tmp/restored kann man eine Datei dann auf ein Ziel der eigenen Wahl wiederherstellen lassen. 
  * Mit dumpe2fs können detaillierte Informationen über ein ext2- oder ext3-Dateisystem eingeholt werden.
  * mke2fs kann mit mke2fs -C die Integrität eines Dateisystems überprüfen. Diese Option war bei mir leider nicht vorhanden.
  * xfs_growfs kann die Größe des Dateisystems nachträglich erweitern.
  * xfs_info gibt u.a. Informationen über die Geometrie des Dateisystems aus.
  * xfs_metadump speichert die Metainformationen des Dateisystems in eine Datei.
  * df (disk free) zeigt die aktuelle Belegung der verwendeten Dateisysteme.
  * df -i (inodes) zeigt die Inode-Belegung.
  * df -h (human readable) zeigt die Informationen im "human readable"-Format an.
  * df -m zeigt die Blöcke in M anstatt in K an.
  * Was die Inodes angeht: Es kommt nur selten zu Engpässen, dafür müsste man schon sehr viele, sehr kleine Dateien besitzen.
  * du -a (all) zeigt auch die Belegung durch Dateien, nicht nur die von Verzeichnissen.
  * du -k (kilo) zeigt die Blöcke in Kilo an.
  * du -m (mega) zeigt die Anzahl der Blöcke in Megablocks an.
  * du -h (himan readable) macht die Ausgabe angenehmer zu lesen (in K, M, G usw.).
  * du -c zeigt zusätzlich die Summe der gelisteten Einträge.
  * du -s zeigt nur die Einträge für die angegebenen Verzeichnisse an. Ohne diese Option zeigt du alle Einträge rekursiv für alle Unterverzeichnisse an.
==== 104.3 - Das Ein- und Aushängen von Dateisystemen steuern ====
  * /etc/fstab (file system table) - Systemkonfigurationsdatei, die alle verfügbaren Laufwerke und Partitionen sowie deren Mount-Parameter enthält. 
  * /media - Nach /media werden meist CDs, DVDs und USB-Sticks gemounted. 
  * mount - Hängt ein Dateisystem ein. -l, -a, -t, -B) -R, -r, -o, -M 
  * umount -  Hängt Dateisysteme aus.  -f, -l
  * Verzeichnis mounten: mount -t ext3 /dev/sda2 /dateien
  * Dateisystemtyp, Device, Ziel (Mountpoint).
  * Wenn das Dateisystem bereits in die /etc/fstab eingetragen wurde, so genügt ein mount <Device> oder mount <Mountpoint>.
  * USB-Stick einhängen: mount -t iso 9660 /dev/hdc /media/cdrom0
  * USB-Sticks werden also genauso wie SCSI-Laufwerke behandelt.
  * mount -a (all) hängt alle Dateisysteme ein, die in der /etc/fstab eingetragen sind.
  * mount -r (read only) hängt ein Dateisystem als read-only ein.
  * mount -w (writeable) hängt ein Dateisystem im read/write-Modus ein.
  * mount -t (type) gibt den Dateisystemtyp an, falls erforderlich. Mount unterstützt übrigens eine Vielzahl von Dateisystemen.
  * mount -v (verbose) sorgt für eine Bestätigung des Vorgangs. Der mount-Befehl zeigt normalerweise keine Erfolgsmeldung an.
  * mount -o (options) übergibt Mount-Optionen.
  * mount -v -o remount,rw /dateien als Beispiel.
  * mount -t smbfs -o username=michaela,password=geheim  <BackslashBackslash>connor/daten /mnt/connor
  * mount -t nfs archangel:/storage /daten hängt ein NFS ein.
  * umount <Device>
  * umount <Mountpoint>
  * umount -a -> Alle Dateisysteme, die in /etc/fstab eingetragen sind, aushängen.
  * In der Regel darf nur root "umount"en. Ausnahmen werden in /etc/fstab eingetragen.
  * Beispiel für eine fstab-Zeile: /dev/hda2   /  ext3   acl,user_xattr   1  1
  * Die Datei /etc/fstab beherbergt also sechs Spalten.
  * 1. Spalte: Einzuhängendes Gerät.
  * 2. Spalte: Mountpoint.
  * 3. Spalten: Dateisystemtyp.
  * 4. Spalte: Mountoptionen.
  * 5. Spalte: Info von "dump". 0 = keine Sicherung des Dateisystems durch dump. Dateisysteme, die nicht permament eingehängt sind, sollten nicht über die Datei fstab zur Sicherung mit dump vorgemerkt werden.
  * 6. Spalte: Info für fsck. 0 = keine Prüfung, 1= vorzugsweise geprüft, 2 = prüfe dieses Filesystem hier nach allen, die hier eine 1 stehen haben. Es ist also eine Art Prioritätenverteilung.
  * dump = Backup-Tool für ext2, ext3 und ext4.
  * Mountoptionen:
  * auto = automatisches Einhängen mittels mount -a
  * noauto = verhindert automatisches Einhängen mittels mount -a
  * usrquota aktiviert die Möglichkeit der Verwendung von Quota auf Benutzerebene.
  * grpquota aktiviert die Möglichkeit der Verwendung von Quota auf Gruppenebene.
  * suid ermöglicht die Funktion der SUID-Bits.
  * nosuid verhindert aus Sicherheitsgründen die Funktion der SUID-Bits.
  * exec erlaubt das Ausführen von Dateien auf diesem Dateisystem.
  * noexec verhindert das Ausführen von Dateien auf diesem Dateisystem.
  * ro = das Dateisystem wird im read-only-Modus eingehängt.
  * rw = Einhängen im read/write-Modus
  * user = erlaubt es einem normalen Benutzer, dieses Dateisystem einzuhängen. Das betroffene Filesystem kann nur vom selben Benuter oder root eingehängt werden.
  * nouser verhindert, dass ein normaler Benutzer ein Dateisystem einhängen kann.
  * users erlaubt es einem normalen Benutzer, dieses Dateisystem einzuhängen. Es kann von einem beliebigen Benutzer wieder ausgehängt werden.
  * defaults setzt die Standardeinstellung. Ausnahmen werden kommasepariert übergeben. Defaults sind: rw, suid, dev, exec, auto, nouser, async.
  * /etc/mtab -> Wenn ein Dateisystem eingehängt wird, trägt mount das Filesystem und die Infos zum Mount (z. B. auch den Mointpoint sowie die Mountoptionen) in der Datei /etc/mtab ein. Ausnahme: Dateisysteme, die mit der Option -n eingehängt wurden, sind nicht in dieser Datei enthalten.
  * In /proc werden eingehängte Dateisysteme in jedem Fall aufgeführt, also auch die, die mit -n eingehängt wurden.
  * cat /proc/mounts
  * /media beinhaltet bevorzugt Wechselmedien.

==== 104.4 - Platten-Quotas verwalten ====
  * quota
  * edquota
  * repquota
  * quotaon
  * Quota: Auf Basis von Benutzerkonten oder Gruppenmitgliedschaften festlegbar.
  * Hard- und Softlimits
  * Quota beziehen sich immer auf eine Partition (also ein Filesystem). Es können keine Quota für ein Unterverzeichnis festgelegt werden.
  * Beim Erreichen des Hardlimits kann kein Schreibzugriff mehr erfolgen ("harte" Grenze!).
  * Beim Erreichen des Softlimits beginnt die Gracetime oder auch Graceperiod. Darunter versteht man eine Gandenfrist, die dem User gewährt wird. Innerhalb dieser Gnadenfrist muss der Benutzer ausreichend Daten löschen, um wieder unterhalb seines Softlimits zu fallen. Tut er das nicht, so wird aus dem Softlimit aus dem Ablauf der Gracefrist ein Hardlimit und dem Benutzer wird der Schreibzugriff verweigert.
  * grace = Gnade, Fristverlängerung, Aufschub
  * Eine Partition muss mit den entsprechenden Optionen (z. B. via /etc/fstab) gemounted werden, damit Quota darauf benutzbar sind.
  * Beispiel: /dev/sdb1  /dateien  ext3  defaults, usrquota,grpquota   0  0
  * Die Quotierungen werden in Dateien, jeweils getrennt nach Benutzer- und Gruppen-Quota im Hauptverzeichnis eines zu quotierenden Dateisystems abgespeichert. Diese Dateien heissen aquota.user und aquota.group.
  * Um Fehlermeldungen zu vermeiden, sollte man diese beiden Dateien von Hand erstelln und die Dateiberechtigungen 600 vergeben.
  * quotacheck erstellt eine Tabelle der aktuell existierenden Dateien und Verzeichnisse und gleicht das Ergebnis mit den beiden Dateien aquota-user und aquota.group 
  * quotacheck -avug aktualisiert alle Quota auf dem System.
  * quotacheck -vu /dateien aktualisiert nur /dateien.
  * quotacheck -a (all) bearbeitet alle eingehängten Dateisysteme.
  * quotacheck -u (user) bearbeitet nur aquota.user
  * quotacheck -g (group) bearbeitet nur aquita.group
  * quotacheck -v (verbose)
  * quotaon -avug aktiviert alle Quota.
  * quotaon -vu /dateien aktiviert das Dateisystem mit dem Hauptverzeichnis /dateien für Benutzer.
  * Bevor quotacheck laufen kann, müssen Quotas mit quotaoff deaktiviert werden.
  * quotaoff -vug /dateien
  * quotaoff -avug
  * Mit edquota können Limits gesetzt werden. 
  * Angabe der Limits in Blöcken.
  * Die Größe eines Blocks kann mit dumpe2fs -h /dev/sda1 |grep "Block size" festgestellt werden. Meist beträgt sie 1024 Byte (1 KiB).
  * Auch häufig verwendete Blockgröße: 4096 Byte (4 KiB).
  * Man kann auch die Inodes zu limitieren (= ungefähr Anzahl der Dateien).
  * Voreinstellung 0, bedeutet kein Limit.
  * edquota -p albert -u martha kopiert mit -p (Prototype) seine Alberts Einstellungen als Vorlage für Martha.
  * Benutzer können sich mit quota das aktuelle Quota anzeigen lassen.
  * root kann mit quota -u <user> das Quota der User einsehen.
  * Mit repquota können Berichte über konfigurierte Quota und aktuelle Belegungen erstellt werden.
  * repquota -avug /dev/sdb1 oder repquota -avug /dateien (man kann bei Quota meist den Mountpoint oder die Partition angeben).


==== 104.5 - Dateizugriffsrechte und -eigentümerschaft verwalten Seite ====
  * SUID, GUID, Sticky Bit (und was ist eigentlich ein Immutable?)
  * umask
  * chmod
  * chown
  * chgrp
  * rwx
  * read = 1 0 0 = 4
  * write = 0 1 0 = 2
  * execute = 0 0 1 = 1
  * read + write = 1 1 0 = 6
  * write + execute = 0 1 1 = 3
  * usw.
  * Berechtigungen ansehen: ls -l
  * wenn  - - - - - - r - - = others may read = world-readable
  * Dateirechte vergeben: chmod 755 <file>
  * chmod -v 755 <file> = -v steht für verbose
  * chmod -R : -R steht für rekursiv
  * chmod -c zeigt nur Dateien an, die tatsächlich verändert wurden
  * chmod u=rwx,g=rx,o=rx <file>
  * chmod a=rx <file>
  * a für all
  * chmod a+x <file>
  * chmod u+x,g+x,o+x <file>
  * chmod u-rwx,o-rwx <file>
  * SUID bzw. Setuid bewirkt, dass eine ausführbare Datei immer im Sicherheitskontext des Besitzers ausgeführt wird.
  * Klassisches Beipiel hierfür: passwd
  * Erkennungsmerkmal: ls -l zeigt z. B. -rwsr-xr-x root root 2566 5. Apri 2007 /usr/bin/passwd
  * - am Anfang steht für Datei, d für directory
  * das s kann auch bei der gruppe stehen
  * find / -perm -u+s findet Dateien und Verzeichnisse, die ein SUID-Bit gesetzt haben (nur bei Usern)
  * SGID oder Setgid: Der Prozess, der beim Ausführen einer Datei mit gesetztem Setgid-Bit entsteht, dehört der Gruppe, die auch die Eigentumsrechte an der Datei besitzt (siehe oben, dass das "s" auch bei der Gruppe stehen kann).
  * Wenn das SGID-Bit auf ein Verzeichnis angewendet wird, dann werden alle Dateien, die in diesem Verzeichnis neu erstellt werden, automatisch der Gruppe zugeordnet, der auch das Verzeichnis selbst gehört. Wenn man das SGID für ein Verzeichnis setzt, betrifft es automatisch auch die darin befindlichen Dateien.
  * Sticky Bit: Wenn man das Sticky Bit auf ein Verzeichnis setzt, kann nur noch der Besitzer einer Datei, der Besitzer des Verzeichnisses oder root eine Datei löschen bzw. umbennennen, die sich in diesem Verzeichnis befindet.
  * Das Sticky Bit ist am kleinen t zu erkennen:
  * drwxr-xr-t   2 root root   4096 Oct 19 18:42 public
  * also s bei user, s bei group und t bei others
  * Auf Dateien angewendet, hat das Sticky bit unter Linux keinen Einfluss.
  * Die drei speziellen Berechtigungen - SUID, GUID und Sticky Bit - werden ebenfalls mit chmid gesetzt.
  * chmod 4755 <file> setzt das SUID-bit gleich mit: -rwsr-xr-x, oder: chmod u+s <file>
  * Stick Bit: chmod o+t <directory>
  * Das [sS] verdeckt das x: -rwsr-xr-x bedeutet, dass das SUID-Bit gesetzt ist. Die Datei ist für den Besitzer ausführbar.
  * -rwSr--r-- bedeutet, dass das SUId-Bit gesetzt ist. Die Datei ist für den Besitzer nicht ausführbar.
  * Trotz Verdeckung kann man also dennoch sehen, ob es ausführbar ist oder nicht. Das Gleiche gilt für das SGID und Sticky Bit.
  * chown root:root * setzt für alle Dateien im Verzeichnis sowohl den Eigentümer, als auch die Gruppe.
  * chown :users <file> setzt nur die Gruppe.
  * chown .users <file> setzt ebenfalls nur die Gruppe.
  * chgrp users <file> setzt die Gruppe.
  * Die umask wird üblicherweise in /etc/profile festgelegt. Soll die Werte aus .bash_profile überschreiben.
  * Beim Erstellen einer neuen Datei wird die umask von 0666 subtraghiert, während beim Erstellen neuer Verzeichnisse die umask von 0777 abgezogen wird.
  * Bei den meisten Systemen ist die umask 0022.
  * Mit "umask" lässt man sich die aktuell gesetzte umask anzeigen.
  * 0666-0022 = 0644 = effektive Berechtigungen für eine neue Datei
  * 0777-0022 = 0755 = effektive Berechtigungen für ein neues Verzeichnis
  * umask 0027 und umask 27 haben den gleichen Effekt, da führende Nullen weggelassen werden können.
  * umask u=rwx,g=rx,0=
  * Für ext2- und ext3-Dateisysteme gibt es noch einen weiteren Satz von Attributen, die verwendet werden können.
  * lsattr zeigt diese erweiterten Attribute an
  * chattr setzt erweiterte Attribute
  * chattr + fügt Attribute hinzu
  * chattr - entfernt Attribute
  * chattr = weist Attribute zu, bestehende Attribute werden entfernt.
  * chattr = change attributes
  * lsattr = list attributes
  * append only (a) = Die Datei kann nur noch anhängend erweitert werden.
  * compressed (c) = Die Datei wird durch den Kernel komprimiert.
  * no dump (d) = Die Datei wird durch dump nicht gesichert.
  * immutable (i) - Die Datei kann nicht modifiziert, umbenannt oder gelöscht werden.
  * data journalling (j) - Die Daten werden in das ext3-Journal geschrieben, bevor die eigentliche Datei ins Dateisystem geschrieben wird.
  * secure deletion (s) - Wenn die Datei gelöscht wird, wird der Datenbereich mit Nullen überschrieben.
  * no tail-merming (t) - Wird noch nicht unterstützt.
  * undeletable (u) - Die Datei kann zwar gelöscht, im Zweifelsfall jedoch auch problemlos wiederhergestellt werden.
  * no atime updates (A) - Die Zugriffszeit wird nicht aktualisiert. Das soll die Anzahl unnötiger Schreibzugriffe (insbesondere für Notebooks) auf das Dateisystem minimieren.
  * synchronous directory updates (D) - Verzeichnisänderngen werden synchron auf die Festplatte geschrieben.
  * synchronous updates (S) - Dateiänderungen werden synchron auf die Festplatte geschrieben.
  * tip of directory hierarchy (T) - Ein Verzeichnis mit diesem Attribut wird als Top der Verzeichnishierarchie erachtet.
  * chattr =aAS <file> = nicht modifizierbar, nur erweiterbar, keine atime dokumentieren, Änderung sofort auf die Festplatte schreiben lassen, lsattr zeigt z. B..: --S--a-A------ ./händler
==== 104.6 - Harte und symbolische Links anlegen und ändern ====
  * Hardlink - Alias auf den gleichen Inode wie die Originaldatei (auf dem gleichen Filesystem!).
  * Softlink - Alias mit neuem Inode, der auf den Inode der Originaldatei zeigt. Kann auch auf andere Dateisysteme zeigen. Wird bei "ls -l" mit einem "l" gekennzeichnet (z. B. lrwxrwxrwx).
  * ln - Erstellt Links auf Inodes/Dateien/Ordner. -l
  * ln -s <Ziel> <Softlink-Name>
  * lrwxrwxrwx -> Das "l" zeigt an, dass es sich um einen Softlink handelt.
  * chmod blabla auf Softlink ändert Modus von Zieldatei, nicht vom Link.
  * Löschen der Originaldatei -> Softlink bleibt "falsch" stehen.
  * Hardlinks: Nur auf Dateien!
  * Hardlink: Im Nachhinein nicht von der Zieldatei zu unterscheiden.
==== 104.7 - Systemdateien finden und Dateien am richtigen Ort platzieren ====
  * find
  * locate - Findet Dateien/Ordner, die in einer Datenbank aufgelistet werden. -r 
  * updatedb - Baut/aktualisiert die Locate-Datenbank. -f, -o
  * whereis - Zeigt den Pfad zur Binary, dem Source und der Man-Page des Programms an. -b, -s, -m
  * which - Zeigt den vollen Pfad eines Shell-Kommandos an, durchsucht die PATH-Variable.
  * type /etc/updatedb.conf
  * FHS: Filesystem Hierarchy Standard (FHS), Standard für die Gestaltung von Linux-Filesystemen
  * Vier Kategorien für Daten laut FHS: shareable, unshareable, variable, static
  * shareable: Verzeichnisse, die von mehreren Systemen gemeinsam genutzt werden können. (z. B. /usr, /opt)
  * unshareable: Verzeichnisse, die keinesfalls gemeinsam genutzt werden können. (Z. B. /etc/, /boot)
  * variable: Verzeichnisse, deren Bestand sich ständig ändert. (Z. B. /home/, /var/mail)
  * static: Verzeichnisse, deren Dateien sich eher selten ändern. (Z. B. /boot/, /opt, /usr)
  * Achtung: whatis zeigt das Beschreibungsfeld einer Manpage an.
  * Achtung: apropos durchsucht die Namen und Beschreibungsfelder der Manpages nach einem angegebenen Suchwort.
  * find /home -name '*.sxw' sucht nach Dateien mit der Endung .swx
  * find -name sucht nach Dateinamen
  * find -amin n sucht nach Dateien, auf die vor n Minuten zugegriffen wurde.
  * find -mmin n sucht nach Dateien, die vor n Minuten modifiziert wurden (z. B. Dateiname, Zugrifssrechte)
  * find -cmin n sucht nach Dateien, die vor n Minuten geändert (Dateiname, Zugriffssrechte..) wurden.
  * find -atime n sucht nach Dateien, auf die zuletzt vor n mal 24 Stunden zugegriffen wurde.
  * find -mtime n sucht nach Dateien, die vor n mal 24 Stunden modifiziert wurden.
  * find -ctime n sucht nach Dateien, die vor n mal 24 Stunden geändert wurden (Dateinamen, Zugrifssrechte..).
  * find -user sucht nach Dateien des angegebenen Benutzers.
  * find -group sucht nach Dateien der angegebenen Gruppe.
  * find -perm findet Dateien mit den angegebenen Berechtigungen.
  * find -size findet Dateien mit angegebener Größe.
  * find / -user  <bla>
  * find / -perm +4000 (Suche nach SUID-Programmen)
  * find / -size +500M findet alle Dateien, die größer als 500 MB sind
  * locate, updatedb, /etc/updatedb.conf
  * PRUNEPATHS="/daten" in updatedb.conf hält updatedb davon ab, dieses Verzeichnis zu erfassen.
  * NETPATHS lässt sogar Netzverzeichnisse indexieren.