1. Linux installieren

Voraussetzung: Downloaden einer ISO-Datei, die im besten Falle für beides herhalten kann: für ein schnelles Arbeiten und Ausprobieren, ohne dass man die Festplatte berühren muss (Live-System) sowie für eine feste Installation. Solche Images findet man (was Debian betrifft) unter:

Die Auswahl an ISO-Images ist hier groß, empfehlenswert ist zuerst einmal ein System mit dem schlanken und reich mit Zubehörprogrammen ausgestatten Desktop LXDE. Debian liegt aktuell (Stand: 28. Juli 2016) in Version 8.5 vor, die entsprechende Datei ist 959M groß. Bitte hier herunterladen…

In der bereits installierten Virtualsierungsumgebung VirtualBox erstellen wir uns nun einen neuen Gast:

  • Schalter "Neu"

  • Name: Debian 8 LXDE (Linux 64-bit)

  • RAM: 1800 MB

  • Festplatte erzeugen (VDI, dynamisch alloziiert, Größe 50 GB)

  • Schalter "Start"

  • Als Boot-Medium die CD debian-live-8.5.0-amd64-lxde-desktop.iso einlegen

  • Mit Cursor nach unten ⇒ "Install"

  • Sprache wählen: "German", 3x Enter

  • Host- und Domainnamen vergeben

  • Benutzer einrichten (root, tux)

  • Zeitzone: "Berlin"

  • Partitionierung: Geführt - vollständige Platte ⇒ sda ⇒ Separate /home, /var- und /tmp-Partitionen

  • Partitionierung beenden ⇒ Änderungen schreiben? ⇒ JA

  • [Was bei der XFCE-Iso-Installation fehlt: Auswahlmenü "tasksel"] (Taskselektor) ein altes Tool: "dselect"

  • Kopieren des Systems…

  • Netzwerkspiegel (Repository) verwenden? JA, welchen Mirror? ⇒ Deutschland / ftp-stud.hs-esslingen.de

  • Proxy? <LEER LASSEN>

  • Bootloader installieren: GRUB in den MBR der Festplatte "sda" installieren
    (Dies ist das Gerät /dev/sda, was das Hauptgerät darstellt; hier keine Partitionsnummer angeben.)

  • Neustart (CD muss nicht manuell entfernt werden)

Siehe auch das mit vielen Screenshots versehene Tutorial unter https://www.howtoforge.com/tutorial/debian-8-jessie-minimal-server/2/

1.1. Software aktualisieren, Gasterweiterungen installieren

Sinnvollerweise installiert man sich in den virtuellen Gästen passende Erweiterungen und Treiber, die den Austausch von Daten zwischen Host und Guest ermöglichen und die Handhabung erleichtern.

  • System als root (im Terminal: su -) aktualisieren: apt-get update && apt-get -y upgrade

  • Hilfspakete installieren und Module bauen:

    • Tools installieren: apt-get install build-essential module-assistant

    • Module bauen: m-a prepare

  • Gasterweiterungen im laufenden Virtualbox-Gastfenster installieren:

    • Evl. eine eingelegte, andere CD auswerfen: Unter Geräte / Optische Laufwerke / Medium entfernen (evl. "Auswurf erzwingen")

    • Unter Geräte den Eintrag Medium mit Gasterweiterungen einlegen… auswählen

    • CD mounten: mount /dev/sr0 /mnt

    • Erweiterungen installieren: bash /mnt/VBoxLinuxAdditions.run

    • X-Server (gewaltsam) neu starten: killall Xorg

  • Gast-Maschine evl. exportieren, um sie später auf anderem Rechner laufen lassen zu können:

    • Gast herunterfahren als root mit shutdown -h now

    • Im VirtualBox-Hauptfenster den Export-Assistenten ausführen: DATEI / APPLIANCE EXPORTIEREN …

Kontrolle und Nutzung

  1. Austausch von markierten Texten mit der Maus (Voraussetzung: unter Geräte wählen wir Gemeinsame Zwischenablage / bidirektional)

  2. Vollbildmodus: rechte STRG-Taste + F
    (Diese Tastenkombination noch einmal drücken, um diesen Modus wieder zu verlassen)

2. Login und kleiner Rundgang

Es steht für den Login ein grafischer Displaymanager zur Verfügung: Bitte als tux einloggen

Im Hauptmenü unter "Systemwerkzeuge":

  • Arbeitsmittel: LXTerminal

  • Zum Vergleichen gern den Dateimanager "pcmanfm" öffnen

Im Terminal:

=> df -h       # disk free, human readeable

Vergleich mit Windows:

  • Nutzerdaten: c:\Users ⇒ /home

  • Installierte Programme: c:\Program Files ⇒ /usr (Unix System Ressources)

  • Bestriebssystem: c:\WINDOWS ⇒ Rest von /

Es gibt keine LW-Buchstaben, die sich verschieben können, einen systemweit einheitlichen Namensraum unter der Wurzel "/"!

Zur Kontrolle der Partitionierung:

  • mount # (cat /proc/self/mounts), gern filtern: mount | grep ^/dev

  • df -h # disk free

  • lsblk # list block devices, USB-Hostpluggeräte herausfinden

  • fdisk -l # Nur als root möglich

  • blkid # Auflisten der Devices unter Angabe der UUIDs

3. Grundlegende Konzepte

3.1. Benutzerschnittstellen

a) GUIs (Graphical User Interface)

  • X-Window-System (Fenstermanager + X-Server, X-Clients)

  • Desktops (LXDE, XFCE, GNOME, KDE), Kennzeichen: Integriert sind Zubehörprogramme, einheitliches Look & Feel

b) Cmdline

  • Vorteile: Geringer Ressourcesbedarf, bessere Stabilität, weil kein Programmierballast für Kommandozeilenbackends

  • Syntax: KOMMANDO [OPTIONEN] [PATAMETER]

    BSP:     ncal        -w         2016
    Wer kümmert sich um die Interpretation der Kommandozeile?
    tux@deb8:~$ echo $0
    /bin/bash
    ACHTUNG: Leerzeichen sind Trenner der einzelnen Bestandteile, daher müssen sie evl. maskiert werden:
    => mkdir Eigene\ Dateien

Wichtige Mechanismen:

  • Dateinamensexpansion (Platzhalter, Wildcard, Joker):

    rmdir  -v Eigen*
    touch abc.{1,2,3}                # Nur zum Erzeugen von Testdateien
    rm -v abc.?
    touch abc.{1,2,3}{x,y,z}         # Nur zum Erzeugen von Testdateien
    rm -v abc.[0-9]*                 # EIN beliebiges Zeichen aus der Menge 0 bis 9 (Negation: "[!1-5]")
  • Variablenexpansion (Variableninhalte einfügen)

    echo $PATH                       # Suchpfad für Anwendungen
    echo $USER
    echo $PWD                        # Print Working Directory
  • Kommandozeilensubstitution (Zuerst eine andere Befehlsfolge ausführen, dann der Rest ringsherum); es gibt zwei Varianten, die gleichberechtigt sind:

    ls -l /lib/modules/`uname -r`
    ls -l /lib/modules/$(uname -r)

4. Topic 101.1 - Determine and configure hardware settings

Im Buch: S. 21 ff

Ziel: Kernelmodule zur Laufzeit des Rechners laden und kontrollieren können

Der Kernel befindet sich unter: /boot/vmlinuz-<VERSION>

Zur des Laufzeit des Rechners werden Module geladen, aus dem Verzeichnis /lib/modules/uname -r

  • Ausgabe des Kernel-Releases: uname -r

  • Ausgabe des Hardware Typs (32 oder 64 bit): uname -m

  • Wie setzt sich die Release-Nummer zusammen?
    "MAJOR.MINOR.PATCH", z.B. 3.16.0
    (Weitere Nummern und Kürzel je nach Distribution - die Bezeichnung lässt sich im Makefile mittels "EXTRAVERSION = " festlegen)

  • Stabile Kernel: gerade-MINOR-Nummer, Entwickerkernel: ungerade MINOR-Nummer

  • Ab Kernel 3.0.0 ist dieses Unterscheidung aufgegeben worden

BEISPIEL: Suche nach einem Novell-kompatiblen Netzwerkkartentreiber:

find /lib/modules -name "*ne2k-pci*"
    /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko

Informationen darüber einholen:

root@deb8:~# modinfo ne2k-pci
filename:       /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko
license:        GPL
description:    PCI NE2000 clone driver
author:         Donald Becker / Paul Gortmaker
alias:          pci:v00008C4Ad00001980sv*sd*bc*sc*i*
alias:          pci:v000012C3d00005598sv*sd*bc*sc*i*
alias:          pci:v000012C3d00000058sv*sd*bc*sc*i*
alias:          pci:v00001050d00005A5Asv*sd*bc*sc*i*
alias:          pci:v000010BDd00000E34sv*sd*bc*sc*i*
alias:          pci:v00001106d00000926sv*sd*bc*sc*i*
alias:          pci:v00004A14d00005000sv*sd*bc*sc*i*
alias:          pci:v00008E2Ed00003000sv*sd*bc*sc*i*
alias:          pci:v000011F6d00001401sv*sd*bc*sc*i*
alias:          pci:v00001050d00000940sv*sd*bc*sc*i*
alias:          pci:v000010ECd00008029sv*sd*bc*sc*i*
depends:        8390
intree:         Y
vermagic:       3.16.0-4-amd64 SMP mod_unload modversions
parm:           msg_enable:Debug message level (see linux/netdevice.h for bitmap) (uint)
parm:           options:Bit 5: full duplex (array of int)
parm:           full_duplex:full duplex setting(s) (1) (array of int)

Welche Optionen können die Ausgabe einschränken? -a, -d, -l, -p, -n

Zum Beispiel nur den Autor eines Modules ausgeben: Option "-a", z.B.:

root@deb8:~# modinfo -a ne2k-pci
Donald Becker / Paul Gortmaker

Zum Testen:

root@deb8:~# lsmod | grep ne2k
root@deb8:~#
root@deb8:~#
root@deb8:~# insmod ne2k-pci
insmod: ERROR: could not load module ne2k-pci: No such file or directory
root@deb8:~#
root@deb8:~# find /lib/modules -name "ne2k*"
/lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko
root@deb8:~#
root@deb8:~# insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko
insmod: ERROR: could not insert module /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko:
  Unknown symbol in module
root@deb8:~#

FEHLERURSACHE: Bei insmod werden keine Modulabhängigkeiten aufgelöst! ⇒ modprobe

root@deb8:~# modprobe ne2k-pci
root@deb8:~#
root@deb8:~# lsmod | grep ne2k
ne2k_pci               12955  0
8390                   17143  1 ne2k_pci

Module aus dem RAM entfernen:

a) rmmod ne2k-pci
b) modprobe -r  ne2k-pci    (BITTE FÜR LPI MERKEN!)

Man sieht hier, dass BEIDE entfernt wurden, da das Modul 8390 nur von ne2k-pci gebraucht wurde (kein anderes Modul benötigt es außerdem auch).

root@deb8:~# lsmod | grep ne2k
root@deb8:~#
root@deb8:~# lsmod | grep 8390
root@deb8:~#

Kontrolle der Modul-Lade-Aktion: dmesg (Debug Messages des Kernels als Ringpuffer)

Abhängigkeiten von Modulen prüfen und in einer Datenbank "modules.dep" zu speichern:

depmod
       -n (non execute + verbose)   => d.h. KEINE modules.dep erstellen
       -v (verbose)
       -A (Append = Anhängen, d.h. nur wenn neue Module gefunden wurden, eine neue modules.dep erstellen)

Nach erfolgreicher Erstellung der Abhängigkeits-Datenbank:

root@deb8:~# grep ne2k-pci /lib/modules/3.16.0-4-amd64/modules.dep
kernel/drivers/net/ethernet/8390/ne2k-pci.ko: kernel/drivers/net/ethernet/8390/8390.ko

Wo legt der Kernel Informationen beim Bootvorgang ab? Unter /proc (Processing)

Spezielles Verzeichnis: /proc/sys/kernel

root@deb8:~# cat /proc/sys/kernel/ostype
Linux
root@deb8:~#
root@deb8:~# cat /proc/sys/kernel/hostname
deb8
root@deb8:~#

AUFGABE FÜR DAS SELBSTSTUDIUM: Welche Dateien unterhalb von /proc/sys/kernel werden ausgelesen, wenn man uname -a (all) eingibt?

Weitere Pfade für Hardware- und Kernel-nahe Informationen:

  • /sys (Viele Infos aus /proc sind hier hinein gewandert, zB: /sys/bus/usb)

  • /dev (Allgemeines Verzeichnis für Gerätedateien)

    • IDE-Geräte (max. 4): /dev/hda, /dev/hdb, /dev/hdc, /dev/hdd

    • SCSI-Geräte: /dev/sda, /dev/sdb, ….

    • Partitionsnummern: 1 - 4 (max. 4 primäre Partitionen), die erste log. bekommt immer die 5 zugewiesen (/dev/sda5, max 63 Partitionen)

    • SCSI-CD/DVD/RW-Laufwerke: /dev/sr0, /dev/scd0

AUFGABE: Dateien auf Seite 32 mit cat ausgeben, Namen einprägen!

  • /proc/ioports (Gibt nur die Port aus, die gerade benutzt werden.)

Außerdem

=> less /proc/bus/pci/devices

Aus diesen Files bezieht lspci dann seine Informationen und bereitet sie auf.

Wichtige Optionen für das Kommando lspci:

-v  (Verbose, zeigt auch die Bez. des geladenen Modules an)
-k  (Kernel-Module ausgeben)
-n  (Numerische Ausgabe von Vendor- und Device-ID)
-t  (Ausgabe in Tree-Form)

Weitere Aufgaben/Hinweise:

  • USB-Geräte einbinden/konfigurieren (S. 34)

  • Welcher Host-USB-Controller ist eingebaut? → laut geladener Module lsmod | grep hci, u.a. taucht ohci_pci und ehci_pci auf!

  • Seit welchen Kernel-Versionen wird USB überhaupt unterstützt und wie ausgeprägt?

  • Unter http://www.tldp.org/HOWTO/Webcam-HOWTO/hardware.html liest man: "USB subsystem support has been present in the Linux kernel since the late 2.2 series."

  • Bessere USB-Unterstützung gab es erst mit dem Kernel 2.4

USB-Support bei verschiedenen Kerneln und Hostcontroller-Treibern:

  • Kernel 2.0 = überhaupt kein USB-Support!

  • Kernel 2.2.7 = USB 1.0 = ohci_pci

  • Kernel 2.4.0 = USB 2.0 = ehci_pci

  • Kernel 2.6.31 = USB 3.0 = xhci_pci

USB-Geräte im System auffinden:

a) dmesg
b) lsusb  (Geht die Pfade unter /proc/bus/usb  bzw.  /sys/bus/usb durch und gibt Infos aus.)
=> apt-get install usbutils

Was findet man unter /dev/bus/usb?

AUFGABE: Erkunden Sie die Device-Manager:

  • usbmgr

  • hotplug

  • udev

Zur Klärung der Aufgabe zuerst einmal Debians Paketmanager heranziehen:

apt-cache show udev
 ...
Description-de: /dev/ und hotplug Hintergrundprozess
 udev ist ein Hintergrundprozess der Gerätedateien in /dev/ dynamisch
 erzeugt und entfernt, hotplug-Ereignisse verarbeitet und Treiber während
 des Systemstarts lädt.
 ...

4.1. Fragen zur Vertiefung

  • Welche Verzeichnispfade repräsentieren virtuelle Dateisysteme bzw. Ansprechpunkte für Geräte?

    • /proc (Prozessdateisystem, Hardwareinformationen)

    • /sys (Hardware- und Systeminformationen)

    • /dev (Ansprechpunkte für Geräte)

  • Mit welchen Optionen kann man bei lspci den Namen des geladenen Kernel-Modules ermitteln?

    • Optionen: -v sowie -k

  • Welche Kommandos können Sie einsetzen, um den soeben angesteckten USB-Stick zu identifizieren?

    • dmesg | tail

    • lsusb

  • Worin besteht ein wesentlicher Unterschied beim Laden von Modulen mit insmod bzw. modprobe?

    • insmod kann nur ein einziges Modul laden (keine abhängigen Module vorher laden), außerdem muss der exakte Modulname samt Pfad angegeben werden

    • modprobe ist intelligent: lädt andere Module in Abhängigkeit mit, es findet das betreffende Modul automatisch unter folgendem Pfad:

      /lib/modules/`uname -r`
  • Mit welchen zwei Kommandos und evl. benötigten Optionen kann man Module aus dem Hauptspeicher entfernen?

    • rmmod

    • modprobe -r

  • Worin besteht der Hauptunterschied bei modinfo und depmod -n?

    • modinfo gibt nur Modulinformationen über ein bestimmtes Modul aus

    • depmod -n (noinstall) testet nur Modulabhängigkeiten und gibt darüber Meldung aus

5. Topic 101.2 - Boot the system

⇒ Siehe Seite 38 ff

5.1. Typischer Ablauf eines Linux-Bootvorganges

  1. BIOS startet Power-on-self-Test (POST-Routine)

  2. Suche nach einem MBR mit Bootcode über mehrere Datenträger hinweg (laut Bootsequenz)
    MBR sichern: dd if=/dev/sda of=/root/myMBR.dd count=1 bs=512

    • if - Input File

    • of - Output File

    • count - Counter (Zähler), wie oft mal der Block kopiert werden soll

    • bs - Block size (kleinste Einheit im Intel-PC = Sektor, = 512 Byte)

  3. Bootcode wird geladen und damit der Bootloader, bei aktuellen Linux-Systemen ist das der Grand Unified Boot Loader (GRUB)

  4. Bootloader findet Kernel auf Boot-Partition und lädt ihn in den RAM

  5. Der sich im RAM breit machende Kernel startet den ersten Prozess init bzw. systemd (Prozess-ID 1, lässt sich nicht killen)
    Zur Kontrolle: pstree -pn | less (Optionen: p = Prozess-IDs zeigen; n = numerische Sortierung)

  6. Login via Konsole (tty) oder Displaymanager (grafisch)

5.2. Kernel-Parameter

Im 3. Schritt der obigen Startreihenfolge können dem Kernel verschiedene Parameter mitgegeben werden, z.B.

  • init=/bin/bash (root-Passwort überschreiben)

  • ide=nodma (für alte Festplatten: Keinen DMA-Kanal aktivieren)

  • apm=off (= das alte Verfahren "Advanced Power Management")

  • acpi=off (= das neue Verfahren "Advanced Configuration Power Interface")

Diese Parameter können im gebooteten System später ausgelesen werden:

tux@deb8:~$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=d426bdb3-2e30-4599-bc17-810bef991d42 ro quiet
tux@deb8:~$

5.3. Initiale RAM-Disk

Vielleicht aus DOS-Zeiten bekannt: RAM-Drive

Ziel: Für den Bootvorgang elementare Treiber frühzeitig bereitstellen (Die root-Partition ist nicht nicht gemountet)

Inhalt der RAM-Disk:

  • Minimales Dateisystem ähnlich (/)

  • Treiber für Festplatten-Controller

  • Dateisystemtreiber für Festplattenpartitionen ( root-Partition mounten)

Wo liegt sie und wie groß ist sie?

tux@deb8:~$ ls -lh /boot/initrd.img-3.16.0-4-amd64
-rw-r--r-- 1 root root 22M Dez 23 09:34 /boot/initrd.img-3.16.0-4-amd64
tux@deb8:~$

Den Inhalt der RAM-Disk erforschen:

root@deb8:~# file /boot/initrd.img-3.16.0-4-amd64
/boot/initrd.img-3.16.0-4-amd64: gzip compressed data, last modified: Mon May  9 14:41:46 2016, from Unix
root@deb8:~#
root@deb8:~#
root@deb8:~# gunzip -c  /boot/initrd.img-3.16.0-4-amd64 > /tmp/initrd
root@deb8:~#
root@deb8:~# file /tmp/initrd
/tmp/initrd: ASCII cpio archive (SVR4 with no CRC)
root@deb8:~#
root@deb8:~# cd /tmp/
root@deb8:/tmp#
root@deb8:/tmp# cpio -idm < initrd
127156 blocks
root@deb8:/tmp#
root@deb8:/tmp# ls -ltrc | tail -8
drwxr-xr-x 2 root root     1024 Mai 10 16:29 sbin
drwxr-xr-x 2 root root     1024 Mai 10 16:29 run
drwxr-xr-x 2 root root     1024 Mai 10 16:29 lib64
drwxr-xr-x 8 root root     1024 Mai 10 16:29 lib
-rwxr-xr-x 1 root root     7137 Mai 10 16:29 init
drwxr-xr-x 7 root root     1024 Mai 10 16:29 etc
drwxr-xr-x 3 root root     1024 Mai 10 16:29 conf
drwxr-xr-x 2 root root     5120 Mai 10 16:29 bin
root@deb8:/tmp#
root@deb8:/tmp# ls -ltrc lib | tail -8
drwxr-xr-x 3 root root  1024 Mai 10 16:29 udev
drwxr-xr-x 2 root root  1024 Mai 10 16:29 systemd
drwxr-xr-x 3 root root  1024 Mai 10 16:29 modules
drwxr-xr-x 2 root root  1024 Mai 10 16:29 modprobe.d
-rw-r--r-- 1 root root 47712 Mai 10 16:29 libnss_files.so.2
-rw-r--r-- 1 root root 47712 Mai 10 16:29 libnss_files-2.19.so
-rwxr-xr-x 1 root root 71416 Mai 10 16:29 klibc-IpHGKKbZiB_yZ7GPagmQz2GwVAQ.so
drwxr-xr-x 4 root root  1024 Mai 10 16:29 firmware
root@deb8:/tmp#

Tools zur erzeugen der Initrds:

a) RedHat: whatis mkinitrd mkinitrd (8) - is a compat wrapper, which calls dracut to generate an initramfs

b) Debian: whatis mkinitramfs mkinitramfs (8) - low-level tool for generating an initramfs image

5.4. Startprotokollierung

⇒ läuft über zwei Ebenen:

  1. Kernel-Ringbuffer: dmesg (Bei RedHat zusätzlich in der Datei /var/log/boot.log)
    Siehe auch http://www.ibm.com/developerworks/linux/tutorials/l-lpic1111/

  2. Nach den Starten des Syslog-Dienstes wird die Datei /var/log/messages (oft auch /var/log/syslog) geführt.

Am besten mit dem tail-Monitor (als root, Option -f = follow Data Stream) betrachten:

root@deb8:~#  tail -f /var/log/messages

Nachrichten als einfacher Nutzer ins Syslog schreiben:

=> logger "ALARM: Festplatte voll $(df -h /)"

5.5. Init-System, Runlevel

a) Startverfahren nach System V

Konfigurationsdatei: cat /etc/inittab, hier wird der Standardrunlevel mit initdefault festgelegt

⇒ Diese Datei definiert außerdem Runlevelverzeichnisse, in denen Skripte liegen und deren aufrufende Links ebenso

  • Ausführbare Skripte liegen im Verzeichnis: /etc/init.d

    • Im Beispiel Slitaz: DHCP-Server starten: /etc/init.d/udhcpd start

    • Kontrolle: netstat -una ⇒ Port 67 ist offen, Konfigdatei /etc/udhcpd.conf

  • Runlevelverzeichnisse, in denen die aufrufenden, symbolischen Verknüfungen liegen: /etc/rc0.d bis /etc/rc6.d

    • Unter DSL-Linux (root werden mit sudo su)

      • Kommando runlevel zum Ausgeben des vorherigen (N = kein vorheriger Level) und aktuellen Levels

      • Änderung der /etc/inittab einlesen: telinit q (telinit ist nur ein symbolischer Link auf /sbin/init)

      • Runlevelverzeichnis z.B. für Level 5: /etc/rc5.d

      • Runlevel wechseln (z.B. in den Level 0 = system halt): init 0

    • Rechner herunterfahren, wobei alle Nutzer darüber informiert werden: die kann allein nur shutdown -h 16:00
      (Das im Hintergrund für Broadcasts verwendete Kommando lautet wall; zur Übung einfach wall eingeben, Nachricht schreiben und mit STRG + D abschicken)

    • Rechner herunterfahren, wobei beim nächsten Bootvorgang ein Dateisystemcheck durchgeführt werden soll: shutdown -F -h 16:00 (force file system check)

    • Rechner herunterfahren, wobei beim nächsten Bootvorgang ein evl. fälliger Dateisystemcheck verhindert werden soll: shutdown -f -h 16:00 (no file system check)

b) Ubuntu-Startverfahren

  • Name des Systems: upstart

  • Benutzung mit dem Kommando service anhand des ssh-Daemons:

    • Infos ausgeben: service sshd status

    • Starten: service sshd stop

    • Stoppen: service sshd start

Siehe auch Cheat Cheets unter:

c) Neues Startverfahren mit dem Systemd

Das d steht für Disks AND Extensions MONitor (daemon) = Dienst bzw. Service

Es gibt drei Sub-Systeme:

  1. systemd-udevd - für die Geräteerkennung

  2. systemd-journald - für das Schreiben eines eigenen System-Logs

  3. systemd-logind - für das Aktivieren der User-Umgebungen beim Login

ps x | grep systemd
  163 ?        Ss     0:00 /lib/systemd/systemd-udevd
  164 ?        Ss     0:00 /lib/systemd/systemd-journald
  483 ?        Ss     0:00 /lib/systemd/systemd-logind

Benutzung als root (ACHTUNG: nicht mit sshd ausführen, sondern nur mit ssh):

  • Den ssh-Dienst stoppen: systemctl stop ssh

  • Den ssh-Dienst starten: systemctl start ssh

  • Den Status ausgeben: systemctl status ssh

  • Den ssh-Dienst nicht mehr automatisch beim Booten starten: systemctl disable ssh

  • Den ssh-Dienst beim Booten mit starten: systemctl enable ssh

  • Das Journal des Systemd ausgeben: journalctl (Komplettes Logfile mit dem Pager less lesen)

  • Das Journal des Systemd ausgeben, aber nur die letzten Änderungen mit follow data stream: journalctl -f (wichtig unter SUSE, da hier kein Syslogd vorinstalliert)

  • Das "Fehler"-Journal mit Hinweisen ausgeben: journalctl -xn

  • Runlevel wechseln (hier Level 1 = SingleUser-Modus, ReparaturModus): systemctl isolate rescue.target

  • Runlevel wechseln (hier Level 5): systemctl isolate graphical.target

  • Standard-Runlevel anzeigen: systemctl get-default

  • Standard-Runlevel auf "nicht-grafisch" ändern: systemctl set-default multi-user.target

  • Standard-Runlevel wieder auf "grafisch" ändern: systemctl set-default graphical.target

6. Topic 101.3 - Change runlevels / boot targets and shutdown or reboot system

In diesem Kapitel werden die eben kennengelernten Aspekte über Init-Systeme vertieft und ergänzt.

6.1. Systemstart nach System V (SysVinit)

Wichtige Kennzeichen:

  • Dienst /sbin/init → Siehe auch pstree -p | head ⇒ init(1)

  • Hauptkonfigurationsdatei /etc/inittab

    • Standardrunlevel konfigurieren: id:3:initdefault: (Hier bitte NIEMALS 0 (poweroff) oder 6 (reboot) eintragen!!)

    • Affengriff konfigurieren: ca::ctrlaltdel:/sbin/shutdown -r +4

6.2. Runlevel

  • Runlevel sind bestimmte Systemzustände, in denen unterschiedlich viel Dienste gestartet werden, z.B.

  • Im Vergleich: Abgesicherter Modus (Windows) ⇒ Runlevel 1 bzw. Single User

  • Herausfinden, in welchem wir uns gerade befinden: runlevel

  • Wechseln: init [NR] bzw. telinit [NR], im Bsp.: telinit 1, wieder ins GUI fahren: telinit 5

  • Kernelparameter für GRUB für Single-User-Modus: 1

    • Zum Beispiel:

      kernel /boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda3 ro initrd=/install/initrd.gz 1'

6.3. Rechner herunterfahren / neu starten

  • Nutzer dabei zu informieren, ist nur mit dem Kommando shutdown möglich (im Hintergrund verwendet es wall)

  • Wichtige Optionen: S. 52 unten, mit der Option -f kann ein evl. anstehender fsck übergangen werden, ein -F erzwingt einen Check.

6.4. Systemstart mit dem neuen Systemd

Wichtige Kennzeichen:

  • Dienst /bin/systemd

  • Geräte automatisch erkennen mit /lib/systemd/systemd-udevd

  • Log-System mit /lib/systemd/systemd-journald - Der sich selbst aktualisierende Logmonitor: journalctl -f

  • Kernelparameter für GRUB, um in den Single-User-Modus zu gelangen: systemd.unit=rescue.target

    • Zum Beispiel: kernel /boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda3 ro initrd=/install/initrd.gz systemd.unit=rescue.target

BEISPIEL: Den Samba-Hauptdaemon unter Debian stoppen, kontrollieren und deaktivieren:

root@deb8:~# systemctl stop smbd
root@deb8:~#

root@deb8:~# systemctl status smbd
● smbd.service - LSB: start Samba SMB/CIFS daemon (smbd)
   Loaded: loaded (/etc/init.d/smbd)
   Active: inactive (dead) since Mi 2016-05-11 16:47:45 CEST; 3s ago
  Process: 18286 ExecStop=/etc/init.d/smbd stop (code=exited, status=0/SUCCESS)
  Process: 17048 ExecReload=/etc/init.d/smbd reload (code=exited, status=0/SUCCESS)
  Process: 16861 ExecStart=/etc/init.d/smbd start (code=exited, status=0/SUCCESS)

Mai 11 16:23:20 deb8 smbd[16861]: Starting SMB/CIFS daemon: smbd.
Mai 11 16:23:28 deb8 smbd[16952]: Reloading /etc/samba/smb.conf: smbd.
Mai 11 16:23:28 deb8 smbd[17006]: Reloading /etc/samba/smb.conf: smbd.
Mai 11 16:23:31 deb8 smbd[17048]: Reloading /etc/samba/smb.conf: smbd.
Mai 11 16:47:44 deb8 smbd[17101]: pam_unix(samba:session): session closed for user nobody
Mai 11 16:47:45 deb8 smbd[18286]: Stopping SMB/CIFS daemon: smbd.
root@deb8:~#

root@deb8:~# systemctl disable smbd
Synchronizing state for smbd.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d smbd defaults
Executing /usr/sbin/update-rc.d smbd disable
insserv: warning: current start runlevel(s) (empty) of script `smbd' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `smbd' overrides LSB defaults (0 1 6).
root@deb8:~#

7. Topic 102.1 - Design hard disk layout

⇒ Seite 57

ZIEL: Linux-Server stabil betreiben, ohne dass die Festplatten voll laufen können.

Wir haben bei der Installation bereits Vorsorge getroffen, die veränderlichen Daten liegen auf separaten Partitionen:

df -h  /home
df -h  /var
df -h  /tmp

FRAGE 1: Welche Problem kann es mit /boot geben?

  • Durch veraltete BIOS-Versionen konnte der Bootloader u.U. nicht über die Grenze von 1024-Zylinders zugreifen (ca. 8GB), wenn dabei

  • LILO als Bootmanager zum Einsatz kam.

  • Deshalb musste dann eine separate, kleine /boot-Partition am Anfang der Festplatte angelegt werden.

FRAGE 2: Welche Verzeichnisse müssen auf der Wurzel-Partition verbleiben (Systemrelevant)?

  • /dev, /proc/, /sys, /etc, /bin, /sbin, /lib, … (Siehe auch Screenshot)

Was sollte der Admin auslagern (Nutzer können dort schreiben!):

  • /tmp, /var, /home

7.1. Partitionierung

Typischerweise sollte sich die Partitionierung der Festplatte so gestalten:

  1. Part.: Größe 300 MB ⇒ Primär ⇒ Anfang ⇒ Dateisystem: ext4 ⇒ Einbindungspunkt: /boot [/dev/sda1]

  2. Part.: Größe 30 GB ⇒ Logisch ⇒ Anfang ⇒ Dateisystem: btrfs ⇒ Einbindungspunkt: / ⇒ (Name: root) [/dev/sda5]

  3. Part.: Größe 1 GB ⇒ Logisch ⇒ Anfang ⇒ Dateisystem: btrfs, ⇒ Einbindungspunkt: /tmp [/dev/sda6]

  4. Part.: Größe 3 GB ⇒ Logisch ⇒ Anfang ⇒ Dateisystem: btrfs, ⇒ Einbindungspunkt: /var [/dev/sda7]

  5. Part.: Größe 5 GB ⇒ Logisch ⇒ Anfang ⇒ Dateisystem: xfs, ⇒ Einbindungspunkt: /home [/dev/sda8]

  6. Part.: Größe 2 GB (Doppelte RAM-Größe) ⇒ Benutzen als: Swap (kein Einbindungspunkt) [/dev/sda9]

Hier sind die Verzeichnisse, in denen Nutzer Daten ablegen können, konsequent auf getrennte Partitionen verteilt worden. Das bringt Stabilität - auch ohne den Einsatz von Disk-Quotas.

7.2. Logical Volume Manager

Was ist das?

Aus einer LPI-Prüfung:

What can the Logical Volume Manager (LVM) be used for? (Choose THREE correct answers.)

  1. To create RAID 9 arrays.

  2. To dynamically change the size of logical volumes.

  3. To encrypt logical volumes.

  4. To create snapshots.

  5. To dynamically create or delete logical volumes.

Richtige Antworten: B, D, E

Im Experiment:

Eine zweite Festplatte einbauen (VBox: Massenspeicher / Controller SATA markieren, + anklicken…)

root@deb8:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   50G  0 disk
├─sda1   8:1    0  8,4G  0 part /
├─sda2   8:2    0    1K  0 part
├─sda5   8:5    0  2,8G  0 part /var
├─sda6   8:6    0  3,4G  0 part [SWAP]
├─sda7   8:7    0  380M  0 part /tmp
└─sda8   8:8    0   35G  0 part /home
sdb      8:16   0    8G  0 disk
sr0     11:0    1 55,5M  0 rom  /media/cdrom0
root@deb8:~#

Installation und Einrichtung:

apt-get install lvm2


# Physische Kennung für LVM erzeugen
root@deb8:~# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created
root@deb8:~#


# Volumengroup erzeugen
root@deb8:~# vgcreate backup /dev/sdb
  Volume group "backup" successfully created
root@deb8:~#


# Volumes erzeugen
root@deb8:~# lvcreate -n doc -L 3G backup
  Logical volume "doc" created
root@deb8:~#
root@deb8:~# lvcreate -n app -L 2G backup
  Logical volume "app" created
root@deb8:~#


# Kontrolle
root@deb8:~# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb   backup lvm2 a--  8,00g 3,00g
root@deb8:~#
root@deb8:~# vgs
  VG     #PV #LV #SN Attr   VSize VFree
  backup   1   2   0 wz--n- 8,00g 3,00g
root@deb8:~#
root@deb8:~# lvs
  LV   VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  app  backup -wi-a----- 2,00g
  doc  backup -wi-a----- 3,00g
root@deb8:~#

# Dateisystem aufbringen
root@deb8:~# mke2fs /dev/backup/doc
mke2fs 1.42.12 (29-Aug-2014)
Ein Dateisystems mit 786432 (4k) Blöcken und 196608 Inodes wird erzeugt.
UUID des Dateisystems: 7b7adc78-9537-4197-88b4-efbcd8dacc33
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

root@deb8:~#
# Mounten und kontrollieren
root@deb8:~# mount /dev/backup/doc /mnt
root@deb8:~#
root@deb8:~# ls -l /mnt/
insgesamt 16
drwx------ 2 root root 16384 Mai 12 16:47 lost+found
root@deb8:~#
root@deb8:~# df -h /mnt/
Dateisystem            Größe Benutzt Verf. Verw% Eingehängt auf
/dev/mapper/backup-doc  3,0G    4,5M  2,8G    1% /mnt
root@deb8:~#
root@deb8:~# mount | tail -1
/dev/mapper/backup-doc on /mnt type ext2 (rw,relatime)
root@deb8:~#

Bitte nicht gesamten Platz für Volumes aufbrauchen, da sonst keine LVM-Snapshots angelegt werden können.

Man nutzt u.a. gern Snapshots, um das Wurzeldateisystem überhaupt mit fsck prüfen zu können.

8. Topic 102.2 - Install a boot manager

⇒ Seite 60 ff

Bootloader für Linux

a) LILO (veraltet, 1024-Zylinder-Problem)

b) GRUB (neu, zwei Versionen)

8.1. Unterschiede zwischen GRUB 1 und GRUB 2

8.1.1. Der veraltete (legacy) GRUB 1

  • Konfigurationsdatei: /boot/grub/menu.lst

    • Schlüsselwort für die Kernel-Zeile (Übergabe von Bootparametern): kernel

      z.B.:     kernel  /boot/vmlinuz-3.2.4 root=/dev/sda1
  • Interaktive GRUB-Shell vorhanden (S. 62): Kommando: grub

  • Bezeicher für /boot-Partition z.B. für 1. Festplatte, 1. Partition: hd0,0

    • Beispiel: root (hd0,0)

    • ACHTUNG: HIER BEGANN MAN BEI DEN PARTITIONEN UNGEWÖHLICHERWEISE MIT NULL ZU ZÄHLEN AN!

8.1.2. Der neue GRUB 2

  • Konfigurationsdatei: /boot/grub/grub.cfg

    • Schlüsselwort für die Kernel-Zeile (Übergabe von Bootparametern): linux

      z.B.:     linux  /boot/vmlinuz-3.2.4 root=/dev/sda1
  • Interaktive GRUB-Shell NICHT mehr vorhanden

  • Bezeicher für /boot-Partition z.B. für 1. Festplatte, 1. Partition: hd0,1

    • Beispiel: root (hd0,1)

8.2. Gemeinsamkeiten der beiden GRUB-Versionen:

  • Zweistufig

    • Stage 1: /boot mounten, Kernel + Initrd in den RAM bringen

    • Stage 2: sysVinit bzw. Systemd starten, den Rest mounten (siehe /etc/fstab)

  • Installation von Stage 1 (Bootcode im MBR, 444 Byte von insgesamt 512 Byte)

    • BEISPIEL: mount /dev/sda1 /mnt grub-install --root-directory=/mnt /dev/sda

      FRAGE DAZU: Wo befindet sich in dem Falle, wenn wir die Wurzelpartition unter /mnt gemountet haben, das Verzeichnis namens grub? ANTWORT: Unter /mnt/boot (Gesamter Verzeichnispfad: /mnt/boot/grub)

  • Eine weitere Gemeinsamkeit ist die Art, wie eine neue Konfigurationsdatei erzeugt wird:

    • Allgemein mit dem Kommando grub-mkconfig

An dieser Stelle leiten wir nur mal in eine temoräre Datei um:

root@deb8:~# grub-mkconfig  > /tmp/grub.cfg
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Linux-Abbild gefunden: /boot/vmlinuz-3.16.0-4-amd64
initrd-Abbild gefunden: /boot/initrd.img-3.16.0-4-amd64
Found memtest86+ image: /boot/memtest86+.bin
Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin
erledigt
root@deb8:~#

Viele Distributionen haben allerding ihre eigenen Tools, bei Debian ist das update-grub:

root@deb8:~# update-grub
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Linux-Abbild gefunden: /boot/vmlinuz-3.16.0-4-amd64
initrd-Abbild gefunden: /boot/initrd.img-3.16.0-4-amd64
Found memtest86+ image: /boot/memtest86+.bin
Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin
erledigt
root@deb8:~#
root@deb8:~# find /boot/ -cmin 1
/boot/grub
/boot/grub/grub.cfg
root@deb8:~#

Weitere Tipps und Dokumentation zu diesem Thema unter http://pemmann.de/doc/lpi1/101/2016-01-08/whlg-lvm-grub.html

9. Topic 102.3 - Manage shared libraries

Siehe Seite 64 ff

Zum Einstieg:

  • Parallele zu Windows? ⇒ dll-Dateien

  • whatis ld - The GNU linker (= das Hauptwerkzeug)

  • Was ist der Vorteil? ⇒ Schlankere Anwendungen (sie greifen auf gemeinsame Funktionsbibliotheken zurück)

  • Ist das sicherer als bei statisch gelinkten Programmen? NEIN! Ein Fehler in der Library und alle Apps haben ihn sofort auch.

  • Gibt es Programme, die keine shared Libs benötigen? Ja, früher z.B. Opera-Browser, Stichwort: portable Apps)

9.1. Abhängigkeiten ausgeben mit ldd

Gegeben sei ein Programm: grep (Searching with regulary ExPressions)

  • Zuerst ermitteln wir, wo es im Dateisystem liegt (über den Suchpfad der Shell hinweg auch gern mittels which)

  • Danach lassen wir uns mit ldd die Abhängigkeiten ausgeben

tux@deb8-2:~$ type grep
grep ist /bin/grep
tux@deb8-2:~$
tux@deb8-2:~$ ldd /bin/grep
        linux-vdso.so.1 (0x00007ffe8cf8a000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f2b4836e000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2b4816a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2b47dc1000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2b47ba4000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2b4880f000)
tux@deb8-2:~$

Am Beispiel unserer vermeintlich portablen App iron:

tux@deb8:~$ tar zxf iron-linux-64.tar.gz
tux@deb8:~$
tux@deb8:~$ cd iron-linux-64/
tux@deb8:~/iron-linux-64$
tux@deb8:~/iron-linux-64$ file iron
iron: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter
  /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.26, BuildID[sha1]=caa29fe2e, not stripped
tux@deb8:~/iron-linux-64$
tux@deb8:~/iron-linux-64$ du -sh .
219M        .
tux@deb8:~/iron-linux-64$ ldd iron
        linux-vdso.so.1 (0x00007ffc19fda000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f39580fc000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f3957ef8000)
        ...

Wir sehen hier deutlich, dass nach Shared Libraries auf dem vorliegenden Linux-System gesucht wird.

Testweise das Programm natürlich auch mal starten: ./iron &

Eine wichtige Fragestellung, die mit ldd beantwortet werden kann ist außerdem: "Kann der SSH-Server mittels dem tcpd (/etc/hosts.allow bzw. /etc/hosts.deny) abgesichert werden?" Ja, wenn er gegen die libwrap gelinkt ist. Und das ist hier der Fall:

root@deb8:~# ldd `which sshd` | grep --color wrap
        libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f695be0e000)
root@deb8:~#

HINWEIS für die LPI-Prüfung: Es lassen sich auch Bibliotheken abfragen:

root@deb8:~# ldd /lib/x86_64-linux-gnu/libresolv-2.19.so
        linux-vdso.so.1 (0x00007ffce804e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feca408e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007feca4650000)
root@deb8:~#

9.2. Den Cache erzeugen mit ldconfig

  • whatis ldconfig - configure dynamic linker run-time bindings

    • Erzeugt nach Änderungen in den Configs (i.d.R. /etc/ld.so.conf) einen neuen Cache

  • Die Datenbank-Cachedatei: /etc/ld.so.cache

Im Experiment:

root@deb8:~# ldconfig
root@deb8:~#
root@deb8:~# find /etc/ -cmin 1
/etc/
/etc/ld.so.cache
root@deb8:~#

root@deb8:~# file /etc/ld.so.cache
/etc/ld.so.cache: data
root@deb8:~#

root@deb8:~# strings /etc/ld.so.cache | head -7
ld.so-1.7.0
glibc-ld.so.cache1.1
libzzipwrap-0.so.13
/usr/lib/x86_64-linux-gnu/libzzipwrap-0.so.13
libzzipmmapped-0.so.13
/usr/lib/x86_64-linux-gnu/libzzipmmapped-0.so.13
libzzipfseeko-0.so.13
root@deb8:~#

9.3. Konfiguration der Suchpfade für Libraries

Dank des mit ldconfig zu erzeugenden Caches ist ein schnelles Auffinden der einzelnen Bibliotheken kein Problem. Es gibt keine Textdateien, in denen alle Libs vermerkt sind, sondern eine zu bildende Datenbankdatei, die /etc/ld.so.cache heißt.

Konfiguration: In der Datei /etc/ld.so.conf können die einzelnen Pfade direkt hinterlegt werden, in denen dann ldconfig nach den .so-Dateien sucht (Shared Objects) und den Cache daraus baut.

9.4. Neuerstellen des Caches und Prüfen des Inhaltes

Nach Installation oder Einbindung neuer Bibliotheken muss wie bereits erwähnt ldconfig ausgeführt werden. (zur Kontrolle Zeitstempel vergleichen: ls -ld /etc/ld.so.c*)

Wichtig ist es für die LPI-Prüfung außerdem zu wissen, wie man den Inhalt des Caches ausgeben (= printing) kann: ldconfig -p

9.5. Einfaches Bereitstellen von Libraries via Variable

  • Ein einfacher Nutzer kann sich seinen Lib-Pfad selbst konfigurieren

  • Libs liegen angenommen unter ~/mylibs

  • Variable erstellen und zugleich exportieren: export LD_LIBRARY_PATH="~/mylibs"

Fragen - ???

10. Topic 102.4 - Use Debian package management

Seite 66 ff

10.1. Das Debian Backend dpkg

Der "Debian Packager" ist das eigentliche Werkzeug, welches das Entpacken und Ausrollen von Debian Paketen (Datei-Suffix: .deb) durchführt.

Welches Archivformat liegt hierbei vor? ar (archiver). Das Paket dos2unix im Experiment lediglich herunterladen und entpacken:

root@deb8:~# apt-get -d install dos2unix
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt:
  libgssapi3-heimdal libheimntlm0-heimdal
Verwenden Sie »apt-get autoremove«, um sie zu entfernen.
Die folgenden NEUEN Pakete werden installiert:
  dos2unix
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 77,8 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 314 kB Plattenplatz zusätzlich benutzt.
Holen: 1 http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie/main dos2unix amd64 6.0.4-1 [77,8 kB]
Es wurden 77,8 kB in 0 s geholt (733 kB/s).
Herunterladen abgeschlossen; Nur-Herunterladen-Modus aktiv
root@deb8:~#
root@deb8:~#
root@deb8:~# mkdir dos2unix
root@deb8:~#
root@deb8:~# cd dos2unix/
root@deb8:~/dos2unix#
root@deb8:~/dos2unix# ar x /var/cache/apt/archives/dos2unix_6.0.4-1_amd64.deb
root@deb8:~/dos2unix#
root@deb8:~/dos2unix# ls -l
insgesamt 84
-rw-r--r-- 1 root root  1391 Mai 19 16:17 control.tar.gz
-rw-r--r-- 1 root root 76184 Mai 19 16:17 data.tar.xz
-rw-r--r-- 1 root root     4 Mai 19 16:17 debian-binary
root@deb8:~/dos2unix#

Der Packager dpkg ist ein sehr intelligentes Werkzeug, was alles kann, außer:

  • Downloads via Netzwerk durchführen

  • Paketabhängigkeiten selbständig auflösen (In begrenztem Maße dank Wildcard *: dpkg -i *.deb)

Beispiele:

  • Installation eines Paketes: dpkg -i /var/cache/apt/archives/dos2unix_6.0.4-1_amd64.deb (Anwendung, z.B. unix2dos mytextfile.txt)

  • Auflisten aller installierten Pakete: dpkg -l oder ausführlich dpkg --list (listing, Filtern: dpkg -l | grep smb)

  • Auflisten aller Dateien, zum installierten Paket gehören: dpkg -L bash oder ausführlich dpkg --listfiles bash
    (Nach config-files suchen: dpkg -L bash | grep rc ⇒ bei der bash mit "rc" = run command oder ressource control)

  • Nach dem Paketnamen suchen, aus dem eine vorgefundene Datei stammt: -S bzw. --search

    root@deb8:~# dpkg -S /usr/bin/unix2mac
    dos2unix: /usr/bin/unix2mac
    root@deb8:~#
  • Ausgeben von Informationen: dpkg -s bash oder alternativ: dpkg --status bash (Für die Prüfung: nicht --info merken!!)

  • Ausgeben, welche Pakete nur teilweise installiert sind (and suggest how to get them correctly installed): dpkg -C oder alternativ: dpkg --audit

  • Selections vornehmen: echo "fglrx-driver hold" | dpkg –set-selections Siehe auch http://debiananwenderhandbuch.de/dpkg.html

  • Entfernen eines einzelnen Paketes (Config-files verbleiben im System): dpkg -r fortune-mod

  • Komplettes entfernen eines einzelnen Paketes (Config-files werden ebenfalls gelöscht): dpkg -P fortune oder mit langer Option`--purge`

  • Paket neu konfigurieren (Starten eines Assistenten): dpkg-reconfigure keyboard-configuration

    • Installation von fortune unter Debian

  • Vorbereitung mit Option "download only": apt-get -d install fortune, dabei wird automatisch das Paket
    fortune-mod ausgewählt und mitsamt Abgängigkeiten nach /var/cache/apt/archives heruntergeladen

  • Wegen den Abhängigkeiten erfolgt die Installation dann so:

    • Ins Downloadverzeichnis wechseln: cd /var/cache/apt/archives

    • Nachsehen, was soeben heruntergeladen wurde (zeitlich sortiert): ls -ltrc

    • Die betreffenden Pakete alle zusammen angeben (Dateijoker: *): dpkg -i fortune*.deb librecode0_3.6-21_amd64.deb

10.2. Frontends für Debian

Frontends sorgen dafür, dass die dpkg-Paketdatenbank komfortabel durchsucht und neue Pakete mitsamt Abhängigkeiten via Netzwerk leicht nachinstalliert werden können.

Wichtige Frontends sind:

  • dselect (veraltet)

  • apt-Tools (apt-get, apt-cache, apt-key, …, apt)

  • aptitude (neu, als preudografisches GUI und als Cmdline-Tool verwendbar)

    • Verwendet eine andere Datenbank als "apt-get"!

    • Das Feature, in Abhängigkeit mit installierte Pakete automatisch zu entfernen, beherrscht heute apt-get (apt-get autoremove, s.u.)

  • dselect

  • synaptic (GUI-Werkzeug für X-Window)

10.2.1. Konfiguration der apt-Repositories

Im Prinzip kann man alle Quellen in einer Datei hinterlegen, der /etc/apt/sources.list. Das unten notierte Beispiel beinhaltet die klassischen drei Zeilen für die aktuelle, stabile Distribution jessie. Die Komponenten "contrib" und "non-free" (Zeile 1) fehlen bei einer standardmäßigen Installation, können aber jederzeit nachgetragen werden. So werden z.B. oft die Pakete

  • flashplugin-nonfree (Flash-Player für Firefox)

  • firmware-iwlwifi (Binary firmware for Intel Wireless cards)

benötigt. Wir lassen uns mit der folgenden Zeile den aktiven Inhalt der Datei ausgeben:

=> grep -v ^# /etc/apt/sources.list
deb http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie main contrib non-free
deb http://security.debian.org/ jessie/updates main
deb http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie-updates main

Nach Änderungen in dieser Datei bitte immer zuerst die aktuellen Paketlisten herunterladen:

=> apt-get update           # Im Vergleich: 'zypper refresh' (SuSE), 'yum check-update' (RedHat)

Weitere Hinweise zur Konfiguration der Quellen siehe auch:

Eine darüber hinaus gern genutzte Konfigurationsdatei ist die /etc/apt/apt.conf, wenn es darum geht, einen evl. erforderlichen Proxy-Server anzugeben:

Acquire::http::Proxy "http://10.0.0.1:3128";

Nun geht es los - wir suchen nach Paketen und installieren verschiedene:

=> apt-cache search geany   # Suchen nach der Zeichenkette 'geany', = IDE / Editor
=> apt-cache show geany     # Ausführliche Infos ausgeben
=> apt-cache policy nmap    # Versionen ausgeben bei verschiedenen Quellen, Siehe auch 'apt-Pinning'
=> apt-get install geany    # In Abhängigkeit wird 'geany-common' mitinstalliert
=> apt-get remove geany     # Entfernt nur das angegebene Paket, wobei die Configs auf dem System
                            # verbleiben siehe 'dpkg -l geany'
=> apt-get autoremove       # Deinstallieren von überflüssigen, in Abhängigkeit mit installierten Paketen
=> apt-get purge geany      # Entfernt das Paket komplett

10.2.2. Beispiel Installation u. Rekonfiguration des LDAP-Servers

=> apt-get install slapd
=> dpkg-reconfigure slapd

11. Topic 102.5 - Use RPM and YUM package management

11.1. Bereitstellen einer VM für Praxisübungen

  1. Download durchführen

  2. Entpacken…

  3. VM in Virtualbox erstellen

    => Doppelklick auf die Datei "CentOS 6.3 x86.vbox"
    => VM starten...
  4. Grafischer Login als Nutzer centos

    • Passwort: reverse

    • Tastaturlayout auf Deutsch stellen: setxkbmap de
      (Bei Problemen mit dem Pipe-Zeichen manchmal ein Ausweg: setxkbmap us)

11.2. RedHat Package Manager

Voraussetzung:

=> yumdownloader dos2unix

11.3. Archiv-Format

Zuerst einmal wollen wir uns das interne Archivierungsformat anschauen. Es handelt sich um ein cpio-Archiv, an das man mittels rpm2cpio herankommt:

=> rpm2cpio dos2unix-*.rpm > dos2unix.archiv
=> file dos2unix.archiv
=> rpm2cpio dos2unix-*.rpm | cpio -idm

11.4. Nicht installierte Pakete erforschen

Wichtige Option in diesem Zusammenhang: -p oder --package

Erforschen, Testen und Fragen stellen kann man nur im Query-Modus: -q oder --query

Die Konfigfiles ausgeben: -c oder --configfiles

11.5. Shell-Mitschnitt

[root@localhost ~]# yumdownloader dos2unix
Loaded plugins: fastestmirror, refresh-packagekit
Loading mirror speeds from cached hostfile
 * base: ftp.halifax.rwth-aachen.de
 * extras: ftp.halifax.rwth-aachen.de
 * updates: centos.bio.lmu.de
dos2unix-3.1-37.el6.i686.rpm                            |  15 kB     00:00
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# file dos2unix-3.1-37.el6.i686.rpm
dos2unix-3.1-37.el6.i686.rpm: RPM v3.0 bin i386/x86_64 dos2unix-3.1-37.el6
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# rpm2cpio dos2unix-3.1-37.el6.i686.rpm > dos2unix.archiv
[root@localhost ~]#
[root@localhost ~]# file dos2unix.archiv
dos2unix.archiv: ASCII cpio archive (SVR4 with no CRC)
[root@localhost ~]#

dos2unix.archiv: ASCII cpio archive (SVR4 with no CRC)
[root@localhost ~]#
[root@localhost ~]# rpm2cpio dos2unix-3.1-37.el6.i686.rpm | cpio -idm
37 blocks
[root@localhost ~]#
[root@localhost ~]# ls -ltr
total 60
-rw-r--r--. 1 root root 15824 Jul  3  2011 dos2unix-3.1-37.el6.i686.rpm
-rw-r--r--. 1 root root 12148 Jul  7  2012 post-install
-rw-r--r--. 1 root root   550 Jul  7  2012 post-install.log
-rw-------. 1 root root   956 Jul 10  2012 anaconda-ks.cfg
-rw-r--r--. 1 root root 18556 May 24 16:31 dos2unix.archiv
drwxr-xr-x. 4 root root  4096 May 24 16:33 usr
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# rpm --package --query dos2unix-3.1-37.el6.i686.rpm
dos2unix-3.1-37.el6.i686
[root@localhost ~]#
[root@localhost ~]# rpm --query dos2unix-3.1-37.el6.i686.rpm
package dos2unix-3.1-37.el6.i686.rpm is not installed
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# rpm --package --query --changelog dos2unix-3.1-37.el6.i686.rpm | head -15
* Wed Mar 03 2010 Tim Waugh <twaugh@redhat.com> 3.1-37
- Added comments for all patches.

* Mon Nov 30 2009 Dennis Gregorovic <dgregor@redhat.com> - 3.1-36.1
- Rebuilt for RHEL 6

* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.1-36
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild

* Tue Feb 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.1-35
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild

* Wed Sep 24 2008 Tim Waugh <twaugh@redhat.com> 3.1-34
- Moved 'make clean' to prep section and added comment about there
  being no upstream (bug #225706).
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# rpm -q -p -c dos2unix-3.1-37.el6.i686.rpm    # Das Paket besitzt kein Config-File
[root@localhost ~]# rpm -q -p -l dos2unix-3.1-37.el6.i686.rpm
/usr/bin/dos2unix
/usr/bin/mac2unix
/usr/share/doc/dos2unix-3.1
/usr/share/doc/dos2unix-3.1/COPYRIGHT
/usr/share/man/man1/dos2unix.1.gz
/usr/share/man/man1/mac2unix.1.gz
[root@localhost ~]#
[root@localhost ~]# rpm -qpl dos2unix-3.1-37.el6.i686.rpm
/usr/bin/dos2unix
/usr/bin/mac2unix
/usr/share/doc/dos2unix-3.1
/usr/share/doc/dos2unix-3.1/COPYRIGHT
/usr/share/man/man1/dos2unix.1.gz
/usr/share/man/man1/mac2unix.1.gz
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# man rpm | grep '\-c'
       rpm {-K|--checksig} [--nosignature] [--nodigest]
        [--changelog] [-c,--configfiles] [-d,--docfiles] [--dump]
       --changelog
       -c, --configfiles
       rpm {--checksig} [--nosignature] [--nodigest]
       The --checksig option checks all the digests and  signatures  contained
       --checksig  is useful to verify all of the digests and signatures asso-
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# rpm -qp --configfiles dos2unix-3.1-37.el6.i686.rpm
[root@localhost ~]#

11.6. Kommandozeilenfrontend yum

Am besten, wir vergleichen es mit Debians Frontend apt:

Debian

RedHat

/etc/apt/sources.list

Dateien unter /etc/yum.repos.d

apt-get update

yum check-update

apt-get upgrade

yum update

apt-get dist-upgrade

yum upgrade (entspricht yum --obsoletes update)

apt-cache search BEGRIFF

yum search BEGRIFF

apt-get install PACKAGE

yum search PACKAGE

apt-get -d install PACKAGE

yumdownloader PACKAGE

apt-cache show PACKAGE

yum info PACKAGE

11.7. yum-Spezialität - Paketgruppen

Installation von Paketgruppen (Serverkomponenten, Desktop)

=> yum grouplist
=> yum groupinstall "Web Server"
=> yum groupremove "Web Server"

11.8. VBox Gasterweiterungen installieren

a) Software installieren

  • yum install dkms

  • yum groupinstall "Development Tools"

  • yum install kernel-devel

b) Gast-Erweiterungen installieren

  • Im VBox-Gastfenster unter Geräte ⇒ Gasterweiterungen einlegen

  • Mounten der CD: mount /dev/sr0 /mnt

  • Kompilieren und Installieren der Treiber: /mnt/VBoxLinuxAddition.run

  • Logout/Login oder Neustart…

12. Topic 103.1 - Work on the command line

Siehe Seite 89 ff

Wir unterscheiden zwei Arten von Variablen:

  • Umgebungsvariablen: großgeschrieben, werden automatisch vererbt

    • BSP: echo $PATH

    • BSP: echo $PS2

  • Shellvariablen werden manuell deklariert, bei Bedarf können sie exportiert werden

    • BSP: myname="Axel Pemmann" ; echo $myname

    • Kindterminal starten: gnome-terminal &

    • Wo ist diese Variable denn aber in diesem neuen Terminal? Nicht vorhanden! Sie wurde nicht exportiert.

    • Daher schließen wir das Terminal und starten es erst nach dem Exportieren der Variablen:

      exit
      export myname
      gnome-terminal &

Zur Kontrolle der Variablen:

  • Die umfangreichsten Ausgaben liefert set (alle Shell- und Umgebungsvariablen):

    => set | grep myname
  • Nur die Umgebungsvariablen liefert env:

    => env | grep PATH

Wenn nun die selbst erzeugte Shellvariable myname auftaucht, dann wurde sie exportiert, was man aber wieder mit

=> export -n myname

zurücknehmen kann.

Ganz und gar entfernt werden kann diese eigene Variable am Schluss mit:

=> unset myname

Nicht nur für LPI wichtig: Skripte, die in der aktuellen Shellumgebung eingelesen und aktiv gesetzt werden sollen, müssen mit

=> source myscript

bzw. alternativ mit einem Punkt, worauf ein Leerzeichen folgt,

=> . myscript

ausgeführt werden…

12.1. Konfigurationsdateien der Shell

Motivation: Viele Einstellungen lassen sich temporär vornehmen, um sie festzuschreiben, müssen die verschiedensten Konfigurationsdateien editiert werden.

12.1.1. Unterscheidung zwischen alten Shells und der neuen Standardshell: bash

Alte Shells

Beispiele (siehe auch /etc/shells): /bin/sh, /bin/ksh

Seite 90/ 91: Wichtiges Unterscheidungskriterium: Welche Dateinamen beinhalten NICHT den Namen bash?

=>  /etc/profile
=> ~/.profile

12.1.2. Startup-Dateien für User-Profiles

a) Systemweit

  • /etc/profile - Wird als erstes nach dem User-Login abgearbeitet, allgemein für alle Shells, z.B. Variablen PATH und PS1, evl auch umask

  • /etc/bashrc - Wird als nächstes als Konfigurationsdatei speziell für die bash abgearbeitet, z.B. PS1 (für Promptbildung der bash)

b) Benutzerdefiniert (Diese Dateien überschreiben die systemweiten Einstellungen)

  • ~/.profile - Wird einmalig nach dem Login nach dem Ausführen der /etc/profile abgearbeitet, Verwendung wie eben diese Datei, in der Vergangenheit war sie auch für die bash zuständig.

  • ~/.bash_profile - Spezielle bash-Startupdatei, die die alte ~/.profile ersetzt, wird nur einmal abgearbeitet

  • ~/.bash_login - Entspricht der ~/.bash_profile, wenn sie nicht existiert wird diese nämlich an dessen Stelle ausgeführt

  • ~/.bash_logout - Optionale Datei, die Befehle beim Logout wie clear (Bildschirm löschen) ausführt

  • ~/.bashrc - Eine weitere, alte bash-Startupdatei, sie wird jedesmal mit einer neuen bash-Instanz abgearbeitet (neues Terminal öffnen), z.B. Aliase, PS1 (Farbprompt)

12.2. man-Pages

⇒ Seite 96 ff

ZIEL: Sich selber weiterhelfen können… mit dem Online-Manuals (Online = werden mit den Paketen ausgeliefert)

Man-Pages sind Kurzbeschreibungen von Kommandos und Dateien, denen oft Beispiele fehlen. (Von Programmierern für Programmierer), deswegen gibt es die HOWTOs im Internet bzw. als Paket nachinstallieren.

Benutzung

  • Aufruf: man <KOMMADO/LIBRARY/KONFIGDATEI>

  • Navigation (gemäß less-Pager):

    • Cursortasten, Enter, Leertaste

    • F (forward), B (backward)

    • G (go to the end), g (go to the begin)

  • Suchen:

    • Vorwärts (nach unten): /<PATTERN>, Weitersuchen: n (next), Rückwärts nach oben suchen: N (Next)

    • Rückwärts (nach oben): ?<PATTERN>, Weitersuchen: n (next), Rückwärts nach unten suchen: N (Next)

  • Beenden: q (quit)

12.3. Funktionsweise

⇒ man "manpath"

Eine Konfigdatei, legt die Pfade fest: /etc/manpath.config

tux@deb8-2:~$ grep MANDB /etc/manpath.config
# MANDB_MAP      global_manpath             [relative_catpath]
MANDB_MAP        /usr/man                   /var/cache/man/fsstnd
MANDB_MAP        /usr/share/man             /var/cache/man
MANDB_MAP        /usr/local/man             /var/cache/man/oldlocal
MANDB_MAP        /usr/local/share/man       /var/cache/man/local
MANDB_MAP        /usr/X11R6/man             /var/cache/man/X11R6
MANDB_MAP        /opt/man                   /var/cache/man/opt
tux@deb8-2:~$

Weiterhin wird die Variable MANPATH abgearbeitet, falls sie vorhanden ist.

Die man-Pages liegen komprimiert vor, beim Aufruf werden sie unter /var/cache/man dekomprimiert abgelegt. Die tatsächliche Pfade ausgeben: manpath -c

Der Cache lässt sich mit catman bereinigen, den Suchindex für apropos kann man mit mandb neu aufbauen.

Die man-Pages werden in sogenannten Abschnitten kategorisiert, siehe man man, z.B.

  • Abschnitt 1: Programme für Benutzer (unter /bin oder /usr/bin oder /usr/local/bin)

  • Abschnitt 4: Spezielle Dateien (Gerätedateien, siehe man 4 null)

  • Abschnitt 5: Dateiformate und Konventionen (z.B. Aufbau der Datei /etc/fstab: man 5 fstab)

  • Abschnitt 6: Spiele (z.B.: man 6 fiberlamp)

  • Abschnitt 8: Programme für root (unter /sbin oder /usr/sbin oder /usr/local/sbin)

TIPP für die Praxis: Option -a verwenden, um sich alle Abschnitte einer gegebenen man-Page anzeigen zu lassen

=> man -a mount
=> man -a crontab     (Hier werden nacheinander die Seiten der Abschnitte 1 und 5 geöffnet)

Eine schnelle Suche im Beschreibungstext des Pages ist mit

  • apropos <PATTERN>

  • man -k <PATTERN>

möglich. Hierbei wird aus NAME bzw. BEZEICHNUNG gesucht. Siehe auch whatis <KOMMANDO>.

Außerdem spielt hier auch das Kommando whereis eine Rolle, es gibt mehrere Dinge aus:

tux@deb8-2:~$ whatis whereis
whereis (1)          - locate the binary, source, and manual page files for a command
tux@deb8-2:~$

13. Topic 103.2 - Textströme mit Filtern verarbeiten

⇒ Seite 100 ff

ZIEL: Ausfiltern von Zeichenströmen auf bestimmte, interessante Inhalt, dabei ist mehrzeilige Arbeitsweise möglich, wie es z.B.

  • join (join lines of two files on a common field)

  • paste (merge lines of files)

möglich machen. Aber der Reihe nach, beginnen wir mit einfacheren Tools.

13.1. Komplettes Ausgeben von Dateien

  • cat (catenate = verketten), Abarbeitung von oben nach unten

  • tac (= reverses cat), Abarbeitung von unten nach oben

Beispieldatei 1: vi textfile1

1        Birnen
2        Äpfel
3        Bananen
4        Erdbeeren

Beispieldatei 2: vi textfile2

cat textfile2
hellgrün
rot
gelb
dunkelgrün

13.2. Zeilen filtern

Nur eine gewisse Zahl von Zeilen ausgeben:

  • head (per Default die ersten 10 Zeilen ausgeben)

    • Wichtige Option: -n <NUMBERS> oder -<NUMBERS>

  • tail (per Default die letzten 10 Zeilen ausgeben)

    • Wichtige Optionen:

      • Zeilenzahl: -n <NUMBERS> oder -<NUMBERS>

      • Folge dem Inputstrom (Monitoring) -f pder --follow
        Bsp.: tail -f /var/log/messages

Im Praxistest:

tux@deb8-2:~$ head -2 textfile1 textfile2
==> textfile1 <==
1        Birnen
2        Äpfel

==> textfile2 <==
hellgrün
rot
tux@deb8-2:~$

AUFGABE: Lassen Sie sich nur die Zeilen 2 und 3 der Textdatei "textfile1" ausgeben, die insgesamt aus 4 Zeilen besteht.

  • Lösung 1: Nach unten bis einschließlich zur gewünschten Zeile gehen, dann von diesem ausgeschnittenen Bereich nach oben gehend den relevanten Rest stehen lassen:

    tux@deb8-2:~$ head -3 textfile1 | tail -2
    2        Äpfel
    3        Bananen
    tux@deb8-2:~$
  • Lösung 2: Von unten bis einschließlich zur gewünschten Zeile gehen, dann von diesem ausgeschnittenen Bereich von oben herab gehend den relevanten Rest stehen lassen

    tux@deb8-2:~$ tail -3 textfile1 | head -2
    2        Äpfel
    3        Bananen
    tux@deb8-2:~$

13.3. Zeilen nummerieren

  • nl dateiname (Leerzeilen werden per Default NICHT nummeriert)

  • cat -n dateiname

13.4. Pager (Textdateien seitenweise lesen)

  • more (Besitzt keine solchen Komfortfunktionen wie less z.B. beim Bildschirmauschnittsblättern)

  • less (= der Pager für man-Pages)

Motto: Less is more.

13.5. Tabulatorschritte in Leerzeichen umwandeln

Man kann mit expand/unexpand Tabulatorschritte in Leerzeichen umwandeln und umgekehrt.

=>   AUFGABE: Welches Tool macht was genau?
tux@deb8-2:~$ whatis  expand
expand (1)           - convert tabs to spaces

tux@deb8-2:~$ whatis  unexpand
unexpand (1)         - convert spaces to tabs

Weitere interessante Werkzeuge finden wir auf Seite 103 ff:

  • format text: fmt, Beispiel: Einen Text-Screenshot von virtueller (schwarzer) Konsole 1 formatieren

    root@deb8-2:~# cat /dev/vcs1 > tty1.out
    root@deb8-2:~#
    root@deb8-2:~# fmt -w 40 tty1.out | head
    5/732160 Bl�cke
    [   12.054488] systemd-fsck[247]:
    /dev/sda7: sauber, 27/97536 Dateien,
    22590/389                    120 Bl�cke
    [   12.115165] systemd-fsck[206]:
    /dev/sda6: sauber, 411/223104 Dateien,
    36805/8                    92416 Bl�cke
    [   12.212506] systemd-fsck[245]:
    /dev/sda8: sauber,
    42696/2297456 Dateien, 1211
  • print (pre stage, = Druckvorstufe z.B. für lp):

    • Einen Offset von 7 Zeichen hinzufügen: pr, z.B. pr -o 7 myfile.txt | lp

    • Mit -h kann man auch einen eigenen Header einfügen: pr -o 7 -h "Dienste und Portnummern" /etc/services | less

  • word count: wc, Beispiel: wc -l /etc/hosts, Optionen:

    • Lines: -l oder --lines

    • Words: -w oder --words

    • Characters: -m oder --chars

  • hexadecimal dump: hexdump, Beispiele:

    • Partittionstabelle ausgeben: hexdump /dev/sda | head -32 | tail -5

    • Die Datei /etc/hostname im Oktalformat ausgeben: hexdump -o /etc/hostname

  • sort characters: sort, Beispiele:

    • Verzeichnisgrößen berechnen (-n = numerisch): du -s /usr* | sort -n

    • Top Ten der großen Verzeichnisse (-r = reverse): du -s /usr/share/* | sort -nr | head

    • Bequemer, weil "human" readeable (-h): du -sh /usr/* | sort -h

    • Sortierte Ausgabe in selbe Datei wieder zurückschreiben (-o = output file): sort myfile.txt -o myfile.txt

      • ACHTUNG, so geht es nicht (DATENVERLUST!): sort myfile.txt > myfile.txt
        (Zuerst wird wegen der Umleitung ein Filehandle eingerichtet,
        dann die Datei geleert (mit ">>" würde append durchgeführt) und zum Schluss die leere Datei sortiert.)

    • Ignorieren des Case-Sensivität: Option -i

  • uniq (doppelte Zeilen entfernen): uniq, Beispiel: doppelte Dateien finden:

    • Im Experiment mit find, md5sum, sort und uniq führt dies schnell zu langen Zeilen, ein erster Versuch sieht so aus:

      find -type f -exec md5sum {} \; | sort | uniq
    • Eine praktikable, elegante Lösung ist dann schon komplexer, siehe

      find -not -empty -type f -printf "%-30s'\t\"%h/%f\"\n" | \
          sort -rn -t$'\t' | \
          uniq -w30 -D | \
          cut -f 2 -d $'\t' | \
          xargs md5sum | \
          sort | \
          uniq -w32 --all-repeated=separate
    • PRÜFUNGSHINWEIS: Das Kommando uniq kann u.U. überflüssig werden, wenn sort -u (sort-option uniq) verwendet wird.

  • splitting files: split, per Default splittet das Kommando Dateien in 1000 ZEILEN große Stücke auf, Beipiel:

    # Top Ten der größten Dateien unter /usr/bin:
    ls -lhS /usr/bin/
    
    # Die größte Datei jetzt aufsplitten (14 MB)
    split /usr/bin/syncthing
    
    # Zur Kontrolle die Größe der Einzelteile betrachten:
    du -sh x*
    
    # Jetzt die Teile wieder unter neuem Namen zusammensetzen:
    cat x* > syncthing.merged
  • cutter (Spaltenweises Auftrennen von maschinenlesbaren Dateien): cut,

    • Optionen:

      • Auftrennung nach Feldern (Spalten): -f 1-3 (nur Felder 1 bis 3 ausgeben)

      • Angeben des Trenners (delimiter): -d: (Hier ist der Trenner ist ein (":"), per Default ist es ein Tabulator-Schritt)

      • Wegschneiden nach einer bestimmten Anzahl von Characters: -c

    • Beispiele:

      • Ausgeben aller Benutzernamen und deren User-IDs: cut -d: -f1,3 /etc/passwd

      • Herausfiltern des prozentualen Wertes der root-Partitionsauslastung: df / | tail -1 | cut -c 46-47

  • paste files (Dateiinhalte zeilenweise stumpf zu einer neuen, mehrspaltigen Datei zusammensetzen): paste, Beispiel:

    tux@deb8-2:~$ cat textfile1 textfile2
    1        Birnen
    2        Äpfel
    3        Bananen
    4        Erdbeeren
    hellgrün
    rot
    gelb
    dunkelgrün
    tux@deb8-2:~$
    
    tux@deb8-2:~$ paste textfile1 textfile2
    1        Birnen        hellgrün
    2        Äpfel        rot
    3        Bananen        gelb
    4        Erdbeeren        dunkelgrün
    tux@deb8-2:~$
  • joining files (Dateiinhalte zeilenweise unter Verwendung eines gemeinsamen Feldes als Verbindungskriterium zur einer neuen, mehrspaltigen Datei zusammensetzen): join, Beispiel:

    tux@deb8-2:~$ cat obst farbe
    1:Birnen
    2:Äpfel
    3:Bananen
    1:hellgrün
    2:dunkelgrün
    3:gelb
    tux@deb8-2:~$
    
    tux@deb8-2:~$ join -t: -j1 obst farbe
    1:Birnen:hellgrün
    2:Äpfel:dunkelgrün
    3:Bananen:gelb
    tux@deb8-2:~$
  • translation of characters, Kommado tr, (es handelt sich um eine einfache Form von "sed", das Tool kann immer nur eine gleiche Anzahl von Zeichen übersetzen):

    • Beispiele:

      • echo ABC | tr 'A-Z' 'a-z'

      • echo ABC | tr '[:upper:]' '[:lower:]'

      • Eine DOS-Datei in eine Unix-Datei umwandeln (Hintergrund: https://de.wikipedia.org/wiki/Zeilenumbruch):

        tux@deb8-2:~$ vi dosfile
        # Am Zeilenende immer ein STRG + v sowie STRG + m anhängen (Insert-Modus)^M
        Zeile 1^M
        Zeile 2^M
        
        # Dateityp prüfen
        tux@deb8-2:~$ file dosfile
        dosfile: ASCII text, with CRLF line terminators
        tux@deb8-2:~$
        
        # Zeilenumbruch umwandeln ('tr' kann man nicht Dateinamen übergeben!)
        cat dosfile | tr -d '\r' > unixfile
        tux@deb8-2:~$
        tux@deb8-2:~$ file unixfile
        unixfile: ASCII text
        tux@deb8-2:~$
  • stream editor: sed (Mehr dazu unter Topic 103.7 - "Reguläre Ausdrücke")

14. Topic 103.3 - Perform basic file management

ZIEL: Neben grundlegenden Datei- und Verzeichnisoperationen lernen wir auch Kompressionswerkzeuge und Archivierungstool kennen und verstehen, sie einzusetzen.

Philosophie: Alles ist eine Datei.

14.1. Kommandos für Dateioperationen

14.1.1. Kommando "ls"

Zweck: Auflisten von Verzeichnisinhalten und Dateieigenschaften

Hier gleich mal eine Grafik zur wichtigsten Option -l (long), die sehr viele Details liefert:

ls mit Option 'long'

Wichtige Optionen:

  • -l - Langes Ausgabeformat

  • -i - Inode-Nummer (Datei-Knotennummer)

  • -s - Size der belegten Blöcke

  • -a - all Files: auch die versteckten "hidden" Files anzeigen (ausblenden von Profiles-Dateien, die separat
    angesprochen werden müssen, sollen sie eine Aktion mit eingeschlossen werden)

  • -h - Dateigrößen menschengerecht (human readeable) in gut lesbare Einheiten umrechnen

  • -S - Nach der Größe der Datei sortieren

  • -r - Reverse (umgekehrte Sortierung)

  • -R - Rekursiv alle Unterverzeichnisse auflisten

  • -d - Directory-Eigenschaften betrachten, NICHT den Inhalt des Verzeichnisses, Dateijoker "*" entkräften für nichtrekursives Arbeiten:

ls -l /usr/share/doc/*ba*
  • -t Time sorted Output: Nach Änderungszeit (modification time) sortiert ausgeben

14.1.2. Kommando "cp"

ZIEL: Kopieren und evl. gleichzeitig es umbenennen:

Es gibt zwei grundsätzliche Modi:

a) Kopiere eine oder mehrere Dateien in einen Zielordner: cp /etc/fstab /etc/hostname /etc/hosts /tmp, ein weiteres Beispiel:

HINWEIS: Wir verwenden hier das Kommando touch, das eigentlich ein Zeitstempelwerkzeug ist, um drei leere Dateien anzulegen.

touch a b c
mkdir d
cp a b c d
ls -l d/

b) Kopiere eine Datei auf eine andere, wobei sie ohne eine Sicherungskopie anzufertigen überschrieben wird, falls nicht der Schalter -b (backup) verwendet wird.

echo Hallo... > datei1.txt
cp -b /etc/hostname datei1.txt
cat datei1.txt datei1.txt~

AUFGABEN:

  1. Kopieren Sie in Ihr Verzeichnis ~/Dokumente die Dateien /etc/hosts.allow und /etc/hosts.deny hinein.

    => cp  /etc/hosts.allow  /etc/hosts.deny  ~/Dokumente/
  2. Kopieren Sie in Ihr Verzeichnis ~/Dokumente in das Verzeichnis '~/Downloads* hinein.

    => cp  -r   ~/Downloads/  ~/Dokumente/
  3. Kopieren Sie die Datei /etc/hosts unter Umbenennung zu IP-und-Hostnamen.txt ins Verzeichnis ~/Dokumente.

    => cp /etc/hosts  ~/Dokumente/IP-und-Hostnamen.txt

Bitte weitere Optionen in man cp studieren, welche Optionen vereint der der Schalter -a?
Siehe https://wiki.ubuntuusers.de/cp/ https://wiki.ubuntuusers.de/cp/

  • -R - Rekursiv arbeiten

  • --preserve=all - Preserve all: Dateirechte, Zeitstempel usw. erhalten

  • -d - no Dereference SymLinks: belasse die Links beim Kopieren so wie sie sind, nicht die dahinter stehenden Dateien kopieren

Beispiel (als root auszuführen):

root@deb8-2:~# cp  -a  /var/lib/nfs  /root/var_lib_nfs
root@deb8-2:~# ls -ld /root/var_lib_nfs
drwxr-xr-x 1 statd nogroup 134 Jan 19 16:29 /root/var_lib_nfs

14.1.3. Kommando "mv"

Das Kommando bedeutet move und macht den Unterschied zu cp aus:

  • Es benennt eine Datei oder ein Verzeichnis um, wenn die Operation im selben Pfad geschieht.

  • Es verschiebt Objekte, wenn als Zielpfad ein anderes Verzeichnis angegeben wird.

ACHTUNG: Anders als cp kann mv immer rekursiv arbeiten (um die Umlagerung im Dateibaum zu ermöglichen), außerdem bleiben dabei naturgemäß Dateirechte, Zeitstempel usw. erhalten.

14.1.4. Kommando "rm"

Mit remove werden zuerst einmal nur Dateien gelöscht, will man Verzeichnisse löschen, muss rekursiv gearbeitet werden: Option -r

Aus Sicherheitsgründen sollte ein Alias eingerichtet werden, der versehentliches Löschen durch interaktives Rückfragen vermeiden hilft:

root@deb8-2:~# alias rm='/bin/rm -i'
root@deb8-2:~# cp -a /etc/ /root/etc_$(date +%F)
root@deb8-2:~#
root@deb8-2:~#
root@deb8-2:~# du -sh /etc/ /root/etc_2016-01-20/
12M        /etc/
12M        /root/etc_2016-01-20/
root@deb8-2:~#
root@deb8-2:~# rm -r /root/etc_2016-01-20/
/bin/rm: in Verzeichnis „/root/etc_2016-01-20/“ absteigen? j
/bin/rm: reguläre Datei „/root/etc_2016-01-20/fstab“ entfernen? j
/bin/rm: in Verzeichnis „/root/etc_2016-01-20/.java“ absteigen? j^C
root@deb8-2:~#

Wie kann dann aber ein schnelles Löschen erzwungen werden?

  1. Alias für einmalige Ausführung umgehen: Backslash voranstellen: \rm -r /root/etc_2016-01-20/

  2. Alias aus der Umgebung entfernen: unalias rm ; rm -r /root/etc_2016-01-20/

  3. Mit Hilfe der rm-Option -f (force): rm-rf /etc/*host*

14.2. Kommandos für Verzeichnisoperationen

14.2.1. Kommandos mkdir und rmdir

Mit mkdir können neue Verzeichnisse angelegt werden, komplette Strukturen nur mit der Option -p (parents)

mkdir -p ~/Briefe/Privat/Einkaufen/Lebensmittel/Gesunde

Sicheres Löschen von Verzeichnisstrukturen am besten mit rmdir durchführen, das nur leere Ordner löschen kann; hier gibt es auch wieder -p (parents):

rmdir -p ~/Briefe/Privat/Einkaufen/Lebensmittel/Gesunde

Metapher: Von rechts solange zurückrollen, bis man auf einen Widerstand stößt: das kann eine versteckte Datei z.B. .keep oder auch ein leerer Ordner sein.

VORSICHT: Diese Art Aufräumaktionen NICHT mit der Systemwurzel durchführen!!

tux@deb8-2:~$ touch ~/Briefe/Privat/.keep
tux@deb8-2:~$ rmdir -p  ~/Briefe/Privat/Einkaufen/Lebensmittel/Gesunde
rmdir: konnte Verzeichnis „/home/tux/Briefe/Privat“ nicht entfernen: Das Verzeichnis ist nicht leer
tux@deb8-2:~$

14.3. Weitere wichtige Kommandos für Dateiarbeit:

  • touch - Files "berühren", um den Zeitstempel zu ändern, wenn das File nicht existiert, wird es einfach erzeugt

    • FRAGE: Welchen der Zeitstempel kann touch nicht ändern?

    • ANTWORT: Die Change Inode Time (chown/chmod; find-Kürzel: -cmin/-ctime) zu ändern ist nicht direkt bzw. unabhängig möglich!

      • Modification Time (vi / nano, libreoffice; find-Kürzel: -mmin/-mtime): Aus der man-Page: -a change only the access time

      • Access Time (cat, more, less; find-Kürzel: -amin/-atime): Aus der man-Page: ' -m change only the modification time'

  • dd - disk dump: Files bestimmter Größe erzeugen, z.B. 100kB: dd if=/dev/zero of=myLittleFile.img bs=100k count=1

  • find - finden von Files aller Art, grundlegende Syntax find [PFADE] [PFADTIEFE] [DATEISYSTEM] [BEDINGUNGen...] [AKTIONen...]

    • Wichtige Optionen:

      • Case-Sensitiv: -name <PATTERN> (es arbeitet immer rekursiv, auch versteckte Dateien werden mit gefunden)

      • Ignore Case-Sensivity: -iname <PATTERN>

      • Dateityp-Suche: -type <fdlsp> (Typen: file, directory, symlink, socket, pipe)

      • Max. Verzeichnistiefe: -maxdepth <ZAHL>, Beispiel: find / -maxdepth 3 -name resolv.conf

      • Einschränkung auf das lokale Dateisystem: -xdev, Beispiel: find / -maxdepth 5 -xdev -name "*bashrc*"

      • Zeitstempel: siehe oben bei touch

      • Besitzer von Files: '-user <USERNAME/ID>, '-uid <UID>

      • Leerzeichen durch Null-Zeichen für nachfolgende Ausführung via xargs ersetzen: -print0

        tux@deb8-2:~$ find Dokumente/2016-01-21/* -print0 | xargs -0  du -h
        4,0K        Dokumente/2016-01-21/dateimanagement-redirects-pipes.adoc
        0        Dokumente/2016-01-21/dateiname mit spaces.txt
        tux@deb8-2:~$
        
        ### Weitere Beispiele:
        # Alle Dateien, die in eben dieser Minute durch 'make install' nach /usr kopiert wurden,
        # ausgeben:
        find /usr -cmin 1
        
        # Ein Verzeichnis als Vergleichswert für Zeitstempelsuche heranziehen
        find -cnewer /home/tux/TimeStamp/ -type f -mmin -60

14.4. Wildcards für Dateinamen und -pfade (S. 117 f)

  • Stern (*): Bringt Übereinstimmung für eine beliebig lange Zeichenkette beliebiger Zeichen, auch kein Zeichen

  • Fragezeichen (?): Bringt Übereinstimmung für ein beliebiges Zeichen

  • In eckigen Klammen ([abcxyz]): Bringt Übereinstimmung für ein beliebiges Zeichen aus der hier angegebenen Menge bzw. des Bereiches
    Negation: Mit einem nach der öffnenden Klammer eingefügten Ausrufezeichen (!) wird Umkehrung erreicht (ACHTUNG: Bei regexp ist dies ähnlich, aber mit einem anderen Zeichen verbunden: (^) Zum Beispiel nicht die Dateien ausgeben, die entweder auf eine 1 oder eine 2 enden: ls -l textfile[!12]

14.5. Wichtige Kommandos für Archivierung

14.5.1. tar - Für Tapes geschaffenes Archivierungsprogramm:

  • Ohne Komprimierung: tar cf Dokumente.tar Dokumente/

  • Mit GnuTar zugleich komprimieren (Dies können alte Unixe nicht!): tar czf Dokumente.tar.gz Dokumente/

    • Hierbei bedeuten die Optionen: c = create, z = Packen mit gzip, f = filename of the archive

    • Weitere Optionen:

      • -v = verbose

      • -C = change directory (mkdir TMP ; tar xzvf Dokumente.tar.gz -C TMP/)

      • -x = eXtract

      • -j = Packen mit bzip2

      • -J = Packen mit xz

      • -t = table of content ausgeben, nicht entpacken

14.5.2. cpio (S. Seite 121, über STDIN / STDOUT kopieren): Einsatz beim rpm-Paketformat (rpm2cpio), es kennt drei Modi:

  1. Copy-IN: Schalter -i oder --extract (ins Dateisystem extrahieren)

    • Beispiel (im Verzeichnis /tmp): cpio -i < ~/textfiles.cpio

  2. Copy-OUT: Schalter -o oder --create (aus dem Dateisystem ins Archiv kopieren; = Erzeugung des Archivs)

    • Beispiel: ls *.txt | cpio -o > textfiles.cpio

    • Dateityp feststellen: file textfiles.cpio (textfiles.cpio: cpio archive)

  3. Copy-TROUGH: Schalter -d oder --pass-through (Via Standardinput Daten aufnehmen und ins Dateisystem kopieren)

    • Beispiel "Benutzer manuell erzeugen" (auszugsweise, als root durchzuführen):

      # Heimatverzeichnis erzeugen
      mkdir /home/lisa
      
      # Vorlagen einkopieren (cp würde dot-files mit kopieren!)
      cd /etc/skel
      find | cpio -pdm /home/lisa

14.6. Wichtige Kommandos für Komprimierung

Anders als bei den Werkzeugen tar und cpio werden die Daten hier lediglich komprimiert, nicht in ein Archiv überführt.

  • gzip - Entpacken: gunzip oder gzip -d

  • bzip2 - Entpacken: bunzip2 oder bzip -d

  • xz - Entpacken: unxz oder xz -d

Die typische Unix-Komprimierung läuft so, dass direkt mit der Originaldatei gearbeitet wird, die danach ein anderes Dateisuffix erhält und somit umbenannt wurde!

Am Beispiel von gzip:

tux@deb8-2:~$ cp /etc/services .
tux@deb8-2:~$
tux@deb8-2:~$ ls -lh services
-rw-r--r-- 1 tux tux 20K Jan 22 10:40 services
tux@deb8-2:~$
tux@deb8-2:~$ gzip -9 services
tux@deb8-2:~$
tux@deb8-2:~$ ls -lh services
ls: Zugriff auf services nicht möglich: Datei oder Verzeichnis nicht gefunden
tux@deb8-2:~$
tux@deb8-2:~$ ls -lh services*
-rw-r--r-- 1 tux tux 7,4K Jan 22 10:40 services.gz
tux@deb8-2:~$
tux@deb8-2:~$ file services.gz
services.gz: gzip compressed data, was "services", last modified: Fri Jan 22 10:40:29 2016, max compression,
 from Unix
tux@deb8-2:~$
tux@deb8-2:~$ ### Wollen wir den Inhalt der komprimierten Datei sehen, ohne sie zu entpacken, müssen wir
                  mit '-c' über STDOUT gehen:
tux@deb8-2:~$ gunzip -c services.gz | less

AUFGABE: Führen Sie die selben Operationen mit bzip2 und xz durch.

Beispielhafte Lösungen:

cp /etc/services .
bzip2 services
cp /etc/services .
xz services
cp /etc/services .
xz -9 -c services >  services-level9.xz
xz -1 -c services >  services-level1.xz

# Zum besseren Vergleichen nur die tatsächliche Dateigröße in Byte und den Dateinamen ausgeben
ls -l services* | awk '{print$5, $9}'
19605 services
7229 services.bz2
7548 services.gz
7484 services-level1.xz
7156 services-level9.xz
7156 services.xz

14.7. Archivierung mit Komprimierung verbinden

Angenommen, es liegt nicht das moderne GNU-tar vor, sondern ein ein altes Unix-System, können die beiden Sparten trotzdem miteinander arbeiten:

a) Erzeugen eines komprimierten Archivs:

# Der Bindestrich bedeutet in diesem Kontext: STDOUT für das Erzeugen des Archiv-files benutzen
tar cvf - foodir | gzip > foo.tar.gz

b) Entpacken des komprimierten Archivs:

# Der Bindestrich bedeutet in diesem Kontext: STDIN für das Entpacken des Archiv-files benutzen
gunzip -c foo.tar.gz | tar xvf -
# oder
gunzip < foo.tar.gz | tar xvf -

Bitte den Schalter -c bei den Komprimierern gzip, bzip2 und xz wahrnehmen, durch ihn lassen sich erst die von tar stammenden Daten weiterverarbeiten.

15. Topic 103.4 - Use streams, pipes and redirects

15.1. Standard-Datenströme der Unix-Shells

Siehe S. 125 oben

  • Kanal STDIN: Dateideskriptor = 0, Umleitungs-Kürzel: "<", anhängende Arbeitsweise als Here-Dokument: "<<MARKE"

  • Kanal STDOUT: Dateideskriptor = 1, Umleitungs-Kürzel: ">", anhängende Arbeitsweise ">>"

  • Kanal STDERR: Dateideskriptor = 2, Umleitungs-Kürzel: "2>", anhängende Arbeitsweise "2>>"

ANMERKUNG: Den Dateidekriptor kann man weglassen, wenn das Kürzel eine eindeutige Interpretation durch die "Pfeilrichtung" zulässt, ansonsten muss die Ziffer angegeben werden. Bei STDERR muss sie immer mit notiert werden.

a) Zu Kanal STDIN:

Motto: Ein Kommando liest von der Tastatur:

tux@deb8-2:~$ wc -l


Hallo?
ABC...
Fertig?
5
tux@deb8-2:~$
tux@deb8-2:~$ #### Ja, durch Drücken von 'STRG + D' (End of File, EoF)

b) Zu Kanal STDOUT:

tux@deb8-2:~$ df -h /
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda5        28G    6,2G   21G   24% /
tux@deb8-2:~$

c) Zu Kanal STDERR (wird genauso wie STDOUT ins Terminal gesendet):

tux@deb8-2:~$ df -h /SERVER
df: „/SERVER“: Datei oder Verzeichnis nicht gefunden
tux@deb8-2:~$

15.2. Pipelines zum Weiterverarbeiten der Datenströme

Das Kürzel für Pipes ist lediglich ein einzelnes Bar-Zeichen (|), dabei wird die Ausgabe eines Kommandos immer zur Eingabe des nächsten (STDOUT wird zu STDIN):

=>    cmd1  |  cmd2  |  cmd3

Beispiel:

tux@deb8-2:~$ df -h / | tail -1
/dev/sda5        28G    6,2G   21G   24% /
tux@deb8-2:~$

Beim Durchreichen der Daten tritt jetzt allerdings ein Problem auf: Zwischenergebnisse gehen verloren! Im Beispiel von oben ist uns ja der Header, also die folgende Zeile verlorengegangen:

Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf

Wie kann man nun darauf zurückgreifen: Es muss ein T-Stück (engl: tee) eingebaut werden:

tux@deb8-2:~$ df -h / | tee header+content.txt | tail -1
/dev/sda5        28G    6,2G   21G   24% /
tux@deb8-2:~$
tux@deb8-2:~$ cat header+content.txt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda5        28G    6,2G   21G   24% /
tux@deb8-2:~$

Dort liest man auch über die für uns wichtige Option -a (append): "Mit -a wird an die angegebene Datei angehängt (anstatt eine neue leere Datei zu eröffnen)"

15.3. Umleitungen der Standardkanäle durchführen

Siehe oben bei der Erklärung der drei Standard-Ströme.

Es lassen sich Kanäle verbinden, daszu wird das Kaufmanns-Und eingesetzt:

Aus Prüfung B)
In bash, inserting 2>&1 after a command redirects
A. standard error to standard input.
B. standard input to standard error.
C. standard output to standard error.
D. standard error to standard output.
E. standard output to standard input.
Richtige Antwort: D

Hintergrund: Für typische Aufgaben wie das Kompilieren von Anwendungen soll jeglicher Output, auch Fehlermeldungen gespeichert werden:

make > my-important-file.log 2>&1
### Bash redirection

# stdout -> Datei umleiten
programm > Datei.txt

# stderr -> Datei umleiten
programm 2> Datei.txt

# stdout UND stderr -> Datei umleiten
programm &> Datei.txt

# stdout -> stderr
programm 1>&2

#stderr -> stdout
programm 2>&1

Ein Beispiel mit einer Datei, in der Klein- und Großschreibung wild gemischt sind. Es soll alles in Kleinbuchstaben umgewandelt werden:

tux@deb8-2:~$ tr '[:upper:]' '[:lower:]' < kontakte | nl
     1        müller
     2        meier
     3        schulze
tux@deb8-2:~$

15.4. Weitere Verarbeitungskürzel der bash

  • Kommandozeilen OHNE Prüfung des Exitcodes aneinanderreihen mit Hilfe dem Semikolon (;)

  • Kurztests auf Erfolg durchführen

    • Nur bei Erfolg weiterarbeiten (zwei Ampersand-Zeichen): &&

    • Nur bei Misserfolg weiterarbeiten (zwei Bar-Zeichen): ||

Beispiele:

tux@deb8-2:~$ cat /etc/hostname && echo Alles OK.
deb8-2
Alles OK.
tux@deb8-2:~$
tux@deb8-2:~$ cat /etc/HOSTNAME && echo Alles OK.
cat: /etc/HOSTNAME: Datei oder Verzeichnis nicht gefunden
tux@deb8-2:~$
tux@deb8-2:~$ cat /etc/hostname || echo Wir gehen zu Plan über....
deb8-2
tux@deb8-2:~$
tux@deb8-2:~$ cat /etc/HOSTNAME || echo Wir gehen zu Plan über....
cat: /etc/HOSTNAME: Datei oder Verzeichnis nicht gefunden
Wir gehen zu Plan über....
tux@deb8-2:~$

16. Topic 103.5 - Create, monitor and kill processes

Siehe Seite 128 ff

16.1. Überwachen von Prozessen

Wichtige Werkzeuge sind unter anderem:

  • ps - Process Snapshots (ohne Option: Nur die Prozesse der aktuellen Shellumgebung werden angezeigt)

    • Optionen (Achtung: Bindestriche zu verwenden, bedeutet die Syntax gemäß POSIX/Unix (Stichwörter: AT&T, Solaris) anzuwenden, keine Bindestriche dagegen heißt BSD-Syntax zu wollen):

      • a - Alle Prozesse ausgeben, auch die von anderen Benutzern

      • u - User defined Format (ausführlich)

      • x - Nicht mit einer Shell verbundenen Daemons ebenfalls ausgeben (Kennzeichen in Spalte TTY: (?))

      • l - Long Listing, auch Prioritäts- und Nice-werte auflisten

      • -C <DIENST> - Die Prozesse, die ein bestimmter Dienst verursacht, auflisten, Bsp.: ps -C sshd

      • -U <USER> - Die Prozesse, die ein bestimmter Nutzer verursacht, auflisten

  • pstree - Prozess in Baumform ausgeben

    • Optionen:

      • -p - Prozess-IDs ausgeben

      • -n - Prozess-ID numerisch sortieren

  • top - Prozesse in einem sich selbst aktualisierenden Monitor präsentieren (top = die größten Ressourcenverbraucher zuerst)

    • Wichtige Ausgaben im Programmfenster:

      • Erste Zeile: Statistiken gemäß Kommando uptime

      • Zweite und dritte Zeile: Statistiken über Prozesse und CPU-Auslastung

      • Vierte und fünfte Zeile: RAM-Auslastung gemäß Kommando free anzeigen

      • Die weiteren Zeilen: Live-Monitor

    • Interaktive Bedienung des Programmes:

      • q - quit

      • 1 - alle Prozessoren anzeigen

      • u <USERNAME> - Nach einem Nutzer filtern

      • r - Renice von Prozessen durchführen (Nice-Wert nachträglich ändern)

      • k - Killen von Prozessen (PID und Signalnummer angeben)

    • Wichtige Optionen:

      • -i - Nur aktive Prozesse anzeigen

      • -d <TIME> - Delay-Zeit [s] angeben (Standard = 1s)

      • -q - Ausgaben in Echtzeit liefern

    • Praxisbeispiel: Ein Programm frisst so viel Ressourcen, dass das System langsam wird (Out of Memory-Killer ⇒ OOM-Killer)

      • Firefox mit laufenden Flash-Plugins

      • Den "Taskmanager" top starten: top

      • Die vorgeschlagene PID übernehmen oder anpassen, Taste k (kill) drücken

      • Die vorgeschlagene Signalnummer (15) übernehmen oder anpassen, eine 9 macht ein Clean up des Programmes unmöglich (SIGKILL)!

      • Beobachten, ob der Systemzustand wieder in Ordnung ist

      • Beenden des Programmes q

16.2. Arbeiten mit Signalen

Recherche-Aufgaben: Suchen Sie nach BIldern, die im Zusammenhang mit Unix/Linux und dem Prozesszyklus stehen (Lebenszyklus, fork(), suspend, running)
http://www2.htw-dresden.de/~fritzsch/BS/bs_script.html

Seite 133: Bitte die folgenden Signale lernen:

  • SIGHUP = 1, No Hangup, das bedeutet heute: Daemons sollen ihre Konfiguration neu einlesen

  • SIGINT = 2 (Via Tastatur: STRG + c), die Abarbeitung von Programmen abbrechen

  • SIGKILL = 9, die Abarbeitung eines Programmen gewaltsam beenden

  • SIGTERM = 15, die Abarbeitung von Programmen auf normalen Wege terminieren

  • SIGCONT = 18, (Via Tastatur: STRG + q) die Abarbeitung eines Programmes nach einem Stop weiterarbeiten lassen

  • SIGSTOP = 19, (Via Tastatur: STRG + s) die Abarbeitung eines Programmes pausieren lassen (einen Stop einlegen)

AUFGABE: Bitte studieren Sie die Einführung von man 5 signal sowie die Tabellen der Signalnummern. (5 min) * Default-Verhalten?

Prozesse können Signale abfangen, weil sie der Meinung sind, bestimmte Aufgaben zu Ende bringen zu müssen (Signal 15 ermöglich: Clean up).
Ein Signal allerdings kann nicht abgefangen werden: SIGKILL (Signal Nr. 9).

Übung: Starten Sie zum Testen ein ziemlich nutzloses Programm im Hintergrund: sleep 60 & (gern auch mehrmals)

tux@deb8-2:~$ sleep 60 &
[1] 4061
tux@deb8-2:~$
tux@deb8-2:~$ sleep 60 &
[2] 4062
tux@deb8-2:~$ sleep 60 &
[3] 4063
tux@deb8-2:~$
tux@deb8-2:~$ kill 4061
tux@deb8-2:~$
[1]   Beendet                 sleep 60
tux@deb8-2:~$
tux@deb8-2:~$ kill -9 4062
tux@deb8-2:~$
[2]-  Getötet                sleep 60
tux@deb8-2:~$

16.3. Weitere Tools zur Prozessmanipulation

  • killall - Via exakten Namen alle gleichnamigen Prozesse manipulieren (max. 64 Prozesse)

    tux@deb8-2:~$ sleep 60 &
    [1] 4519
    tux@deb8-2:~$ sleep 60 &
    [2] 4520
    tux@deb8-2:~$ sleep 60 &
    [3] 4521
    tux@deb8-2:~$ sleep 60 &
    [4] 4522
    tux@deb8-2:~$
    tux@deb8-2:~$
    tux@deb8-2:~$
    tux@deb8-2:~$ killall sleep
    [1]   Beendet                 sleep 60
    [2]   Beendet                 sleep 60
    [3]-  Beendet                 sleep 60
    [4]+  Beendet                 sleep 60
    tux@deb8-2:~$
  • pgrep - Eine Prozesssuche gestaltet sich viel schneller als mit ps aux | grep <PATTERN>.)

  • pkill - Vorsicht hier wird mit einem Pattern gearbeitet, es kann u.U. zu viel treffen!

  • xkill - Grafische Anwendungen mit einem einfachen Linksklick gewaltsam beenden
    (Aus der man-Page: "This program is very dangerous, but is useful for aborting programs that have displayed undesired windows on a user’s screen.")

  • Weitere Monitoring-Tools:

    • htop (Debian: "Htop ist ein ncurses-basierter Prozessbetrachter ähnlich wie top, jedoch ermöglicht er Ihnen die Liste vertikal und horizontal zu durchlaufen")

    • dstat (Debian: "Vielseitiges Ressourcenstatistikwerkzeug. Dstat ist ein vielseitiger Ersatz für vmstat, iostat und ifstat.)

    • monitorix (Webbasiertes, grafischen Auswertungstool (CGI-basiert), siehe http://www.monitorix.org/screenshots.html)

Tipp: Beenden verschiedenster Apps:

  • STRG + c (Signal 2)

  • STRG + d (done, End of File)

  • ESC (alsamixer)

  • q

  • quit

  • exit

16.4. Jobverwaltung der bash

Motivation: aus einer Shell-Sitzung lassen sich viele Programme gleichzeitig starten und verwalten (Komfort).

Wichtige Kürzel für den bash-Mechanismus:

  • & Ein einzelnes Ampersand, was man dem Kommandoaufruf mitgibt, startet das Programm im Hintergrund und führt es aus (ding ist ein Englisch/Deutsch-Dictionary, es muss nachinstalliert werden), ⇒ synchrone Abarbeitung, der Shellprompt wird frei gemacht

    tux@deb8-2:~$ ding &
    [1] 4663
    tux@deb8-2:~$
  • fg - foreground: Ein im Hintergrund laufendes Programm nach vorn holen, so dass es mit Tastenkombinationen manupuliert werden kann

  • bg - backgroud: Ein mit STRG + z suspendiertes Programm im Hintergrund fortfahren lassen (so als ob man ein % angehängt hätte)

    tux@deb8-2:~$ ding
    ^Z
    [1]+  Angehalten              ding
    tux@deb8-2:~$
    tux@deb8-2:~$ jobs
    [1]+  Angehalten              ding
    tux@deb8-2:~$
    tux@deb8-2:~$ bg
    [1]+ ding &
    tux@deb8-2:~$
    tux@deb8-2:~$
    tux@deb8-2:~$ jobs
    [1]+  Läuft                  ding &
    tux@deb8-2:~$
  • jobs - Jobs auflisten

  • kill <%PID> - Prozesse über ihre Job-Nummer manipulieren

Beispiel: Ein Programm (bc = basic calculator) manuell in den Hintergrund suspendieren und aus dem Vordergrund heraus normal beenden:

tux@deb8-2:~$ bc -l
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

3/1.5
2.00000000000000000000

^Z
[1]+  Angehalten              bc -l
tux@deb8-2:~$ killall bc
tux@deb8-2:~$ killall bc
tux@deb8-2:~$ killall bc              ### Kein Erfolg: Der Prozess müsste hier mit '-9' gekillt werden!
tux@deb8-2:~$
tux@deb8-2:~$ jobs
[1]+  Angehalten              bc -l
tux@deb8-2:~$
tux@deb8-2:~$ kill -15 %1             ### So gelingt ein sanftes Beenden

[1]+  Angehalten              bc -l
tux@deb8-2:~$
[1]+  Beendet                 bc -l
tux@deb8-2:~$

17. Topic 103.6 - Modify process execution priorities

Siehe Seite 140

Hier spielen für LPI zwei Kommandos eine Rolle:

  • nice (voranzustellendes Kommando) - Einen anderen Freundlichkeitswert beim Starten eines Kommandos setzen, per Default wird der positive Wert 10 benutzt)

  • renice (im nachhinein auszuführen, PID erforderlich) - Einen anderen Freundlichkeitswert im nachhinein, per Default wird der positive Wert 10 benutzt)

Darüber hinaus gibt es speziell für Datenträgeroperationen (kopieren, Backups anfertigen) das Kommando: ionice

Wie funktioniert das Ganze?

  • nice-Werte sind nur Empfehlungen, der Kernel kann sie überstimmen (Bitte Spalte PRI bei ps l beachten: Dies legt allein der Kernel fest!)

  • nice-Werte verhalten sich zu Prioritäten umgekeht proportional: Hoher nice-Wert = geringe Priorität und umgedreht.

  • Bereich für nice: -20 bis +19

    • Benutzer root: Er darf wie immer alles, also auch in den negativen Bereich gehen

    • Normale Benutzer: Nur positive Werte sind erlaubt.

Ein paar Beispiele:

tux@deb8-2:~$ nice sleep 120 &
[1] 7346
tux@deb8-2:~$
tux@deb8-2:~$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  1423  1418  20   0  24276   676 -      Ss+  pts/0      0:00 bash
0  1000  2633  1418  20   0  23920   416 -      Ss   pts/2      0:00 bash
0  1000  3312  1418  20   0  23960  4388 -      Ss   pts/1      0:00 bash
0  1000  4053  1418  20   0  23876   220 -      Ss+  pts/4      0:00 bash
0  1000  4338  1418  20   0  23936   352 -      Ss+  pts/5      0:00 bash
0  1000  6751  6748  20   0  23840  5736 -      Ss+  pts/7      0:00 -bash
1  1000  6801     1  20   0  24372  2336 -      S    pts/7      0:00 /usr/bin/dbus-launch --autolaunch ...
0  1000  7346  3312  30  10   5808   632 -      SN   pts/1      0:00 sleep 120
0  1000  7347  3312  20   0  10688  2092 -      R+   pts/1      0:00 ps l
tux@deb8-2:~$
tux@deb8-2:~$
tux@deb8-2:~$ renice -n 15 7346
7346 (Prozesskennung) alte Priorität 10, neue Priorität 15
tux@deb8-2:~$
tux@deb8-2:~$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  1423  1418  20   0  24276   676 -      Ss+  pts/0      0:00 bash
0  1000  2633  1418  20   0  23920   416 -      Ss   pts/2      0:00 bash
0  1000  3312  1418  20   0  23960  4388 -      Ss   pts/1      0:00 bash
0  1000  4053  1418  20   0  23876   220 -      Ss+  pts/4      0:00 bash
0  1000  4338  1418  20   0  23936   352 -      Ss+  pts/5      0:00 bash
0  1000  6751  6748  20   0  23840  5736 -      Ss+  pts/7      0:00 -bash
1  1000  6801     1  20   0  24372  2336 -      S    pts/7      0:00 /usr/bin/dbus-launch --autolaunch ...
0  1000  7346  3312  35  15   5808   632 -      SN   pts/1      0:00 sleep 120
0  1000  7349  3312  20   0  10688  2096 -      R+   pts/1      0:00 ps l
tux@deb8-2:~$
tux@deb8-2:~$ nice --20 sleep 120 &
[1] 7356
tux@deb8-2:~$ nice: die Priorität kann nicht gesetzt werden: Keine Berechtigung

tux@deb8-2:~$
tux@deb8-2:~$
tux@deb8-2:~$ nice -+19 sleep 120 &
[2] 7357
tux@deb8-2:~$
tux@deb8-2:~$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  1423  1418  20   0  24276   676 -      Ss+  pts/0      0:00 bash
0  1000  2633  1418  20   0  23920   416 -      Ss   pts/2      0:00 bash
0  1000  3312  1418  20   0  23960  4388 -      Ss   pts/1      0:00 bash
0  1000  4053  1418  20   0  23876   220 -      Ss+  pts/4      0:00 bash
0  1000  4338  1418  20   0  23936   352 -      Ss+  pts/5      0:00 bash
0  1000  6751  6748  20   0  23840  5736 -      Ss+  pts/7      0:00 -bash
1  1000  6801     1  20   0  24372  2336 -      S    pts/7      0:00 /usr/bin/dbus-launch --autolaunch ...
0  1000  7356  3312  20   0   5808   688 -      S    pts/1      0:00 sleep 120
0  1000  7357  3312  39  19   5808   672 -      SN   pts/1      0:00 sleep 120
0  1000  7358  3312  20   0  10688  2088 -      R+   pts/1      0:00 ps l
tux@deb8-2:~$
[1]-  Fertig                  nice --20 sleep 120
[2]+  Fertig                  nice -+19 sleep 120
tux@deb8-2:~$

Praktische Anwendungsfälle:

a) root möchte ressourcenschonend den Suchindex von locate erneuern:

=> nice -19 updatedb &

b) tux möchte ressourcenschonend eine find-Suche für eigenen Bedarf durchführen:

=> nice -n +19 find 2> /dev/null > allMyFiles.txt

c) root will beim Erstellen von GnuGP-Schlüsseln mehr Dampf geben (für duplicity-Backups):

=> nice --19 gpg --gen-key

17.1. Optionen und Aufrufmöglichkeiten:

Dies alles ist als Benutzer möglich:

tux@deb8-2:~$ nice -+13 sleep 2
tux@deb8-2:~$
tux@deb8-2:~$ nice -n+13 sleep 2
tux@deb8-2:~$ nice -n13 sleep 2
tux@deb8-2:~$ nice -n 13 sleep 2
tux@deb8-2:~$ nice -n +13 sleep 2
tux@deb8-2:~$

Das Folgende ergibt allerdings NEGATIVE Werte:

tux@deb8-2:~$ nice -n-13 sleep 2
nice: die Priorität kann nicht gesetzt werden: Keine Berechtigung
tux@deb8-2:~$
tux@deb8-2:~$ nice --13 sleep 2
nice: die Priorität kann nicht gesetzt werden: Keine Berechtigung
tux@deb8-2:~$

Bei renice gibt es nicht ganz so viele Möglichkeiten, die Kürzel mit Minus/Plus (-+) oder Minus/Minus (--) funktionieren nicht: wir brauchen also die Option -n, außerdem muss ein Leerzeichen zwischen -n und dem Wert stehen.

tux@deb8-2:~$ renice 19 7464
7464 (Prozesskennung) alte Priorität 0, neue Priorität 19
tux@deb8-2:~$
tux@deb8-2:~$ renice -19 7464
renice: Priorität für 7464 konnte nicht gesetzt werden (Prozesskennung): Keine Berechtigung
tux@deb8-2:~$
tux@deb8-2:~$ renice -n +19 7546
7546 (Prozesskennung) alte Priorität 0, neue Priorität 19
tux@deb8-2:~$

18. Topic 103.7 - Search text files using regular expressions

Siehe Seite 143 ff

Es handelt sich hierbei um eine in vielen Kommandos nutzbare Filtersprache (u.a. in Perl).

Welche Tools können damit originär umgehen?

  • grep (kein logisch ODER)

  • egrep (oder grep -E, = extended grep, beherrscht u.a. logisch ODER)

  • sed (stream editor)

  • vim

ACHTUNG: Das Tool fgrep (oder grep -F) kann NICHT mit regulären Ausdrücken (das "f" bedeutet fixed Strings), z.B. wenn man vermeiden möchte, dass der Punkt als "ein beliebiges Zeichen" interpretiert wird:

Beispiel: Der Punkt ist hier ein normales Zeichen:

root@deb8-2:~# find /boot/ | fgrep .cfg
/boot/grub/grub.cfg
root@deb8-2:~#

Gegenprobe, ob fgrep wirklich nichts mit diesen regulären Ausdrücken anfangen kann:

### grep kann es:
root@deb8-2:~# grep -v ^# /etc/hosts
127.0.0.1        localhost
127.0.1.1        deb8-2.myDomain.site        deb8-2

::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.22.15.119 c7
root@deb8-2:~#

### fgrep kann den Kommentar nicht ausblenden
root@deb8-2:~# fgrep -v ^# /etc/hosts
127.0.0.1        localhost
127.0.1.1        deb8-2.myDomain.site        deb8-2

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.22.15.119 c7
root@deb8-2:~#

Wollen wir alternativ z.B. Car oder Auto in einer Datei finden, muss für diese logisch-ODER-Verknüpfung das Extended grep herangezogen werden:

root@deb8-2:~# cat > textdatei.txt <<EOF
Ein Car ist ein Mobil,
das wir auch Auto nennen.
Fahrradfahren ist freilich umweltfreundlicher.
EOF
root@deb8-2:~# grep -E -i 'car|auto' textdatei2.txt
Ein Car ist ein Mobil,
das wir auch Auto nennen.
root@deb8-2:~#

Gibt es auch logisch-UND? Ja, hierfür brauchen wir zwei grep-Zeilen via Pipe: Zuerst filtern wir z.B. alle Gerätedateien aus der /etc/fstab heraus, danach folgt ein weiterer Filter, der nur ext-Dateisysteme berücksichtigt:

root@deb8-2:~# grep '^/dev' /etc/fstab | fgrep ext
/dev/store01/www    /srv/www     ext3     defaults     0      2
root@deb8-2:~#

Aufgabenstellung:

  • Schneiden Sie alle Kommentar- und Leerzeilen aus der Datei /etc/hosts weg, so dass nur der wichtige Rest stehenbleibt:

    root@deb8-2:~# grep -v '^#' /etc/hosts | grep -v '^$'
    127.0.0.1        localhost
    127.0.1.1        deb8-2.myDomain.site        deb8-2
    ::1     localhost ip6-localhost ip6-loopback
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    10.22.15.119 c7
    root@deb8-2:~#
    root@deb8-2:~#

    Die Option -v kann entfallen, wenn die Negation mit einem Metazeichen durchgeführt wird:

    => grep ^[^#] /etc/hosts | grep -v ^$
  • Ein bestimmtes Wort finden: grep -i '\<car\>' textdatei.txt

Weitere reguläre Ausdrücke sind (Auszug von Seite 144 f):

  • Ein einzelner Punkt: (.) - ersetzt EIN beliebiges Zeichen.

  • Ein Stern (*) - Wiederholungsfaktor: Das davor stehende Zeichen beliebig oft

Somit lässt sich der gewöhnliche Dateijoker (*) auf diese Art als regulärer Ausdrück realisieren: (.*)

Wichtige Optionen:

  • -i - Ignoriere Groß- und Kleinschreibung

  • -v - inVertiere die Ergebnisse (negieren)

  • -r - Rekursiv arbeiten (Verzeichnisse samt Inhalt durchsuchen)

  • -E - Extended Arbeitsweise aktivieren (= egrep)

  • -F - Fixed-Strings-Arbeitsweise aktivieren (= fgrep)

  • -c - Counting: Zählt nur die Übereinstimmungen (gibt nur eine Zahl aus)

  • -n - Number of Line: Die betreffende Zeilennummer mit ausgeben

  • -l - Liste nur die Dateinamen auf, nicht den gefundenen Inhalt

  • -H - Liste die Dateinamen und den gefundenen Inhalt auf, ideal für eine kleine Suchmaschine:

    find /etc -type f -exec grep -iH --color linus {} \;

18.1. Der streaming Editor sed

Sed kann tatsächlich Dateien editieren, obwohl er sie nicht direkt wie vim bearbeiten kann. Sein Name bedeutet: "Stream Editor":

  • Typisches Verhalten: Arbeiten im Datenstrom (Pipes)

  • Direkt eine Datei editieren: Option -i bzw. --in-place

Seine Stärke liegt im Suchen und Ersetzen im Datenstrom.

Allgemeine Syntax: sed 'BEFEHL' datei

Allgemeine Syntax für das Suchen und Ersetzen: sed 's/ALT/NEU/[g]' datei

Dabei bitte beachten:

  • Das kleine s steht für "substitute", damit wird der Vorgang eingeleitet

  • Die Zeichenkette ALT soll on the fly durch NEU ersetzt werden

  • Das optionale kleine g steht für "global auf der Zeile agieren", was bedeutet, dass ein Mehrfachvorkommen auf der Zeile beachtet wird

Beispiele:

  • echo "Ich heiße Bob, mein Bobschlitten ist Bobbig." | sed 's/Bob/bob/'
    ⇒ ERGEBNIS: Ich heiße bob, mein Bobschlitten ist Bobbig.

  • echo "Ich heiße Bob, mein Bobschlitten ist Bobbig." | sed 's/Bob/bob/g'
    ⇒ ERGEBNIS: Ich heiße bob, mein bobschlitten ist bobbig.

  • echo BOB > bob.txt ; sed -i 's/BOB/bob/g' bob.txt

  • Ein sehr experimentelles Beispiel:

    tux@deb8-2:~$ echo ALT, ALT, ALT | sed 's/ALT/NEU/'
    NEU, ALT, ALT
    tux@deb8-2:~$
    tux@deb8-2:~$ echo ALT, ALT, ALT | sed 's/ALT/NEU/g'
    NEU, NEU, NEU
    tux@deb8-2:~$

19. Topic 103.8 - Perform basic file editing operations using vi

Siehe Seite 152 ff

Es gibt drei Modi:

  • COMMAND (ESC)

  • INSERT (i, o, a, A)

  • EXECUTE (:wq / :w / ZZ / :q! / :wq! / :e datei)

Navigation:

  • Ersatz der Cursortasten: h, j, k, l

  • Einen Bildschirmausschnitt nach unten (forward) blättern: STRG + f

  • Einen Bildschirmausschnitt nach unten (backward) blättern: STRG + b

Ganze Zeilen bearbeiten

  • dd - (delete) - eine ganze Zeile in den Löschpuffer (= Ausschneiden)

  • yy - (yank) - eine ganze Zeile in den Kopierpuffer legen

  • p - (paste) - Pufferinhalt eine Zeile darunter einfügen

  • HINWEIS: Dabei können den Befehlen ein Zahl für den Wiederholungsfaktor vorangestellt werden

20. Topic 104.1 - Create partitions and filesystems

20.1. Ein kleiner Ausflug in die Dateitypen

Die sieben Linux-Dateitypen anhand von Beispielen kurz erklärt:

tux@deb8-2:~$ ### Reguläre Files
tux@deb8-2:~$ ls -l /etc/passwd /usr/bin/passwd
-rw-r--r-- 1 root root  2966 Feb  2 09:02 /etc/passwd
-rwsr-xr-x 1 root root 54192 Nov 18 09:11 /usr/bin/passwd

tux@deb8-2:~$ ### Directories
tux@deb8-2:~$ ls -ld /etc /tmp
drwxr-xr-x 1 root root 4196 Feb  2 09:02 /etc
drwxrwxrwt 1 root root  462 Feb  2 11:36 /tmp

tux@deb8-2:~$ ### Symbolische Links
tux@deb8-2:~$ ls -l /var/run /sbin/telinit
lrwxrwxrwx 1 root root 14 Nov 21 20:00 /sbin/telinit -> /bin/systemctl
lrwxrwxrwx 1 root root  4 Jan  7 12:24 /var/run -> /run

tux@deb8-2:~$ ### Gerätedateien (Character / Block)
tux@deb8-2:~$ ls -l /dev/ttyS0 /dev/sda
brw-rw---- 1 root disk    8,  0 Feb  2 07:48 /dev/sda
crw-rw---- 1 root dialout 4, 64 Feb  2 07:48 /dev/ttyS0

tux@deb8-2:~$ ### Prozesse via benannter Pipe und Unix-Domain-Socket
tux@deb8-2:~$ ls -l /dev/xconsole /tmp/.X11-unix/X0
prw-r----- 1 root adm  0 Feb  2 11:20 /dev/xconsole
srwxrwxrwx 1 root root 0 Feb  2 07:48 /tmp/.X11-unix/X0

Situation: Auf / wird der Plattenplatz knapp, Grund ist das installierte Dokumentenmanagementsystem Agorum (/opt beinhaltet eine große DB)

AUFGABE: Gastsystem bitte herunterfahren, Festplatte einbauen… (8 GB)

Kontrollieren wir, ob die neue Festplatte da ist:

  • fdisk -l

  • dmesg

  • blkid

  • lsblk

  • parted (Automatische Auswahl von /dev/sda, Partitionen auflisten: print all, quit)

  • gdisk (zur Kontrolle: gdisk -l /dev/sdb

20.2. Partitionierung mit fdisk:

Die Vorgehensweise im Überblick:

  1. m - Ausgeben der integrierten fdisk-Befehle

  2. p - Ausgeben der Partitionstabelle, die zur Zeit noch leer ist

  3. n - (new) Neue Partition anlegen

  4. e - Typ festlegen: erweiterte Partition, Größe: vorgeschlagene Start- und Endwerte mit ENTER übernehmen (ganze Platte)

  5. n - eine weitere neue Partition anlegen

  6. l - Typ festlegen: logische Partition, Größe: vorgeschlagenen Startwert mit ENTER übernehmen, Endwert: +1G

  7. n - eine weitere neue Partition anlegen

  8. l - Typ festlegen: logische Partition, Größe: vorgeschlagenen Startwert mit ENTER übernehmen, Endwert: +2G

  9. p - ein Print zur Endkontrolle

  10. w - (write) Änderungen speichern und Programm beenden

Hier der Vorgang im einzelnen:

root@deb8-2:~# fdisk /dev/sdb
Willkommen bei fdisk (util-linux 2.25.2).
Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich
entscheiden, sie zu schreiben.
Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.

Gerät enthält keine erkennbare Partitionstabelle.
Created a new DOS disklabel with disk identifier 0x23695331.

Befehl (m für Hilfe): m

Hilfe:

  DOS (MBR)
   a   (De)Aktivieren der bootfähig-Markierung
   b   verschachtelte BSD-Festplattenbezeichnung bearbeiten
   c   (De)Aktivieren der DOS-Kompatibilitätsmarkierung

  Generisch
   d   Eine Partition löschen
   l   Die bekannten Dateisystemtypen anzeigen
   n   Eine neue Partition anlegen
   p   Die Partitionstabelle ausgeben
   t   Einen Partitionstyp ändern
   v   Die Partitionstabelle überprüfen

  Sonstiges
   m   Dieses Menü anzeigen
   u   Die Einheit für die Anzeige/Eingabe ändern
   x   Zusätzliche Funktionen (nur für Experten)

  Speichern und Beenden
   w   Die Tabelle auf die Festplatte schreiben und das Programm beenden
   q   Beenden ohne Speichern der Änderungen

  Eine neue Bezeichnung erstellen
   g   Eine neue leere GPT-Partitionstabelle erstellen
   G   Eine neue leere SGI (IRIX)-Partitionstabelle erstellen
   o   Eine neue leere DOS-Partitionstabelle erstellen
   s   Eine neue leere Sun-Partitionstabelle erstellen


Befehl (m für Hilfe): p
Festplatte /dev/sdb: 8 GiB, 8589934592 Bytes, 16777216 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0x23695331



Befehl (m für Hilfe): n
Partitionstyp
   p   Primär (0 primär, 0 erweitert, 4 frei)
   e   Erweitert (Container für logische Partitionen)
Wählen (Vorgabe p): e
Partitionsnummer (1-4, Vorgabe 1):
Erster Sektor (2048-16777215, Vorgabe 2048):
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (2048-16777215, Vorgabe 16777215):

Eine neue Partition 1 des Typs »Extended« und der Größe 8 GiB wurde erstellt.

Befehl (m für Hilfe): p
Festplatte /dev/sdb: 8 GiB, 8589934592 Bytes, 16777216 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0x23695331

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1        2048 16777215 16775168   8G  5 Extended


Befehl (m für Hilfe): n
Partitionstyp
   p   Primär (0 primär, 1 erweitert, 3 frei)
   l   Logisch (nummeriert ab 5)
Wählen (Vorgabe p): l

Logische Partition 5 wird hinzugefügt
Erster Sektor (4096-16777215, Vorgabe 4096):
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (4096-16777215, Vorgabe 16777215): +1M

Eine neue Partition 5 des Typs »Linux« und der Größe 1 MiB wurde erstellt.

Befehl (m für Hilfe): p
Festplatte /dev/sdb: 8 GiB, 8589934592 Bytes, 16777216 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0x23695331

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1        2048 16777215 16775168   8G  5 Extended
/dev/sdb5        4096     6143     2048   1M 83 Linux


Befehl (m für Hilfe): n
Partitionstyp
   p   Primär (0 primär, 1 erweitert, 3 frei)
   l   Logisch (nummeriert ab 5)
Wählen (Vorgabe p): l

Logische Partition 6 wird hinzugefügt
Erster Sektor (8192-16777215, Vorgabe 8192):
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (8192-16777215, Vorgabe 16777215): +2G

Eine neue Partition 6 des Typs »Linux« und der Größe 2 GiB wurde erstellt.

Befehl (m für Hilfe): p
Festplatte /dev/sdb: 8 GiB, 8589934592 Bytes, 16777216 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0x23695331

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1        2048 16777215 16775168   8G  5 Extended
/dev/sdb5        4096     6143     2048   1M 83 Linux
/dev/sdb6        8192  4202495  4194304   2G 83 Linux


Befehl (m für Hilfe): w

Die Partitionstabelle wurde verändert.
ioctl() wird aufgerufen, um die Partitionstabelle neu einzulesen.
Festplatten werden synchronisiert.

root@deb8-2:~#

Nun Kontrollieren wir die erfolgreiche Partitionierung:

root@deb8-2:~# ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Jan 27 12:58 /dev/sdb
brw-rw---- 1 root disk 8, 17 Jan 27 12:58 /dev/sdb1
brw-rw---- 1 root disk 8, 21 Jan 27 12:58 /dev/sdb5
brw-rw---- 1 root disk 8, 22 Jan 27 12:58 /dev/sdb6
root@deb8-2:~#

Es muss hierbei im Hintergrund so etwas wie partprobe gelaufen sein, um udev über die Änderungen zu informieren und anzuweisen, neue Gerätedateien zu erzeugen.

Als nächstes können auch schon Dateisysteme aufgebracht werden:

root@deb8-2:~# mkfs /dev/sdb1
mke2fs 1.42.12 (29-Aug-2014)
In /dev/sdb1 wurde eine dos-Partitionstabelle gefunden
Trotzdem fortfahren? (j,n)

root@deb8-2:~# mkfs /dev/sdb5
mke2fs 1.42.12 (29-Aug-2014)
Ein Dateisystems mit 262144 (4k) Blöcken und 65536 Inodes wird erzeugt.
UUID des Dateisystems: 39aead11-c212-4372-8933-fa7ea1070152
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

Diese neuen Dateisysteme wollen wir natürlich gleich einbinden:

root@deb8-2:~# mount /dev/sdb5 /mnt/
root@deb8-2:~#
root@deb8-2:~# mount | tail -3
tmpfs on /run/user/118 type tmpfs (rw,nosuid,nodev,relatime,size=102444k,mode=700,uid=118,gid=126)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=102444k,mode=700,uid=1000,gid=1000)
/dev/sdb5 on /mnt type ext2 (rw,relatime)
root@deb8-2:~#
root@deb8-2:~#
root@deb8-2:~# mke2fs -j  /dev/sdb6
mke2fs 1.42.12 (29-Aug-2014)
Ein Dateisystems mit 524288 (4k) Blöcken und 131072 Inodes wird erzeugt.
UUID des Dateisystems: 31c9d432-5648-4441-8067-e441a0f35f94
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Das Journal (16384 Blöcke) wird angelegt: erledgt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

root@deb8-2:~#

Wir lassen uns den aktuellen Stand der Arbeiten ausgeben:

root@deb8-2:~# fdisk -l /dev/sdb | grep ^/dev
/dev/sdb1          2048 16777215 16775168   8G  5 Extended
/dev/sdb5          4096  2101247  2097152   1G 83 Linux
/dev/sdb6       2103296  6297599  4194304   2G 83 Linux
root@deb8-2:~#

20.2.1. Swap-Space erweitern

Die zweite Partition /dev/sdb6 soll für swap-Nutzung umgewidmet werden:

  • Dateisystemtyp ändern: Von 83 (Linux: ext*, xfs, reiserfs, btrfs, jfs) auf 82 (Swap)

    • fdisk /dev/sdb ⇒ Taste "t" drücken, eine "6" eingeben, dann mit "L" alle Typen auflisten

  • Vor der Erweiterung den aktuellen Zustand feststellen:

    • free -h

    • swapon -s

  • Partition für swap vorbereiten:

    root@deb8-2:~# mkswap /dev/sdb6
    mkswap: /dev/sdb6: Warnung: Alte ext3-Signatur wird gelöscht.
    Auslagerungsbereich Version 1 wird angelegt, Größe = 2097148 KiB
    keine Bezeichnung, UUID=71e5903e-41f2-41f2-8a20-70c649a042be
    root@deb8-2:~#
  • Die swap-Partition zuschalten: swapon

    root@deb8-2:~# swapon -v /dev/sdb6
    swapon /dev/sdb6
    swapon: /dev/sdb6: Swap-Signatur gefunden: Version 1d, Seitengröße 4, Byte-Reihenfolge gleich
    swapon: /dev/sdb6: Seitengröße=4096, Swapgröße=2147483648, Gerätegröße=2147483648
    root@deb8-2:~#
  • Vor der Erweiterung den aktuellen Zustand feststellen: Wie oben free und swapon -s

  • Wieder freigeben der swap-Partition:

    root@deb8-2:~# swapoff -v /dev/sdb6
    swapoff /dev/sdb6
    root@deb8-2:~#

**NICHT VERGESSEN: Dies ist nur temporär, am Ende muss die Datei /etc/fstab bearbeitet werden!

20.2.2. Dateisystem erzeugen und benutzen

ZIEL: Auf einer weiteren Partition sollen 4 GB für spätere Nutzung für /opt bereitgestellt werden. Als Dateisystem zuerst bitte ext2 verwenden, später soll ein Journal hinzugefügt werden (ext3).

Die Schritte im Überblick:

  • Die zweite Festplatte partitionieren (ID = 83)

  • Dateisystem aufbringen

  • Temporär nach /mnt mounten (selbständig Erfolg prüfen mit zwei verschiedenen Tools)

Ausführung dieser 3 Schritte:

root@deb8-2:~# fdisk /dev/sdb

Willkommen bei fdisk (util-linux 2.25.2).
Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich
entscheiden, sie zu schreiben.
Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.


Befehl (m für Hilfe): n
Partitionstyp
   p   Primär (0 primär, 1 erweitert, 3 frei)
   l   Logisch (nummeriert ab 5)
Wählen (Vorgabe p): l

Logische Partition 7 wird hinzugefügt
Erster Sektor (6299648-16777215, Vorgabe 6299648):
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (6299648-16777215, Vorgabe 16777215): +4G

Eine neue Partition 7 des Typs »Linux« und der Größe 4 GiB wurde erstellt.

Befehl (m für Hilfe): p
Festplatte /dev/sdb: 8 GiB, 8589934592 Bytes, 16777216 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0x23695331

Device     Boot   Start      End  Sectors Size Id Type
/dev/sdb1          2048 16777215 16775168   8G  5 Extended
/dev/sdb5          4096  2101247  2097152   1G 83 Linux
/dev/sdb6       2103296  6297599  4194304   2G 82 Linux swap / Solaris
/dev/sdb7       6299648 14688255  8388608   4G 83 Linux


Befehl (m für Hilfe): w
Die Partitionstabelle wurde verändert.
ioctl() wird aufgerufen, um die Partitionstabelle neu einzulesen.
Das erneute Einlesen der Partitionstabelle ist fehlgeschlagen.: Das Gerät oder die Ressource ist belegt

Der Kernel benutzt noch die alte Tabelle. Die neue Tabelle wird beim nächsten Neustart verwendet werden oder
nachdem Sie partprobe(8) oder kpartx(8) ausgeführt haben.

root@deb8-2:~#

root@deb8-2:~# ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Jan 28 10:18 /dev/sdb
brw-rw---- 1 root disk 8, 17 Jan 28 10:18 /dev/sdb1
brw-rw---- 1 root disk 8, 21 Jan 28 10:18 /dev/sdb5
brw-rw---- 1 root disk 8, 22 Jan 28 10:18 /dev/sdb6
root@deb8-2:~#
root@deb8-2:~# partprobe
Warning: Unable to open /dev/sr0 read-write (Das Dateisystem ist nur lesbar). /dev/sr0 has been opened read-only.
Warning: Unable to open /dev/sr0 read-write (Das Dateisystem ist nur lesbar). /dev/sr0 has been opened read-only.
root@deb8-2:~#
root@deb8-2:~#
root@deb8-2:~# ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Jan 28 10:19 /dev/sdb
brw-rw---- 1 root disk 8, 17 Jan 28 10:19 /dev/sdb1
brw-rw---- 1 root disk 8, 21 Jan 28 10:19 /dev/sdb5
brw-rw---- 1 root disk 8, 22 Jan 28 10:19 /dev/sdb6
brw-rw---- 1 root disk 8, 23 Jan 28 10:19 /dev/sdb7        <===== Dank 'partprobe' wurde das Gerät erzeugt
root@deb8-2:~#

root@deb8-2:~# ### Jetzt erzeugen wir ext2 (ohne Journal) auf dreierlei Art:
root@deb8-2:~# mkfs /dev/sdb7
mke2fs 1.42.12 (29-Aug-2014)
Ein Dateisystems mit 1048576 (4k) Blöcken und 262144 Inodes wird erzeugt.
UUID des Dateisystems: 68fdb24b-e5f9-4edf-bcd2-8a0c4ef34edc
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

root@deb8-2:~#
root@deb8-2:~# mkfs -t ext2 /dev/sdb7
mke2fs 1.42.12 (29-Aug-2014)
/dev/sdb7 hat ein ext2-Dateisystem
        auf Thu Jan 28 10:21:23 2016
 erzeugtTrotzdem fortfahren? (j,n) j
Ein Dateisystems mit 1048576 (4k) Blöcken und 262144 Inodes wird erzeugt.
UUID des Dateisystems: 71254867-c4b3-403c-aebc-1340e15cbd23
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

root@deb8-2:~#
root@deb8-2:~# mke2fs  /dev/sdb7
mke2fs 1.42.12 (29-Aug-2014)
/dev/sdb7 hat ein ext2-Dateisystem
        auf Thu Jan 28 10:21:45 2016
 erzeugtTrotzdem fortfahren? (j,n) j
Ein Dateisystems mit 1048576 (4k) Blöcken und 262144 Inodes wird erzeugt.
UUID des Dateisystems: a13f6800-8a04-4b60-95b7-0a32f0b58ad7
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

root@deb8-2:~#
root@deb8-2:~# mount /dev/sdb7 /mnt/
root@deb8-2:~#
root@deb8-2:~# mount | tail -1
/dev/sdb7 on /mnt type ext2 (rw,relatime)
root@deb8-2:~#
root@deb8-2:~# df -h /mnt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb7       4,0G    8,0M  3,8G    1% /mnt
root@deb8-2:~#
root@deb8-2:~# ls -l /mnt/
insgesamt 16
drwx------ 2 root root 16384 Jan 28 10:22 lost+found
root@deb8-2:~#

20.2.3. Neue Partition für /opt verwenden

Problem: /opt lässt sich nicht umbenennen, um die neue Partition, die jetzt unter /mnt gemountet ist, anstelle dessen für /opt zu verwenden! Grund: Sie wird gerade benutzt, siehe das Listing offener Files:

  • lsof / | grep opt

  • fuser -mv /opt

  • ls -la /opt

⇒ Am besten sich eine Auszeit nehmen und in den sicheren Runlevel 1 wechseln, hier die Möglichkeiten bei Debian 8:

  • init 1

  • telinit 1

  • systemctl isolate runlevel1.target

  • reboot, dann den GRUB-Bootprompt editieren und dem Kernel eine "1" mitgeben (linux /boot/vmlinuz-VERSION ... root=... ... 1)

# In den abgesicherten Modus fahren
systemctl isolate runlevel1.target

# Das Originalverzeichnis umbenenn
mv /opt /opt.old
mkdir /opt

# Falls das Gerät noch von vorherigen Tests gemountet ist
umount /mnt

# Für robuste Gerätebezeichnungen Universally Unique Identifier benutzen
blkid /dev/sdb7 >> /etc/fstab

# File System Table editieren
vi /etc/fstab

Hier bitte Anpassen:

  • Einen Hash-Tag vor die lange Zeile setzen

  • Nach /dev/sdb7 einen Zeilenumbruch einfügen

  • Die Double Ticks (Gänsefüßchen) rings um die UUID entfernen

  • Die Zeile vervollständigen:

    # /dev/sdb7
    UUID=HEXWERT-OHNE-TICKMARKS  /opt  ext2  defaults   0 2

Die nächsten Schritte sind, das Ganze noch einmal zu kontrollieren, das Gerät zu mounten und die Daten auf dem neuen Volume bereitzustellen:

# Kontrolle
grep /opt /etc/fstab

# Jetzt mounten (alle Einträge der fstab, die nicht die Option 'noauto' aufweisen)
mount -a
df -h /opt
ls -la /opt

# Die originalen Daten herüberkopieren
cp -a /opt.old/* /opt

# In den grafischen Runlevel fahren
systemctl isolate runlevel5.target

Nach dem Wiedereinloggen auf der grafischen Oberfläche, den alten Ordner bitte nach ausgiebigen Tests noch mit \rm -r /opt.old löschen (der Backslash deaktiviert für den Moment der Ausführung einen möglicherweise vorhanden alias).

Damit ist die Aufgabenstellung der Datenmigration abgeschlossen.

20.2.4. Weitere Aufgaben

  • Betreffend /dev/sdb7: An das vorhande, in Benutzung befindliche ext2-Dateisystem ein Journal anfügen

  • Eine weitere Partition anlegen, die mit xfs zu formatieren ist

  • Auf die erste Partition der zweiten Festplatte das "Virtual File Allocation Table" Dateisystem aufbringen

Hier die drei Schritte relativ unkommentiert via Shell-Mitschnitt:

root@deb8-2:~# fdisk /dev/sdb

Willkommen bei fdisk (util-linux 2.25.2).
Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich
entscheiden, sie zu schreiben.
Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.


Befehl (m für Hilfe): n
Partitionstyp
   p   Primär (0 primär, 1 erweitert, 3 frei)
   l   Logisch (nummeriert ab 5)
Wählen (Vorgabe p): l

Logische Partition 8 wird hinzugefügt
Erster Sektor (14690304-16777215, Vorgabe 14690304):
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (14690304-16777215, Vorgabe 16777215):

Eine neue Partition 8 des Typs »Linux« und der Größe 1019 MiB wurde erstellt.

Befehl (m für Hilfe): p
Festplatte /dev/sdb: 8 GiB, 8589934592 Bytes, 16777216 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0x23695331

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sdb1           2048 16777215 16775168    8G  5 Extended
/dev/sdb5           4096  2101247  2097152    1G 83 Linux
/dev/sdb6        2103296  6297599  4194304    2G 82 Linux swap / Solaris
/dev/sdb7        6299648 14688255  8388608    4G 83 Linux
/dev/sdb8       14690304 16777215  2086912 1019M 83 Linux


Befehl (m für Hilfe): w
Die Partitionstabelle wurde verändert.
ioctl() wird aufgerufen, um die Partitionstabelle neu einzulesen.
Das erneute Einlesen der Partitionstabelle ist fehlgeschlagen.: Das Gerät oder die Ressource ist belegt

Der Kernel benutzt noch die alte Tabelle. Die neue Tabelle wird beim nächsten Neustart verwendet werden oder
nachdem Sie partprobe(8) oder kpartx(8) ausgeführt haben.

root@deb8-2:~#



root@deb8-2:~# ls -l /dev/sdb8
ls: Zugriff auf /dev/sdb8 nicht möglich: Datei oder Verzeichnis nicht gefunden
root@deb8-2:~#
root@deb8-2:~# partprobe
Warning: Unable to open /dev/sr0 read-write (Das Dateisystem ist nur lesbar). /dev/sr0 has been opened read-only.
Warning: Unable to open /dev/sr0 read-write (Das Dateisystem ist nur lesbar). /dev/sr0 has been opened read-only.
root@deb8-2:~#
root@deb8-2:~# ls -l /dev/sdb8
brw-rw---- 1 root disk 8, 24 Jan 28 11:50 /dev/sdb8
root@deb8-2:~#
root@deb8-2:~#


### Wie man sieht fehlen einfach nur die XFS-Werkzeuge (Der Kernel muss es freilich unterstützen!)
root@deb8-2:~# mkfs.
mkfs.bfs      mkfs.cramfs   mkfs.ext3     mkfs.ext4dev  mkfs.minix    mkfs.ntfs
mkfs.btrfs    mkfs.ext2     mkfs.ext4     mkfs.fat      mkfs.msdos    mkfs.vfat
root@deb8-2:~# mkfs.

### Also die Programme einfach installieren:
apt-get install xfsprogs


root@deb8-2:~# mkfs.xfs /dev/sdb8
meta-data=/dev/sdb8              isize=256    agcount=4, agsize=65216 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=260864, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =Internes Protokoll     bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =keine                  extsz=4096   blocks=0, rtextents=0
root@deb8-2:~#

root@deb8-2:~# mkfs.vfat -F32 /dev/sdb5
mkfs.fat 3.0.27 (2014-11-12)
root@deb8-2:~#

Benutzung der xfs-Partition als HOME für neue User (weil es natives Quota beherrscht)

  • Mountpunkt: /Users

  • fstab-Eintrag erzeugen und Gerät mounten

  • User mit $HOME auf dieser Partition erzeugen

    • useradd -m -d /Users/susi -s /bin/bash susi && passwd susi

Hier ist die Lösung:

root@deb8-2:~# mkdir /Users
root@deb8-2:~#
root@deb8-2:~# blkid /dev/sdb8 >> /etc/fstab
root@deb8-2:~#
root@deb8-2:~# tilde /etc/fstab
root@deb8-2:~#
root@deb8-2:~# tail -3 /etc/fstab

#/dev/sdb8:
UUID=2cc89fa8-1601-47eb-b356-ed0b804dad51  /Users  xfs  defaults  0 2
root@deb8-2:~#
root@deb8-2:~# mount -a
root@deb8-2:~#
root@deb8-2:~# mount | tail -1
/dev/sdb8 on /Users type xfs (rw,relatime,attr2,inode64,noquota)
root@deb8-2:~#

root@deb8-2:~# useradd -m -d /Users/susi -s /bin/bash scgsusi && passwd susi
Geben Sie ein neues UNIX-Passwort ein:
Geben Sie das neue UNIX-Passwort erneut ein:
passwd: Passwort erfolgreich geändert
root@deb8-2:~#
root@deb8-2:~# ls -la /Users/susi/
insgesamt 12
drwxr-xr-x 5 susi susi   92 Jan 28 12:19 .
drwxr-xr-x 3 root root   17 Jan 28 12:19 ..
-rw-r--r-- 1 susi susi  220 Nov 13  2014 .bash_logout
-rw-r--r-- 1 susi susi 3515 Nov 13  2014 .bashrc
drwxr-xr-x 2 susi susi    6 Jan 22 10:23 Desktop
drwxr-xr-x 2 susi susi    6 Jan 22 10:23 Musik
-rw-r--r-- 1 susi susi  675 Nov 13  2014 .profile
drwxr-xr-x 2 susi susi    6 Jan 22 10:23 Video
root@deb8-2:~#

### Testweise mal schnell root werden
root@deb8-2:~# su - susi
susi@deb8-2:~$
susi@deb8-2:~$ pwd
/Users/susi
susi@deb8-2:~$
susi@deb8-2:~$ id
uid=1004(susi) gid=1004(susi) Gruppen=1004(susi)
susi@deb8-2:~$
susi@deb8-2:~$ groups
susi
susi@deb8-2:~$ exit
Abgemeldet
root@deb8-2:~#

Benutzung der vfat-Partition als Austausch-Ordner für Windows-User (weil wir nicht den Tuxera-Treiber für rw-NTFS einsetzen wollen und der Kernel selbst es nicht unterstützt).

  • Mountpunkt: /media/austausch

  • fstab-Eintrag erzeugen und Gerät nicht automatisch mounten lassen: Der User möge es selber tun.) ⇒ defaults,noauto,user

  • Weiteren Handlungsbedarf gibt es beim Zeichensatzmapping für UTF-8 - ISO8559-1 (siehe http://www.heise.de/ct/hotline/Linux-vermatscht-Umlaute-326142.html)

    Und hier ist die Lösung:

    root@deb8-2:~# mkdir /media/austausch
    root@deb8-2:~#
    root@deb8-2:~# blkid /dev/sdb5 >> /etc/fstab
    root@deb8-2:~#
    root@deb8-2:~# tilde /etc/fstab
    root@deb8-2:~#
    root@deb8-2:~# tail -2 /etc/fstab
    #/dev/sdb5:
    UUID=490D-7B8A  /media/austausch vfat defaults,noauto,user,iocharset=utf8  0  0
    root@deb8-2:~#
    root@deb8-2:~# ### Jetzt hilft uns 'mount -a' nicht mehr (wegen "noauto"), deshalb:
    root@deb8-2:~#
    root@deb8-2:~# su - susi
    susi@deb8-2:~$
    susi@deb8-2:~$ df -h /media/austausch/
    Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
    /dev/sda5        28G    6,5G   20G   25% /
    susi@deb8-2:~$
    susi@deb8-2:~$ mount /media/austausch/
    susi@deb8-2:~$
    susi@deb8-2:~$ df -h /media/austausch/
    Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
    /dev/sdb5      1022M    4,0K 1022M    1% /media/austausch
    susi@deb8-2:~$
    susi@deb8-2:~$
    susi@deb8-2:~$
    susi@deb8-2:~$ #### Verwirrend, dass 'disk free' uns den Superblock via Angabe irgendeines
        Unterverzeichnisses ansprechen lässt:
    susi@deb8-2:~$ df -h /usr/share/doc/bash
    Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
    /dev/sda5        28G    6,5G   20G   25% /
    susi@deb8-2:~$
    susi@deb8-2:~$
    susi@deb8-2:~$ exit
    Abgemeldet
    root@deb8-2:~#

Abschließende Aufgaben:

21. Topic 104.2 - Maintain the integrity of filesystems

Siehe Seite 170 ff

21.1. Wichtige Tools für den Dateisystem-Check

  • fsck - file system check (= Frontend für verschiedene Dateisysteme, die einzelnen Tool sind z.B.

    • e2fsck

    • fsck.ext3

    • fsck.ext4

    • fsck.xfs

  • shutdown - Das Kommando ist in der Lage, mit der Option -f einen evl. anstehenden Check zu unterbinden, mit -F wird dagegen beim nächsten Startvorgang eine Prüfung erzwungen (Force).

Wichtige Optionen:

  • -f - force (erzwingen), wird erforderlich, wenn die per Default versuchte, automatische Reparatur fehlgeschlagen ist, z.B. könnte das so aussehen:

    root@deb8-2:~# fsck -f -n /dev/sdb7
    fsck von util-linux 2.25.2
    e2fsck 1.42.12 (29-Aug-2014)
    Warnung! /dev/sdb7 ist eingehängt.
    Durchgang 1: Inodes, Blöcke und Größen werden geprüft
    Durchgang 2: Verzeichnisstruktur wird geprüft
    Durchgang 3: Verzeichnisverknüpfungen werden geprüft
    Durchgang 4: Referenzzähler werden überprüft
    Durchgang 5: Zusammengefasste Gruppeninformation wird geprüft
    Die Anzahl freier Blöcke ist falsch (1030066, gezählt=989364).
    Reparieren? nein
    
    Die Anzahl freier Inodes ist falsch (262133, gezählt=259988).
    Reparieren? nein
    
    /dev/sdb7: 11/262144 Dateien (1254.5% nicht zusammenhängend), 18510/1048576 Blöcke
    root@deb8-2:~#
  • -n - no repair, dry run (für Tests gut, keine Garantie dass die Aussagen stimmen!), besser also: Dateisystem aushängen

  • -A - alle Dateisystem, die in der /etc/fstab beschrieben sind prüfen

  • -y - Alle Fragen nach "fixed?" automatisch mit yes beantworten

21.2. Tools für das Tuning und für Recovery

  • tune2fs - Tuningmöglichkeiten (S. 172 f)

    • Journal einem ext2-Dateisystem beifügen, Option: -j

    • Anzahl der max. Mountvorgänge: -c (count)

    • Intervall zwischen den Prüfungen [Tage]: -i (ohne Zeiteingabe wird die regelmäßige Überprüfung ausgeschaltet)

    • Den Zeitpunkt für den zuletzt stattgefunden Check manuell festlegen: -T <TIME>

  • dumpe2fs - einen Dateisystemdump erstellen, mit -h nur den Header ausgeben: dumpe2fs -h /dev/sdb7 | grep -i check

  • debugfs - ein interaktives Debugging und Recoverywerkzeug (Tipp: anstelle extundelete verwenden)

  • xfs_growfs - ein XFS-Dateisystem vergrößern

  • xfs_quota - Diskquotas für XFS einrichten

  • df -i - Anzeigen der freien Inodes (Dateiknotennummer), ACHTUNG: dummerweise wird eine feste Anzahl bei den ext-Dateisystemen reserviert:

    root@deb8-2:/opt# df -i .
    Dateisystem    Inodes IBenutzt  IFrei IUse% Eingehängt auf
    /dev/sdb7      262144     2156 259988    1% /opt
    root@deb8-2:/opt#
    root@deb8-2:/opt# df -h .
    Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
    /dev/sdb7       4,0G    167M  3,6G    5% /opt
    root@deb8-2:/opt#
    root@deb8-2:/opt# while true; do echo > datei-`date +%s`.txt; done
    root@deb8-2:/opt#

Parallel kann man in einem anderen Terminal Monitoring betreiben: watch -n1 -d df -i /opt/

22. Topic 104.3 - Control mounting and unmounting of filesystems

Wichtiges Grundwissen: Aufbau der Datei /etc/fstab:

#<Ressource>      <Mountpunkt>    <Dateisystemtyp>     <Optionen>    <Sichern mit dump?>    <Prüfen mit fsck?>
# Wurzel:
UUID=9f9e3961-38c4-4dc8-b809-88b063ea905a /               btrfs   defaults        0       1

# Optionale Daten:
UUID=a13f6800-8a04-4b60-95b7-0a32f0b58ad7  /opt  ext2  defaults 0 2

# Network File System - Freigabe:
10.0.0.1:/srv/backup      /media/backup    nfs      soft,bg     0   0

# Windows-Freigabe (SMB, samba-Server):
//10.0.0.1/backup      /media/samba        cifs     guest,noexec,nosuid,umask=777   0    0

Die Optionen lassen sich natürlich auch beim manuellen Mounten übergeben:

=> mount -o guest //10.0.0.1/backup /media/samba
=> mount -o remount,rw /       # Siehe "root-Passwort vergessen":  GRUB/Kernel-Parameter: `init=/bin/sh` ...

Aufgabe: Studieren Sie die mount-Optionen, siehe Seite 182 f:

  • auto

  • noauto

  • usrquota

  • grpquota

  • suid (Dateien mit erhöhen Rechten akzeptieren)

  • nosuid (Dateien mit erhöhen Rechten ignorieren)

  • exec

  • noexec

  • ro

  • rw

  • user (Ein beliebiger Nutzer darf diese Ressource mounten, wobei nur derjenige, welcher sie gemountet hatte, auch wieder aushängen kann.)

  • nouser

  • users (Ein beliebiger Nutzer darf diese Ressource mounten; hier dürfen auch x-beliebige sie wieder aushängen)

  • defaults (= rw,suid,dev, exec,auto,nouser,async)

  • sync (Schreiboperationen sofort synchronisieren, keinen Cache nutzen)

  • async (asynchron arbeiten, bei gelegener Zeit Cache auf Platte schreiben)

23. Topic 104.4 - Manage disk quotas

ZIEL: Speicherplatzkontingentierung für viele Nutzer auf einer /home-Partition

Siehe Seite 184 ff

Praktische Vorgehensweise:

23.1. Software installieren

Unter Debian ist dies schnell erledigt:

apt-get install quota

23.2. Datei /etc/fstab anpassen

Die zu reglementierende Partition muss in Feld 4 als weitere Option entweder usrquota, grpquota oder beides erhalten.

Danach muss die Partition neu eingehängt werden, um die Einstellung aktiv zu setzen. Hier lässt sich oft sehr gut mit der mount-Option remount arbeiten:

mount -o remount /opt

Im Beispiel hier mal die betreffenden Zeilen:

root@deb8-2:~# grep quota /etc/fstab
UUID=a13f6800-8a04-4b60-95b7-0a32f0b58ad7  /opt  ext2  defaults,grpquota 0 2
root@deb8-2:~#
root@deb8-2:~#
root@deb8-2:~#
root@deb8-2:~# mount | grep quota
/dev/sda8 on /home type xfs (rw,relatime,attr2,inode64,noquota)
root@deb8-2:~#
root@deb8-2:~# mount -o remount /opt
root@deb8-2:~#
root@deb8-2:~# mount | grep quota
/dev/sda8 on /home type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sdb7 on /opt type ext2 (rw,relatime,grpquota)       <<<<<----------- Jetzt taucht hier 'grpquota' auf!
root@deb8-2:~#

23.3. Prüfen und einrichten der Quotierung

Dies geschieht mit

quotacheck -avum [-g]   # => Datei /aquota.user [/aquota.group] wird dabei erstellt

In manchen Fällen ist es erforderlich, den Schalter -m (--no-remount) mitzunehmen, da ansonsten die Aktion fehlschlägt. Beim Check versucht nämlich dieses Kommando, die Partition read-only zu mounten.

root@deb8-2:~# quotacheck -agv
quotacheck: Prüfe /dev/sdb7 [/opt] fertig
quotacheck: Old user file name could not been determined. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file /opt/aquota.group: Datei oder Verzeichnis nicht gefunden. Usage
  will not be subtracted.
quotacheck: 546 Verzeichnisse und 1602 Dateien geprüft
quotacheck: Alte Datei nicht gefunden.
root@deb8-2:~#
root@deb8-2:~# ls -l /opt/
insgesamt 32
-rw------- 1 root root  6144 Jan 29 12:33 aquota.group
drwxr-xr-x 7 root root  4096 Jan 18 10:03 brackets
drwx------ 2 root root 16384 Jan 28 10:22 lost+found
drwxr-xr-x 9 root root  4096 Jan  7 12:57 VBoxGuestAdditions-4.3.34
root@deb8-2:~#

23.4. Quotas aktivieren

Je nachdem welche Quotaform man möchte, muss sie nun aktiviert werden:

=> quotaon -avu [-g]

In unserem Beispiel sieht das so aus:

root@deb8-2:~# quotaon -agv
/dev/sdb7 [/opt]: group Quotas angeschalten
root@deb8-2:~#

23.5. Ausflug ins Thema Benutzerverwaltung

root@deb8-2:~# groupadd technik
root@deb8-2:~#
root@deb8-2:~# useradd -m -g technik -G audio,video,lpadmin,plugdev -d /opt/heide heide
root@deb8-2:~# passwd heide
Geben Sie ein neues UNIX-Passwort ein:
Geben Sie das neue UNIX-Passwort erneut ein:
passwd: Passwort erfolgreich geändert
root@deb8-2:~#
root@deb8-2:~# ls -l /opt/
insgesamt 36
-rw------- 1 root  root     7168 Jan 29 12:33 aquota.group
drwxr-xr-x 7 root  root     4096 Jan 18 10:03 brackets
drwxr-xr-x 5 heide technik  4096 Jan 29 12:40 heide
drwx------ 2 root  root    16384 Jan 28 10:22 lost+found
drwxr-xr-x 9 root  root     4096 Jan  7 12:57 VBoxGuestAdditions-4.3.34
root@deb8-2:~#
root@deb8-2:~#
root@deb8-2:~# su - heide
$
$ bash
heide@deb8-2:~$
heide@deb8-2:~$ pwd
/opt/heide
heide@deb8-2:~$
heide@deb8-2:~$ quota
heide@deb8-2:~$
heide@deb8-2:~$ quota -g
Dateisystemquotas für group audio (gid 29): kein
Dateisystemquotas für group video (gid 44): kein
Dateisystemquotas für group plugdev (gid 46): kein
Dateisystemquotas für group lpadmin (gid 110): kein
Dateisystemquotas für group technik (gid 1005): kein
heide@deb8-2:~$
heide@deb8-2:~$ exit
$ exit
root@deb8-2:~#

23.6. Quotas für User/Group editieren

Allgemeine Syntax:

=> edquota -u max
=> [Für Gruppen-Quota: edquota -g users]

Hinweise zur Berechnung:

  • Als Einheit werden Blöcke in der Größe von 1kB angegeben.

  • Gehen wir von der Standard-Dateisystemblockgröße von 4096 Byte aus (siehe dumpe2fs -h /dev/sdb7| grep Block\ size), verbrauchen wir zwangläufig 4 Blöcke (zu je 1 kB), um eine winzige Datei von einem Byte speichern zu können:
    ⇒ echo > 1-byte-datei

  • 1MB beansprucht dann: 1kB * 1024 = 1024kB = 1024 Blöcke

  • Einfache Umrechnungshilfe: Angezeigte Blockgröße / 1024 = Größe in MB

Editieren wir nun als root die Gruppen-Quota und setzen testhalber einen Minimalwert, indem wir zum aktuellen Verbrauch (Spalte 2: Blöcke, im folgenden Beispiel 20) vier Blöcke hinzuaddieren. Am besten tun wir dies beim Soft- und Hardlimit gleichermaßen (weich = 24, hart = 24). Um einen kleineren Wert (z.B. 3 Blöcke) zu erhöhen, macht keinen Sinn - das Dateisystem gibt das 4-kByte-Raster vor!

Setzen wir dies nun praktisch um, sieht das so aus:

edquota -g technik

Wir befinden uns nun im Editiermodus, wobei der vorkonfigurierte Standardeditor aufgerufen wird
(Ein Ausweg wäre EDITOR=vi edquota -g technik):

Datenträgerquotas für group technik (gid 1005):
  Dateisystem                  Blöcke       weich      hart     Inodes     weich    hart
  /dev/sdb7                        20         24         24          5        0        0

Mit dieser Einstellung testen wir nun die Angelegenheit:

root@deb8-2:~# su - heide
$
$ bash
heide@deb8-2:~$ pwd
/opt/heide
heide@deb8-2:~$
heide@deb8-2:~$ ls -la
insgesamt 64
drwxr-xr-x 2 heide technik  4096 Jan 29 13:55 .
drwxr-xr-x 6 root  root    45056 Jan 29 12:40 ..
-rw------- 1 heide technik   303 Jan 29 13:33 .bash_history
-rw-r--r-- 1 heide technik   220 Nov 13  2014 .bash_logout
-rw-r--r-- 1 heide technik  3515 Nov 13  2014 .bashrc
-rw-r--r-- 1 heide technik   675 Nov 13  2014 .profile
heide@deb8-2:~$
heide@deb8-2:~$ echo > 1-byte-datei
heide@deb8-2:~$
heide@deb8-2:~$ echo > 1-byte-datei_No2
sdb7: write failed, group block limit reached.
bash: echo: Schreibfehler: Der zugewiesene Plattenplatz (Quota) ist überschritten.
heide@deb8-2:~$

23.7. Kontrolle der Einstellungen

  • Als User kann man sein Kontingent so prüfen: quota [-g]

  • root kann sich einen kompletten Report so ausgeben: repquota -a [-g]

23.8. Sicherheitshinweis

Wird mit Gruppen-Quotas gearbeitet, kann ein Benutzer die Restriktionen u.U. folgendermaßen überwinden:

  • Er schaut mit id nach, in welchen (sekundären) Gruppen er außerdem Mitglied ist und betritt sie mit newgrp <GRUPPE>.

    z.B.: 'newgrp audio' (per Default ohne Passwortabfrage möglich)
  • Mit dieser neuen primären Gruppe, für die es keine Beschränkung gibt, kann er nun wieder Daten ablegen!

Abhilfe: Entfernen des SUID-Bits von /usr/bin/newgrp (Damit schaltet man aber diesen Mechanismus komplett ab.)

24. Topic 104.5 - Manage file permissions and ownership

24.1. Zugriffsrechte im symbolischen Modus

Neben dem schon bekannten oktalen Modus, gibt es auch den symbolischen, der leichter bei einfachen Änderungen zu handhaben ist. In der Regel arbeitet er relativ zu dem bereits bestehenden Recht:

Z.B. ein Skript ausführbar machen:

echo "echo Hallo Welt..." > myworld.sh
chmod +x myworld.sh            # => -rwxr-xr-x     (ist die Kurzform von 'chmod a+x myworld.sh')

Möchte man, dass nur der Besitzer das Skript ausführen kann, müssen jetzt das x-Recht bei Gruppe und Others entziehen:

chmod go-x myworld.sh       # -rwxr--r--

Soll eine Datei keiner nutzen dürfen, kann das auf zweierlei Weise geschehen:

chmod ugo=--- myworld.sh
# Das folgende ist nur die Kurzform (leerer Wert bedeutet "auf Null setzen"):
chmod ugo= myworld.sh

24.2. Zugriffsrechte für Sonderfälle

Siehe Seite 193

Motivation: Gewisse Unix-Mechanismen würde ohne Sonder-Bits nicht funktionenen, z.B. könnte ein Benutzer sein Passwort nicht ändern.

24.2.1. Set User ID - mit Besitzerrechten ausführen

Beginnen wir mit dem ersten Sonderbit, das für erhöhte Rechte beim Ausführen eines Programmes sorgt: Der aufrufende, einfache Nutzer soll mit den Rechten arbeiten können, die sonst nur dem eingetragenen Besitzer zustehen würden.

ls -l /usr/bin/passwd      #  Man beachte das 's' bei User  anstelle des 'x':     rwsr-xr-x

Weil das s bei User steht, bezeichnet man dies als Set User ID Bit (SUID).

Im praktischen Falle bedeutet dies, dass ein Nutzer die /etc/shadow nur dank dem SUID-Sonderbit ändern kann.

Wie setzt man das SIUD-Bit?

a) chmod 4755  /usr/bin/passwd
b) chmod u+s /usr/bin/passwd

Hier die im Zusammenhang stehenden Dateien und ihre Rechte:

root@deb8-2:~# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54192 Nov 18 09:11 /usr/bin/passwd
root@deb8-2:~

root@deb8-2:~# echo UNIX User DBMS:  ;  ls -l /etc/passwd /etc/shadow  /etc/group
UNIX User DBMS:
-rw-r--r-- 1 root root   1339 Feb  2 09:01 /etc/group
-rw-r--r-- 1 root root   2966 Feb  2 09:02 /etc/passwd
-rw-r----- 1 root shadow 2172 Feb  2 08:56 /etc/shadow
root@deb8-2:~#

24.2.2. Set Group ID - mit Gruppenrechten ausführen

Es wird benötigt, um erhöhte Aufgaben mit den Rechten einer bestimmten Gruppe auszuführen, beispielsweise Nachrichten auf Tele Types senden:

Kein anderer Nutzer könnte Mitteilungen auf mein Terminal senden bei dieser Rechtesituation (Lesen und Schreiben ist nur für mich selbst zulässig!)

tux@deb8-2:~$
tux@deb8-2:~$ tty
/dev/pts/0
tux@deb8-2:~$
tux@deb8-2:~$ ls -l /dev/pts/0
crw------- 1 tux tty 136, 0 Feb  2 10:57 /dev/pts/0
tux@deb8-2:~$

Der Schlüssel für das Problem liegt in den Sonderrechten des ausführbaren Programmes, mittels dessen wir dies nur bewerkstelligen werden:

tux@deb8-2:~$ ls -lL /usr/bin/wall  /usr/bin/write
-rwxr-sr-x 1 root tty 27232 Mär 30  2015 /usr/bin/wall
-rwxr-sr-x 1 root tty 14592 Okt 17  2014 /usr/bin/write
tux@deb8-2:~$

Bitte beachten: Entscheidend ist die Gruppenzuordnung der Applications zu tty bei gleichzeitigem Setzen des s-Bits beim Gruppenzugriffsrecht.

Und natürlich können das SUID- und das SGID-Bit gleichzeitig vorkommen:

tux@deb8-2:~$ find /usr/bin -perm 6755
/usr/bin/X
/usr/bin/at
/usr/bin/procmail
tux@deb8-2:~$

Der Sinn dahinter ist z.B. beim Zeitplaner at, Spool-Jobs unter /var/spool/cron/ verwalten zu können. Die Rechte sehen bei Debian so aus:

drwxrwx--T 1 daemon daemon  36 Feb  2 10:48 atjobs

Wir sehen hier ein T bei Others, was uns zum nächsten Sonderbit, dem Sticky-Bit führt.

24.2.3. Sticky Bit - nur der Besitzer/Ersteller darf modifizieren

Bedeutung: "klebrig" — es wurde früher Applications mitgegeben, die nicht aus dem Arbeitsspeicher verdrängt werden, sondern dort kleben bleiben sollten.

Heute wird es für eine Art Austausch-Verzeichnis eingesetzt, das erst einmal Schreibrechte für alle ermöglicht, wobei es dann einschränkend wirkt: Nur der Besitzer/Ersteller darf seine Files modifizieren (auch wenn er den Fehler begehen würde, Others Schreibrechte zu geben) Es ignoriert im Prinzip die gesetzten Rechte bei Group und Others.

Im Praxisbeispiel:

tux@deb8-2:~$ ls -ld /tmp/ /var/tmp/
drwxrwxrwt 1 root root 462 Feb  2 11:45 /tmp/
drwxrwxrwt 1 root root 160 Feb  2 07:51 /var/tmp/
tux@deb8-2:~$

Wollen wir die Auswirkungen testen, dann legen wir mit anderer Nutzerkennung Files an, und versuchen sie als anderer User zu bearbeiten:

  • Als Standardnutzer tux: echo Zeile 1 > /tmp/vonTux

  • Als linus: echo Zeile 2 >> /tmp/vonTux (FEHLER: Keine Schreibrechte!)

  • Als root: chmod o-t /tmp (Die Sicherheitsbarriere wird entfernt)

  • Als linus den Versuch von b) wiederholen… (Funktioniert jetzt)

  • Am Schluss bitte wieder als root das sticky-Bit hinzufügen mit chmod o+t /tmp, alternativ: chmod 1777 /tmp

In der Umsetzung sieht das so aus:

tux@deb8-2:~$ echo Zeile 1 > /tmp/vonTux
tux@deb8-2:~$ chmod 646 /tmp/vonTux
tux@deb8-2:~$ ls -l /tmp/vonTux
-rw-r--rw- 1 tux tux 8 Feb  2 12:27 /tmp/vonTux
tux@deb8-2:~$
tux@deb8-2:~$ su - linus
Passwort:
$ echo Zeile 2 >> /tmp/vonTux
$
$ rm /tmp/vonTux
rm: das Entfernen von „/tmp/vonTux“ ist nicht möglich: Die Operation ist nicht erlaubt
$
$ cat /tmp/vonTux
Zeile 1
Zeile 2
$
$ exit
tux@deb8-2:~$ /bin/su -
Passwort:
root@deb8-2:~# ls -ld /tmp
drwxrwxrwt 1 root root 474 Feb  2 12:24 /tmp
root@deb8-2:~# chmod o-t /tmp
root@deb8-2:~# ls -ld /tmp
drwxrwxrwx 1 root root 474 Feb  2 12:24 /tmp
root@deb8-2:~# exit
Abgemeldet
tux@deb8-2:~$ su - linus
Passwort:
$ rm /tmp/vonTux
$
$ echo 'Ätsch: ' ; ls -l /tmp/vonTux
Ätsch:
ls: Zugriff auf /tmp/vonTux nicht möglich: Datei oder Verzeichnis nicht gefunden
$ exit
tux@deb8-2:~$ /bin/su -
Passwort:
root@deb8-2:~# chmod o+t /tmp
root@deb8-2:~# ls -ld /tmp
drwxrwxrwt 1 root root 462 Feb  2 12:31 /tmp
root@deb8-2:~# exit
Abgemeldet
tux@deb8-2:~$

Ein gutes Dokument, was u.a. dieses Sticky-Bit gut erklärt, ist hier zu finden: http://ruban.de/wp-content/uploads/2012/02/Unix-s-bit-and-t-bit.pdf

24.3. Standardrechte für neue Files

Motivation: Wieso haben neue Dateien das Recht 644, neue Verzeichnisse aber 755?

Das Kommando umask stellt Standardrechte zur Verfügung, die eine Negativmaske zu den eigentlichen Rechtebits darstellt. Mathematisch werden die Zahlen negiert und mit UND verknüpft.

Einfacher Ausgangspunkt: Das Executable-Recht muss für Dateien immer entfernt werden, es könnten ja die englischen Wörter in der Shell eine Sonderbedeutung als Kommando haben!

a) Maximalrecht einer Datei: 666

b) Maximalrecht eines Verzeichnisses: 777

Davon wird nun der umask-Wert abgezogen, was herauskommt ist der tatsächliche Wert der neuen Dateisystemobjekte.

Beispiel Standard-umask-Wert 022:

a) Datei (Minus eins, tiefer als 0 ist nicht zulässig, ist das x-Recht schon abgezogen, gibt es kein -1)

   666
 - 022
--------
   644
========

b) Verzeichnis (Maximalwert: 7)

   777
 - 022
--------
   755
========

Je nach Distribution wird umask an anderen Stellen gesetzt, ursprünglich war die /etc/profile dafür gedacht, heute findet sich die Einstellung meist in der /etc/login.defs (UMASK 022). Eigene Einstellungen können diesen Wert natürlich überschreiben, eine Möglichkeit ist die Datei ~/.profile.

24.4. Praxisübung

Temporär soll die Umask so gesetzt werden, dass KEINE Rechte für künftige neue Dateisystemobjekte gesetzt sind.

tux@deb8-2:~$ umask
0022
tux@deb8-2:~$ umask 027
tux@deb8-2:~$
tux@deb8-2:~$ touch datei-01
tux@deb8-2:~$ mkdir verzeichnis-01
tux@deb8-2:~$
tux@deb8-2:~$ ls -ld datei-01 verzeichnis-01/
-rw-r----- 1 tux tux 0 Feb  3 10:40 datei-01
drwxr-x--- 2 tux tux 6 Feb  3 10:40 verzeichnis-01/
tux@deb8-2:~$

Setzen Sie einen passenden umask-Wert, der dem Besitzer nur Lesen und Ausführen gibt, Gruppenmitgliedern Lesen, Schreiben und Ausführen, der Rest erhält kein Recht.

=> umask 207

Erweitern Sie die Aufgabenstellung, so dass Dateien explizit Ausführungsrechte erhalten.

=> umask 107

ACHTUNG: Das bringt das Schreibrecht für den Besitzer, was nicht gewollt war. (7-1=6)! Diese Aufgabe lässt sich nicht umsetzten, da bei Dateien automatisch -1 gerechnet wird.

Umask         Created Files                 Created Directories
-------------------------------------------------------------
000         666 (rw-rw-rw-)      777         (rwxrwxrwx)
002         664 (rw-rw-r--)      775         (rwxrwxr-x)
022         644 (rw-r--r--)      755         (rwxr-xr-x)
027         640 (rw-r-----)      750         (rwxr-x---)
077         600 (rw-------)      700         (rwx------)
277         400 (r--------)      500         (r-x------)

24.5. Eigentümerschaft von Files ändern

⇒ Siehe Seite 195 f

Das Kommando chgrp zum Ändern der Gruppenzugehörigkeit wird eher selten eingesetzt, weil man sowohl den Eigentümer wie auch den Gruppenbesitz mit dem Kommando chown ändern kann:

root@deb8-2:~# chgrp audio /home/tux/Austausch
root@deb8-2:~#
root@deb8-2:~# ls -ld /home/tux/Austausch
drwxr-xr-x 2 root audio 6 Feb  3 11:39 /home/tux/Austausch
root@deb8-2:~#
root@deb8-2:~# chown .video /home/tux/Austausch
root@deb8-2:~#
root@deb8-2:~# ls -ld /home/tux/Austausch
drwxr-xr-x 2 root video 6 Feb  3 11:39 /home/tux/Austausch
root@deb8-2:~#
root@deb8-2:~# chown :plugdev /home/tux/Austausch
root@deb8-2:~#
root@deb8-2:~# ls -ld /home/tux/Austausch
drwxr-xr-x 2 root plugdev 6 Feb  3 11:39 /home/tux/Austausch
root@deb8-2:~#

Gibt es Inhalte, die auch mit bearbeitet werden sollen, muss die Option -R (Großes R!) Verwendung finden:

root@deb8-2:~# cp -v /etc/host* /home/tux/Austausch
„/etc/host.conf“ -> „/home/tux/Austausch/host.conf“
„/etc/hostname“ -> „/home/tux/Austausch/hostname“
„/etc/hosts“ -> „/home/tux/Austausch/hosts“
„/etc/hosts.allow“ -> „/home/tux/Austausch/hosts.allow“
„/etc/hosts.deny“ -> „/home/tux/Austausch/hosts.deny“
root@deb8-2:~#
root@deb8-2:~# ls -l /home/tux/Austausch
insgesamt 20
-rw-r--r-- 1 root root   9 Feb  3 11:42 host.conf
-rw-r--r-- 1 root root   7 Feb  3 11:42 hostname
-rw-r--r-- 1 root root 247 Feb  3 11:42 hosts
-rw-r--r-- 1 root root 411 Feb  3 11:42 hosts.allow
-rw-r--r-- 1 root root 711 Feb  3 11:42 hosts.deny
root@deb8-2:~#
root@deb8-2:~# chown -R tux /home/tux/Austausch/
root@deb8-2:~#
root@deb8-2:~# ls -l /home/tux/Austausch
insgesamt 20
-rw-r--r-- 1 tux root   9 Feb  3 11:42 host.conf
-rw-r--r-- 1 tux root   7 Feb  3 11:42 hostname
-rw-r--r-- 1 tux root 247 Feb  3 11:42 hosts
-rw-r--r-- 1 tux root 411 Feb  3 11:42 hosts.allow
-rw-r--r-- 1 tux root 711 Feb  3 11:42 hosts.deny
root@deb8-2:~#

#   => Wird nach dem Punkt oder Doppelpunkt keine Gruppe explizit benannt,
#      setzt das Kommando 'chown' automatisch die primäre Gruppe ein:
root@deb8-2:~# chown -R tux: /home/tux/Austausch/
root@deb8-2:~#
root@deb8-2:~# ls -l /home/tux/Austausch
insgesamt 20
-rw-r--r-- 1 tux tux   9 Feb  3 11:42 host.conf
-rw-r--r-- 1 tux tux   7 Feb  3 11:42 hostname
-rw-r--r-- 1 tux tux 247 Feb  3 11:42 hosts
-rw-r--r-- 1 tux tux 411 Feb  3 11:42 hosts.allow
-rw-r--r-- 1 tux tux 711 Feb  3 11:42 hosts.deny
root@deb8-2:~#

24.6. Einen Nutzer ohne Werkzeuge wie useradd und passwd aus dem Standard-Nutzer tux erzeugen

Schritt 1: Es beginnt mit dem Bearbeiten der Benutzerdatenbankdateien, wobei wir das auf sichere Art tun wollen, nämlich über einen im Hintergrund laufenden Locking-Mechanismus.

Kommando: vipw

Für Einsteiger sollen an dieser Stelle die Kommandos für das Bearbeiten im vi mitgegeben werden:

    /^tux

    yy

    p

    Mit 'l' auf Zeile 4 wandern

    i    (INSERT), eine 2 an tux anfügen:   tux2

    ESC

    Mit 'l' weiterwandern: Ziel: User-ID auf 1200 ändern

    ESC

    Mit 'l' wieder weiterwandern: Ziel: Heimatverzeichnis auf  /home/tux2  ändern

    ESC

    :wq!

Nun muss entspechend auch die dazugehörige Datei /etc/shadow sicher bearbeitet werden:

Kommando: vipw -s

⇒ Nun das Ganze synonym zu oben anpassen, dh.

  • Wieder die Zeile von tux kopieren

  • Den Nutzernamen von tux auf tux2 ändern.

Schritt 2: Heimatverzeichnis erzeugen und mit Standardinhalt befüllen

mkdir /home/tux2
cd /etc/skel
find | cpio -pdm /home/tux2

Schritt 3: Berechtigungen rekursiv anpassen:

root@deb8-2:~# chown -R -v tux2:  /home/tux2
der Eigentümer von „/home/tux2/.bash_logout“ wurde von root:root in tux2:tux geändert
der Eigentümer von „/home/tux2/.bashrc“ wurde von root:root in tux2:tux geändert
der Eigentümer von „/home/tux2/.profile“ wurde von root:root in tux2:tux geändert
der Eigentümer von „/home/tux2/Desktop“ wurde von root:root in tux2:tux geändert
der Eigentümer von „/home/tux2/Musik“ wurde von root:root in tux2:tux geändert
der Eigentümer von „/home/tux2/Video“ wurde von root:root in tux2:tux geändert
der Eigentümer von „/home/tux2“ wurde von root:root in tux2:tux geändert
root@deb8-2:~#

Schritt 4: Jetzt bitte noch Funktionstests durchführen:

  1. Klappt der Login mit tux2 und dem Passwort von tux?
    Kommando: su - tux2

  2. Kann tux2 in /home/tux2 Daten ablegen? Kommando: pwd && echo 456 >> datei && echo OK.
    Alternativ: pwd && echo 456 >> datei || echo Es ist etwas schiefgegangen

Troubleshooting

Sind die Datenbankeinträge OK?

root@deb8-2:~# grep tux2 /etc/passwd /etc/shadow
/etc/passwd:tux2:x:1200:1000:tux,,,:/home/tux2:/bin/bash
/etc/shadow:tux2:$6$SqfMZVZl$lmlVxeConR8hautrtW9eADNMergNUnikPIu0/6kKtQhEdS...m6e/:16834:0:99999:7:::
root@deb8-2:~#

Gibt es das Heimatverzeichnis mit den passenden Rechten?

Was macht die folgende Kommandozeile im Detail? Hinweis: Zwischen den Back Tick Marks ist eine Kommandozeilensubstitution eingebettet.

root@deb8-2:~# ls -ld `cut -d: -f6 /etc/passwd | grep tux2`
drwxr-xr-x 5 tux2 tux 104 Feb  3 12:16 /home/tux2
root@deb8-2:~#

Außerdem gibt es noch das Kommando pwck, um die Datenbankdateien auf korrekte Syntax zu prüfen.

24.7. Dateiattribute als weitere Möglichkeit, Berechtigungen zu verwalten

Einige Dateisysteme, u.a natürlich btrfs, gestatten die Nutzung von Attributen, wie

Immutable

Eine Änderung ist nicht mal von root möglich, Rechte setzen mit der Option +i

Append only

Nur Anhängen ist möglich, Rechte setzen mit der Option +a

Directory updates sync

Verzeichnisänderungen synchron auf HDD schreiben, Option: +D

Benutzung im Beispiel:

tar czf /root/etc-backup-`date +%F_%H:%M`.tar.gz /etc
chattr +i *backup*
lsattr  *backup*

Dieses Immutable-Recht kann mit -i wieder entfernt werden, geht es um eine ganze Verzeichnisstruktur, wo in einem unbekannten Verzeichnis eine solch immunisierte Datei liegt, dann kann zusätzlich -R verwendet werden, was aber einem groben überbügeln entspricht.

Frage: Kann find evl. schon diese Attribute finden: man find | grep -i -B3 -A3 attr

Wir erhalten keine Ausgabe; das bedeutet also nein: Wie es scheint, lässt sich so einfach nicht danach suchen.

Siehe Seite 199 ff

Es gibt zwei Arten von Links, die Hinweisschilder auf die eigentlichen Dateien bzw. Verzeichnisse darstellen.

Hard-Links
  • Vom Prinzip her handelt es sich nur um weitere Namen für ein und dieselbe Datei, dh. es wird kein zusätzlicher Speicherplatz auf dem Datenträger benötigt. Daraus ergibt sich, dass sie nicht partitionsübergreifend angelegt werden können.

  • Sie sind Grundlage für die Konstruktion von Verzeichnisstrukturen, so sieht man immer bei Verzeichnissen die Anzahl von Hardlinks als Unterverzeichniszähler.

  • Eine Verwendung von Hardlinks anstelle von Symlinks scheint nicht immer plausibel zu sein, betrachtet man aber das Dateisystem als Datenbank, in der es keine unnötigen Redundanzen geben soll, hilft das Hardlinken dabei, ein konsistentes System zu erhalten. Siehe auch unten bei "speicherschonende Snapshots" (cp -al …).

  • Hardlinks können nicht auf Verzeichnisse gesetzt werden.

Symbolische Links
  • Hier handelt es sich um die bestens bekannten Verküpfungen, die als Zeiger auf ein Verknüpfungsziel zeigen.
    Man kann sie sich auch als Knauf für einen bequemen Zugriff vorstellen.

  • Anders als bei Hardlinks ist hier partitions- und netzwerkübergreifende Arbeitsweise möglich.

  • Symlinks lassen sich unter bestimmten Umständen verschieben (mittels relativer Pfade angelegt).

  • Sie können sowohl auf Dateien wie auch auf Verzeichnisse gesetzt werden.

Grundsätzlich benötigen Dateisystemstrukturen (Stichwort: Filesystem Hierarchy Standard "HFS") Hardlinks, um Unterverzeichnisse zu referenzieren, damit schließlich auch ein cd .. funktioniert:

tux@deb8-2:~$ mkdir Container
tux@deb8-2:~$
tux@deb8-2:~$ ls -ld Container/
drwxrwxr-x 2 tux tux 6 Feb  4 10:23 Container/
tux@deb8-2:~$
tux@deb8-2:~$
tux@deb8-2:~$ ls -la Container/
insgesamt 8
drwxrwxr-x  2 tux tux    6 Feb  4 10:23 .
drwxr-xr-x 58 tux tux 4096 Feb  4 10:23 ..
tux@deb8-2:~$
tux@deb8-2:~$ mkdir Container/Kiste
tux@deb8-2:~$
tux@deb8-2:~$ ls -ld Container/
drwxrwxr-x 3 tux tux 18 Feb  4 10:23 Container/
tux@deb8-2:~$
tux@deb8-2:~$
tux@deb8-2:~$ cd Container/Kiste/
tux@deb8-2:~/Container/Kiste$
tux@deb8-2:~/Container/Kiste$ cd ..
tux@deb8-2:~/Container$
tux@deb8-2:~/Container$ cd ..
tux@deb8-2:~$
tux@deb8-2:~$ cd ..
tux@deb8-2:/home$
tux@deb8-2:/home$ cd ..
tux@deb8-2:/$

Erzeugen von Hardlinks am Beispiel (aus einem alten Windows NT Lehrbuch):

Ein Henkeltöpfchen mit zwei Anfassern
Bild 1: Ein Henkeltöpfchen mit zwei Anfassern
tux@deb8-2:~$ echo Spieglein, Spieglein... > spieglein
tux@deb8-2:~$  ln spieglein spiegel
tux@deb8-2:~$ ls -li spieg*        # WICHTIG: Beide Dateien haben die selbe Inode-Nummer
3760 -rw-rw-r-- 2 tux tux 24 Feb  4 10:28 spiegel
3760 -rw-rw-r-- 2 tux tux 24 Feb  4 10:28 spieglein
tux@deb8-2:~$

Eine weitere Einsatzmöglichkeit sind speicherschonende Snapshots (Kein Backupersatz!!). Dies kann vor größeren Auf- und Umräumaktionen sinnvoll sein, um vor ungewollten Datenverlust gewappnet zu sein.

cp -al Dokumente Dokumente.hardlinked

Erzeugen von symbolischen Links (Fortsetzung des obigen Beispiels aus dem alten Windows NT Lehrbuch):

Ein Henkeltöpfchen mit seinem Wegweiser
Bild 2: Ein Henkeltöpfchen mit seinem Wegweiser
tux@deb8-2:~$ ln -s spieglein mirror
tux@deb8-2:~$
tux@deb8-2:~$
tux@deb8-2:~$ ls -li spieg* mirror
2648738 lrwxrwxrwx 1 tux tux  9 Feb  4 10:53 mirror -> spieglein     # 'mirror' ist eine separate Datei
   3760 -rw-rw-r-- 2 tux tux 24 Feb  4 10:28 spiegel                 #    mit eigener Inode
   3760 -rw-rw-r-- 2 tux tux 24 Feb  4 10:28 spieglein
tux@deb8-2:~$

In der Praxis werden bestimmte Gerätedateien gerne über allgemeine Symlinks angesprochen:

# CDROM/DVD-Laufwerk (Brenner)
ln -s /dev/sr0 /cdv/cdrom

# Modem an COM 1
ln -s /dev/ttyS0 /dev/modem

26. Topic 104.7 - Find system files and place files in the correct location

Seite 204 ff

Ziel: Lage und Bezeichnung wichtiger Verzeichnispfade kennen und mit Tools herausfinden

26.1. Filesystem Hierarchy Standard (FHS)

Grundsätzlich unterscheidet man 3 Ebenen:

  • Wurzel (/): /bin, /sbin, /lib, /etc

  • Unix System Ressources (statisch): /usr/bin, /usr/sbin, /usr/lib (/usr kann read-only gemountet werden)

  • Unix System Ressources, eigene Software (statisch): /usr/local/bin, /usr/local/sbin, /usr/local/lib, /usr/local/etc

Wichtige Verzeichnisse, die gesichert werden sollten:

  • Alle Nutzerdatenverzeichnisse: /home, /var/mail, /var/spool/mail, /tmp

  • Alle Serverfreigabeverzeichnisse: /srv

  • Konfigurationen: /etc, /usr/local/etc, /opt

  • Betriebssystemdaten: /bin, /sbin, /lib*, /boot, /etc, /usr, /root, /var

Sinnvollerweise brauchen NICHT gesichert werden: /proc, /sys, /run, /tmp

26.2. Suchen nach Dateisystemobjekten

a) Langsame Just-in-Time-Suche mit find (siehe man-Page)

b) Schnelle Datenbank-basierte Suche: locate / updatedb

  • Paketname: slocate = Secure locate, damit einfache Nutzer nicht die Daten anderer angezeigt bekommen

  • Aktualieren des Indizes: updatedb (nice +19 updatedb &)

  • Speicherort des Datenbank-Indizes: /var/lib/locatedb (Debian: /var/lib/mlocate/mlocate.db)

  • Konfiguration von nicht mit zu indizierenden Verzeichnissen: /etc/updatedb.conf

    • EINSTELLUNG: PRUNEPATHS="/tmp /var/spool /media"

    • Ist es möglich, mit Pattern wie z.B. *BACKUP* zu arbeiten? man 5 updatedb.conf
      Leider nein: "Each path name must be exactly in the form in which the directory would be reported by locate(1)."

    • Dann eben einzeln: PRUNEPATHS="/tmp /var/spool /media /BACKUP /boot/BACKUP /var/BACKUP"

26.3. Einen eigenen Index als einfacher Benutzer erzeugen und nutzen

⇒ Siehe man 8 updatedb, dieses Fallbeispiel ist dort im Prinzip beschrieben:

  • updatedb --require-visibility 0 --database-root /home/tux --output /home/tux/.my_locatedb

  • locate --database /home/tux/.my_locatedb .bashrc
    ⇒ dies findet /home/tux/.bashrc