LPI 101 Vorbereitung

Grundlagen Linux

Kurs: Vorbereitung auf das Zertifikat LPI 101

Installation I (Debian mit KDE-Oberfläche)

Voraussetzungen:

So ist für die 64-bit-Plattform derzeit dieses Abbild aktuell (Stand: Februar 2017): http://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-8.7.1-amd64-kde-desktop.iso

ACHTUNG: Falls in VirtualBox nur 32-bit-Gastsysteme angelegt werden können, sind im BIOS des Rechners sehr wahrscheinlich die VT-Extensions nicht aktiviert worden. Siehe dazu https://www.thomas-krenn.com/de/wiki/Virtualisierungsfunktion_Intel_VT-x_aktivieren Alternativ kann man sich einfach eine 32-bit Version downloaden und diese anstelle dessen benutzen.

Nun starten wir die vorhin installierte Virtualsierungsumgebung VirtualBox und erstellen uns dort ein neues Gast-Betriebssystem:

  • Schalter „Neu“

  • Name: Debian (Bevorzugter Typ: „Linux 64-bit“)

  • RAM: 1800 MB

  • Festplatte erzeugen (VDI, dynamisch alloziiert, Größe belassen: 8 GB)

  • Schalter „Start“

  • Als Boot-Medium die eben heruntergelade Live-CD einlegen…

Im nunmehr gebooteten Live-System können wir uns ein bisschen umschauen und dann das Betriebssystem fest installieren:

  • Im K-Menü nach ‚install‘ suchen…

  • Danach „Install Debian Jessie“ anklicken

  • Wir wählen:

    • „German“, „Deutschland“, „Deutsch“

    • Hostname: „d8“

    • Weiter, Weiter.

    • Root-Passwort: t00r

    • Benutzer „tux“ anlegen (Passwort geleichlautend wählen)

    • Zeitzone: Berlin

    • Partitionierung: - Geführt - vollständige Festplatte - SCSI3 (weiter…) - Alle Daten auf eine Partition - Partitionierung beenden / übernehmen - Nochmals bestätigen: JA

    • Kopieren des Grundsystems… - Netzwerkspiegel verwenden: Ja - Deutschland - Mirror wählen (Esslingen) - <KEIN PROXY>

    • Installation abschließen, Installationsort für Bootloader GRUB: - per Mausklick „Ja“ auswählen - Gerät „/dev/sda“ auswählen

  • Neustart ohne Boot-DVD durchführen - Im VirtualBox-Gastfenster unter „Geräte“, „Optische Laufwerke“, „Medium entfernen“ - Affengriff via „Eingabe“, „Tastatur“ => „Einfügen „CTRL-ALT-Del“ senden

Das System erkunden

K-Menü => Leave => Log out

Wir testen: Kennt der verwendete Display-Manager eine Option zur Einstellung der Menüsprache?

=> Beim ‚kdm‘ (KDE Display Manager) leider Nein!

Nun soll Software nachinstalliert werden…

Software nachinstallieren

In dem X-Terminal ‚konsole‘ (via K => Search => „konso“)

  • „STRG“ + „+“

  • Administrator-Identität annehmen (Unix: „root“): /bin/su -

    (Das Programm namens „switch user“ bitte mit absolutem Pfad ausführen, wobei der einzelne Bindestrich für ‚-l‘ (login-shell) steht, d.h. die Umgebung wird komplett zum dem jeweilingen User geswitcht (wichtig auch für die Autovervollständigung mit der Tabulator-Taste)

  • Installation des Paketes ‚kde-l10n-de‘:

    $ apt-get install kde-l10n-de
    

Bevor weitere Software installiert wird, bitte einen Sicherungspunkt erstellen:

  • Im VirtualBox-Fenster unter „Maschine“ => „Sicherungspunkt erstellen“ => dabei bitte einen sprechenden Namen vergeben

Installieren der Engl./Deutsch-Wörterbuches ‚ding‘:

$ apt-get install ding

Nun starten wir das Programm ALS EINFACHER NUTZER (konsole => Datei => Neues Fenster): ding &

VirtualBox-Gasterweiterungen in Debian installieren

Bei Debian 12 ist es nach wie vor wichtig, vorher die passenden Module bauen zu lassen:

apt-get install dkms build-essential linux-headers-$(uname -r)

Siehe dazu auch https://virtualboxes.org/doc/installing-guest-additions-on-debian/

Bei älteren Debian-Releases war die Voraussetzung so zu schaffen, wir müssen dazu als root eingeloggt sein:

$ apt-get update
$ apt-get upgrade
$ apt-get install build-essential module-assistant
$ m-a prepare

Nun im VirtualBox-Fenster unter „Geräte“ => „Gasterweiterungen einlegen“ die Treiber-CD (eine iso-Datei) im Gast einbinden

Wir ignorieren das unter KDE aufpoppende Dialogfenster fürs automatische Einhängen und mounten die virtuelle CD per Hand:

$ mount /dev/sr0 /mnt
$ cd /mnt
$ ls
$ bash VBoxLinuxAdditions.run
$ cd
$ umount /mnt
$ killall Xorg

Weitere Doku unter http://pemmann.de/cc/

  • Benutzer: dresden

  • Passwort:

AUFGABEN:

  1. Unter http://pemmann.de/cc/Handouts/lpi-101.html über „Vergleich mit Windows“ nachlesen

Kommandos:

$  cd <PFAD>
$  ls -F
  1. VM-Snapshot in VBox anfertigen, Name: „incl Guest Additions“

  2. Innerhalb der Debian-VM via Firefox das folgende Buch durchstöbern: https://de.wikibooks.org/wiki/Linux-Praxisbuch

Windows Emulator unter Linux

https://wiki.debian.org/Wine

Wir installieren als root:

$ dpkg --add-architecture i386 && sudo apt update
$ apt-get install wine

In einem neuen konsole-Fenster als root:

$ cd Downloads
$ wine CLauncher-2-PC.exe
    (dotnet NICHT installieren, also 'Abbrechen')

Rungang im neuen Linux-System

  1. Dateisystem:

    tux@d8:~$ /bin/su -
    Passwort:
    root@d8:~#
    root@d8:~#
    root@d8:~# ls -l /home/
    insgesamt 4
    drwxr-xr-x 16 tux tux 4096 Jan 11 16:04 tux
    root@d8:~#
    root@d8:~#
    root@d8:~# du -sh /usr
    3,4G    /usr
    root@d8:~#
    root@d8:~#
    root@d8:~#
    root@d8:~# ## du = disk usage (Option: "-h" = human readeable)
    root@d8:~#
    root@d8:~# ls -F /
    bin/   dev/  home/        lib/    live-build/  media/  opt/   root/  sbin/  sys/  usr/  vmlinuz@
    boot/  etc/  initrd.img@  lib64/  lost+found/  mnt/    proc/  run/   srv/   tmp/  var/
    root@d8:~#
    
  2. Benutzerverwaltung:

    root@d8:~# # In welchen Gruppen ist tux Mitglied:
    root@d8:~# groups tux
    tux : tux cdrom floppy audio dip video plugdev netdev lpadmin scanner bluetooth
    root@d8:~#
    
    root@d8:~# # Einen neuen Benutzer anlegen:
    root@d8:~# useradd -s /bin/bash max
    root@d8:~# passwd max
    Geben Sie ein neues UNIX-Passwort ein:
    Geben Sie das neue UNIX-Passwort erneut ein:
    passwd: Passwort erfolgreich geändert
    root@d8:~#
    root@d8:~#
    root@d8:~# ls -l /home/
    insgesamt 4
    drwxr-xr-x 16 tux tux 4096 Jan 11 16:04 tux
    root@d8:~#
    root@d8:~# groups max
    max : max
    root@d8:~#
    

AUFGABE: Einen weiteren Benutzer namens ‚surfer‘ anlegen und sich mit diesem dann an der Oberfläche anmelden…

ABER ES GIBT IN PROBLEM: Die Option ‚-m‘ (make home dir) wurde vergessen:

root@d8:~# tail -2 /etc/passwd
vboxadd:x:999:1::/var/run/vboxadd:/bin/false
max:x:1001:1001::/home/max:/bin/bash
root@d8:~#
root@d8:~#
root@d8:~# mkdir /home/max
root@d8:~#
root@d8:~# ls -l /home/
insgesamt 8
drwxr-xr-x  2 root root 4096 Jan 12 09:23 max
drwxr-xr-x 16 tux  tux  4096 Jan 11 16:04 tux
root@d8:~#
root@d8:~#
root@d8:~# tail -2 /etc/group
vboxsf:x:999:
max:x:1001:
root@d8:~#
root@d8:~#
root@d8:~# chown max:max /home/max
root@d8:~#
root@d8:~# ls -l /home/
insgesamt 8
drwxr-xr-x  2 max max 4096 Jan 12 09:23 max
drwxr-xr-x 16 tux tux 4096 Jan 11 16:04 tux
root@d8:~#
root@d8:~#
root@d8:~# useradd -m -s /bin/bash surfer
root@d8:~# passwd surfer
Geben Sie ein neues UNIX-Passwort ein:
Geben Sie das neue UNIX-Passwort erneut ein:
passwd: Passwort erfolgreich geändert
root@d8:~#
root@d8:~#
root@d8:~# ls -l /home/
insgesamt 12
drwxr-xr-x  2 max    max    4096 Jan 12 09:23 max
drwxr-xr-x  2 surfer surfer 4096 Jan 12 09:28 surfer
drwxr-xr-x 16 tux    tux    4096 Jan 11 16:04 tux
root@d8:~#

Topic 101: System Architecture

101.1 Determine and configure hardware settings

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

Kernel und Treibermodule

Der Linux-Kernel ist das Herzstück unseres Betriebssystems, er befindet sich in der Datei /boot/vmlinuz-<VERSION>. Bei Linux handelt sich dabei um einen monolithischen Kernel, in dem die wesentlichen Treiber fest integriert sind. Trotz dieser Tatsache können zur Laufzeit des Rechners aus dem Verzeichnis /lib/modules/<VERSION> Module nachgeladen werden.

  • Ausgabe des Kernel-Releases: uname -r

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

  • Wie setzt sich die Release-Nummer zusammen?
    In historischer Manier mit „MAJOR.MINOR.PATCHLEVEL“, z.B. 2.6.0
    (Weitere Nummern und Kürzel je nach Distribution - die Bezeichnung lässt sich im Makefile mittels „EXTRAVERSION = „ festlegen)
  • Die alte Grundregel lautete: Stabile Kernel: gerade-MINOR-Nummer, Entwickerkernel: ungerade MINOR-Nummer (2.5 war der letzte Entwickerkernel, alle neuen Features wurden in die 2.6er-Serie eingearbeitet (siehe => Wikipedia).

  • Wichtige, reichhaltige Informationsquelle: dmesg (debug messages des Kernels)

USB-Support

Entwicklungsgeschichtlich bedingt wurde erst ab Kernel 2.4 USB vollständig unterstützt. Im Zusammenhang mit den verschiedenen Kerneln und den Hostcontroller-Treibern sieht das so aus:

  • 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

Welcher Host-USB-Controller eingebaut ist, lässt sich auch anhand der geladenen Module herausfinden, lsmod | grep hci offenbart z.B. ohci_pci und ehci_pci.

Interessant ist auch, was unter http://www.tldp.org/HOWTO/Webcam-HOWTO/hardware.html zu lesen ist: „USB subsystem support has been present in the Linux kernel since the late 2.2 series.“

Module nachladen, auflisten und entfernen

Zum Beispiel den Novell-kompatiblen Netzwerkkartentreiber für eine alte Network Interface Card (NIC) testweise laden:

Zuerst listen wir alle Module auf, die bisher geladen wurden (nur die ersten 10 Zeilen):

root@tux-pc:~# lsmod | head
Module                  Size  Used by
vboxvideo              49152  0
rfkill                 28672  1
snd_intel8x0           45056  3
snd_ac97_codec        147456  1 snd_intel8x0
crct10dif_pclmul       16384  0
crc32_pclmul           16384  0
ac97_bus               16384  1 snd_ac97_codec
snd_pcm               114688  2 snd_intel8x0,snd_ac97_codec
ghash_clmulni_intel    16384  0
root@tux-pc:~#

Mit modinfo kann man sich alle möglichen Eigenschaften eines Modules ausgeben lassen, wir benötigen hier nur den Namen des Modules samt Speicherort, um es mit insmod manuell und einzeln für die alte, Novell 2000 kompatible NIC laden zu können. Vorher müssen wir aber noch klären, ob es Abhängigkeiten zu beachten gilt:

root@tux-pc:~# modinfo ne2k-pci | grep -i depend
depends:        8390
root@tux-pc:~# #  >> Ja, es benötigt ein weiteres Modul in Abhängigkeit!
root@tux-pc:~#
root@tux-pc:~# modinfo -n 8390
/lib/modules/4.19.0-8-amd64/kernel/drivers/net/ethernet/8390/8390.ko
root@tux-pc:~#
root@tux-pc:~# modinfo -n ne2k-pci
/lib/modules/4.19.0-8-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko
root@tux-pc:~#

Wie soeben festgestellt, gibt es eine Abhängigkeit, weshalb wir zuerst 8390 laden müssen und zwar unter Angabe des exakten Dateinamens, wie es bei insmod generell erforderlich ist:

root@tux-pc:~# insmod /lib/modules/4.19.0-8-amd64/kernel/drivers/net/ethernet/8390/8390.ko
root@tux-pc:~# insmod /lib/modules/4.19.0-8-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko
root@tux-pc:~#
root@tux-pc:~# lsmod | grep -E '8390|ne2k-pci'
8390                   24576  1 ne2k_pci
root@tux-pc:~# #  >> Passt, beide Module wurden geladen.

Da ja alles geklappt hat, wollen wie die beiden Module wieder aus dem RAM entfernen. Dazu kommen rmmod bzw. modprobe -r in Frage:

root@tux-pc:~# rmmod ne2k-pci
root@tux-pc:~#
root@tux-pc:~# lsmod | grep -E '8390|ne2k-pci'
8390                   24576  0
root@tux-pc:~# #  >> Wir müssen fetstellen, dass hierbei das in Abhängikeit geladene Modul NICHT mit entfernt wurde.
root@tux-pc:~#
root@tux-pc:~# rmmod 8390
root@tux-pc:~#
root@tux-pc:~# lsmod | grep -E '8390|ne2k-pci'
root@tux-pc:~#

Mit modprobe wird es intelligenter, es kann die grundlegenden Abhängigkeiten auflösen. Das betrifft das Laden wie auch das spätere Entfernen:

root@tux-pc:~# modprobe ne2k-pci
root@tux-pc:~#
root@tux-pc:~# lsmod | grep -E '8390|ne2k-pci'
8390                   24576  1 ne2k_pci
root@tux-pc:~# #  >> Beide sind in richtiger Reihenfolge geladen worden.
root@tux-pc:~#
root@tux-pc:~#
root@tux-pc:~# modprobe -r ne2k_pci
root@tux-pc:~#
root@tux-pc:~# lsmod | grep -E '8390|ne2k-pci'
root@tux-pc:~# #  >> Und beider wurden auch wieder entfernt.

Sinnvollerweise schauen wir uns noch im Zusammenhanng mit den Abhängigkeiten das Kommando depmod an:

root@tux-pc:~# whatis depmod
depmod (8)           - Generate modules.dep and map files.
root@tux-pc:~#
root@tux-pc:~# # Das Erzeugen der 'modules.dep'-Datenbank mit '-n' nur simulieren:
root@tux-pc:~# depmod -n | grep ne2k
kernel/drivers/net/ethernet/8390/ne2k-pci.ko: kernel/drivers/net/ethernet/8390/8390.ko
alias pci:v00008C4Ad00001980sv*sd*bc*sc*i* ne2k_pci
alias pci:v000012C3d00005598sv*sd*bc*sc*i* ne2k_pci
alias pci:v00001050d00000940sv*sd*bc*sc*i* ne2k_pci
alias pci:v000010ECd00008029sv*sd*bc*sc*i* ne2k_pci
root@tux-pc:~#

Und unser Basismodul 8390 finden wir als Abhängigkeit für ne2l-pci in dieser Datei ebenfalls wieder:

root@tux-pc:~# grep ne2k /lib/modules/4.19.0-8-amd64/modules.dep
kernel/drivers/net/ethernet/8390/ne2k-pci.ko: kernel/drivers/net/ethernet/8390/8390.ko
root@tux-pc:~#

ZUSAMMENFASSUNG

  • Unser monolithischer Kernel namens ‚Linux‘ ist modular aufgebaut

  • Die Treibermodule liegen unter /lib/modules/<KERNELVERSION>

  • Infos ausgeben: Kommandos lsmod, modinfo, Datei /lib/modules/<KERNELVERSION>/modules.dep

  • Module laden: Kommandos insmod, modprobe

  • Module entfernen: Kommandos rmmod, modprobe -r

  • Modulabhängigkeitsdatenbank neu aufbauen: Kommando depmod, Datei modules.dep

Hardwareinformationen

Virtuelle Dateisysteme

Dank virtueller Dateisysteme, die vielfältige Hilfsaufgaben wahrnehmen, lassen sich auch bequem hardware- und kernelnahe Informationen direkt aus Dateien auslesen. So z.B. mittels procfs, was in /proc residiert (Prozessdateisystem) sowie mittels sysfs in /sys (Kernel-Subsysteme).

Wichtige Dateisystempfade und Dateien für /proc sind:

  • /proc/cpuinfo (Eigenschaften der CPU)

  • /proc/interrupts (Hardwareressource Nr. 1: Auflistung der vorhandenen Interrupt-Kanäle)

  • /proc/ioports (Hardwareressource Nr. 2: verwendete I/O-Speicherbereiche im RAM)

  • /proc/dma (Hardwareressource Nr. 3: verwendete DMA-Kanäle)

  • /proc/cmdline (Bootparameter für den Kernel)

  • /proc/scsi/scsi (Datei mit SCSI-Informationen, ist nach /sys gewandert)

  • /proc/bus/usb (Verzeichnis mit USB-Informationen, ist ebenfalls nach /sys gewandert)

Hierzu folgen nun einige Beispiele.

root@d8:~# egrep "vmx|svm" /proc/cpuinfo    ## KVM-Support vorhanden?
...
root@d8:~#
root@d8:~# cat /proc/sys/kernel/osrelease
3.16.0-4-amd64
root@d8:~#
root@d8:~# cat /proc/sys/kernel/ostype
Linux
root@d8:~#
root@d8:~# cat /proc/sys/kernel/hostname
d8
root@d8:~#
root@d8:~# hostname
d8
root@d8:~#
root@d8:~# cat /proc/sys/kernel/modprobe
/sbin/modprobe
root@d8:~#
root@d8:~# ls -F /proc/sys/kernel/

Drei Dateien sind für die Hardwareressourcen von Schnittstellenkarten und Festplatten wichtig:

  1. Die Interrupts des Systems:

    root@d8:~# cat /proc/interrupts
            CPU0
    0:         34   IO-APIC-edge      timer
    1:      11007   IO-APIC-edge      i8042
    8:          0   IO-APIC-edge      rtc0
    ...
    
  2. Die derzeit benutzten I/O-Portbereiche im RAM:

    root@d8:~# cat /proc/ioports
    0000-0cf7 : PCI Bus 0000:00
    0000-001f : dma1
    0020-0021 : pic1
    0040-0043 : timer0
    ...
    
  3. Die derzeit benutzten Direct-Memory-Access-Kanäle ausgeben:

    root@d8:~# cat /proc/dma
    4: cascade
    root@d8:~#
    

Weiterhin LPI-relevant: Die Cheatcodes, die dem Kernel als Bootparameter beim Systemstart übergeben wurden:

root@d8:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro quiet
root@d8:~#

Eine Textsuche nach dieser Kernelversion in der Konfigurationsdatei des Bootloaders:

root@d8:~# grep --color vmlinuz-3.16.0-4-amd64  /boot/grub/grub.cfg
linux   /boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro  quiet
  linux   /boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro  quiet
  linux   /boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro single

Was auch damit zusammenhängt:

root@d8:~# ls -l /dev/disk/by-uuid/549e3713-ece9-4337-a09c-fed9450bcc28
lrwxrwxrwx 1 root root 10 Jan 11 16:03 /dev/disk/by-uuid/549e3713-ece9-4337-a09c-fed9450bcc28 -> ../../sda1
root@d8:~#

Das Kernel-Release mit Hilfe einer Kommandozeilensubstitution herausfinden (automatisierbar):

root@d8:~# uname -r
3.16.0-4-amd64
root@d8:~#
root@d8:~#
root@d8:~# du -sh /lib/modules/`uname -r`
173M    /lib/modules/3.16.0-4-amd64
root@d8:~#
root@d8:~#
root@d8:~# du -sh /lib/modules/$(cat /proc/sys/kernel/osrelease)
173M    /lib/modules/3.16.0-4-amd64
root@d8:~#

Zum zweiten virtuellen Dateisystem /sys muss man wissen, dass viele Infos aus /proc jetzt hier zu finden sind, so über die Bussysteme in /sys/bus; z.B. das Verzeichnis /sys/bus/usb:

root@tux-pc:~# ls -F /sys
block/  bus/  class/  dev/  devices/  firmware/  fs/  hypervisor/  kernel/  module/  power/
root@tux-pc:~#
root@tux-pc:~# ls -F /sys/bus/usb
devices/  drivers/  drivers_autoprobe  drivers_probe  uevent
root@tux-pc:~#

Kommandos lspci und lsusb

Neben den virtuellen Dateisystemen existieren natürlich gewisse Kommandos, die bessere Veranschaulichung bieten.

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)

USB-Geräte im System auffinden:

a) dmesg
b) lsusb   # (falls nicht vorhanden: 'apt-get install usbutils')

Das Kommando lsusb geht dabei die Pfade unter /proc/bus/usb bzw. /sys/bus/usb durch und gibt Infos aus.

Automatische Erzeugung von Gerätedateien, Automounter

Anders als früher, als noch die Gerätedateien unter /dev (= „devices“, allgemeines Verzeichnis für Gerätedateien) mittels mknod massenweise erzeugt und dann vorgehalten wurden, gibt es heute dafür den Userspace Device Manager ‚udev‘, der die Devices bei Bedarf automatisch anlegt.

Im Überblick der gemounteten „Laufwerke“ findet sich neben dem Shared Memory Device „/dev/shm“ der Mountpunkt für den Userspace Device Manager ‚udev‘:

root@d8:~# df -h
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1       7,4G    6,0G  1,1G   86% /
udev             10M       0   10M    0% /dev
tmpfs           403M    5,9M  397M    2% /run
tmpfs          1006M    164K 1006M    1% /dev/shm
tmpfs           5,0M    4,0K  5,0M    1% /run/lock
tmpfs          1006M       0 1006M    0% /sys/fs/cgroup
tmpfs           202M    8,0K  202M    1% /run/user/1001
root@d8:~#

Dazu aus einem Braindump: „The /dev/ directory is a filesystem of type tmpfs and is mounted by udev during system startup“. Deshalb schauen wir uns auch nun diesen Mountpunkt von udev, nämlich /dev direkt an:

root@d8:~# mount | grep udev
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1358552k,nr_inodes=339638,mode=755)
root@d8:~#
root@d8:~# df -h /dev
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
udev             10M       0   10M    0% /dev
root@d8:~#

Zuallererst denken wir dabei an Blockgerätedateien, hier ein kleiner Auszug:

  • 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)

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

Nun wollen wir ein wenig mehr über diesen modernen, aktuellen Autokonfigurationsdienst, den User Space Device Manager erfahren:

root@d8:~# 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.
 ...

root@d8:~# ps aux | grep  udev
root       170  0.0  0.1  41592  3660 ?        Ss   00:18   0:00 /lib/systemd/systemd-udevd
root     19082  0.0  0.1  12752  2100 pts/0    S+   12:36   0:00 grep udev
root@d8:~#
root@d8:~# ## Dies ist der Mountpunkt für das virtuelle Dateisystem, welches udev verwaltet:
root@d8:~# df -h /dev
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
udev             10M       0   10M    0% /dev
root@d8:~#
root@d8:~# ## Hier können eigene Regeln abgelegt werden (*.rules-Dateien):
root@d8:~# ls -l /etc/udev/rules.d/
insgesamt 4
-rw-r--r-- 1 root root 134 Jan 11 12:13 60-vboxadd.rules
-rw-r--r-- 1 root root   0 Sep 17 15:40 70-persistent-cd.rules
root@d8:~#
root@d8:~# ps aux | grep  udev
root       170  0.0  0.1  41592  3660 ?        Ss   00:18   0:00 /lib/systemd/systemd-udevd
root     19437  0.0  0.1  12752  2284 pts/0    S+   12:41   0:00 grep udev
root@d8:~#
root@d8:~#
root@d8:~# ## Und dann spielt noch der Desktop Bus zur Information von Apps eine wichtige Rolle:
root@d8:~# ps aux | grep  dbus
message+ 17498  0.0  0.1  42952  4016 ?        Ss   11:18   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
max      18173  0.0  0.0  10700   340 ?        Ss   11:18   0:00 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session x-session-manager
max      18176  0.0  0.0  15960  1924 ?        S    11:18   0:00 /usr/bin/dbus-launch --exit-with-session x-session-manager
max      18177  0.0  0.1  42352  2596 ?        Ss   11:18   0:00 /usr/bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
root     19439  0.0  0.1  12752  2096 pts/0    S+   12:42   0:00 grep dbus
root@d8:~#

Am besten zeigen wie uns die Änderungen im Verzeichnis ‚/dev‘ zeitlich sortiert an, wobei für das Kommando ls praktischerweise die Optionen -t (time sorted), -l (long output), -r (reverse sorted) und -c (change inode time zeigen) verwendet werden. Danach wird die zeitlich sortierte Ausgabe einfach via Pipeline dem Kommando „tail -5“ zugespielt, was nur die letzten 5 Zeilen anzeigt:

root@d8:~# ls -ltrc /dev | tail -5
brw-rw----  1 root    disk      8,  16 Jan 13 12:40 sdb
drwxr-xr-x  6 root    root         120 Jan 13 12:40 disk
drwxr-xr-x  2 root    root         180 Jan 13 12:40 block
prw-r-----  1 root    adm            0 Jan 13 12:40 xconsole
brw-rw----  1 root    disk      8,  17 Jan 13 12:40 sdb1
root@d8:~#
root@d8:~#

In Schichtenmodelldenkweise:

  1. udevd => erzeugt im Hintergrund eine Gerätedatei (/dev/sdb1) und eventuelle symbolische Verknüpfungen

  2. dbus => erzeugt Aufrufe für grafische Dialogfenster sowie Laufwerkssymbole in Dateimanagern wie ‚dolphin‘

Neben udev, der auch als Automounter auftreten kann, gibt es außerdem folgende Lösungen:

  • hal (war zum Teil noch erforderlich für DRM-Web-Inhalte)

  • usbmgr

  • hotplug

  • autofs (speziell für NFS-Netzwerk-Mountvoränge wichtig)

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

Tipp fürs Recherchieren:

Google-Stichwörter: lpi 101 modprobe.conf modules.conf

Kaufempfehlung für eigenen USB-Stick:

101.2 Boot the system

Typischer Ablauf eines Bootvorgangs (altes BIOS mit Master Boot Record):

  1. Power-Knopf drücken (ATX-Formfaktor, Stromsparfunktionen via Taster => Netzteil)

  2. Start-OS „BIOS“, Power On Self Test (POST) http://www.grundlagen-computer.de/…

  3. Auf der Festplatte wird MBR gesucht (512 Bytes insgesamt, 440 Bytes Bootcode, 64 Bytes Partitionstabelle)

  4. Bootloader des OS starten (GRUB lädt sich selbst in den RAM: First Stage)

  5. Bootloader lädt den Kernel mitsamt seines Initramfs in den RAM (GRUB: Second Stage)

  6. Kernel startet den ersten Prozess mit der PID 1 (init / systemd)

  7. Bereitstellen von Dateisystem und User-Login

Wenn es um das Booten bei modernen EFI-Systemen geht, gestalten sich insbesondere die Schritte 2 bis 4 anders. Hier ein paar wichtige Kennzeichen:

  • Eine Firmware im UEFI-Chip tritt als First Stage Bootloader auf.

  • Eine DOS-Zwischenschicht liefert den Bootcode aus.

  • Die Festplatten- und Partitionsdaten werden in einer umfangreicheren Tabelle namens GPT (GUID Partition Table) abgelegt.

  • Der MBR beinhaltet keinen Bootcode und auch keine Partitionstabelle mehr.

  • Der darauf folgende Bootloader GRUB fungiert quasi nur noch als Boot Manager zur komfortablen Auswahl verschiedener Konfigurationen bzw. Betriebssysteme.

Weitere Hinweise zum neuen UEFI-Bootverfahren:

  • Es wurde ein verbessertes BIOS nötig, um von Festplattenpartitionen größer als 2,2 TB booten zu können. Dank des GPT-Schemas können maximal 128 Partitionen verwaltet werden (historisches MBR-Schema: nur 4 primäre Partitionen).

  • Ein herkömmliches Backup vom MBR mittels ‚dd‘ hat keinen Effekt mehr, weil er nur noch eine Schutzfunktion inne hat, dass die Festplatte alten BIOS-Rechnern nicht als unpartitioniert erscheint.

  • GRUB ist im Prinzip nur noch für das Verwaltung mehrerer OS und Kernel zuständig (-> Boot Manager, kein „Loader“)

  • Der neue EFI Bootloader benötigt zum Laden weiterer Software eine separate FAT-Ablagefläche in /boot/efi. Diese Partition nennt sich Efi System Partition (ESP).

Siehe dazu https://www.computerweekly.com/de/definition/UEFI-Unified-Extensible-Firmware-Interface

Startprotokollierung

⇒ läuft über zwei Ebenen:

  1. Kernel-Ringbuffer: dmesg (Bei RedHat zusätzlich in der Datei /var/log/boot.log)
  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: tail -f /var/log/messages

Und dann kann man Nachrichten, die ein einfacher Nutzer ins Syslog z.B. via logger "ALARM: Festplatte voll $(df -h /)" schreiben kann, mitlesen.

USB-Multiboot Speicherstick einrichten

ZIEL: USB-Stick Formatieren mit GRUB2 austatten und Live-Linux-Systeme installieren

Zuerst einmal die Daten sichern! Da er bereits automatisch gemountet wurde, können wir so fortfahren:

$ df -h     # Mountpunkt z.B. /media/tux/020D44775093A94E
$ cp -r /media/tux/020D44775093A94E/ /home/tux
$ umount /media/tux/020D44775093A94E

Installation von gparted

$ apt-get update
$ apt-get install gparted

$ exit
$ xhost +
$ gparted &
  • Gerät /dev/sdb auswählen (Listenfeld oben rechts)

  • Unter „Laufwerk“ eine neue „Partitionstabelle erstellen…“, Typ: „msdos“

  • Mit Rechtsklick auf „nicht zugeteilt“ eine neue Partition erstellen (NTFS), Schalter „Anwendung“

  • Programm beenden

$ mount /dev/sdb1 /mnt
$ df -h /mnt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb1       7,3G     38M  7,3G    1% /mnt

ZIELE:

  1. Ordnerstruktur auf /mnt erzeugen: /mnt/boot/grub

  2. MBR auf dem Stick schreiben (/dev/sdb)

$ grub-install --no-floppy --root-directory=/mnt /dev/sdb

   --- bitte Geduld ---

Installing for i386-pc platform.
installation beendet. Keine Fehler aufgetreten.

Weiter geht es dann mit dem downloaden von Live-Systemen:

Einrichten eines VirtualBox „Shared Folders“:

  • Unter „Geräte“, „Gemeinsame Ordner“, „Gemeinsame Ordner…“

  • Einen Ordner-Pfad auswählen („Downloads“)

  • Namen bei „Ordner-Name“ vergeben: „shared“ (Beide Optionen wählen: „Automatisch einbinden“, „Permanent erzeugen“)

$ mkdir /media/tmp
$
$ mount -t vboxsf shared /media/tmp/
$
$ df -h /media/tmp/
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
shared          466G    465G  1,5G  100% /media/tmp
$
$ mkdir /media/iso
$ mount -o loop /media/tmp/debianDog.iso /media/iso/
mount: /dev/loop0 ist schreibgeschützt, wird eingehängt im Nur-Lese-Modus
$
$
$ cp -r /media/iso/live/ /mnt/ISO/DebianDog
$
$ nano /mnt/boot/grub/grub.cfg

Als Inhalt geben wir der Datei folgendes mit:

set timeout=10
set default=0
set isopath=/ISO


menuentry "Boot from Hard Disk" {
      insmod chain
      set root=(hd1)
      chainloader +1
}

menuentry "DebianDog Jessie" {
   linux /ISO/DebianDog/vmlinuz1 boot=live config noeject live-media-path=/ISO/DebianDog  toram=01-filesystem.squashfs --
   initrd /ISO/DebianDog/initrd1.img
}

Nun hängen wir alles aus und können ans Testen gehen:

$ umount /mnt /media/tmp /media/iso

Siehe auch http://pemmann.de/cc/debianDog_grub.cfg.txt

Weiter mit USB-Bootstick am Nachmittag…

root@d8:~# dmesg | tail
[22555.346151] Bluetooth: BNEP socket layer initialized
[24738.685010]  sdb:
[24738.733024]  sdb:
[24739.691150]  sdb:
[24741.726404]  sdb:
[24742.863555]  sdb:
[25053.250792]  sdb:
[25053.298828]  sdb:
[25055.827082]  sdb: sdb1
[25068.979252]  sdb: sdb1
root@d8:~#
root@d8:~# mount /dev/sdb1 /mnt
root@d8:~#
root@d8:~# df -h /mnt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb1       7,3G     38M  7,3G    1% /mnt
root@d8:~#
root@d8:~# grub-install --no-floppy --root-directory=/mnt /dev/sdb
Installing for i386-pc platform.

installation beendet. Keine Fehler aufgetreten.
root@d8:~#

Via Firefox auf dem Debian-Gast die Datei ‚debianDog.iso‘ herunterladen:

root@d8:~# file /home/tux/Downloads/debianDog.iso
/home/tux/Downloads/debianDog.iso: ISO 9660 CD-ROM filesystem data 'live-modules-slimjet' (bootable)
root@d8:~#
root@d8:~# sha1sum /home/tux/Downloads/debianDog.iso
2767b15df951ef1c4331a7f180cd2ab0799740fa  /home/tux/Downloads/debianDog.iso
root@d8:~#



root@d8:~# mkdir -p /media/iso/
root@d8:~#
root@d8:~# mount /home/tux/Downloads/debianDog.iso /media/iso/
mount: /dev/loop0 ist schreibgeschützt, wird eingehängt im Nur-Lese-Modus
root@d8:~#
root@d8:~# mkdir /mnt/ISO
root@d8:~#

Kopieren und Umbenennen des Systemverzeichnisses:

root@d8:~# cp -r /media/iso/live/ /mnt/ISO/DebianDog

Wir legen nun die Konfigurationsdatei an: nano /mnt/boot/grub/grub.cfg

### Inhalt der Datei
set timeout=10
set default=0
set isopath=/ISO


menuentry "Boot from Hard Disk" {
    insmod chain
    set root=(hd1)
    chainloader +1
}

menuentry "DebianDog Jessie" {
    linux /ISO/DebianDog/vmlinuz1 boot=live config noeject live-media-path=/ISO/DebianDog  toram=01-filesystem.squashfs --
    initrd /ISO/DebianDog/initrd1.img
}

menuentry "SliTaz Linux 4.0 Core" {
    set isofile="$isopath/slitaz-4.0-core.iso"
    loopback loop $isofile
    linux (loop)/boot/bzImage rw root=/dev/null autologin isofrom=$isofile noeject noprompt lang=de kmap=de
    initrd (loop)/boot/rootfs.gz
}

menuentry "SystemRescueCd 4.9 x86/amd64" {
    set isofile="$isopath/systemrescuecd-x86-4.9.1.iso"
        loopback loop $isofile
        linux (loop)/isolinux/rescue32 isoloop=$isofile
        initrd (loop)/isolinux/initram.igz
}

VM für USB-Boot einrichten (in WINDOWS-Konsole)

USB-Stick ist angesteckt und von KEINEM Linux-Gast blockiert, dann in der Datenträgerverwaltung nachsehen, ob die Gerätenummer tatsächlich die 2 ist.

Mit „WIN + R: cmd“ starten wir eine Konsole:

$ cd "\Program Files\Oracle\VirtualBox"

$ C:\Program Files\Oracle\VirtualBox>VBoxManage.exe internalcommands createrawvmdk -filename "%USERPRO
FILE%"\usbboot.vmdk -rawdisk \\.\PhysicalDrive2

Erfolgsmeldung: „RAW host disk access VMDK file C:Usersapemmannusbboot.vmdk created successfully.“

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.

Systemstart nach System V (SysVinit)

Grundlegendes

  1. Dienst hinter der PID 1 ist /sbin/init, siehe pstree -pn | head

  2. 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

  1. Init-Skripte sind kleine Hilfsprogramme, die den eigentlichen Daemon starten;

  • Speicherort im allgemeinen unterhalb von /etc/init.d/

  • Speicherort bei RedHat unterhalb von /etc/rc.d/init.d/

  • Im vom Skript vorgesehenen Aktionen tauchen auf, wenn das Skript ohne Parameter ausgeführt wird:

    root@devuan-c1:~# /etc/init.d/ssh
    [info] Usage: /etc/init.d/ssh {start|stop|reload|force-reload|restart|try-restart|status}.
    root@devuan-c1:~#
    
  1. Runlevel-Links sind symbolische Links, die auf die eigentlichen Init-Skripte zeigen. Sie starten und stoppen die Daemons beim Systemstart und Shutdown sowie beim Runlevel-Wechsel. Die liegen in entsprechend nummerierten Verzeichnissen, beispielsweise für Level 3 in /etc/rc3.d/. Die Links für den SSH-Daemon können so aussehen:

  • Im Level 3: /etc/rc3.d/S02ssh -> ../init.d/ssh

  • Im Level 5: /etc/rc5.d/S02ssh -> ../init.d/ssh

  • Zur Benennung der Runlevel-Links:

    • S bedeutet, dass dem Init-Skript „start“ übergeben wird

    • K bedeutet, dass dem Init-Skript „stop“ übergeben wird (kill-Signal)

    • Danach folgt eine zweistellige Zahl, welche die Reihenfolge der Abarbeitung festlegt.

    • Insgesamt wird alphanumerisch abgearbeitet: zuerst die mit K beginnenden Links, danach die mit S

Runlevel

  • Runlevel sind bestimmte Systemzustände, in denen unterschiedlich viele Dienste gestartet werden, so wird z.B. im Level 5 zusätzlich zum Multiuser- und Netzwerk-Betrieb ein grafischer Login mittels „Display Manager“ ermöglicht.

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

  • Herausfinden, in welchem wir uns gerade befinden: runlevel, wir sehen dabei

    • als erstes Zeichen oft ein „N“, was bedeutet: „it was (n)o change before“

    • als zweites Zeichen eine Zahl, die den aktuellen Runlevel ausgibt

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

  • Kernelparameter für Single-User-Modus: 1 (gibt man der GRUB-Config mit)

    • Zum Beispiel (man achte auf die „1“ am Ende der Zeile):

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

Rechner herunterfahren / neu starten

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

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

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:~#

Was versteht man unter einer initialen RAM-Disk? Ein RAM-Laufwerk, das Treiber für den Bootvorgang bereithält um insbesondere Controller, Fetsplatten und Dateisysteme ansprechen zu können.

Bitte downloaden: http://mirror.netcologne.de/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso

Installation als VM:

  • Name: CentOS 6

  • RAM: 1 GB

  • Festplatte 50 G

  • Cursor nach rechts: „Skip“

  • German => Deutsch

  • Basisspeichergeräte, „Ja, alle Daten verwerfen“

  • Rechnername: c6.dom.test

  • Option: „Bestehende(s) Linux-System(e) ersetzen“ wählen

  • Einstellungen übernehmen

Danach:

  • Neustart vornehmen (CD manuell auswerfen!)

  • Als ‚root‘ einloggen…

  • DHPC-Server kontaktieren: dhclient eth0

  • Kontrolle: ifconfig

  • Software aktualieren: yum update # mit „j“ bestätigen

Siehe auch: https://www.heise.de/ct/artikel/Das-Init-System-Systemd-Teil-1-1563259.html

Virtuelles Umstecken der Netzwerkanschlüsse: Von „NAT“ zu „Netzwerkbrücke“…

  1. Debian bekommt den Wechsel automatisch mit, Kontolle: ifconfig eth0

  2. Unter CentOS 6 müssen wir die Adresse abgeben und neu beziehen:

  • dhclient -r eth0

  • dhclient eth0

Auf CentOS:

  • läuft der ssh-Server? ps -C sshd => JA.

  • wie lautet die Identität (digitalen Fingerabdruck ausgeben):

    $ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub

Auf Debian:

root@d8:~# exit
Abgemeldet
tux@d8:~$
tux@d8:~$ ssh root@10.22.15.187
The authenticity of host '10.22.15.187 (10.22.15.187)' can't be established.
RSA key fingerprint is 85:5f:56:9c:82:50:ff:60:a5:c3:07:ae:30:5c:fc:06.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.22.15.187' (RSA) to the list of known hosts.
Connection closed by 10.22.15.187
tux@d8:~$
tux@d8:~$ cat .ssh/known_hosts
|1|mwnHX7oJvaUYWkmW6csfD8954BA=|3+iU0XZbjo5C3Xas9vbjos6DODs= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxqek4eoZImQI/eLsgkOdt25/m9Bsj+wD0vQ4O2bAnPFClUmCe8pTZ1IVELq5Jy9RCncry2PQhsAAcrYhufd3682Zmit6dgkvL8vJFkjh2MMPzvQpC99qBqUAD9rISVv06eTqrup84s1TjxE5fecsnCjEsnqTzCkOcxt7qxeDlQbVlnVkBmz+FzumukOd5wN7I4pQMPEBYl7+nTH2vMCTyqT0dRdVxJnlPG62PdPFOCynC/MwYtdzTXTT5qd1bp7ypCaUjwUZykNAbZEt90lAWCWWkKFYVstI5YqmpJJLtGwEStf7diFeTMv6jE9HvORtPf5F1zoeWcOStoqEwrRqnw==
tux@d8:~$

Jetzt sind wir auf CentOS einloggt:

Tipp: Systemd-freie Distributionen siehe unter http://without-systemd.org/wiki/index.php/Main_Page

  • Puppy Linux

  • Slackware

  • Gentoo

  • Alpine Linux (BusyBox/OpenRC)

Wir konfigurieren eth0, so dass die Schnittstellenkarte beim Bootvorgang automatisch aktiviert wird:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

   # Für vim-Neulinge:
   # ESC ESC ESC
   # 5G
   # l     (mehrfach, bis wir auf no stehen)
   # D     (Delete upt up end of line)
   # a     (In den Insert-Modus gehen, appending one character)
   #
   # Jetzt schreiben wir das "yes" hin:


# Das einzige, was anzupassen ist:
#
ONBOOT=yes

   # ESC
   #
   # :wq

Nun können wir eth0 über das Netzwerkskript steuern:

$ /etc/init.d/network stop
$ /etc/init.d/network start

Wiederholung Module

Den Schnittstellennamen „eth0“ einem bestimmten Treiber via „/etc/modules.conf“ zuordnen:

alias eth0 ne2k-pci

Siehe http://linux-sxs.org/networking/ne2k.html

Ein Datenbank-basiertes Init-System, wir erforschen wichtige Bestandteile:

root@d8:~# ## find /var -iname "*systemd*"
root@d8:~#
root@d8:~# ls -l /var/lib/systemd/
insgesamt 16
drwxr-xr-x  2 root root 4096 Jan 11 08:50 catalog
drwxr-xr-x  2 root root 4096 Jan 11 09:01 coredump
drwxr-xr-x 11 root root 4096 Jan 11 08:51 deb-systemd-helper-enabled
-rw-------  1 root root  512 Jan 17 07:54 random-seed
root@d8:~#
root@d8:~# ls -l /var/lib/systemd/catalog/
insgesamt 40
-rw-r--r-- 1 root root 40665 Sep 17 15:21 database
root@d8:~#
root@d8:~# file /var/lib/systemd/catalog/database
/var/lib/systemd/catalog/database: data
root@d8:~#
root@d8:~#
root@d8:~# pgrep -a systemd
1 /sbin/init
153 /lib/systemd/systemd-udevd
155 /lib/systemd/systemd-journald
476 /lib/systemd/systemd-logind
1093 /lib/systemd/systemd --user
root@d8:~#
root@d8:~#
root@d8:~# mount | grep udev
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=254308,mode=755)
root@d8:~#
root@d8:~#
root@d8:~# pstree -pn | head
systemd(1)-+-systemd-udevd(153)
        |-systemd-journal(155)
        |-rpcbind(438)
        |-rpc.statd(448)
        |-rpc.idmapd(462)
        |-sshd(465)
        |-ModemManager(467)-+-{gmain}(572)
        |                   `-{gdbus}(782)
        |-cron(468)
        |-NetworkManager(469)-+-{NetworkManager}(836)
root@d8:~#


root@d8:~# ps aux | grep systemd
root       153  0.0  0.1  41596  3768 ?        Ss   Jan17   0:00 /lib/systemd/systemd-udevd
root       155  0.0  0.1  29924  3780 ?        Ss   Jan17   0:00 /lib/systemd/systemd-journald
root       476  0.0  0.1  28268  3016 ?        Ss   Jan17   0:00 /lib/systemd/systemd-logind
message+   483  0.0  0.2  43040  4240 ?        Ss   Jan17   0:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
tux       1093  0.0  0.1  35656  3904 ?        Ss   Jan17   0:00 /lib/systemd/systemd --user
root      4580  0.0  0.0  12752  2040 pts/0    S+   08:28   0:00 grep systemd
root@d8:~#

Steuerung des Systemd

Runlevel wechseln (auf Debian):

$ systemctl isolate runlevel1.target

Wir lesen dann: „Give root passwort for maintenance…“

$ runlevel
$ who -r

Default-Runlevel ändern:

$ systemctl set-default multi-user.target
$ systemctl set-default graphical.target

Standard-Operationen für Dienste:

$ ps -C sshd
$ systemctl status ssh
$ systemctl stop ssh
$ systemctl disable ssh

Topic 102: Linux Installation and Package Management

102.1 Design hard disk layout

Installation II mit manueller Partitionierung (Debian mit Cinnamon-Oberfläche)

Als Voraussetzung bitte einfach das passende Netinstall-ISO von https://www.debian.org/CD/netinst/ herunterladen und als Bootmedium für einen jetzt neu anzulegenden VirtualBox-Gast verwenden:

  • Schalter „Neu“

  • Name: „Debian Cinnamon“ (Bevorzugter Typ: „Linux 64-bit“)

  • RAM: 1024 MB

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

  • Schalter „Start“

  • Als Boot-Medium die eben heruntergelade Netinst-CD einlegen…

Der erste Teil der Installation gestatltet sich wie üblich.

Im zweiten Teil partitionieren wir manuell. Hier ein Vorschlag für ein Disk-Layout:

  1. Partition: 1 GB swap (prim. => /dev/sda1, sw)

  2. Partition: 10 GB /usr (log. => /dev/sda5, ext4)

  3. Partition: 5 GB /var (log. => /dev/sda6, ext4)

  4. Partition: 500 MB /tmp (log. => /dev/sda7, ext4)

  5. Partition: 15 GB /home (log. => /dev/sda8, xfs)

  6. Partition: 3 GB / (log. => /dev/sda9, ext4)

Von den insgesamt 50 GB Festplattenplatz verbleiben uns schließlich für spätere Experimente noch 19 GB freier Speicher.

Zur Problematik Festplattenlayout siehe auch https://www.debian.org/releases/slink/i386/ch-Partitionieren.de.html

Im dritten Teil der Installation wählen wir im Menü „Softwareauswahl“ (= Konsolenprogramm ‚tasksel‘) den Eintrag „Debian desktop environment“ mit der Leertaste ab und an Stelle dessen den Eintrag „Cinnamon“ aus. Außerdem kann gern ‚SSH server‘ mit ausgewählt werden.

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 Probleme 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

Logical Volume Manager

Was ist das? Siehe

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

102.2 Install a boot manager

USB-Multiboot-Stick erweitern

Eine Erweiterung ist dann auch unter Windows möglich:

  1. Downloaden von geeigneten Linux-ISOs

  2. ISOs in das in der Stick-Wurzel befindliche Verzeichnis ISO kopieren

  3. Die Konfigurationsdatei des Bootloaders ‚bootgrubgrub.cfg‘ anpassen (von der Stickwurzel ausgehend)

  4. Testen in einer VM / nativ

Inhalt der aktuellen „grub.cfg“:

set timeout=10
set default=0
set isopath=/ISO

menuentry "Boot from Hard Disk" {
    insmod chain
    set root=(hd1)
    chainloader +1
}

menuentry "DebianDog Jessie" {
    linux /ISO/DebianDog/vmlinuz1 boot=live config noeject live-media-path=/ISO/DebianDog  toram=01-filesystem.squashfs --
    initrd /ISO/DebianDog/initrd1.img
}

menuentry "SliTaz Linux 4.0 Core" {
    set isofile="$isopath/slitaz-4.0-core.iso"
    loopback loop $isofile
    linux (loop)/boot/bzImage rw root=/dev/null autologin isofrom=$isofile noeject noprompt lang=de kmap=de
    initrd (loop)/boot/rootfs.gz
}

menuentry "SystemRescueCd 4.9 x86/amd64" {
    set isofile="$isopath/systemrescuecd-x86-4.9.1.iso"
    loopback loop $isofile
    linux (loop)/isolinux/rescue32 isoloop=$isofile
    initrd (loop)/isolinux/initram.igz
}

Konfiguration von GRUB

Grub legacy (Version 1)

$ ls -l /boot/grub/menu.lst
lrwxrwxrwx. 1 root root 11 17. Jan 08:50 /boot/grub/ menu.lst -> ./grub.conf


$ grep -A7 ^title menu.lst
title CentOS 6 (2.6.32-642.el6.x86_64)
      root (hd0,0)
      kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg_c6-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=de-latin1-nodeadkeys rd_NO_MD rd_LVM_LV=vg_c6/lv_root SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c6/lv_swap LANG=de_DE.UTF-8 rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.x86_64.img

Grub 2 (aktuelle Version)

$ ls -l /boot/grub/grub.*
-r--r--r-- 1 root root 8257 Jan 13 08:17 /boot/grub/grub.cfg


$ grep -A16 ^menuentry /boot/grub/grub.cfg  | head -17
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-549e3713-ece9-4337-a09c-fed9450bcc28' {
        load_video
        insmod gzio
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
        search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  549e3713-ece9-4337-a09c-fed9450bcc28
        else
        search --no-floppy --fs-uuid --set=root 549e3713-ece9-4337-a09c-fed9450bcc28
        fi
        echo    'Linux 3.16.0-4-amd64 wird geladen …'
        linux   /boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro  quiet
        echo    'Initiale Ramdisk wird geladen …'
        initrd  /boot/initrd.img-3.16.0-4-amd64
}

Eine Konfigurationsdatei testweise unter /tmp erzeugen:

$ grub-mkconfig -o /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
$
$ diff /boot/grub/grub.cfg /tmp/grub.cfg

Debian benutzt häuft Wrapper-Skript, wie in dem Zusammenhang ‚update-grub‘:

$ 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
$
$
$ diff /boot/grub/grub.cfg /tmp/grub.cfg

Zusammenfassung:

root@d8:~# whatis grub-install
grub-install (8)     - install GRUB to a device
root@d8:~#
root@d8:~# #   => Neuen MBR erzeugen (nur 1x)
root@d8:~#
root@d8:~#
root@d8:~# whatis grub-mkconfig
grub-mkconfig (8)    - generate a GRUB configuration file
root@d8:~#
root@d8:~# #   => Neue Konfigurationsdatei erzeugen (immer wieder, bei Kernelupdates)

Software aus Quellcode bauen

AUFGABE: Bitte in die Thematik „Software aus dem Quellcode bauen“ einlesen:

http://www.linux-praxis.de/lpic1/lpi101/1.102.3.html

Praxisbeispiel ‚synbak‘:

$ wget http://www.initzero.it/products/opensource/synbak-3.5.tar.gz
$ tar zxf synbak-3.5.tar.gz

Als einfacher Nutzer konfigurieren und kompilieren:

$ cd synbak-3.5
$ ./configure --prefix=/opt
$ make

Jetzt führen wir die Installation als root durch:

$ /bin/su
$ make install
Making install in m4
make[1]: Entering directory '/home/tux/Downloads/synbak-3.5/m4'
make[2]: Entering directory '/home/tux/Downloads/synbak-3.5/m4'
make[2]: Nothing to be done for 'install-exec-am'.
...
$ exit

Leider wird das Programm nicht so ohne weiteres gefunden, was lediglich an der Umgebungsvariable PATH liegt. So sieht sie vorher aus:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Jetzt wird sie temorär um /opt/bin erweitert:

$ export PATH=/opt/bin:$PATH
$ synbak
synbak - Universal Backup System
copyright ©2003-2016 InitZero S.r.l.
written by Ugo Viti - ugo.viti@initzero.it
version 3.5 - 20170103
usage: /opt/bin/synbak [<options>]
...

102.3 Manage shared libraries

Welchen Sinn haben gemeinsam genutzte Bibliotheken?

  • Jedes Programm müsste sonst seine eigenen Libs mitbringen (oft die selben noch einmal).

  • Vorteil: Speicherplatzersparnis

  • Nachteil: Sicherheit - Hat eine Lib einen Fehler, dann haben ihn alle Apps auch

root@d8:~# file /opt/bin/synbak
/opt/bin/synbak: Bourne-Again shell script, UTF-8 Unicode text executable
root@d8:~# apt-get install sash
root@d8:~# file /bin/sash
/bin/sash: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=15ee0faf016357ea99c1db841638de40ec641090, stripped
root@d8:~#


root@d8:~# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=a8ff57737fe60fba639d91d603253f4cdc6eb9f7, stripped
root@d8:~#
root@d8:~# file /usr/bin/passwd
/usr/bin/passwd: setuid 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.32, BuildID[sha1]=573580ce2ad86ffabbec30ef6b5bb4f8dd2f4910, stripped
root@d8:~#
root@d8:~# file /usr/bin/k3b
/usr/bin/k3b: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=907bf0af022b0d76463ecffe52af1f4f50f67d01, stripped
root@d8:~#
root@d8:~# ls -lh /usr/bin/k3b
-rwxr-xr-x 1 root root 2,0M Okt 26  2014 /usr/bin/k3b
root@d8:~#
root@d8:~#
root@d8:~#
root@d8:~# ldd /usr/bin/k3b
        linux-vdso.so.1 (0x00007ffe75d83000)
        libk3bdevice.so.6 => /usr/lib/libk3bdevice.so.6 (0x00007fb14b097000)
        libk3blib.so.6 => /usr/lib/libk3blib.so.6 (0x00007fb14ac96000)


root@d8:~# ldd /usr/bin/cal
        linux-vdso.so.1 (0x00007ffe80f1e000)
        libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007f99f8bbb000)
        libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f99f8991000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f99f85e6000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f99f83e2000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f99f8de0000)
root@d8:~#
root@d8:~#
root@d8:~# file /etc/ld.so.c*
/etc/ld.so.cache:  data
/etc/ld.so.conf:   ASCII text
/etc/ld.so.conf.d: directory
root@d8:~#

Methode A)

Root ergänzt die Liste der Library-Pfade: vi /etc/ld.so.conf, danach muss der Cache neu aufgebaut werden:

root@d8:~# ldconfig
root@d8:~#
root@d8:~# ls -ltrcd /etc/ld.so.c*
-rw-r--r-- 1 root root     34 Jan 11 08:47 /etc/ld.so.conf
-rw-r--r-- 1 root root 122432 Jan 19 10:51 /etc/ld.so.cache
root@d8:~#
root@d8:~# ldconfig -p | wc -l
1327
root@d8:~#

Methode B) Ein einfacher Nutzer (Praktikant) kann sich selber helfen:

$ export LD_LIBRARY_PATH=/home/practise1/testlibs

Zum Finden von Verzeichnissen und ausführbaren Programmen:

root@d8:~# find /etc -maxdepth 1 -type d -name "*.d" | head -5
/etc/rc4.d
/etc/libpaper.d
/etc/rc2.d
/etc/sysctl.d
/etc/Muttrc.d
root@d8:~#
root@d8:~#
root@d8:~#
root@d8:~# find / -maxdepth 5 -type f -name "*d" -perm -700 | head
/lib/udev/scsi_id
/lib/udev/cdrom_id
/lib/udev/v4l_id
/lib/udev/ata_id
/lib/systemd/systemd-journald
/lib/systemd/systemd-shutdownd
/lib/systemd/systemd-networkd
/lib/systemd/systemd-udevd
/lib/systemd/systemd-localed
/lib/systemd/systemd-socket-proxyd
root@d8:~#

http://www.commandlinefu.com/commands/view/1489/display-calendar-with-specific-national-holidays-and-week-numbers

http://www.deutschlandfunk.de/denken-wird-ueberschaetzt-warum-unser-gehirn-die-leere-liebt.676.de.html?dram:article_id=368111

102.4 Use Debian package management

Debian als Mutter vieler Distributionen hat en sehr flexibles und stabiles Paketverwaltungssystem. Es gibt Backend- und Frontend-Tools.

Backends

NACHTEILE: Sie sind nicht netzwerkfähig, können keine Paketabhängigkeiten auflösen.

  • dpkg (einzelne Paket installieren / löschen)

  • dpkg-reconfigure (Konfigurationsassitent aufrufen)

Ein einzelnes Paket namens ‚dos2unix‘ installieren. Dazu laden wir am besten mit den Frontendtools das Paket lediglich herunterladen:

$ apt-get update
$ apt-get -d install dos2unix
$ cd /var/cache/apt/archives

$ ls -ltrc | tail -5
-rw-r--r-- 1 root root   199524 Jan 16 10:40 libparted-fs-resize0_3.2-7_amd64.deb
-rw-r--r-- 1 root root  1927462 Jan 16 10:40 gparted_0.19.0-2_amd64.deb
-rw-r--r-- 1 root root   356124 Jan 19 10:38 sash_3.8-3+b1_amd64.deb
drwxr-xr-x 2 root root     4096 Jan 20 08:19 partial
-rw-r--r-- 1 root root    77768 Jan 20 08:19 dos2unix_6.0.4-1_amd64.deb
$

Nun können wir das Paket installieren:

 $ dpkg -i dos2unix_6.0.4-1_amd64.deb
 $ dpkg -s dos2unix
 Package: dos2unix
 Status: install ok installed
 Priority: extra
 Section: text
 Installed-Size: 307
 Maintainer: Jari Aalto <jari.aalto@cante.net>
 Architecture: amd64
 Version: 6.0.4-1
 Depends: libc6 (>= 2.4)
 Conflicts: tofrodos (<< 1.7.8.debian.1)
 Description: convert text file line endings between CRLF and LF
 This package contains utilities dos2unix, unix2dos, mac2unix,
 unix2mac to convert the line endings of text files between UNIX (LF),
 DOS (CRLF) and Mac (CR) formats.
 .
 Text files under Windows and DOS typically have two ASCII characters
 at the end of each line: CR (carriage return) followed by LF (line
 feed). Older Macs used just CR, while UNIX uses just LF. While most
 modern editors can read all these formats, there may still be a need
 to convert files between them.
 .
 This is the classic utility developed in 1989.
 Homepage: http://freshmeat.net/projects/dos2unix
 $
 $ dpkg -l dos2unix
Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/
         Halb installiert/Trigger erWartet/Trigger anhängig
|/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht)
||/ Name                    Version          Architektur      Beschreibung
+++-=======================-================-================-===================================================
ii  dos2unix                6.0.4-1          amd64            convert text file line endings between CRLF and LF
$

Alle insŧallierten Pakete, die von Debians Paketmanager verwalteten werden, können einfach mit dpkg -l angezeigt werden.

$ dpkg -l | wc -l
1827
$

LDAP-Server installieren, um den Assistenen zu sehen:

$ pwd
/var/cache/apt/archives
$
$ apt-get clean
$
$ ls -l
insgesamt 4
-rw-r----- 1 root root    0 Sep 17 15:50 lock
drwxr-xr-x 2 root root 4096 Jan 20 08:19 partial
$
$ apt-get -d install slapd
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden zusätzlichen Pakete werden installiert:
  libodbc1 libslp1
Vorgeschlagene Pakete:
  libmyodbc odbc-postgresql tdsodbc unixodbc-bin slpd openslp-doc ldap-utils libsasl2-modules-gssapi-mit
  libsasl2-modules-gssapi-heimdal
Die folgenden NEUEN Pakete werden installiert:
  libodbc1 libslp1 slapd
0 aktualisiert, 3 neu installiert, 0 zu entfernen und 74 nicht aktualisiert.
Es müssen 1.677 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 5.071 kB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n]
Holen: 1 http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie/main libodbc1 amd64 2.3.1-3 [206 kB]
Holen: 2 http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie/main libslp1 amd64 1.2.1-10+deb8u1 [46,7 kB]
Holen: 3 http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie/main slapd amd64 2.4.40+dfsg-1+deb8u2 [1.425 kB]
Es wurden 1.677 kB in 0 s geholt (3.662 kB/s).
Herunterladen abgeschlossen; Nur-Herunterladen-Modus aktiv
$

Dank des Jokers kann nun ‚dpkg‘ doch ein winig die Abhängigkeiten auflösen:

$ dpkg -i *.deb

Jetzt wird der Assistent aktiv:

$ dpkg-reconfigure slapd

Wir löschen lediglich das Hauptpaket:

$ dpkg -r slapd
(Lese Datenbank ... 121773 Dateien und Verzeichnisse sind derzeit installiert.)
Entfernen von slapd (2.4.40+dfsg-1+deb8u2) ...
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...
Trigger für libc-bin (2.19-18+deb8u6) werden verarbeitet ...
$
$ dpkg -l slapd
Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/
        Halb installiert/Trigger erWartet/Trigger anhängig
|/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht)
||/ Name                    Version          Architektur      Beschreibung
+++-=======================-================-================-====================================================
rc  slapd                   2.4.40+dfsg-1+de amd64            OpenLDAP server (slapd)
$
$
$ ls -l /etc/ldap/
insgesamt 12
-rw-r--r-- 1 root     root      332 Jan 17  2016 ldap.conf
drwxr-xr-x 2 root     root     4096 Jan 20 08:48 schema
drwxr-xr-x 3 openldap openldap 4096 Jan 20 08:50 slapd.d
$

AUFGABE:

Bitte das Paket ‚slapd‘ wieder installieren und dann VOLLSTÄNDIG (samt Configs) entfernen, dananch bitte auch die anderen beiden Pakete (libs) entfernen.

Weitere Schalter:

$ dpkg -L libodbc1
/.
/usr
/usr/share
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/libodbc1
/usr/share/doc
/usr/share/doc/libodbc1
/usr/share/doc/libodbc1/changelog.Debian.gz
/usr/share/doc/libodbc1/copyright
/usr/share/doc/libodbc1/NEWS.Debian.gz
/usr/share/doc/libodbc1/changelog.gz
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/odbc
/usr/lib/x86_64-linux-gnu/odbc/libnn.so
/usr/lib/x86_64-linux-gnu/libodbccr.so.2.0.0
/usr/lib/x86_64-linux-gnu/libodbc.so.2.0.0
/usr/lib/x86_64-linux-gnu/libodbccr.so.2
/usr/lib/x86_64-linux-gnu/libodbccr.so.1
/usr/lib/x86_64-linux-gnu/libodbc.so.2
/usr/lib/x86_64-linux-gnu/libodbc.so.1
$
$ dpkg -S /etc/ldap
libldap-2.4-2:i386, slapd, libldap-2.4-2:amd64: /etc/ldap
$
$ dpkg --search /etc/ldap
libldap-2.4-2:i386, slapd, libldap-2.4-2:amd64: /etc/ldap
$

Purge (‚-P‘ oder ‚–purge‘) entfernt auch noch die Konfigurationsdateien:

$ dpkg -l slapd
Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/
        Halb installiert/Trigger erWartet/Trigger anhängig
|/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht)
||/ Name                    Version          Architektur      Beschreibung
+++-=======================-================-================-====================================================
rc  slapd                   2.4.40+dfsg-1+de amd64            OpenLDAP server (slapd)
$
$ dpkg -P slapd
(Lese Datenbank ... 121538 Dateien und Verzeichnisse sind derzeit installiert.)
Entfernen von slapd (2.4.40+dfsg-1+deb8u2) ...
Löschen der Konfigurationsdateien von slapd (2.4.40+dfsg-1+deb8u2) ...
Removing slapd configuration... done.
$
$ dpkg -l slapd
Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/
        Halb installiert/Trigger erWartet/Trigger anhängig
|/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht)
||/ Name                    Version          Architektur      Beschreibung
+++-=======================-================-================-====================================================
un  slapd                   <keine>          <keine>          (keine Beschreibung vorhanden)
$
$ dpkg -s slapd
dpkg-query: Paket »slapd« ist nicht installiert und es ist keine Information verfügbar
Verwenden Sie dpkg --info (= dpkg-deb --info) zum Untersuchen von Archiven
und dpkg --contents (= dpkg-deb --contents) zum Auflisten ihres Inhalts.
$

Das alte Frontend ‚dselect‘ installieren:

$ pwd
/var/cache/apt/archives
$
$ ls -l
insgesamt 1648
-rw-r--r-- 1 root root  205646 Apr 30  2014 libodbc1_2.3.1-3_amd64.deb
-rw-r--r-- 1 root root   46656 Sep  5  2015 libslp1_1.2.1-10+deb8u1_amd64.deb
-rw-r----- 1 root root       0 Sep 17 15:50 lock
drwxr-xr-x 2 root root    4096 Jan 20 08:44 partial
-rw-r--r-- 1 root root 1424610 Jan 17  2016 slapd_2.4.40+dfsg-1+deb8u2_amd64.deb
$
$ ### Anstelle von 'apt-get clean':
$
$ rm -vvv *.deb
„libodbc1_2.3.1-3_amd64.deb“ wurde entfernt
„libslp1_1.2.1-10+deb8u1_amd64.deb“ wurde entfernt
„slapd_2.4.40+dfsg-1+deb8u2_amd64.deb“ wurde entfernt
$
$
$ apt-get -d install dselect
$ ls -ltrc
insgesamt 1120
-rw-r----- 1 root root       0 Jan 11 08:50 lock
drwxr-xr-x 2 root root    4096 Jan 20 10:13 partial
-rw-r--r-- 1 root root 1140216 Jan 20 10:13 dselect_1.17.27_amd64.deb
$
$ dpkg --install dselect_1.17.27_amd64.deb
Vormals nicht ausgewähltes Paket dselect wird gewählt.
(Lese Datenbank ... 121509 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von dselect_1.17.27_amd64.deb ...
Entpacken von dselect (1.17.27) ...
dselect (1.17.27) wird eingerichtet ...
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...
$

Frontends für dpkg

  • dselect (Beenden mit STRG + C)

  • tasksel („Debian desktop environment“ == Gnome)

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

  • aptitude (VORSICHT: Es

$ apt-get install wireshark
$ Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden zusätzlichen Pakete werden installiert:
libc-ares2 libsmi2ldbl libwireshark-data libwireshark5 libwiretap4 libwsutil4 wireshark-common
Vorgeschlagene Pakete:
    snmp-mibs-downloader wireshark-doc
Die folgenden NEUEN Pakete werden installiert:
    libc-ares2 libsmi2ldbl libwireshark-data libwireshark5 libwiretap4 libwsutil4 wireshark wireshark-common
0 aktualisiert, 8 neu installiert, 0 zu entfernen und 74 nicht aktualisiert.
Es müssen 13,6 MB an Archiven heruntergeladen werden.
Nach dieser Operation werden 78,7 MB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n]
Holen: 1 http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie/main libsmi2ldbl amd64 0.4.8+dfsg2-10+b2 [122 kB]
Holen: 2 http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie/main libc-ares2 amd64 1.10.0-2+deb8u1 [72,5 kB]
...

$
$ apt-get remove wireshark
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt:
libc-ares2 libsmi2ldbl libwireshark-data libwireshark5 libwiretap4 libwsutil4 wireshark-common
Verwenden Sie »apt-get autoremove«, um sie zu entfernen.
Die folgenden Pakete werden ENTFERNT:
wireshark
0 aktualisiert, 0 neu installiert, 1 zu entfernen und 74 nicht aktualisiert.
Nach dieser Operation werden 2.554 kB Plattenplatz freigegeben.
Möchten Sie fortfahren? [J/n]
(Lese Datenbank ... 121932 Dateien und Verzeichnisse sind derzeit installiert.)
Entfernen von wireshark (1.12.1+g01b65bf-4+deb8u10) ...
Trigger für hicolor-icon-theme (0.13-1) werden verarbeitet ...
Trigger für mime-support (3.58) werden verarbeitet ...
Trigger für shared-mime-info (1.3-1) werden verarbeitet ...
Unknown media type in type 'all/all'
Unknown media type in type 'all/allfiles'
Unknown media type in type 'uri/mms'
Unknown media type in type 'uri/mmst'
Unknown media type in type 'uri/mmsu'
Unknown media type in type 'uri/pnm'
Unknown media type in type 'uri/rtspt'
Unknown media type in type 'uri/rtspu'
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...
Trigger für menu (2.1.47) werden verarbeitet ...
$
$ apt-get autoremove
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden Pakete werden ENTFERNT:
libc-ares2 libsmi2ldbl libwireshark-data libwireshark5 libwiretap4 libwsutil4 wireshark-common
0 aktualisiert, 0 neu installiert, 7 zu entfernen und 74 nicht aktualisiert.
Nach dieser Operation werden 76,1 MB Plattenplatz freigegeben.
Möchten Sie fortfahren? [J/n]
(Lese Datenbank ... 121920 Dateien und Verzeichnisse sind derzeit installiert.)
Entfernen von wireshark-common (1.12.1+g01b65bf-4+deb8u10) ...
Entfernen von libwireshark5:amd64 (1.12.1+g01b65bf-4+deb8u10) ...
Entfernen von libc-ares2:amd64 (1.10.0-2+deb8u1) ...
Entfernen von libsmi2ldbl:amd64 (0.4.8+dfsg2-10+b2) ...
Entfernen von libwireshark-data (1.12.1+g01b65bf-4+deb8u10) ...
Entfernen von libwiretap4:amd64 (1.12.1+g01b65bf-4+deb8u10) ...
Entfernen von libwsutil4:amd64 (1.12.1+g01b65bf-4+deb8u10) ...
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...
Trigger für libc-bin (2.19-18+deb8u6) werden verarbeitet ...
$
$ apt-get install frozen-bubble
$ dpkg -L frozen-bubble
$
$ grep -v ^# /etc/apt/sources.list

Der Inhalt dieser Datei:

deb http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie main
deb-src http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie main

deb http://security.debian.org/ jessie/updates main
deb-src http://security.debian.org/ jessie/updates main

deb http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie-updates main
deb-src http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie-updates main

Wir installieren zuerst einmal den vollständige vim-Editor:

$ apt-get install vim

TESTEN:

  • Insert: ‚i‘

  • Zurück in den Commando-Modus: ‚ESC‘

  • In dern Execute-Mosdus wechseln: ‚:‘

  • Write / quit: ‚wq‘ ENTER

Wir wollen wieder nur den aktiven Inhalt sehen: 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

Jetzt laden wir die Paketlisten neu herunter und suchen nach nichtfreien Wlan-Treibern für Intel:

$ apt-get update
Ign http://ftp.tu-chemnitz.de jessie InRelease
OK   http://ftp.tu-chemnitz.de jessie-updates InRelease
OK   http://security.debian.org jessie/updates InRelease
OK   http://ftp.tu-chemnitz.de jessie Release.gpg
OK   http://ftp.tu-chemnitz.de jessie Release
Holen: 1 http://ftp.tu-chemnitz.de jessie-updates/main amd64 Packages/DiffIndex [6.916 B]
Holen: 2 http://ftp.tu-chemnitz.de jessie-updates/main i386 Packages/DiffIndex [6.916 B]
Holen: 3 http://ftp.tu-chemnitz.de jessie-updates/main Translation-en/DiffIndex [2.704 B]
OK   http://security.debian.org jessie/updates/main amd64 Packages
OK   http://ftp.tu-chemnitz.de jessie/main amd64 Packages
OK   http://security.debian.org jessie/updates/main i386 Packages
Holen: 4 http://ftp.tu-chemnitz.de jessie/contrib amd64 Packages [50,2 kB]
OK   http://security.debian.org jessie/updates/main Translation-en
Holen: 5 http://ftp.tu-chemnitz.de jessie/non-free amd64 Packages [83,6 kB]
OK   http://ftp.tu-chemnitz.de jessie/main i386 Packages
Holen: 6 http://ftp.tu-chemnitz.de jessie/contrib i386 Packages [49,5 kB]
Holen: 7 http://ftp.tu-chemnitz.de jessie/non-free i386 Packages [80,4 kB]
Holen: 8 http://ftp.tu-chemnitz.de jessie/contrib Translation-en [38,5 kB]
OK   http://ftp.tu-chemnitz.de jessie/main Translation-de_DE
OK   http://ftp.tu-chemnitz.de jessie/main Translation-de
OK   http://ftp.tu-chemnitz.de jessie/main Translation-en
Holen: 9 http://ftp.tu-chemnitz.de jessie/non-free Translation-en [72,1 kB]
Es wurden 391 kB in 2 s geholt (173 kB/s).
Paketlisten werden gelesen... Fertig
$
$ apt-cache search iwl
firmware-iwlwifi - Binary firmware for Intel Wireless cards
$

Nach der Installation mit apt-get install firmware-iwlwifi:

$ ### dpkg -L  ...
$
$ dpkg --listfiles firmware-iwlwifi
/.
/lib
/lib/firmware
/lib/firmware/iwlwifi-7260-7.ucode
/lib/firmware/iwlwifi-7265-8.ucode
/lib/firmware/iwlwifi-6050-4.ucode

AUFGABEN:

$ ## apt-get -d install redshift
$ ls -l *.deb
-rw-r--r-- 1 root root 29864 Sep  1  2014 libgeoclue0_0.12.99-4_amd64.deb
-rw-r--r-- 1 root root 56112 Okt 10  2014 redshift_1.9.1-4_amd64.deb
$
$ ## alien --to-rpm redshift_1.9.1-4_amd64.deb
$ ## alien --to-rpm libgeoclue0_0.12.99-4_amd64.deb
$

Zur Lösung:

$ mkdir /root/redshift-for-rpm
$
$ cd /root/redshift-for-rpm
$
$ pwd
/root/redshift-for-rpm
$
$ alien --to-rpm /var/cache/apt/archives/redshift_1.9.1-4_amd64.deb
redshift-1.9.1-5.x86_64.rpm generated
$
$ ## alien --to-rpm /var/cache/apt/archives/libgeoclue0_0.12.99-4_amd64.deb
$ alien --to-rpm /var/cache/apt/archives/libgeoclue0_0.12.99-4_amd64.deb
Warning: Skipping conversion of scripts in package libgeoclue0: postinst postrm
Warning: Use the --scripts parameter to include the scripts.
libgeoclue0-0.12.99-5.x86_64.rpm generated
$
$ ls -l
insgesamt 120
-rw-r--r-- 1 root root 38617 Jan 20 12:06 libgeoclue0-0.12.99-5.x86_64.rpm
-rw-r--r-- 1 root root 80279 Jan 20 12:06 redshift-1.9.1-5.x86_64.rpm
$

Der kleine Editor ‚zile‘ (emacs-Kompatibel) kann wahrscheinliche eher zum Erfolg führen (Installation auf CentOS):

$ apt-get -d install zile
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt:
frozen-bubble-data libalien-sdl-perl libcapture-tiny-perl libclass-inspector-perl libcompress-bzip2-perl
libfile-sharedir-perl libfile-which-perl libfluidsynth1 libmikmod3 libpango1.0-0 libsdl-gfx1.2-5 libsdl-mixer1.2
libsdl-pango1 libsdl-perl libsdl-ttf2.0-0 libtie-simple-perl musescore-soundfont-gm
Verwenden Sie »apt-get autoremove«, um sie zu entfernen.
Die folgenden NEUEN Pakete werden installiert:
zile
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 74 nicht aktualisiert.
Es müssen 164 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 362 kB Plattenplatz zusätzlich benutzt.
Holen: 1 http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie/main zile amd64 2.4.11-1 [164 kB]
Es wurden 164 kB in 0 s geholt (1.403 kB/s).
Herunterladen abgeschlossen; Nur-Herunterladen-Modus aktiv
$
$
$ alien --to-rpm /var/cache/apt/archives/zile_2.4.11-1_amd64.deb
Warning: Skipping conversion of scripts in package zile: postinst postrm prerm
Warning: Use the --scripts parameter to include the scripts.
zile-2.4.11-2.x86_64.rpm generated
$
$ file *
libgeoclue0-0.12.99-5.x86_64.rpm: RPM v3.0 bin i386/x86_64
redshift-1.9.1-5.x86_64.rpm:      RPM v3.0 bin i386/x86_64
zile-2.4.11-2.x86_64.rpm:         RPM v3.0 bin i386/x86_64
$

Das Paketformat ‚deb‘ liegt im ‚ar‘-Format vor:

$ cd -
/var/cache/apt/archives
$
$ mdir dos2unix
-su: mdir: Kommando nicht gefunden.
$
$ mkdir dos2unix
$
$ cd dos2unix/
$
$ ar x ../dos2unix*.deb
$
$
$ ls -l
insgesamt 84
-rw-r--r-- 1 root root  1391 Jan 20 12:33 control.tar.gz
-rw-r--r-- 1 root root 76184 Jan 20 12:33 data.tar.xz
-rw-r--r-- 1 root root     4 Jan 20 12:33 debian-binary
$

Fazit:

Wiederholung Debian-Paketverwaltung:

D8> apt-get update
D8> apt-get install usbutils

Aus welchem Paket stammt das Programm ‚lspci‘?

D8> dpkg -S lsusb
usbutils: /usr/share/man/man8/lsusb.8.gz
usbutils: /usr/bin/lsusb
D8>

Welche Dateien gehören außerdem zum Paket ‚usbutils‘?

D8> dpkg -L usbutils
/.
/var
/var/lib
/var/lib/usbutils
/var/lib/usbutils/usb.ids
/usr
/usr/share
/usr/share/misc
/usr/share/doc
/usr/share/doc/usbutils
/usr/share/doc/usbutils/changelog.Debian.gz
/usr/share/doc/usbutils/changelog.gz
/usr/share/doc/usbutils/copyright
/usr/share/doc/usbutils/README.Debian
/usr/share/pkgconfig
/usr/share/pkgconfig/usbutils.pc
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/update-usbids.8.gz
/usr/share/man/man8/lsusb.8.gz
/usr/share/man/man1
/usr/share/man/man1/usb-devices.1.gz
/usr/sbin
/usr/sbin/update-usbids
/usr/bin
/usr/bin/lsusb
/usr/bin/usbhid-dump
/usr/bin/usb-devices
/usr/share/misc/usb.ids
D8>

Entfernen eines Paketes, wwobei Config auch mit gelöscht werden sollen:

D8> dpkg --purge usbutils     # Alt.:  -P
(Lese Datenbank ... 124433 Dateien und Verzeichnisse sind derzeit installiert.)
Entfernen von usbutils (1:007-2) ...
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...
D8>

102.5 Use RPM and YUM package management

ZIEL: Anders als bei Debian („ABSOLUTELY NO WARRANTY“) muss das Paketformat kommerzionellen Ansprüchen genügen.

Auf welcher Maschine arbeiten wir?

C6> cat /etc/issue.net
CentOS release 6.8 (Final)
Kernel \r on an \m
C6>

Mit Hilfe von ‚yumdownloader‘ können wir ähnlich wie bei Debian ein Paket herunterladen, ohne es zu installieren zu müssen:

C6> yum install yum-utils
C6> yumdownloader nano
Geladene Plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.fau.de
* extras: centosmirror.netcup.net
* updates: ftp.fau.de
nano-2.0.9-7.el6.x86_64.rpm                     | 436 kB     00:00
C6>


C6> ### rpm-Datenbank abfragen ('-q' oder '--query' = Query-Modus):
C6>
C6> rpm -q nano
Das Paket nano ist nicht installiert
C6>

Den Inhalt der nicht installierten Paketes auflisten:

C6> rpm --query --list --package nano-2.0.9-7.el6.x86_64.rpm | grep bin
/bin/nano
/bin/rnano
/usr/bin/nano
/usr/bin/rnano
C6>
C6> rpm -qlp nano-2.0.9-7.el6.x86_64.rpm | grep bin
/bin/nano
/bin/rnano
/usr/bin/nano
/usr/bin/rnano
C6>

AUFGABEN: nano jetzt bitte installieren, Inhalt auflisten, deinstallieren…

C6> rpm -hiv nano-2.0.9-7.el6.x86_64.rpm
Vorbereiten...              ########################################### [100%]
    Das Paket nano-2.0.9-7.el6.x86_64 ist bereits installiert
C6>
C6> rpm -ql nano | head -5
/bin/nano
/bin/rnano
/etc/nanorc
/usr/bin/nano
/usr/bin/rnano
C6>
C6>
C6> rpm -e nano

Neben den Schaltern ‚-i‘ bzw. ‚–install‘ kann auch für die Installation von Paketen ‚-F‘ bzw. ‚–freshen‘ sowie mit ‚-U‘ bzw. ‚–upgrade‘ verwendet werden:

C6> rpm --freshen nano-2.0.9-7.el6.x86_64.rpm
C6>
C6> rpm --freshen nano-2.0.9-7.el6.x86_64.rpm
C6> echo $?
0
C6> nano
-bash: nano: Kommando nicht gefunden.
C6> ### Die Option weigert sich völlig scheigend, es zu tun!
C6>
C6> rpm --upgrade nano-2.0.9-7.el6.x86_64.rpm
C6>
C6> nano --help
Aufruf: nano [OPTIONEN] [[+ZEILE,SPALTE] Datei]...

Option          lange GNU-Option                Bedeutung
-h, -?         --help                  diese Meldung anzeigen
+ZEILE,SPALTE                          bei Zeile ZEILE, Spalte SPALTE beginnen
-A             --smarthome             intelligente Pos1-Taste aktivieren
-B             --backup                existierende Dateien beim Speichern sichern
...
C6>

Wir installieren mit dem Backend ‚yum‘ erst einmal schnell die man-Pages samt Tools:

C6> yum install man man-pages

Nun verifizieren wir, ob das Paket unverfälscht ist:

C6> rpm -V bash
S.5......    /bin/bash
S.5......    /usr/bin/bashbug-64
C6>
C6> rpm -Vv bash
S.5......    /bin/bash
.........    /bin/sh
.........  c /etc/skel/.bash_logout

...
C6>

Alle installierten Pakete kann man so prüfen:

C6> rpm -Va | less

Den Inhalt des RPM-Paketes entpacken:

C6> rpm2cpio nano-2.0.9-7.el6.x86_64.rpm > nano-editor.cpio
C6>
C6> file nano-editor.cpio
nano-editor.cpio: ASCII cpio archive (SVR4 with no CRC)
C6>
C6>
C6> cat nano-editor.cpio | cpio -idm
3123 blocks
C6>
C6> ls -ltr
insgesamt 2348
-rw-r--r--. 1 root root  446364  3. Jul 2011  nano-2.0.9-7.el6.x86_64.rpm
-rw-r--r--. 1 root root    3384 17. Jan 08:49 install.log.syslog
-rw-r--r--. 1 root root   10067 17. Jan 08:50 install.log
-rw-------. 1 root root    1107 17. Jan 08:50 anaconda-ks.cfg
-rw-r--r--. 1 root root      36 17. Jan 15:02 testdatei
-rw-r--r--. 1 root root  211745 17. Jan 15:04 modules.dep
-rw-r--r--. 1 root root  102556 20. Jan 12:29 dos2unix-6.0.4-2.x86_64.rpm
-rw-r--r--. 1 root root 1598796 23. Jan 12:03 nano-editor.cpio
drwxr-xr-x. 2 root root    4096 23. Jan 12:04 etc
drwxr-xr-x. 2 root root    4096 23. Jan 12:04 bin
drwxr-xr-x. 4 root root    4096 23. Jan 12:04 usr
C6>
C6> ls etc/
nanorc
C6>

Tipp am Rande:

  • Daemons finden: find /sbin  /usr/sbin -name "*d"  -type f -perm -700

  • Konfigurations-Directories finden: find /etc -name "*.d" -type d

Das rpm-Frontend ‚yum‘

Zur Frage, wo die Paketquellen liegen:

C6> grep --color -v ^# /etc/yum.repos.d/*
/etc/yum.repos.d/CentOS-Base.repo:
/etc/yum.repos.d/CentOS-Base.repo:[base]
/etc/yum.repos.d/CentOS-Base.repo:name=CentOS-$releasever - Base
/etc/yum.repos.d/CentOS-Base.repo:mirrorlist=http://mirrorlist.centos.org/?release=...
...

Vergleich mit Debian:

C6> yum check-update       ### =  apt-get update
C6> yum update             ### =  apt-get upgrade

Das Kommando yum upgrade berücksichtigt auch noch veraltete pakete sonst ist es identisch mit yum update.

FORSCHUNGSAUFTRAG: Wie kann ‚apropos‘ auf CentOS 6 zum Laufen gebracht werden?

C6> rpm -q man
man-1.6f-32.el6.x86_64
C6>
C6> rpm -ql man | grep bin
/usr/bin/apropos
/usr/bin/man
/usr/bin/man2html
/usr/bin/manpath
/usr/bin/whatis
/usr/sbin/makewhatis
C6>
C6> file /usr/sbin/makewhatis
/usr/sbin/makewhatis: Bourne-Again shell script text executable
C6>
C6> rpm -q man
man-1.6f-32.el6.x86_64
C6>
C6>
C6> rpm -ql man | grep bin
/usr/bin/apropos
/usr/bin/man
/usr/bin/man2html
/usr/bin/manpath
/usr/bin/whatis
/usr/sbin/makewhatis
C6>

Mit Hilfe des Skriptes ‚makewhatis‘ kann das leicht erledigt werden, wobei die Option ‚-v‘ dabei ausführliche Ausgaben produzieren würde:

C6> makewhatis
C6>
C6> grep --color -r makewhatis /etc/cron*
/etc/cron.daily/makewhatis.cron:LOCKFILE=/var/lock/makewhatis.lock
/etc/cron.daily/makewhatis.cron:# two makewhatis cron scripts get run close to each other to keep
/etc/cron.daily/makewhatis.cron:# Rebuild the database if makewhatis was since last full run,
/etc/cron.daily/makewhatis.cron:   find /usr/sbin/makewhatis -newer /var/cache/man/whatis |grep -q .
/etc/cron.daily/makewhatis.cron:        makewhatis -w
/etc/cron.daily/makewhatis.cron:        makewhatis -U -w
C6>
C6> less /etc/cron.daily/makewhatis.cron
C6>
C6> grep --color -r cron.daily /etc/cron*
/etc/cron.hourly/0anacron:if test -r /var/spool/anacron/cron.daily; then
/etc/cron.hourly/0anacron:    day=`cat /var/spool/anacron/cron.daily`
C6>
C6> file `which anacron`
/usr/sbin/anacron: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
C6>

Gobby unter Windows per Desktop-Doppelklick starten

Wir schreiben uns mit Hilfe von ‚notepad‘ eine kleine Batchdatei namens ‚gobby-start.bat‘, deren Inhalt wir hiermit zeigen und kontrollieren wollen:

WIN + R: cmd


C:\>type Users\apemmann\Desktop\gobby-start.bat
"c:\Program Files (x86)\Gobby-0.5\bin\Gobby-0.5.exe" -c pemmann.de:6523/lpic-1
C:\>

Anmerkung: Das Kommando ‚type‘ gibt einfach nur eine Datei aus, es ist mit dem Unix-cat zu vergleichen.

AUFGABE: Installation des EPEL-Paketes, um ein weiteres Repository zu erhalten

Da wir uns nur noch an das Kürzel ‚epel‘ erinnern können, wird ein einmal danach gesucht:

C6> yum search epel
Geladene Plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.fau.de
* extras: mirror1.hs-esslingen.de
* updates: ftp.fau.de
================================================= N/S Matched: epel ==================================================
epel-release.noarch : Extra Packages for Enterprise Linux repository configuration

Name and summary matches only, use "search all" for everything.
C6>

Mit yum install epel-release können wir es ganz einfach installieren.

Nach dem eben durchgeführten Installieren des neuen Repsitories mittels yum install epel-release haben wir viel mehr Pakete zur Auswahl:

C6> yum list available > available-packages-with-epel.txt
C6>
C6> wc -l available-packages-with*
19004 available-packages-with-epel.txt
6567 available-packages-without-epel.txt
25571 insgesamt
C6>

Installationsaufgabe: unter Debian bitte folgende Pakete installieren:

  • tty-clock

  • terminator

Rechercheaufgabe: Wie kann man die Installieren unter Debian die Dokumente unter /usr/share/doc von der Installation ausschließen?

Lösungen:

D8> apt-get update
D8> apt-get install tty-clock
D8>
D8> apt-get install terminator

Bitte über ALT + F2 starten (Ausführen-Menü): terminator

Einstellungen:

  • Rechtsklick: „Einstellungen“ => „Profiles“ => Registerkarte „Colors“ => Auswahl treffen bei „Built-in schemes“

  • Rechtsklick: „Horizontal teilen“ und/oder „Vertikal teilen“

Ohne „/usr/share/doc“ u.a. Pakete: apt-get install --no-install-recommends <MYPACKAGE>

Topic 103: GNU and Unix Commands

103.1 Work on the command line

Bitte unterteilen nach

  • Konfigururationsdateien für die bash-Shell

  • Konfigururationsdateien für alle anderen Shells

Farbpromt ALS EINFACHER BENUTZER unter Debian einrichten:

tux@d8:~$ cd
tux@d8:~$ pwd
/home/tux
tux@d8:~$ vi .bashrc

Da drin suchen wir mittels

/force

nach ‚force_color_prompt=yes‘. Die davorstehende Raute (‚#‘) ist ein Kommentar und muss einfach entfernt werden.

Wir speichern die Datei mit: ESC ZZ

Durch ESC gelangt man in den Command-Modus, mit SHIFT + z (2x das Ganze) speichert man die Änderung und verlässt den Editor zugleich.

Mit source .bashrc wird diese Datei in aktueller Shellumgbung ausgeführt und der Prompt wird augenblicklich grün/blau/schwarz dargestellt.

Jetzt soll ‚root‘ einen roten Propot erhalten:

tux@d8:~$ su -
Passwort:
root@d8:~#
root@d8:~# pwd
/root
root@d8:~#
root@d8:~# cp -b /home/tux/.bashrc .
root@d8:~#
root@d8:~# ls -ltrc .ba*
root@d8:~# vi .bashrc

Wir suchen jetzt nach „32“, also:

/32   ENTER

Wir stellen den Cursor auf die „2“, drücken genau dort ein ‚x‘ (kleines „x“), gehen dann mit einem kleinen ‚i‘ in den Insert-Modus und geben OHNE DEN CURSOR ZU BEWEGEN eine ‚1‘ ein.

Gespeichert wird diesmal auf eine weitere, andere Art: ESC-Taste drücken (ruhig merfach), danach mit ‚:x‘ speichern und beenden.

Dann führen wir die Startupdatei mit Punkt und einem darauffolgenden Leerzeichen aus (innerhalt der aktuellen Shellumgebung, = ‚source‘):

root@d8:~# . .bashrc
root@d8:~#

Nun ist der Prompt für „root“ rot geworden. Die Datei ‚~/.bashrc‘ wird bei jedem neuen Login sowie bei jeder neuen bash (in Skripten oder Terminals) abgearbeitet.

Der Punkt ist ein Alias für ‚source‘, beide sind Shell-interne Befehle:

root@d8:~# enable | head
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
root@d8:~#
root@d8:~# enable | grep source
enable source
root@d8:~#

Bitte als ‚tux‘ auf „tty1“ einloggen (STRG + ALT + F1) und testen, ob der Bildschirm gelöscht wird. Alternativ kann „tty2“ (STRG + ALT + F2), „tty3“ (STRG + ALT + F3) usw. verwendet werden.

Zurück zur grafischen Oberfläche gelangt man mit STRG + ALT + F7.

Aufgabe: In die Datei ‚~/.bash_logout‘ folgende Zeilen hineinschreiben:

mkdir -p /home/tux/.backup
cp -a /home/tux/* /home/tux/.backup/

Bitte den ‚vi‘ benutzen, wenn man ihn verlassen möchte, ohne irgendetwas zu speichern, gibt man ein: ESC und danach :q!.

LÖSUNG

tux@d8:~$ cat .bash_logout
# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

# Backups nur von sichtbaren Dateien und Verzeichnissen machen
mkdir -p /home/tux/.backup
cp -a /home/tux/* /home/tux/.backup
tux@d8:~$

Wir arbeiten weiter mit Variablen:

tux@d8:~$ env | grep HOME
HOME=/home/tux
tux@d8:~$
tux@d8:~$
tux@d8:~$ myname="Axel Pemmann"
tux@d8:~$
tux@d8:~$ echo $myname
Axel Pemmann
tux@d8:~$
tux@d8:~$ ### Das Dollar-Zeichen wird LEDIGLICH beim Zugreifen auf den Variableninhalt benötigt!!
tux@d8:~$ #    (nicht beim Exportieren)
tux@d8:~$
tux@d8:~$
tux@d8:~$ echo $HOME
/home/tux
tux@d8:~$
tux@d8:~$ echo ~
/home/tux
tux@d8:~$
tux@d8:~$ cd /usr/share/doc
tux@d8:/usr/share/doc$
tux@d8:/usr/share/doc$ head -3 ~/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
tux@d8:/usr/share/doc$


tux@d8:/usr/share/doc$ cd
tux@d8:~$
tux@d8:~$ xterm &
[1] 31404
tux@d8:~$
[1]+  Fertig                  xterm
tux@d8:~$
tux@d8:~$
tux@d8:~$
tux@d8:~$
tux@d8:~$ HEUTE=Dienstag
tux@d8:~$
tux@d8:~$ xterm &
[1] 31415
tux@d8:~$
[1]+  Fertig                  xterm
tux@d8:~$
tux@d8:~$
tux@d8:~$ env | grep HEUTE
tux@d8:~$
tux@d8:~$ set | grep HEUTE
HEUTE=Dienstag
tux@d8:~$
tux@d8:~$
tux@d8:~$ export HEUTE
tux@d8:~$
tux@d8:~$
tux@d8:~$ env | grep HEUTE
HEUTE=Dienstag
tux@d8:~$
tux@d8:~$ xterm &
[1] 31435
tux@d8:~$
[1]+  Fertig                  xterm
tux@d8:~$
tux@d8:~$
tux@d8:~$ ### Schrittweise die Variable entfernen:
tux@d8:~$
tux@d8:~$ # A) Export entfernen:
tux@d8:~$
tux@d8:~$ export -n HEUTE
tux@d8:~$
tux@d8:~$ env | grep HEUTE
tux@d8:~$ set | grep HEUTE
HEUTE=Dienstag
tux@d8:~$
tux@d8:~$
tux@d8:~$ # B) Komplett aus der Prozessumgebung entfernen:
tux@d8:~$
tux@d8:~$ unset HEUTE
tux@d8:~$
tux@d8:~$ env | grep HEUTE
tux@d8:~$ set | grep HEUTE
tux@d8:~$
tux@d8:~$
tux@d8:~$ ### Unterschied zw. env und set:
tux@d8:~$
tux@d8:~$ env | wc -l
41
tux@d8:~$
tux@d8:~$ set | wc -l
2449
tux@d8:~$

BlueStacks und APK

Erste Schritte siehe unter http://pemmann.de/cc/Braindumps/android-player_vce-simulator_einrichten.html

  • BlueStacks wie üblich installieren

  • Über SharedFolder („C:ProgramDataBlueStacksUserDataSharedFolder“) die gewünschten apk-Dateien in Android bereitstellen

  • Im Android-System Dateimanager öffnen (blaues, rechteckiges Symbol mit Kreis)

  • Mit Mausrad nach unten scrollen

  • Mit einfachem Linksklick den Ordner ‚windows‘ öffnen

  • Mit einfachem Linksklick den Ordner ‚BstShardFolder‘ öffnen

  • Einfach-Klick auf „A__VCE_Silver-Full-5.8.apk“, => „Installieren“

  • Die App nun „Öffnen“…

  • „Do you want to load…“ => „No“

  • vce-Dateien über „Add“ => „File“ einbinden

  • Oben rechts kann man jetzt auf „Start“ klicken…

LPI-relevante Variablen:

  • HISTSIZE

  • MANPATH

  • PS1 (äußere Eingabeprompt)

  • PS2 (innere Eingabeprompt)

  • 1 bis 9 (Positionsparameter)

Im Beispiel:

D8> PS1="\u@\h D8> "
tux@d8 D8>
tux@d8 D8>
tux@d8 D8> PS1="\u@\h \w> "
tux@d8 ~>
tux@d8 ~> cd /usr/share/doc
tux@d8 /usr/share/doc>
tux@d8 /usr/share/doc>
tux@d8 /usr/share/doc> PS1="\u@\h \W> "
tux@d8 doc>
tux@d8 doc> pwd
/usr/share/doc
tux@d8 doc>

PS2 farbig gestalten, siehe https://wiki.archlinux.de/title/Bash-Prompt_anpassen

tux@d8:~$ vi übergabetest.sh
tux@d8:~$
tux@d8:~$ ls -l übergabetest.sh
-rw-r--r-- 1 tux tux 38 Jan 25 08:29 übergabetest.sh
tux@d8:~$
tux@d8:~$ cat übergabetest.sh
echo Übergebene Parameter:  $1 $2 $3
tux@d8:~$
tux@d8:~$ chmod +x übergabetest.sh
tux@d8:~$
tux@d8:~$
tux@d8:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
tux@d8:~$
tux@d8:~$ export PATH=.:$PATH
tux@d8:~$
tux@d8:~$ echo $PATH
.:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
tux@d8:~$
tux@d8:~$
tux@d8:~$ übergabetest.sh Heute ist Mittwoch, glaube ich.
Übergebene Parameter: Heute ist Mittwoch,
tux@d8:~$
tux@d8:~$ übergabetest.sh Heute "ist Mittwoch, glaube ich."
Übergebene Parameter: Heute ist Mittwoch, glaube ich.
tux@d8:~$
tux@d8:~$
tux@d8:~$
tux@d8:~$ PS1="D8> "
D8>
D8> echo 'echo "Dem Skript wurden $# Parameter übergeben."' >> übergabetest.sh
D8>
D8> übergabetest.sh Hallo Welt und Universum
Übergebene Parameter: Hallo Welt und
Dem Skript wurden 4 Parameter übergeben.
D8>

Zu den Aliasen:

D8> alias
alias ls='ls --color=auto'
D8>
D8> rm -i übergabetest.sh
rm: reguläre Datei „übergabetest.sh“ entfernen? n
D8>
D8>
D8> alias rm='/bin/rm -i'
D8>
D8> alias cp='/bin/cp -i'
D8>
D8> alias mv='/bin/mv -i'
D8>
D8>
D8> rm übergabetest.sh
/bin/rm: reguläre Datei „übergabetest.sh“ entfernen? d
D8>
D8> ls -l übergabetest.sh
-rwxr-xr-x 1 tux tux 88 Jan 25 08:40 übergabetest.sh
D8>
D8>
D8> ### AUFGABE: Diese 3 Aliase in eine Startupdatei der Bash schreiben, die jedesmal (beim Login und
D8> #    mit jeder neuen Shell) ausgeführt wird.
D8>
D8>

AUFGABEN:

  • Diese 3 Aliase in eine Startupdatei der Bash schreiben, die jedesmal (beim Login und mit jeder neuen Shell) ausgeführt wird.

  • Das Kapitel weiter durcharbeiten (bis 99)

DIE LÖSUNG:

root@d8:~# vi /etc/bash.bashrc
root@d8:~#
root@d8:~# grep ^alias /etc/bash.bashrc     # CentOS:  /etc/bashrc
alias rm="/bin/rm -i"
alias cp="/bin/cp -i"
alias mv="/bin/mv -i"
root@d8:~#

Testweise ein neues X-Terminal starten und alias eingeben:

tux@d8:~$ touch datei-{0..9}
tux@d8:~$
tux@d8:~$ ls -l datei-*
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-0
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-1
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-2
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-3
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-4
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-5
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-6
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-7
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-8
-rw-r--r-- 1 tux tux 0 Jan 25 10:37 datei-9
tux@d8:~$
tux@d8:~$ rm datei-*
/bin/rm: reguläre leere Datei „datei-0“ entfernen? j
/bin/rm: reguläre leere Datei „datei-1“ entfernen? j
/bin/rm: reguläre leere Datei „datei-2“ entfernen? j
/bin/rm: reguläre leere Datei „datei-3“ entfernen? j
/bin/rm: reguläre leere Datei „datei-4“ entfernen? ^C
tux@d8:~$
tux@d8:~$
tux@d8:~$ \rm datei-*
tux@d8:~$
tux@d8:~$ # Ein vorangestellter Backslash maskiert i.d.R. das nachfolgende Zeichen, hier wird der Alias
tux@d8:~$ #  'rm' on-the-fly einmalig übersprungen.
tux@d8:~$
tux@d8:~$ # Andere Möglichkeiten sind 'unalias rm' sowie 'rm -f <DATEIEN>'.
tux@d8:~$

Zum Thema Man-Pages

tux@d8:~$ man man

tux@d8:~$ whatis cp
cp (1)               - copy files and directories
tux@d8:~$
tux@d8:~$ # In der Kurzbezeichnung 'Name' suchen:
tux@d8:~$
tux@d8:~$ apropos copy | head -5
debconf-copydb (1)   - kopiere eine Debconf-Datenbank
bcopy (3)            - copy byte sequence
copysign (3)         - copy sign of a number
copysignf (3)        - copy sign of a number
copysignl (3)        - copy sign of a number
tux@d8:~$
tux@d8:~$ man -k copy | head -5
debconf-copydb (1)   - kopiere eine Debconf-Datenbank
bcopy (3)            - copy byte sequence
copysign (3)         - copy sign of a number
copysignf (3)        - copy sign of a number
copysignl (3)        - copy sign of a number
tux@d8:~$
tux@d8:~$
tux@d8:~$ # Merke:   'apropos' == 'man -k'!!

Bitte in dieses Thema einordnen:

tux@d8:~$ whatis cp
cp (1)               - copy files and directories
tux@d8:~$
tux@d8:~$ whereis cp
cp: /bin/cp /usr/share/man/man1/cp.1.gz  <evl. Quellcode-Dateien>
tux@d8:~$
tux@d8:~$ manpath
/usr/local/man:/usr/local/share/man:/usr/share/man
tux@d8:~$
tux@d8:~$ set | grep MANPATH
tux@d8:~$
tux@d8:~$ env | grep MANPATH

103.2 Process text streams using filters

Zur Motivation: „Kein Programmierballast - höhere Stabilität!“ => KISS-Prinzip

root@d8:~# df -h
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1       7,4G    5,3G  1,8G   76% /
udev             10M       0   10M    0% /dev
tmpfs           403M    5,8M  397M    2% /run
tmpfs          1006M    264K 1005M    1% /dev/shm
tmpfs           5,0M    4,0K  5,0M    1% /run/lock
tmpfs          1006M       0 1006M    0% /sys/fs/cgroup
shared          466G    447G   19G   96% /media/sf_shared
tmpfs           202M    8,0K  202M    1% /run/user/1000
root@d8:~#
root@d8:~#
root@d8:~# du -sh /usr/* | sort -h | tail
124K    /usr/local
1,7M    /usr/games
20M     /usr/include
27M     /usr/sbin
49M     /usr/src
138M    /usr/bin
1,5G    /usr/share
1,9G    /usr/lib
root@d8:~#
root@d8:~# du -sh /usr/lib/* | sort -h | tail
17M     /usr/lib/vlc
38M     /usr/lib/python3
79M     /usr/lib/jvm
93M     /usr/lib/gcc
96M     /usr/lib/firefox-esr
97M     /usr/lib/kde4
107M    /usr/lib/python2.7
224M    /usr/lib/i386-linux-gnu
256M    /usr/lib/libreoffice
647M    /usr/lib/x86_64-linux-gnu
root@d8:~#

In dem Zusammenhang ein Softwaretipp:

D8> apt-get install ncdu

D8>
D8> whoami
tux
D8>
D8> pwd
/home/tux
D8>
D8>
D8>


D8> vi obst.txt
D8>
D8> cat obst.txt
1               Birnen
2               Äpfel
3               Bananen
4               Erdbeeren
D8>
D8> cat obst.txt -A
1^I^IBirnen$
2^I^IM-CM-^Dpfel$
3^I^IBananen$
4^I^IErdbeeren$
D8>
D8>
D8> tac obst.txt
4               Erdbeeren
3               Bananen
2               Äpfel
1               Birnen
D8>


D8> head -2 obst.txt
1               Birnen
2               Äpfel
D8>
D8>
D8> head -2  ~/obst.txt /etc/hosts
==> /home/tux/obst.txt <==
1               Birnen
2               Äpfel

==> /etc/hosts <==
127.0.0.1       localhost
127.0.1.1       d8.localdomain  d8
D8>

ACHTUNG: tail benötigt die Option ‚-n‘, um mehrere DAteien zu verarbeiten:

D8> tail -2  ~/obst.txt /etc/hosts
tail: Option in ungültigen Kontext benutzt – 2
D8>
D8> tail -n2  ~/obst.txt /etc/hosts
==> /home/tux/obst.txt <==
3               Bananen
4               Erdbeeren

==> /etc/hosts <==
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
D8>

Im Terminal 1 schreiben wir Daten in eine Datei:

D8> echo 123 > /tmp/mylog

Im Terminal 2 beobachten wir nur:

D8> tail -f /tmp/mylog
tail: „/tmp/mylog“ kann nicht zum Lesen geöffnet werden:
tail: Keine Dateien mehr übrig
D8>
D8>
D8> tail -f /tmp/mylog
123
12345
1234567

123456789

Schluss...
^C
D8>

Im Terminal 1 schreiben wir Daten anhängend weiter in die Datei:

tux@d8:~$ echo 123 > /tmp/mylog
tux@d8:~$
tux@d8:~$ echo 12345 >> /tmp/mylog
tux@d8:~$
tux@d8:~$ echo 1234567 >> /tmp/mylog
tux@d8:~$
tux@d8:~$ echo 123456789 >> /tmp/mylog
tux@d8:~$


D8> expand obst.txt | cat -A
1               Birnen$
2               M-CM-^Dpfel$
3               Bananen$
4               Erdbeeren$
D8>
D8>
D8> expand obst.txt | wc
      4       8      96
D8>
D8> expand obst.txt > obst-expanded.txt
D8>
D8> wc obst-expanded.txt
4  8 96 obst-expanded.txt
D8>
D8> unexpand obst-expanded.txt | wc
      4       8      96
D8>
D8>
D8> man unexpand
D8>
D8>
D8> unexpand -a obst-expanded.txt | wc
      4       8      44
D8>




D8>
D8> fmt -w 10 obst.txt
1
Birnen 2
Äpfel 3
Bananen 4
Erdbeeren
D8>
D8>
D8>
D8> fmt -w 3 obst.txt
1
Birnen
2
Äpfel
3
Bananen
4
Erdbeeren
D8>
D8>
D8> nl obst.txt
    1  1               Birnen
    2  2               Äpfel
    3  3               Bananen
    4  4               Erdbeeren
D8>
D8>
D8> cat obst.txt
1               Birnen
2               Äpfel
3               Bananen
4               Erdbeeren
D8>
D8> cat -n obst.txt
    1  1               Birnen
    2  2               Äpfel
    3  3               Bananen
    4  4               Erdbeeren
D8>
D8>

Eine Druckvorstufe mit ‚pr‘ (print), das eigentliche Drucken geschieht mit ‚lpr‘ oder ‚lp‘:

D8> cat /etc/hosts | pr -o 7 -h "Für meinen lieben Boss" | head


      2017-01-25 14:32             Für meinen lieben Boss              Seite 1


      127.0.0.1        localhost
      127.0.1.1        d8.localdomain  d8

      # The following lines are desirable for IPv6 capable hosts
      ::1     localhost ip6-localhost ip6-loopback
D8>

Hexadezimal- und oktale Ausgabe jeweils mit ‚hexdump‘ und ‚od‘:

D8> hexdump obst.txt
0000000 0931 4209 7269 656e 0a6e 0932 c309 7084
0000010 6566 0a6c 0933 4209 6e61 6e61 6e65 340a
0000020 0909 7245 6264 6565 6572 0a6e
000002c
D8>
D8> hexdump -o obst.txt
0000000  004461  041011  071151  062556  005156  004462  141411  070204
0000010  062546  005154  004463  041011  067141  067141  067145  032012
0000020  004411  071105  061144  062545  062562  005156
000002c
D8>
D8> od -x obst.txt
0000000 0931 4209 7269 656e 0a6e 0932 c309 7084
0000020 6566 0a6c 0933 4209 6e61 6e61 6e65 340a
0000040 0909 7245 6264 6565 6572 0a6e
0000054
D8>
D8> od obst.txt
0000000 004461 041011 071151 062556 005156 004462 141411 070204
0000020 062546 005154 004463 041011 067141 067141 067145 032012
0000040 004411 071105 061144 062545 062562 005156
0000054
D8>

Den MBR ausgeben (32 Zeilen zu a‘ 16 Byte), davon aber nur die letzten 5 Zeilen herausfiltern, was dann nun die Partitionstabelle beinhaltet (5 Zeilen zu a‘ 16 Byte):

D8> hexdump /dev/sda | head -32 | tail -5
00001b0 10cd c361 0000 c3f4 120e 6436 c9cf 2080
00001c0 0021 1a83 1f3b 0800 0000 9800 0007 3b00
00001d0 1f1d fe8e ffff a800 0007 5000 0638 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
D8>


D8> cat sorttest
Zum Glück
aber hier
1               Birnen
sind
2               Äpfel
3               Bananen
wir in
4               Erdbeeren
der IT-Welt
999
01815
gut aufgehoben.
4711
Zzzz
Abc
6000000
----

###
::
D8>


D8> sort sorttest

----
::
###
01815
1               Birnen
2               Äpfel
3               Bananen
4711
4               Erdbeeren
6000000
999
Abc
aber hier
der IT-Welt
gut aufgehoben.
sind
wir in
Zum Glück
Zzzz
D8>
D8>
D8> sort -n sorttest

----
::
###
Abc
aber hier
der IT-Welt
gut aufgehoben.
sind
wir in
Zum Glück
Zzzz
1               Birnen
2               Äpfel
3               Bananen
4               Erdbeeren
999
01815
4711
6000000
D8>

ACHTUNG: Soll das Ergebnis in die selbe Datei zurückgeschrieben werden, muss die Option ‚-o‘ verwendet werden und nicht ‚>‘, ansonsten würde die Datei zuerst einmall geleert!

D8> sort -nr sorttest -o sorttest
D8>
D8> head sorttest
6000000
4711
01815
999
4               Erdbeeren
3               Bananen
2               Äpfel
1               Birnen
Zzzz
Zum Glück
D8>


D8> echo Abc > doppelteZeilen.txt
D8> echo 007 >> doppelteZeilen.txt
D8> echo 007 >> doppelteZeilen.txt
D8> echo Xyz >> doppelteZeilen.txt
D8>
D8> cat doppelteZeilen.txt
Abc
007
007
Xyz
D8>
D8> uniq doppelteZeilen.txt
Abc
007
Xyz
D8>
D8> ### LPI-relevant: Das Kommando 'sort' kann auch gleich 'uniq' ausführen:
D8> sort -u doppelteZeilen.txt
007
Abc
Xyz
D8>


D8> mkdir splittest
D8>
D8> cd splittest/
D8>
D8> ls -la
insgesamt 8
drwxr-xr-x  2 tux tux 4096 Jan 25 15:07 .
drwxr-xr-x 23 tux tux 4096 Jan 25 15:07 ..
D8>
D8> ls -l /etc/services
-rw-r--r-- 1 root root 19605 Okt 21  2014 /etc/services
D8>
D8> grep -i 80/tcp /etc/services
http            80/tcp          www             # WorldWideWeb HTTP
socks           1080/tcp                        # socks proxy server
http-alt        8080/tcp        webcache        # WWW caching service
amanda          10080/tcp                       # amanda backup services
canna           5680/tcp                        # cannaserver
D8>
D8> wc -l /etc/services
612 /etc/services
D8>
D8> cp /etc/services .

D8> cat services >> services.txt
D8> cat services >> services.txt
D8> cat services >> services.txt
D8> cat services >> services.txt
D8>
D8> wc -l services.txt
2448 services.txt
D8>
D8> split services.txt
D8>
D8> ls -l
insgesamt 180
-rw-r--r-- 1 tux tux 19605 Jan 25 15:09 services
-rw-r--r-- 1 tux tux 78420 Jan 25 15:10 services.txt
-rw-r--r-- 1 tux tux 31460 Jan 25 15:10 xaa
-rw-r--r-- 1 tux tux 32557 Jan 25 15:10 xab
-rw-r--r-- 1 tux tux 14403 Jan 25 15:10 xac
D8>
D8> wc -l x*
1000 xaa
1000 xab
  448 xac
2448 insgesamt
D8>
D8>

D8> dd if=/dev/zero of=myCD.iso bs=1M count=50
50+0 Datensätze ein
50+0 Datensätze aus
52428800 Bytes (52 MB) kopiert, 0,0335793 s, 1,6 GB/s
D8>
D8> split -b 1400K  myCD.iso myFloppy_
D8>
D8> ls -1 myFloppy_* | wc -l
37
D8>
D8> cat myFloppy_* > myCD-merged.iso
D8>
D8> sha512sum myCD*
50173936f83822c28812ea23f7f843a27e8b85f65626cbc339cea0e63aa770809f932343af9e6a0cd26bfa490d6d1928f19cf529ebd1e76ef74264fda961f810  myCD.iso
50173936f83822c28812ea23f7f843a27e8b85f65626cbc339cea0e63aa770809f932343af9e6a0cd26bfa490d6d1928f19cf529ebd1e76ef74264fda961f810  myCD-merged.iso
D8>

https://www.heise.de/ct/ausgabe/2017-2-Fundstuecke-im-Web-Cyberwar-Gehaelter-Internet-Radio-3583695.html

Weiter zu den Textfiltern

D8> cut -d: -f1,6 /etc/passwd | pr -o 7 -h "Benutzer mit ihren Heimatverzeichnissen"  | head


      2017-01-26 08:20     Benutzer mit ihren Heimatverzeichnissen     Seite 1


      root:/root
      daemon:/usr/sbin
      bin:/bin
      sys:/dev
      sync:/bin
D8>

D8> grep tux /etc/group | cut -d: -f1,4  | pr -o 7 -h "Gruppen + sek. Mitglieder"  | sort -u


      2017-01-26 08:32            Gruppen + sek. Mitglieder            Seite 1
      audio:pulse,tux
      bluetooth:tux
      cdrom:tux
      dip:tux
      floppy:tux
      lpadmin:tux
      netdev:tux
      plugdev:tux
      scanner:saned,tux
      tux:
      video:tux
D8>
D8> groups
tux cdrom floppy audio dip video plugdev netdev lpadmin scanner bluetooth
D8>

Die Kommandos ‚paste‘ und ‚join‘:

D8> echo hellgrün >> farben
D8> echo rot >> farben
D8> echo gelb >> farben
D8> echo dunkelgrün >> farben
D8>
D8>
D8> paste obst.txt farben
1               Birnen  hellgrün
2               Äpfel   rot
3               Bananen gelb
4               Erdbeeren       dunkelgrün
D8>
D8>
D8> nl farben > farben.txt
D8>
D8>
D8> paste obst.txt farben.txt
1               Birnen       1  hellgrün
2               Äpfel        2  rot
3               Bananen      3  gelb
4               Erdbeeren            4  dunkelgrün
D8>

Ähnlich wie bei relationalen Datenbanken kann ‚join‘ die Spalten anhand eines Schlüsselfeldes zusammenführen:

D8> join -j 1 obst.txt farben.txt
1 Birnen hellgrün
2 Äpfel rot
3 Bananen gelb
4 Erdbeeren dunkelgrün
D8>

Eine Liste von Feldern kann man z.B. so abfragen: cut -d: -f1-3 /etc/passwd

Wird die Option ‚-d‘ (Delimiter) nicht angegeben, wird per Default ein Tabulatorschritt verwendet.

Außerdem kann die Option ‚-c‘ Zeichenweise ausschneiden (Characters):

D8> df -h /
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1       7,4G    5,4G  1,6G   78% /
D8>
D8>
D8> df -h / | tail -1
/dev/sda1       7,4G    5,4G  1,6G   78% /
D8>
D8> df -h / | tail -1 | cut -c 38-39
78
D8>


D8> join -j 1 obst.txt farben.txt | tr 'a-z' 'A-Z'
1 BIRNEN HELLGRüN
2 ÄPFEL ROT
3 BANANEN GELB
4 ERDBEEREN DUNKELGRüN
D8>
D8>
D8>
D8> join -j 1 obst.txt farben.txt | tr '[:lower:]' '[:upper:]'
1 BIRNEN HELLGRüN
2 ÄPFEL ROT
3 BANANEN GELB
4 ERDBEEREN DUNKELGRüN
D8>

Translate mit ‚tr‘ (eine vereinfachte Form von ‚sed‘):

D8> tr -d '\r' < testdatei.txt | cat -A
Ein Zeile endet in der DOS-Welt mit LF + CR.$
(Das erzeugt man im vi mit STRG + v und STRG + m)$
In Unix-Files gibt es aber nur ein LF.$
D8>

D8> tr -d '\r' < testdatei.txt  > testdatei2.txt
D8>
D8> file testdatei*
testdatei2.txt: ASCII text
testdatei.txt:  ASCII text, with CRLF line terminators
D8>

ACHTUNG ‚tr‘ kann NICHT direkt mit Dateinamen als Übergabeparameter arbeiten:

D8> tr -d \r testdatei.txt
tr: zusätzlicher Operand „testdatei.txt“
Beim Löschen ohne Verdichten darf nur eine Zeichenkette angegeben werden.
„tr --help“ liefert weitere Informationen.
D8>

AUFGABE: Bitte erkunden, was die Option ‚-s‘ bedeutet:

D8> man tr | grep squeeze
      Translate, squeeze, and/or delete characters from standard input, writing to standard output.
      -s, --squeeze-repeats
D8>

Siehe dazu:

http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2005/02/tr-dos2unix/(article_body_offset)/2

Aber dieser Satz stimmt nicht ganz: Das Löschen macht man mit ‚-d‘, hier haben wir eine Schrumpfung:

„So löscht das Kommando tr -s ‚ ‚ < test.txt alle Spaces aus einer Datei heraus.“

Siehe dazu:

D8> cat squeeze-repeat.txt
Zeile  mit  vielen  Spaces  .
Zeile2   mit   vielen   Spaces   .
Zeile    3
Zeile 4 mit immer nur einem Leerzeichen dazwischen.
D8>
D8> ### Löscht alle Spaces (delete):
D8>
D8> cat squeeze-repeat.txt | tr  -d ' '
ZeilemitvielenSpaces.
Zeile2mitvielenSpaces.
Zeile3
Zeile4mitimmernureinemLeerzeichendazwischen.
D8>
D8>
D8> ### Schrupft mehrmaliges Vorkommen von Spaces, eins aber bleibt immer erhalten:
D8>
D8> cat squeeze-repeat.txt | tr  -s ' '
Zeile mit vielen Spaces .
Zeile2 mit vielen Spaces .
Zeile 3
Zeile 4 mit immer nur einem Leerzeichen dazwischen.
D8>

Jetzt die Ersetzung: Einen Unterstrich anstelle der Spaces verwenden:

D8> cat squeeze-repeat.txt | tr  -s ' ' '_'
Zeile_mit_vielen_Spaces_.
Zeile2_mit_vielen_Spaces_.
Zeile_3
Zeile_4_mit_immer_nur_einem_Leerzeichen_dazwischen.
D8>

Der streaming Editor

Geben sei eine Datei:

D8> cat squeeze-repeat.txt
Zeile  mit  vielen  Spaces  .
Zeile2   mit   vielen   Spaces   .
Zeile    3
Zeile 4 mit immer nur einem Leerzeichen dazwischen.
Spaces, Spaces, Spaces.... !!!
D8>

Mit dem Befehl ‚/d‘ können Zeien gelöscht werden:

D8> sed '/Zeile2 /d' squeeze-repeat.txt
Zeile  mit  vielen  Spaces  .
Zeile    3
Zeile 4 mit immer nur einem Leerzeichen dazwischen.
Spaces, Spaces, Spaces.... !!!
D8>

Suchen und ersetzen (substitute)

ACHTUNG: Ohne „global auf der Zeile“ zu agieren (‚g‘) wird nur das erste Auftreten ersetzt:

D8> sed 's/Spaces/Leerzeichen/' squeeze-repeat.txt
Zeile  mit  vielen  Leerzeichen  .
Zeile2   mit   vielen   Leerzeichen   .
Zeile    3
Zeile 4 mit immer nur einem Leerzeichen dazwischen.
Leerzeichen, Spaces, Spaces.... !!!
D8>

Mit dem ‚g‘ ist alles OK:

D8> sed 's/Spaces/Leerzeichen/g' squeeze-repeat.txt
Zeile  mit  vielen  Leerzeichen  .
Zeile2   mit   vielen   Leerzeichen   .
Zeile    3
Zeile 4 mit immer nur einem Leerzeichen dazwischen.
Leerzeichen, Leerzeichen, Leerzeichen.... !!!

Sed kann auch Dateien direkt ändern:

D8> man sed | grep in-place
      -i[SUFFIX], --in-place[=SUFFIX]
D8>
D8>
D8> sed -i 's/Spaces/Leerzeichen/g' squeeze-repeat.txt
D8>
D8> tail -1 squeeze-repeat.txt
Leerzeichen, Leerzeichen, Leerzeichen.... !!!
D8>

103.3 Perform basic file management

D8> mkdir ZumAussortieren
D8> mv splittest/ ZumAussortieren/
D8>
D8> touch Bilder-TOC.txt
D8>
D8> ls -l
insgesamt 35324
drwxr-xr-x 2 tux  tux      4096 Jan 11 09:02 Bilder
-rw-r--r-- 1 tux  tux         0 Jan 26 10:49 Bilder-TOC.txt
-rw-r--r-- 1 tux  tux         4 Jan 25 14:29 datei
...

ACHTUNG: Anders als ‚mv‘ benötigt ‚cp‘ die Option ‚-R‘ (aber auch: ‚-r‘ und ‚-a‘) für „rekursiv“:

D8> cp Bilder* ZumAussortieren/
/bin/cp: Verzeichnis „Bilder“ wurde ausgelassen
D8>


D8> alias cp
alias cp='/bin/cp -i'
D8>
D8> cp -r Bilder* ZumAussortieren/
/bin/cp: „ZumAussortieren/Bilder-TOC.txt“ überschreiben?
D8>
D8> ls -l ZumAussortieren/
insgesamt 24
drwxr-xr-x 2 tux tux  4096 Jan 26 10:51 Bilder
-rw-r--r-- 1 tux tux     0 Jan 26 10:49 Bilder-TOC.txt
drwxr-xr-x 2 tux tux 20480 Jan 25 15:25 splittest
D8>

Warum muss ‚mv‘ immer rekursiv arbeiten können und besitzt und daher keine Option für rekursives Arbeiten (‚-R‘)?

Siehe das Verschieben von gesamten Strukturen; es muss die Pfade an neuer Stelle im Dateibaum befestigen können.

D8> mkdir -p Container/Kiste/Schachtel/Box
D8>
D8> mv Container /tmp
D8>
D8> pwd
/home/tux
D8>
D8> ls -lR /tmp/Cont*
/tmp/Container:
insgesamt 4
drwxr-xr-x 3 tux tux 4096 Jan 26 10:55 Kiste

/tmp/Container/Kiste:
insgesamt 4
drwxr-xr-x 3 tux tux 4096 Jan 26 10:55 Schachtel

/tmp/Container/Kiste/Schachtel:
insgesamt 4
drwxr-xr-x 2 tux tux 4096 Jan 26 10:55 Box

/tmp/Container/Kiste/Schachtel/Box:
insgesamt 0
D8>

tar/gzip automatisieren

root@d8:~# crontab -e
no crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny

Choose 1-3 [1]:    <ENTER>

root@d8:~# crontab -l | tail -3
#
# m h  dom mon dow   command
0 8,10,12,13,15,16 * * 1-5 tar zcf /root/etc-backup-$(date +\%F_\%H).tar.gz /etc 1> /dev/null 2>&1
root@d8:~#

Falls man es vorher manuell testen möchte:

  • Archivieren und komprimieren: tar zcf /root/etc-backup-$(date +\%F_\%H).tar.gz

  • Archiv entpacken und dekomprimieren: tar xvf etc-backup-2017-01-26_12-46.tar.gz -C /tmp

Bereitstellen von Vorlagedateien und -verzeichnissen für neu anzulegende Benutzer

ACHTUNG: Bitte nicht versuchen, mit ‚cp‘ die hidden Files zu kopieren, das Kommando folgt dem ‚..‘-Verzeichnis!

NICHT SO: cp -rv .*  * /home/susi/

Sondern mit ‚find‘, das dem ‚..‘ per Default nicht folgt. Dazu benötigen wir aber auch noch das Kommando ‚cpio‘:

root@d8:/etc/skel#
root@d8:/etc/skel# find
.
./Desktop
./Desktop/firefox-esr.desktop
./.bashrc
./.bash_logout
./.profile
root@d8:/etc/skel# find | cpio -pdm /home/susi
17 blocks
root@d8:/etc/skel#
root@d8:/etc/skel# find /home/susi/
/home/susi/
/home/susi/Desktop
/home/susi/Desktop/firefox-esr.desktop
/home/susi/.bashrc
/home/susi/.bash_logout
/home/susi/.profile
root@d8:/etc/skel#

Archivieren mit tar

Historisch gesehen wurden Bandlaufwerke als Sicherungsziel verwendet und z.B. mittels Gerätedatei ‚/dev/st0‘ (Option ‚-f, –file ARCHIVE‘) angesteuert.

Siehe https://wiki.ubuntuusers.de/Sicherungskopien_auf_Streamer/

tux@d8:~$
tux@d8:~$ find Dokumente/ -size +50M
tux@d8:~$
tux@d8:~$ du -sh Dokumente/
36K     Dokumente/
tux@d8:~$
tux@d8:~$ cp /etc/services Dokumente/
tux@d8:~$

Ein unkomprimiertes Archiv erzeugen:

tux@d8:~$ tar cvf Dokumente-Archiv.tar Dokumente/
Dokumente/
Dokumente/Bilder-TOC.txt
Dokumente/farben
Dokumente/obst.txt
Dokumente/LPI-Vorbereitung.mm
Dokumente/squeeze-repeat.txt
Dokumente/obst-expanded.txt
Dokumente/doppleteZeilen.txt
Dokumente/services
Dokumente/grub.cfg
Dokumente/farben.txt
tux@d8:~$
tux@d8:~$

tux@d8:~$ file Dokumente-Archiv.tar
Dokumente-Archiv.tar: POSIX tar archive (GNU)
tux@d8:~$
tux@d8:~$ du -sh Dokumente*
56K     Dokumente
40K     Dokumente-Archiv.tar
tux@d8:~$

Den Inhalt des Archives ausflisten ('-t' = table of content): ::

tux@d8:~$ tar tf Dokumente-Archiv.tar | grep obst
Dokumente/obst.txt
Dokumente/obst-expanded.txt
tux@d8:~$

Ein mit gzip komprimiertes Archiv erzeugen:

tux@d8:~$
tux@d8:~$ tar cvzf Dokumente-Archiv.tar.gz  Dokumente/
Dokumente/
Dokumente/Bilder-TOC.txt
Dokumente/farben
Dokumente/obst.txt
Dokumente/LPI-Vorbereitung.mm
Dokumente/squeeze-repeat.txt
Dokumente/obst-expanded.txt
Dokumente/doppleteZeilen.txt
Dokumente/services
Dokumente/grub.cfg
Dokumente/farben.txt
tux@d8:~$

tux@d8:~$ tar cvjf Dokumente-Archiv.tar.bz2  Dokumente/
Dokumente/
Dokumente/Bilder-TOC.txt
Dokumente/farben
Dokumente/obst.txt
Dokumente/LPI-Vorbereitung.mm
Dokumente/squeeze-repeat.txt
Dokumente/obst-expanded.txt
Dokumente/doppleteZeilen.txt
Dokumente/services
Dokumente/grub.cfg
Dokumente/farben.txt
tux@d8:~$
tux@d8:~$ tar cvJf Dokumente-Archiv.tar.xz  Dokumente/
Dokumente/
Dokumente/Bilder-TOC.txt
Dokumente/farben
Dokumente/obst.txt
Dokumente/LPI-Vorbereitung.mm
Dokumente/squeeze-repeat.txt
Dokumente/obst-expanded.txt
Dokumente/doppleteZeilen.txt
Dokumente/services
Dokumente/grub.cfg
Dokumente/farben.txt
tux@d8:~$
tux@d8:~$ du -sh Dokumente*
56K     Dokumente
40K     Dokumente-Archiv.tar
12K     Dokumente-Archiv.tar.bz2
12K     Dokumente-Archiv.tar.gz
12K     Dokumente-Archiv.tar.xz
tux@d8:~$

AUFGABE: Bitte dann das selbe mit /usr/share/doc anstellen…

Einzelne Dateien mit ‚gzip‘, ‚bzip2‘ und ‚xz‘ komprimieren

ACHTUNG: Hier wird direkt am Dateiobjekt gearbeitet, die originale Datei wird dabei umbenannt:

tux@d8:~$ cp services services.test
tux@d8:~$
tux@d8:~$ cat services >> services.test
tux@d8:~$
tux@d8:~$ cat services >> services.test
tux@d8:~$ cat services >> services.test
tux@d8:~$
tux@d8:~$ ls -l services*
-rw-r--r-- 1 tux tux 19605 Jan 27 08:40 services
-rw-r--r-- 1 tux tux 78420 Jan 27 08:41 services.test
tux@d8:~$
tux@d8:~$
tux@d8:~$ gzip services.test
tux@d8:~$
tux@d8:~$ ls -l
insgesamt 132
drwxr-xr-x 2 tux tux  4096 Jan 11 09:02 Bilder
drwxr-xr-x 2 tux tux  4096 Jan 27 08:10 Dokumente
-rw-r--r-- 1 tux tux 40960 Jan 27 08:19 Dokumente-Archiv.tar
-rw-r--r-- 1 tux tux  9074 Jan 27 08:36 Dokumente-Archiv.tar.bz2
-rw-r--r-- 1 tux tux  9392 Jan 27 08:33 Dokumente-Archiv.tar.gz
-rw-r--r-- 1 tux tux  8724 Jan 27 08:37 Dokumente-Archiv.tar.xz
drwxr-xr-x 3 tux tux  4096 Jan 26 16:51 Downloads
drwxr-xr-x 2 tux tux  4096 Jan 11 14:30 Schreibtisch
-rw-r--r-- 1 tux tux 19605 Jan 27 08:40 services
-rw-r--r-- 1 tux tux  8205 Jan 27 08:41 services.test.gz
drwxr-xr-x 3 tux tux  4096 Jan 27 08:30 TESTs
drwxr-xr-x 4 tux tux  4096 Jan 26 10:51 ZumAussortieren
tux@d8:~$
tux@d8:~$ gzip services.test
gzip: services.test: No such file or directory
tux@d8:~$
tux@d8:~$ gunzip services.test.gz
tux@d8:~$
tux@d8:~$ ls -l services*
-rw-r--r-- 1 tux tux 19605 Jan 27 08:40 services
-rw-r--r-- 1 tux tux 78420 Jan 27 08:41 services.test
tux@d8:~$
tux@d8:~$

Wollen wir die originale Datei erhalten, müssen wir über STDOUT gehen (Umleitung):

tux@d8:~$ gzip -c services.test > services.test.gz
tux@d8:~$
tux@d8:~$ ls -l services*
-rw-r--r-- 1 tux tux 19605 Jan 27 08:40 services
-rw-r--r-- 1 tux tux 78420 Jan 27 08:41 services.test
-rw-r--r-- 1 tux tux  8205 Jan 27 08:46 services.test.gz
tux@d8:~$
tux@d8:~$ bzip2 -c services.test > services.test.bz2
tux@d8:~$
tux@d8:~$ xz -c services.test > services.test.xz
tux@d8:~$
tux@d8:~$
tux@d8:~$ ls -l services*
-rw-r--r-- 1 tux tux 19605 Jan 27 08:40 services
-rw-r--r-- 1 t
ux tux 78420 Jan 27 08:41 services.test
-rw-r--r-- 1 tux tux 10063 Jan 27 08:47 services.test.bz2
-rw-r--r-- 1 tux tux  8205 Jan 27 08:46 services.test.gz
-rw-r--r-- 1 tux tux  7240 Jan 27 08:47 services.test.xz
tux@d8:~$

Die Beteiligung aller Prozessorkerne erhält man nur durch solche Tools:

tux@d8:~$ apt-cache search compress | grep parallel
pixz - parallel, indexing XZ compressor/decompressor
plzip - parallel, lossless data compressor based on the LZMA algorithm
plzip-dbg - parallel, lossless data compressor based on the LZMA algorithm (debug)
pxz - parallel LZMA compressor using liblzma
tux@d8:~$
tux@d8:~$ apt-cache search pigz
pigz - Parallele Implementierung von gzip
tux@d8:~$

Dekomprimieren und Archiv entpacken in zwei einzelnen Schritten:

tux@d8:~$ rm -f Dokumente-Archiv.tar
tux@d8:~$
tux@d8:~$ gunzip Dokumente-Archiv.tar.gz
tux@d8:~$
tux@d8:~$ ls -ltrc | tail -3
-rw-r--r-- 1 tux tux 4399104 Jan 27 08:57 doc.tar.xz
drwxr-xr-x 2 tux tux    4096 Jan 27 10:46 ABC
-rw-r--r-- 1 tux tux   40960 Jan 27 10:47 Dokumente-Archiv.tar
tux@d8:~$
tux@d8:~$ mv Dokumente Dokumente_OK
tux@d8:~$
tux@d8:~$ tar xf Dokumente-Archiv.tar
tux@d8:~$
tux@d8:~$ du -s Dokumente_OK/ Dokumente
56      Dokumente_OK/
56      Dokumente
tux@d8:~$

Wegen dem eben durchgeführten gunzip Dokumente-Archiv.tar.gz müssen wir das Archiv wieder komprimieren:

tux@d8:~$ gzip Dokumente-Archiv.tar

Und nun noch einmal das selbe, aber on-the-fly (wie auch heute noch unter Unix-Systemen):

tux@d8:~$ ls -ltrc | tail -3
drwxr-xr-x 2 tux tux    4096 Jan 27 10:48 Dokumente_OK
drwxr-xr-x 2 tux tux    4096 Jan 27 10:49 Dokumente
-rw-r--r-- 1 tux tux    9413 Jan 27 10:52 Dokumente-Archiv.tar.gz
tux@d8:~$
tux@d8:~$ gzip -d -c Dokumente-Archiv.tar.gz | tar tvf -
drwxr-xr-x tux/tux           0 2017-01-27 08:10 Dokumente/
-rw-r--r-- tux/tux           0 2017-01-26 10:49 Dokumente/Bilder-TOC.txt
-rw-r--r-- tux/tux          31 2017-01-26 08:36 Dokumente/farben
-rw-r--r-- tux/tux          44 2017-01-25 12:35 Dokumente/obst.txt
-rw-r--r-- tux/tux        1062 2017-01-26 15:36 Dokumente/LPI-Vorbereitung.mm
-rw-r--r-- tux/tux         184 2017-01-26 10:37 Dokumente/squeeze-repeat.txt
-rw-r--r-- tux/tux          96 2017-01-25 12:48 Dokumente/obst-expanded.txt
-rw-r--r-- tux/tux          16 2017-01-25 15:03 Dokumente/doppleteZeilen.txt
-rw-r--r-- tux/tux       19605 2017-01-27 08:10 Dokumente/services
-rw------- tux/tux        1741 2017-01-16 10:34 Dokumente/grub.cfg
-rw-r--r-- tux/tux          59 2017-01-26 08:38 Dokumente/farben.txt
tux@d8:~$

Für heterogene Umgebungen:

tux@d8:~$ zip -r Dokumente.zip Dokumente
  adding: Dokumente/ (stored 0%)
  adding: Dokumente/Bilder-TOC.txt (stored 0%)
  adding: Dokumente/farben (deflated 10%)
  adding: Dokumente/obst.txt (deflated 7%)
  adding: Dokumente/LPI-Vorbereitung.mm (deflated 55%)
  adding: Dokumente/squeeze-repeat.txt (deflated 48%)
  adding: Dokumente/obst-expanded.txt (deflated 56%)
  adding: Dokumente/doppleteZeilen.txt (deflated 13%)
  adding: Dokumente/services (deflated 62%)
  adding: Dokumente/grub.cfg (deflated 60%)
  adding: Dokumente/farben.txt (deflated 25%)
tux@d8:~$
tux@d8:~$ unzip -l Dokumente.zip
Archive:  Dokumente.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-01-27 08:10   Dokumente/
        0  2017-01-26 10:49   Dokumente/Bilder-TOC.txt
      31  2017-01-26 08:36   Dokumente/farben
      44  2017-01-25 12:35   Dokumente/obst.txt
    1062  2017-01-26 15:36   Dokumente/LPI-Vorbereitung.mm
      184  2017-01-26 10:37   Dokumente/squeeze-repeat.txt
      96  2017-01-25 12:48   Dokumente/obst-expanded.txt
      16  2017-01-25 15:03   Dokumente/doppleteZeilen.txt
    19605  2017-01-27 08:10   Dokumente/services
    1741  2017-01-16 10:34   Dokumente/grub.cfg
      59  2017-01-26 08:38   Dokumente/farben.txt
---------                     -------
    22838                     11 files
tux@d8:~$

103.4 Use streams, pipes and redirects

Siehe dazu:

Drei einfache Beispiele:

Umleiten von STDOUT:

tux@d8:~$ echo "zeile 1" > datei.txt
tux@d8:~$ echo "zeile 2" >> datei.txt

Umleiten von STDERR:

tux@d8:~$ cat /etc/shadow 2> /tmp/error.log
tux@d8:~$ cat /etc/gshadow 2>> /tmp/error.log

Umleiten von STDIN:

tux@d8:~$ tr '[:lower:]' '[:upper:]' < /tmp/error.log
CAT: /ETC/SHADOW: KEINE BERECHTIGUNG
CAT: /ETC/GSHADOW: KEINE BERECHTIGUNG
tux@d8:~$
tux@d8:~$ tr '[:lower:]' '[:upper:]' 0< /tmp/error.log
CAT: /ETC/SHADOW: KEINE BERECHTIGUNG
CAT: /ETC/GSHADOW: KEINE BERECHTIGUNG
tux@d8:~$

Mit set -o noclobber aktivieren wir einen Schutz, so dass nur noch anhängend (‚>>‘) gearbeitet werden kann:

tux@d8:~$ set -o noclobber
tux@d8:~$
tux@d8:~$ echo 123 > datei
bash: datei: Kann existierende Datei nicht überschreiben.
tux@d8:~$
tux@d8:~$ echo 123 > datei
bash: datei: Kann existierende Datei nicht überschreiben.
tux@d8:~$
tux@d8:~$ echo 123 >> datei
tux@d8:~$ echo 123 >> datei
tux@d8:~$ echo 123 >> datei
tux@d8:~$
tux@d8:~$
tux@d8:~$ cat datei
123
123
123
123
tux@d8:~$ ### Schutzfunktion wieder abschalten:
tux@d8:~$ set +o noclobber



tux@d8:~$
tux@d8:~$ echo "Zeile 1, `date`" > datei
tux@d8:~$
tux@d8:~$ set -o noclobber
tux@d8:~$
tux@d8:~$ echo "Zeile 2, `date`" > datei
bash: datei: Kann existierende Datei nicht überschreiben.
tux@d8:~$
tux@d8:~$ echo "Zeile 2, `date`" >> datei
tux@d8:~$ echo "Zeile 3, `date`" >> datei
tux@d8:~$
tux@d8:~$ cat datei
Zeile 1, Fr 27. Jan 10:59:30 CET 2017
Zeile 2, Fr 27. Jan 11:00:04 CET 2017
Zeile 3, Fr 27. Jan 11:00:08 CET 2017
tux@d8:~$

Auch den Fehler umleiten:

tux@d8:~$ cat /etc/hostname /etc/nix > /tmp/ok 2> /tmp/error
tux@d8:~$
tux@d8:~$
tux@d8:~$ cat /tmp/ok /tmp/error
d8
cat: /etc/nix: Datei oder Verzeichnis nicht gefunden
tux@d8:~$

Für Fortgeschrittene:

tux@d8:~$ echo "Zeile 3, `date`, Inhalt der /etc/hostname: `cat /etc/hostnameee 2>> /tmp/error.log`" >> datei
tux@d8:~$
tux@d8:~$ ### Reihenfolge beachten:
tux@d8:~$
tux@d8:~$ #  Zuerst STDOUT umleiten, dann STERR kopierend nach STDOUT "zurückleiten":
tux@d8:~$ #  (Die runden Klammern müssen sein, damit die Shell die 'date ; kal' eine Kommandzeile betrachtet)
tux@d8:~$ (date ; kal)     >  datum-und-kalender.txt   2>&1
tux@d8:~$
tux@d8:~$ cat datum-und-kalender.txt
Fr 27. Jan 12:42:30 CET 2017
bash: kal: Kommando nicht gefunden.
tux@d8:~$
tux@d8:~$ alias kal=cal
tux@d8:~$
tux@d8:~$
tux@d8:~$ (date ; kal)     >  datum-und-kalender.txt   2>&1
tux@d8:~$
tux@d8:~$ cat datum-und-kalender.txt
Fr 27. Jan 12:42:55 CET 2017
    Januar 2017
So Mo Di Mi Do Fr Sa
1  2  3  4  5  6  7
8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

tux@d8:~$

Zu den Umleitungen von STDIN

ZUR MOTIVATION: Es gibt Tools, die nur mit Datenströmen umgehen können, nicht aber mit mit Dateinamen:

tux@d8:~$ tr 'a-z' 'A-Z' /etc/hosts
tr: zusätzlicher Operand „/etc/hosts“
„tr --help“ liefert weitere Informationen.
tux@d8:~$
tux@d8:~$
tux@d8:~$ tr 'a-z' 'A-Z' < /etc/hosts
127.0.0.1       LOCALHOST
127.0.1.1       D8.LOCALDOMAIN  D8

# THE FOLLOWING LINES ARE DESIRABLE FOR IPV6 CAPABLE HOSTS
::1     LOCALHOST IP6-LOCALHOST IP6-LOOPBACK
FF02::1 IP6-ALLNODES
FF02::2 IP6-ALLROUTERS
tux@d8:~$
tux@d8:~$
tux@d8:~$ echo mittag? | tr 'a-z' 'A-Z'
MITTAG?
tux@d8:~$

Ein Kommando liest von der Tastatur (u.a. Eof benutzen können, STRG + D):

tux@d8:~$ wc

Hallo?

was is'n hier loas...................?

      5       5      49
tux@d8:~$
tux@d8:~$ su -
Passwort:
root@d8:~#
root@d8:~# mail -s "Logdatei mit Problem" tux@localhost < /var/log/messages
root@d8:~#
root@d8:~# exit
Abgemeldet
tux@d8:~$
tux@d8:~$ ls -ltr /var/spool/mail/
insgesamt 4
-rw-rw---- 1 tux mail 3945 Jan 27 12:54 tux
tux@d8:~$
tux@d8:~$ head -15 /var/spool/mail/tux
From root@localhost.localdomain Fri Jan 27 12:54:07 2017
Return-path: <root@localhost.localdomain>
Envelope-to: tux@localhost
Delivery-date: Fri, 27 Jan 2017 12:54:07 +0100
Received: from root by d8.localdomain with local (Exim 4.84_2)
        (envelope-from <root@localhost.localdomain>)
        id 1cX56V-0002Gp-3B
        for tux@localhost; Fri, 27 Jan 2017 12:54:07 +0100
To: tux@localhost
Subject: Logdatei mit Problem
Message-Id: <E1cX56V-0002Gp-3B@d8.localdomain>
From: root <root@localhost.localdomain>
Date: Fri, 27 Jan 2017 12:54:07 +0100

Jan 25 07:56:52 d8 rsyslogd: [origin software="rsyslogd" swVersion="8.4.2" x-pid="512" x-info="http://www.rsyslog.com"] rsyslogd ws HUPed
tux@d8:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/tux": 1 message 1 new
>N  1 root@localhost.lo  Fri Jan 27 12:54   47/3945  Logdatei mit Problem
... Zum verlassen 'q' drücken...

AUFGABE FÜR DEN NACHMITTAG:

Wie lässt sich eine Umleitungen einrichten, so dass im Folgenden on-the-fly nach ‚type‘ gefiltert werden kann?

tux@d8:~$ /sbin/mkfs.ext4 --help | grep -i typ
/sbin/mkfs.ext4: Ungültige Option -- -
Aufruf: mkfs.ext4 [-c|-l Dateiname] [-b Blockgröße] [-C Clustergröße]
        [-i Bytes-pro-Inode] [-I Inode-Größe] [-J Journal-Optionen]
        [-G Größe_der_Metagruppe] [-N Anzahl_der_Inodes]
        [-m Reservierte-Blöcke-Prozentsatz] [-o Erzeuger-OS]
        [-g Blöcke-pro-Gruppe] [-L Volume-Label]
        [-M letztes-eingehängtes-Verzeichnis] [-O Eigenschaft[,...]]
        [-r fs-Revision] [-E erweiterte-Option[,...]]
        [-t Dateisystemtyp] [-T Verwendungs-Typ ] [-U UUID] [-jnqvDFKSV]
        Gerät [Block-Anzahl]
tux@d8:~$
tux@d8:~$
tux@d8:~$
tux@d8:~$ /sbin/mkfs.ext4 --help | grep -i typ
/sbin/mkfs.ext4: Ungültige Option -- -
Aufruf: mkfs.ext4 [-c|-l Dateiname] [-b Blockgröße] [-C Clustergröße]
        [-i Bytes-pro-Inode] [-I Inode-Größe] [-J Journal-Optionen]
        [-G Größe_der_Metagruppe] [-N Anzahl_der_Inodes]
        [-m Reservierte-Blöcke-Prozentsatz] [-o Erzeuger-OS]
        [-g Blöcke-pro-Gruppe] [-L Volume-Label]
        [-M letztes-eingehängtes-Verzeichnis] [-O Eigenschaft[,...]]
        [-r fs-Revision] [-E erweiterte-Option[,...]]
        [-t Dateisystemtyp] [-T Verwendungs-Typ ] [-U UUID] [-jnqvDFKSV]
        Gerät [Block-Anzahl]
tux@d8:~$
tux@d8:~$ /sbin/mkfs.ext4 --help 2> /tmp/mkfs.out
tux@d8:~$
tux@d8:~$ grep UUID /tmp/mkfs.out
        [-t Dateisystemtyp] [-T Verwendungs-Typ ] [-U UUID] [-jnqvDFKSV]
tux@d8:~$

DIE LÖSUNG:

tux@d8:~$ /sbin/mkfs.ext4 --help 2>&1 | grep -i --color typ
        [-t Dateisystemtyp] [-T Verwendungs-Typ ] [-U UUID] [-jnqvDFKSV]
tux@d8:~$

Ein Sonderfall eines Here-Documents lässt sich mit ‚<<<‘ realisieren. Es verhält sich ähnlich wie ‚echo‘, nur dass es vom Ende der Kommandozeile her die Daten liefert:

tux@d8:~$ tr 'A-Z' 'a-z' <<<WORT
wort
tux@d8:~$
tux@d8:~$ tr 'A-Z' 'a-z' <<</etc/HALLO/WELT
/etc/hallo/welt
tux@d8:~$
tux@d8:~$ tr 'A-Z' 'a-z' <<<$HOME
/home/tux
tux@d8:~$

Vertiefung / Wiederholung Shell:

tux@d8:~$ set -o noclobber
tux@d8:~$
tux@d8:~$ echo 123 > neueDatei
tux@d8:~$ echo anzuhängen: Zeile 2  > neueDatei
bash: neueDatei: Kann existierende Datei nicht überschreiben.
tux@d8:~$
tux@d8:~$ echo anzuhängen: Zeile 2  >> neueDatei
tux@d8:~$ echo anzuhängen: Zeile 3  >> neueDatei
tux@d8:~$ echo anzuhängen: Zeile 4  >> neueDatei
tux@d8:~$
tux@d8:~$ cat neueDatei
123
anzuhängen: Zeile 2
anzuhängen: Zeile 3
anzuhängen: Zeile 4
tux@d8:~$
tux@d8:~$ set +o noclobber
tux@d8:~$
tux@d8:~$ echo Noch einmal von vorn > neueDatei
tux@d8:~$
tux@d8:~$ > neueDatei
tux@d8:~$
tux@d8:~$ ls -l neueDatei
-rw-r--r-- 1 tux tux 0 Jan 30 08:31 neueDatei
tux@d8:~$
tux@d8:~$ set -o vi
tux@d8:~$
tux@d8:~$ date
Mo 30. Jan 08:32:51 CET 2017
tux@d8:~$
tux@d8:~$ echo Noch einmal von vorn
Noch einmal von vorn
tux@d8:~$
tux@d8:~$ set -o emacs
tux@d8:~$
tux@d8:~$

Weiter zu Pipes, ‚tee‘ und ‚xargs‘

Pipes (First-in-first-out): Der STDOUT der ersten Kommandos wird zum STDIN des nächsten.

Da Zwischenergebnisse in Pipes verlorengehen, wurde das Kommando ‚tee‘ geschaffen:

tux@d8:~$ cat /etc/hosts | tee /tmp/hosts.txt | wc -l
7
tux@d8:~$
tux@d8:~$
tux@d8:~$ cat /tmp/hosts.txt
127.0.0.1       localhost
127.0.1.1       d8.localdomain  d8

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
tux@d8:~$

Das Kommando ‚tee‘ kann mit ‚-a‘ anhängend arbeiten, wobei das Ende offen bleiben kann:

tux@d8:~$ df -h / | sed 's/\%//' | tee -a /tmp/hosts.txt
Dateisystem    Größe Benutzt Verf. Verw Eingehängt auf
/dev/sda1       7,4G    6,6G  414M   95 /
tux@d8:~$

tux@d8:~$ df -h / | tee -a /tmp/disk-free.txt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1       7,4G    6,6G  414M   95% /
tux@d8:~$
tux@d8:~$ df -h /dev | tee -a /tmp/disk-free.txt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
udev             10M       0   10M    0% /dev
tux@d8:~$
tux@d8:~$ cat /tmp/disk-free.txt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1       7,4G    6,6G  414M   95% /
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
udev             10M       0   10M    0% /dev
tux@d8:~$

Man kann ‚tee‘ durchaus mit einer normalen Umleitung vergleichen, wobei der Ausgabestrom dann bereits beendet wird:

tux@d8:~$ echo 12345 > /tmp/zahl | wc
    0       0       0
tux@d8:~$

Hier kann ‚tee‘ mehr erreichen:

tux@d8:~$ echo 12345 | tee /tmp/zahl | wc
    1       1       6
tux@d8:~$

Die Bash kann nur eine endlich Anzahl von Argumenten verarbeiten:

tux@d8:~$ getconf -a | grep ARG
ARG_MAX                            2097152
NL_ARGMAX                          4096
_POSIX_ARG_MAX                     2097152
LFS64_CFLAGS                       -D_LARGEFILE64_SOURCE
LFS64_LINTFLAGS                    -D_LARGEFILE64_SOURCE
tux@d8:~$
tux@d8:~$
tux@d8:~$ ### Bei 2097153 Dateien, die wir mit 'rm *.txt' löschen wollten, wurde die Shell streiken, daher::
tux@d8:~$
tux@d8:~$
tux@d8:~$ touch datei{0..9}.txt
tux@d8:~$
tux@d8:~$ find -name dat\*.txt
./datum-und-kalender.txt
./datei4.txt
./datei5.txt
./datei2.txt
./datei3.txt
./datei9.txt
./datei8.txt
./datei7.txt
./datei0.txt
./datei1.txt
./datei6.txt
tux@d8:~$
tux@d8:~$ find -name dat\*.txt | xargs rm -v
„./datum-und-kalender.txt“ wurde entfernt
„./datei4.txt“ wurde entfernt
„./datei5.txt“ wurde entfernt
„./datei2.txt“ wurde entfernt
„./datei3.txt“ wurde entfernt
„./datei9.txt“ wurde entfernt
„./datei8.txt“ wurde entfernt
„./datei7.txt“ wurde entfernt
„./datei0.txt“ wurde entfernt
„./datei1.txt“ wurde entfernt
„./datei6.txt“ wurde entfernt
tux@d8:~$
tux@d8:~$ find -name dat\*.txt

File-Globbing versus Kommandooptionen

Aktive Rolle der Shell:

tux@d8:~$ #### Via File-globbing
tux@d8:~$
tux@d8:~$ find dir* -type d
dir*
dir1
dir2
tux@d8:~$

Die Shell soll hier passiv bleiben:

tux@d8:~$ #### Via nativen find-Bedingungen:
tux@d8:~$ find -name dir\* -type d
./Dokumente/dir1
./dir1
./dir2
./dir*
tux@d8:~$

103.5 Create, monitor and kill processes

(Fast) alle Prozess gemäß BSD-Tools ausgeben:

[root@c6 ~]# ps aux | grep sshd
root      1136  0.0  0.1  66236  1188 ?        Ss   Jan23   0:00 /usr/sbin/sshd
root      2472  0.0  0.4 102084  4168 ?        Ss   05:19   0:00 sshd: root@pts/0
root      2768  0.1  0.4 102084  4164 ?        Ss   12:15   0:00 sshd: root@pts/1
root      2791  0.0  0.0 103332   888 pts/1    S+   12:17   0:00 grep sshd
[root@c6 ~]#

[root@c6 ~]# ps -ef | grep sshd
root      1136     1  0 Jan23 ?        00:00:00 /usr/sbin/sshd
root      2472  1136  0 05:19 ?        00:00:00 sshd: root@pts/0
root      2768  1136  0 12:15 ?        00:00:00 sshd: root@pts/1
root      2793  2772  0 12:19 pts/1    00:00:00 grep sshd
[root@c6 ~]#

[root@c6 ~]# ps aux | head -3
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  19232  1540 ?        Ss   Jan23   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Jan23   0:00 [kthreadd]
[root@c6 ~]#
[root@c6 ~]#
[root@c6 ~]# ps -ef | head -3
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Jan23 ?        00:00:00 /sbin/init
root         2     0  0 Jan23 ?        00:00:00 [kthreadd]
[root@c6 ~]#

[root@c6 ~]# sleep 60 &
[1] 2821
[root@c6 ~]#
[root@c6 ~]#
[root@c6 ~]# ps
  PID TTY          TIME CMD
2772 pts/1    00:00:00 bash
2821 pts/1    00:00:00 sleep
2822 pts/1    00:00:00 ps
[root@c6 ~]#
[root@c6 ~]# killall -9 sleep
[1]+  Getötet                sleep 60
[root@c6 ~]#
[root@c6 ~]# sleep 60 &
[1] 2824
[root@c6 ~]#
[root@c6 ~]# killall -15 sleep
[1]+  Beendet                 sleep 60
[root@c6 ~]#
[root@c6 ~]# sleep 60 &
[1] 2826
[root@c6 ~]#
[root@c6 ~]# killall  sleep
[1]+  Beendet                 sleep 60
[root@c6 ~]#

Zum Senden von Signalen:

root@d8:~# find /run -name "*.pid"
/run/dhclient-eth0.pid
/run/exim4/exim.pid
/run/rsyslogd.pid
/run/kdm.pid
/run/crond.pid
/run/atd.pid
/run/cups/cupsd.pid
/run/sm-notify.pid
/run/rpc.statd.pid
/run/rpcbind.pid
root@d8:~#
root@d8:~#
root@d8:~# cat /run/crond.pid
460
root@d8:~#
root@d8:~# ps aux | grep 460
root       460  0.0  0.1  27504  2200 ?        Ss   Jan29   0:00 /usr/sbin/cron -f
tux       1460  0.0  1.4 715240 30240 ?        Sl   Jan29   0:00 /usr/bin/kmix -session 10643800000148412177000000010920011_1484209966_529116
root      9600  0.0  0.1  12752  2140 pts/5    S+   11:55   0:00 grep 460
root@d8:~#
root@d8:~#
root@d8:~# kill -1 `cat /run/crond.pid`
root@d8:~#
root@d8:~# kill -1 460
root@d8:~#
root@d8:~#
root@d8:~# kill -SIGHUP 460
root@d8:~#
root@d8:~# kill -HUP 460
root@d8:~#
root@d8:~#
root@d8:~# kill -s hup 460
root@d8:~#
root@d8:~#

Erkunden von Signalnummern, wobei wir die Jobverwaltung der Shell eingeziehen wollen:

root@d8:~# 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'.

10/3
3.33333333333333333333

2^8
256

^Z
[1]+  Angehalten              bc -l
root@d8:~#
root@d8:~# jobs
[1]+  Angehalten              bc -l
root@d8:~#
root@d8:~# fg
bc -l

2^8
256

2^7
128

2^6
64

^Z
[1]+  Angehalten              bc -l
root@d8:~#

Der Prozess wartet im Hintergrund auf Wiederbelebung… ;-)

Wir müssen den Prozess jetzt im Hintergrund weiter laufen lassen (Er läuft nicht wirklich!), wir erhalten aber mit ‚$!‘ den PID des letzten Jobs:

root@d8:~# bg
[1]+ bc -l &
root@d8:~#

[1]+  Angehalten              bc -l
root@d8:~# echo $!
9604
root@d8:~#

Jetzt wollen wir den Prozess auf die snafte Art beenden, können es aber nicht, weil die Shell ihn blockiert hält:

Siehe dazu die Prozesszustände unter https://de.wikipedia.org/wiki/Prozess_%28Informatik%29

root@d8:~# jobs
[1]+  Angehalten              bc -l
root@d8:~#
root@d8:~# kill 9604
root@d8:~#
root@d8:~# kill 9604
root@d8:~#
root@d8:~# kill 9604
root@d8:~#
root@d8:~# kill 9604
root@d8:~#
root@d8:~# kill -9 9604
root@d8:~#
[1]+  Getötet                bc -l
root@d8:~#
root@d8:~#
root@d8:~# kill -9 9604
-su: kill: (9604) - Kein passender Prozess gefunden
root@d8:~#
root@d8:~# fg
-su: fg: gegenwärtig: Kein solcher Job.
root@d8:~#
root@d8:~# bg
-su: bg: gegenwärtig: Kein solcher Job.
root@d8:~#

Übung zum Benutzen der Hintergrundjobs und kill-Kommandos:

root@d8:~# sleep 120 &
[1] 9635
root@d8:~#
root@d8:~# sleep 300 &
[2] 9636
root@d8:~#
root@d8:~# sleep 600 &
[3] 9637
root@d8:~#
root@d8:~# sleep 15m &
[4] 9638
root@d8:~#
root@d8:~# jobs
[1]   Läuft                  sleep 120 &
[2]   Läuft                  sleep 300 &
[3]-  Läuft                  sleep 600 &
[4]+  Läuft                  sleep 15m &
root@d8:~#

Wir halten jetzt einen Prozess an und lassen ihn mit dem Signal „SIGCONT“ (Signalnummer 18) dann wieder weiterlaufen:

root@d8:~# jobs
[1]   Fertig                  sleep 120
[2]+  Angehalten              sleep 300
[3]   Läuft                  sleep 600 &
[4]-  Läuft                  sleep 15m &
root@d8:~#
root@d8:~#
root@d8:~# kill -18 %2
root@d8:~#
root@d8:~# jobs
[2]+  Läuft                  sleep 300 &
[3]   Läuft                  sleep 600 &
[4]-  Läuft                  sleep 15m &
root@d8:~#
root@d8:~#
root@d8:~# killall sleep
[2]+  Beendet                 sleep 300
[3]   Beendet                 sleep 600
[4]-  Beendet                 sleep 15m
root@d8:~#
root@d8:~# jobs
root@d8:~#

Zur Erinnerung:

root@d8:~# 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
deb http://httpredir.debian.org/debian/ jessie main contrib

Softwarepaketlisten herunterladen, wobei ‚nohup‘ eingesetzt werden soll:

root@d8:~# apt-get -qq  update
root@d8:~# nohup apt-get -y upgrade &
[4] 9703
root@d8:~# nohup: ignoriere Eingabe und hänge Ausgabe an „nohup.out“ an

root@d8:~# pgrep -fl apt
9703 apt-get
9708 http
9709 http
root@d8:~#
root@d8:~# pstree -pn | grep apt
          |           |         |-apt-get(9703)-+-dpkg(9712)
          |           |         |               `-sh(9713)---apt-listchanges(9714)---sh(9972)-+-dpk+
root@d8:~#
root@d8:~# at 17:00
warning: commands will be executed using /bin/sh
at> nohup apt-get -y upgrade &
at> <EOT>
job 1 at Mon Jan 30 17:00:00 2017
root@d8:~#

Zurücknehmen der Einstellung, dass keine Dokumente mit installiert werden sollen:

root@d8:~# cat /etc/dpkg/dpkg.cfg.d/excludes
# Drop locales except German
path-exclude=/usr/share/locale/*
path-include=/usr/share/locale/de/*
path-include=/usr/share/locale/locale.alias

# Drop translated manual pages except German
path-exclude=/usr/share/man/*
path-include=/usr/share/man/man[1-9]/*
path-include=/usr/share/man/de*/*

# Drop doc
path-exclude=/usr/share/doc/*
[3]+  Fertig                  sleep 1200
root@d8:~#
root@d8:~# mv /etc/dpkg/dpkg.cfg.d/excludes /root
root@d8:~#
root@d8:~# apt-get install --reinstall  ca-certificates
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
0 aktualisiert, 0 neu installiert, 1 erneut installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen noch 0 B von 207 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt.
Vorkonfiguration der Pakete ...
(Lese Datenbank ... 126619 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../ca-certificates_20141019+deb8u2_all.deb ...
Entpacken von ca-certificates (20141019+deb8u2) über (20141019+deb8u2) ...
Trigger für man-db (2.7.0.2-5) werden verarbeitet ...
ca-certificates (20141019+deb8u2) wird eingerichtet ...
/usr/sbin/update-ca-certificates: [--verbose] [--fresh]
Trigger für ca-certificates (20141019+deb8u2) werden verarbeitet ...
Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
done.
done.
root@d8:~#

Jetzt wurden die Dokumente mitinstalliert und wir können das Changelog lesen:

root@d8:~# gunzip -c /usr/share/doc/ca-certificates/changelog.gz | less
root@d8:~#

103.6 Modify process execution priorities

Ziel: Anwendungen mehr oder weniger CPU-Zeit als üblich zuweisen

Kommandos:

  • nice/renice - für Anwendungsprogramme im Hauptspeicher

  • ionice - Prioritäten im Zusammenhang mit Datenträger-I/O ändern (nicht für LPI relevant)

Grundlegendes:

  • nice-Werte sind nur Empfehlungen, der Linux-Kernel legt letztendlich selber fest, welche Priorität ein Prozess erhält (Spalte PRI bei ‚ps -l‘)

  • nice-Werte (Spalte NI bei ‚ps -l‘) bewegen sich im Bereich von -20 bis +19 (negative Zahlen sind nur für root erlaubt!)

  • PRI und NI verhalten sich umgekehrt proportional zueinander:

    1. Hoher Nice-Wert -> geringe Priorität

    2. Geringer Nice-Wert -> hohe Priorität

Ganz ohne jeden Schalter aufgerufen, ergibt sich ein Standard-nice-Wert von 10:

tux@devuan:~$ nice sleep 3m &
[1] 9599
tux@devuan:~$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  5440  5439  0  80   0 -  5386 -      pts/1    00:00:00 bash
0 S  1000  9599  5440  0  90  10 -  1457 -      pts/1    00:00:00 sleep
0 R  1000  9600  5440  0  80   0 -  2687 -      pts/1    00:00:00 ps
tux@devuan:~$

Als root darf man mehr Dampf geben, max. bis ‚-20‘ (sehr unfreundlich = hohe Priorität):

root@d8:~# nice --20 sleep 300 &
[1] 27715
root@d8:~#
root@d8:~# ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0   518   516  20   0 396292 205712 -     Ss+  tty7      13:45 /usr/bin/X :0 vt7 -br -nolisten tcp -aut
4     0  4666     1  20   0  14416  1824 -      Ss+  tty1       0:00 /sbin/agetty --noclear tty1 linux
4     0  8752     1  20   0  14416  1928 -      Ss+  tty2       0:00 /sbin/agetty --noclear tty2 linux
4     0  9556  3390  20   0  54856  2892 -      S    pts/5      0:00 su -
4     0  9557  9556  20   0  23828  5472 -      S    pts/5      0:00 -su
4     0 27715  9557   0 -20   5808   680 -      S<   pts/5      0:00 sleep 300
0     0 27716  9557  20   0  10688  2028 -      R+   pts/5      0:00 ps l
root@d8:~#

Bitte die Möglichkeiten zur Übergabe der nice-Werte ergründen:

root@d8:~# renice -+10 27717

Aufruf:
renice [-n] <Priorität> [-p|--pid] <PID> …
renice [-n] <Priorität>  -g|--pgrp <PGID> …
renice [-n] <Priorität>  -u|--user <Benutzer> …

Optionen:
-g, --pgrp <ID>        Argument als Prozessgruppen-ID interpretieren
-n, --priority <Zahl>  Nice-Hochzählungswert angeben
-p, --pid <ID>         Argument als Prozess-ID interpretieren (Vorgabe)
-u, --user <Name|ID>   Argument als Benutzername oder Benutzer-ID
                        interpretieren
-h, --help             diese Hilfe anzeigen und beenden
-V, --version          Versionsinformationen ausgeben und beenden

Für weitere Informationen siehe renice(1).
root@d8:~# nice -+10 sleep 12345 &
[3] 27722
root@d8:~#
root@d8:~# ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0   518   516  20   0 396696 205972 -     Ss+  tty7      13:46 /usr/bin/X :0 vt7 -br -nolisten tcp -aut
4     0  4666     1  20   0  14416  1824 -      Ss+  tty1       0:00 /sbin/agetty --noclear tty1 linux
4     0  8752     1  20   0  14416  1928 -      Ss+  tty2       0:00 /sbin/agetty --noclear tty2 linux
4     0  9556  3390  20   0  54856  2892 -      S    pts/5      0:00 su -
4     0  9557  9556  20   0  23828  5524 -      S    pts/5      0:00 -su
0     0 27717  9557  10 -10   5808   716 -      S<   pts/5      0:00 sleep 300
0     0 27722  9557  30  10   5808   716 -      SN   pts/5      0:00 sleep 12345
0     0 27723  9557  20   0  10688  2140 -      R+   pts/5      0:00 ps l
root@d8:~#
root@d8:~#
root@d8:~# renice 10 27717
27717 (Prozesskennung) alte Priorität -10, neue Priorität 10
root@d8:~#
root@d8:~# renice +10 27717
27717 (Prozesskennung) alte Priorität 10, neue Priorität 10
root@d8:~#
root@d8:~# ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0   518   516  20   0 396696 205972 -     Ss+  tty7      13:46 /usr/bin/X :0 vt7 -br -nolisten tcp -aut
4     0  4666     1  20   0  14416  1824 -      Ss+  tty1       0:00 /sbin/agetty --noclear tty1 linux
4     0  8752     1  20   0  14416  1928 -      Ss+  tty2       0:00 /sbin/agetty --noclear tty2 linux
4     0  9556  3390  20   0  54856  2892 -      S    pts/5      0:00 su -
4     0  9557  9556  20   0  23828  5524 -      S    pts/5      0:00 -su
0     0 27717  9557  30  10   5808   716 -      SN   pts/5      0:00 sleep 300
0     0 27722  9557  30  10   5808   716 -      SN   pts/5      0:00 sleep 12345
0     0 27727  9557  20   0  10688  2140 -      R+   pts/5      0:00 ps l
root@d8:~#

Was ist der default-nice-Wert bei z.B. dieser Zeile?

root@d8:~#
root@d8:~# nice sleep 666 &
[4] 27730
root@d8:~#

Siehe auch:

Vertiefung ‚top‘:

Startoptionen:

  • top -u tux -d1

  • top -c

Interaktive Kommandos:

  • L = Locate String (Prozessname suchen)

  • r = renice

  • k = kill

  • u = nach User filtern

  • R = Reverse Sortierung

  • 1 = alle CPUs im Header auflisten

  • STRG + 0 = nach ressourcenverbrauchen Prozesse sortieren

PROJEKT: NAT-Router

Auf Debian 1 (d8.localdomain):

$ systemctl poweroff

Im ausgeschalteten Zustand:

  • Adapter 2 aktivieren

  • Angeschlossen an: „Internes Netzwerk“

  • Name: „intnet“

  • Unter „Erweitert“ bitte kontrollieren, dass „Kabel verbunden“ aktiviert ist

Auf Debian 2 (d8-2):

Bei laufenden Gast im VirtualBox-Fenster unter „Geräte“ => „Netzwerk“ => „Einstellungen Netzwerk…“ den Adapter 1 an „Internes Netzwerk“ namens „intnet“ anschließen

  • Kontrolle der IP-Adressierung: ifconfig -a

  • Temporäres Setzen von IP und STD-GW:

    • IP-Adresse: ifconfig eth0 10.0.0.2/24

    • Route: route add default gw 10.0.0.1

Wieder auf Debian 1 (d8.localdomain) zurückgekehrt:

root@d8:~# ifconfig -a
eth0      Link encap:Ethernet  Hardware Adresse 08:00:27:9a:2d:17
        inet Adresse:10.22.15.128  Bcast:10.22.15.255  Maske:255.255.255.0
        inet6-Adresse: fe80::a00:27ff:fe9a:2d17/64 Gültigkeitsbereich:Verbindung
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
        RX packets:629 errors:0 dropped:0 overruns:0 frame:0
        TX packets:578 errors:0 dropped:0 overruns:0 carrier:0
        Kollisionen:0 Sendewarteschlangenlänge:1000
        RX bytes:179824 (175.6 KiB)  TX bytes:81826 (79.9 KiB)

eth1      Link encap:Ethernet  Hardware Adresse 08:00:27:23:01:21
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
        RX packets:17 errors:0 dropped:0 overruns:0 frame:0
        TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
        Kollisionen:0 Sendewarteschlangenlänge:1000
        RX bytes:2430 (2.3 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Lokale Schleife
        inet Adresse:127.0.0.1  Maske:255.0.0.0
        inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine
        UP LOOPBACK RUNNING  MTU:65536  Metrik:1
        RX packets:213 errors:0 dropped:0 overruns:0 frame:0
        TX packets:213 errors:0 dropped:0 overruns:0 carrier:0
        Kollisionen:0 Sendewarteschlangenlänge:0
        RX bytes:29428 (28.7 KiB)  TX bytes:29428 (28.7 KiB)

root@d8:~#

IP-Adresse setzen und kontrollieren:

root@d8:~# ifconfig eth1 10.0.0.1/24
root@d8:~#
root@d8:~# ifconfig eth1
eth1      Link encap:Ethernet  Hardware Adresse 08:00:27:23:01:21
        inet Adresse:10.0.0.1  Bcast:10.255.255.255  Maske:255.0.0.0
        inet6-Adresse: fe80::a00:27ff:fe23:121/64 Gültigkeitsbereich:Verbindung
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
        RX packets:18 errors:0 dropped:0 overruns:0 frame:0
        TX packets:80 errors:0 dropped:0 overruns:0 carrier:0
        Kollisionen:0 Sendewarteschlangenlänge:1000
        RX bytes:2563 (2.5 KiB)  TX bytes:9858 (9.6 KiB)

root@d8:~#

Das STD-GW steht im eigenen, physischen Netzwerk:

root@d8:~# route -n
Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.22.15.1      0.0.0.0         UG    1024   0        0 eth0
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth1
10.22.15.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
root@d8:~#

Zur Kontrolle gibt man ein: iptables -t nat -vnL

Damit sind wir fast schon ein Router; was noch fehlt ist das Weiterleiten von IP-Paketen auf OSI-Schicht 3:

root@d8:~# cat /proc/sys/net/ipv4/ip_forward
0
root@d8:~#
root@d8:~# echo 1 > /proc/sys/net/ipv4/ip_forward
root@d8:~#
root@d8:~# cat /proc/sys/net/ipv4/ip_forward
1
root@d8:~#

Nun erweitern wir nur noch den Router um Network Address Translation, dann kann Debian 2 schon surfen…

$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Unter Ubuntu (anstelle Debian2)

$ sudo -i

$ systemctl stop NetworkManager
$ ip add del 10.22.15.140/24 dev enp0s3
$ ip addr add 10.0.0.3/24 dev enp0s3
$ ip route add default via 10.0.0.1
$ echo 'nameserver 8.8.8.8' > /etc/resolv.conf
$ ping -c4 ping.eu

Willkommen im Februar: http://www.textlog.de/40812.html

103.7 Search text files using regular expressions

Fixed-grep interpretiert keine regulären Ausdrücke:

tux@d8:~$ fgrep www /etc/services
# Updated from http://www.iana.org/assignments/port-numbers and other
# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
http                80/tcp          www             # WorldWideWeb HTTP
tux@d8:~$
tux@d8:~$
tux@d8:~$
tux@d8:~$ fgrep '^http' /etc/services

Für logisch UND müssen wir zwei grep-Hintereinander schalten (die Trefferzahl verringet sich):

tux@d8:~$ grep '^http' /etc/services | grep -i ssl
https               443/tcp                         # http protocol over TLS/SSL
tux@d8:~$

Für logisch ODER mit Hilfe von GNU-grep mit „Basic Regular Expression“-Syntax oder egrep (die Trefferzahl erhöht sich). Siehe dazu man grep, Abschnitt „Basic vs Extended Regular Expressions“:

tux@d8:~$ grep 'http\|domain' /etc/services
# Updated from http://www.iana.org/assignments/port-numbers and other
# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
domain              53/tcp                          # Domain Name Server
domain              53/udp
http                80/tcp          www             # WorldWideWeb HTTP
http                80/udp                          # HyperText Transfer Protocol
https               443/tcp                         # http protocol over TLS/SSL
https               443/udp
http-alt    8080/tcp        webcache        # WWW caching service
http-alt    8080/udp
tux@d8:~$
tux@d8:~$
tux@d8:~$ egrep 'http|domain' /etc/services
# Updated from http://www.iana.org/assignments/port-numbers and other
# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
domain              53/tcp                          # Domain Name Server
domain              53/udp
http                80/tcp          www             # WorldWideWeb HTTP
http                80/udp                          # HyperText Transfer Protocol
https               443/tcp                         # http protocol over TLS/SSL
https               443/udp
http-alt    8080/tcp        webcache        # WWW caching service
http-alt    8080/udp
tux@d8:~$

Anwendungsbeispiel für den regulären Ausdruck ‚?‘ (mittels BRE) oder auch gern ‚?‘ (mittels ERE):

root@devuan:~# mkdir FILES
root@devuan:~# cd FILES/
root@devuan:~/FILES#
root@devuan:~/FILES# touch file{0..4}
root@devuan:~/FILES# touch file-{0..4}
root@devuan:~/FILES#
root@devuan:~/FILES#  ls -1
file-0
file-1
file-2
file-3
file-4
file0
file1
file2
file3
file4
root@devuan:~/FILES#
root@devuan:~/FILES#  ls -1 | grep --color '^file-\?[0-2]'
file-0
file-1
file-2
file0
file1
file2
root@devuan:~/FILES#
root@devuan:~/FILES# ls -1 | grep --color '^file\?[0-2]'
file0
file1
file2
root@devuan:~/FILES#

Siehe auch http://www.kingcomputerservices.com/unix_101/grep_this.htm

Zum Üben

ACHTUNG: NICHT DEN KONTEXT VERWECHSELN, das Folgende sind Dateijoker:

tux@d8:/etc$ echo '\<p*.d'
\<p*.d
tux@d8:/etc$
tux@d8:/etc$
tux@d8:/etc$
tux@d8:/etc$ echo '*.d'
*.d
tux@d8:/etc$
tux@d8:/etc$ echo *.d
apparmor.d bash_completion.d binfmt.d cron.d grub.d init.d insserv.conf.d ld.so.conf.d libpaper.d logrotate.d modprobe.d modules-load.d Muttrc.d pam.d profile.d rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d request-key.d rsyslog.d sane.d sensors.d sudoers.d sysctl.d tmpfiles.d usb_modeswitch.d
tux@d8:/etc$
tux@d8:/etc$
tux@d8:/etc$ # Nur zur Erinnerung: Dateijoker sind:
tux@d8:/etc$
tux@d8:/etc$ # *       - Eine beliebig lange Zeichenkette beliebiger Zeichen, auch kein Zeichen
tux@d8:/etc$ # ?       - Ein beliebiges Zeichen
tux@d8:/etc$ # [...]   - Ein Zeichen aus der angegebenen Menge
tux@d8:/etc$ # [!...]  - Die Zeichen aus der angegebenen Menge NICHT verarbeiten

tux@d8:/bin$ echo g*
getfacl grep gunzip gzexe gzip
tux@d8:/bin$
tux@d8:/bin$ echo g???
grep gzip
tux@d8:/bin$
tux@d8:/bin$ cd /etc

tux@d8:/etc$ echo *.d
apparmor.d bash_completion.d binfmt.d cron.d grub.d init.d insserv.conf.d ld.so.conf.d libpaper.d logrotate.d modprobe.d modules-load.d Muttrc.d pam.d profile.d rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d request-key.d rsyslog.d sane.d sensors.d sudoers.d sysctl.d tmpfiles.d usb_modeswitch.d
tux@d8:/etc$
tux@d8:/etc$ ls -d *.d
apparmor.d         grub.d          libpaper.d      Muttrc.d   rc1.d  rc5.d          rsyslog.d  sysctl.d
bash_completion.d  init.d          logrotate.d     pam.d      rc2.d  rc6.d          sane.d     tmpfiles.d
binfmt.d           insserv.conf.d  modprobe.d      profile.d  rc3.d  rcS.d          sensors.d  usb_modeswitch.d
cron.d             ld.so.conf.d    modules-load.d  rc0.d      rc4.d  request-key.d  sudoers.d
tux@d8:/etc$

Wir erzeugen uns erst einmal eine Textdatei:

tux@d8:~$ echo 'Willi' > Adressliste
tux@d8:~$ echo 'Franz' >> Adressliste
tux@d8:~$ echo 'Friedrich' >> Adressliste
tux@d8:~$ echo 'Frank' >> Adressliste
tux@d8:~$ echo 'Meier' >> Adressliste
tux@d8:~$ echo 'Meir' >> Adressliste
tux@d8:~$ echo 'Meyer' >> Adressliste
tux@d8:~$ echo 'Mayer' >> Adressliste
tux@d8:~$ echo 'Mayr' >> Adressliste
tux@d8:~$ echo 'Beier' >> Adressliste
tux@d8:~$ echo 'Bayer' >> Adressliste
tux@d8:~$ echo 'Bayr' >> Adressliste
tux@d8:~$ echo 'Beir' >> Adressliste

Und nun filtern wir ein wenig;

tux@d8:~$ grep '^F' Adressliste
Franz
Friedrich
Frank
tux@d8:~$
tux@d8:~$
tux@d8:~$ grep '^M' Adressliste
Meier
Meir
Meyer
Mayer
Mayr
tux@d8:~$
tux@d8:~$ grep '.[ae]' Adressliste
Franz
Friedrich
Frank
Meier
Meir
Meyer
Mayer
Mayr
Beier
Bayer
Bayr
Beir
tux@d8:~$
tux@d8:~$ grep --color  '^.[aey]' Adressliste
Meier
Meir
Meyer
Mayer
Mayr
Beier
Bayer
Bayr
Beir
Byer
tux@d8:~$
tux@d8:~$ grep -o  '^.[aey]' Adressliste
Me
Me
Me
Ma
Ma
Be
Ba
Ba
Be
By
tux@d8:~$

Der Klassiker für Admins:

tux@d8:~$ ls -lSrh /etc/*.conf | tail -5
-rw-r--r-- 1 root root 3,0K Sep 17 15:21 /etc/adduser.conf
-rw-r--r-- 1 root root 3,1K Jan  4  2015 /etc/reportbug.conf
-rw-r--r-- 1 root root 7,5K Sep 17 15:39 /etc/pnm2ppa.conf
-rw-r--r-- 1 root root 8,1K Jan 30 12:28 /etc/ca-certificates.conf
-rw-r--r-- 1 root root  11K Mai  8  2014 /etc/sensors3.conf
tux@d8:~$
tux@d8:~$
tux@d8:~$
tux@d8:~$ grep -v '^#' /etc/adduser.conf | grep -v '^$'
DSHELL=/bin/bash
DHOME=/home
GROUPHOMES=no
LETTERHOMES=no
SKEL=/etc/skel
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999
FIRST_SYSTEM_GID=100
LAST_SYSTEM_GID=999
FIRST_UID=1000
LAST_UID=29999
FIRST_GID=1000
LAST_GID=29999
USERGROUPS=yes
USERS_GID=100
DIR_MODE=0755
SETGID_HOME=no
QUOTAUSER=""
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"
tux@d8:~$

Zum Weiterlernen und Ausprobieren ist diese Seite gut geeignet: http://regexr.com/

Raspberry Pi

Wenn man erst einmal keine GFX-Ausgabe mittels HDMI-to-VGA Konvertern bekommen kann, dann hift u.U. ein Portscan, um den Raspberry via ssh zu steuern. Voraussetzung ist natürlich, dass dort der ‚sshd‘ läuft.

  1. Netzwerkkarte anstecken

  2. Das ganze nmap -p22 10.22.15.0/24 | less

u.a. ist hier dies zu sehen:

Nmap scan report for 10.22.15.113
Host is up (-0.076s latency).
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: B8:27:EB:E2:32:4F (Raspberry Pi Foundation)

ANMERKUNG: Nicht alle Raspberry-Betriebssysteme starten per Default den ssh-Server!

Experiment am Nachmittag mit der Zielstellung: https://github.com/MichMich/MagicMirror

Raspi fernsteuern

  1. Der Fernsteuernde = Debian Desktop (Paket: ‚xtightvncviewer‘): vncviewer -listen

  2. Der zu Steuernde = Raspberry Pi mit Raspian (Paket: ‚x11vnc‘): x11vnc -connect 10.22.15.168:5500 -scale 9/10 &

103.8 Perform basic file editing operations using vi

https://www.spielwarenmesse.de/messe/

Der Visual Editor ‚vi‘ kennt 3 Hauptmodi:

  1. Command (= Default), Navigieren, Kopieren (ganze Zeile: yy)

  2. Insert (schreiben…, mit ESC kommt man zurück in den Commando-Modus)

  3. Execute-Modus (speichern, beenden, ersetzen), Zeichen: ‚:‘

Die ersten Schritte in einem Übungsdokument:

  • Nach oben navigieren: mehrmals drücken: ‚k‘

  • Fünf Zeilen in den unbenannten Puffer legen: 5yy

  • Zehn mal unterhalb Cursorposition einfügen: 10p

  • Drei Zeilen ausschneiden: 3dd

  • An Ende des Dokumentes springen: G

Nummerierung einschalten:

  • ESC

  • :set nu

Echte Komfortfunktionen sind nur bei vim vorhanden (apt-get install vim):

  • Undo: u

  • Redo: Strg + r

Tipps für Einsteiger:

  • apt-get install vim

  • Undo (u) bzw. Redo (STRG + r) nutzen

  • Speichern und Beenden in zwei Schritten:

    1. ESC :w

    2. :q

  • Beenden, wobei alles verworfen wird: :q!

  • Wenn nur vim-tiny installiert ist, können im Insert-Modus mit der Backspace-Taste Fehler unkompliziert korrigiert werden

tux@d8:~$ find /bin /usr/bin -type f -perm -700 -name "vi*"
/usr/bin/vimtutor
/usr/bin/vim.tiny
/usr/bin/vim.basic
/usr/bin/viewres
tux@d8:~$
tux@d8:~$ which vimdiff
/usr/bin/vimdiff
tux@d8:~$
tux@d8:~$ ls -l /usr/bin/vimdiff
lrwxrwxrwx 1 root root 25 Jan 20 10:38 /usr/bin/vimdiff -> /etc/alternatives/vimdiff
tux@d8:~$
tux@d8:~$

Wichtig ist außerdem das Suchen und Ersetzen, z.B. soll im gesamten Dokument

usr/Local

durch

usr/local

ersetzt werden:

:1,$s/usr\/Local/usr\/local/g

Ein Kürzel für ‚1,$‘ ist das ‚%‘-Zeichen:

:%s/beenden/closing/g

Von aktueller Zeile (‚.‘) bis zum Ende löschen:

:.,$s/kennt/knows/g

Bis zum Ende des Dokumentes alles löschen: dG

Praxistipp „vimdiff“:

tux@d8:~$ cp vim-editor.txt vim-editor-mod.txt
tux@d8:~$
tux@d8:~$ tail -5 vim-editor-mod.txt
  Hallo Welt
  und Universum...

Unter Linux gibt es /Usr/Local und /Opt für eigene Programme, unter /Usr/share/doc befinden sich weitere Dokumente.

tux@d8:~$ sed -i '/Unter\ Linux/d' vim-editor-mod.txt
tux@d8:~$
tux@d8:~$ tail -5 vim-editor-mod.txt
Testabschnitt
  Hallo Welt
  und Universum...
tux@d8:~$ echo 'Ende der Datei.' >> vim-editor-mod.txt
tux@d8:~$
tux@d8:~$ vimdiff vim-editor.txt vim-editor-mod.txt

+ +-- 67 Zeilen: Der vim kennt 3 Hauptmodi:--------------|+ +-- 67 Zeilen: Der vim kennt 3 Hauptmodi:--------------
  C) Execute-Modus (speichern, beenden, ersetzen)        |   C) Execute-Modus (speichern, beenden, ersetzen)
  Der vim kennt 3 Hauptmodi:                             |  Der vim kennt 3 Hauptmodi:
                                                         |
  A) COMMAND (= Default), Navigieren, Kopieren (ganze Ze |   A) COMMAND (= Default), Navigieren, Kopieren (ganze Ze
  B) Insert (schreiben..., mit ESC kommt man zurück in d |   B) Insert (schreiben..., mit ESC kommt man zurück in d
  C) Execute-Modus (speichern, beenden, ersetzen)        |   C) Execute-Modus (speichern, beenden, ersetzen)
  Testabschnitt                                          |  Testabschniidfdftt
    Hallo Welt                                           |     Hallo Welt
    und Universum...                                     |     und Universum...
                                                         |
  Unter Linux gibt es /Usr/Local und /Opt für eigene Prog|  -------------------------------------------------------
                                                         |
  -------------------------------------------------------|  Ende der Datei.
  ~                                                      |  ~

Zwischen den beiden Fensten kann man mit STRG + w sowie den Cusortasten hin- und herspringen.

Weiter zum PROJEKT: NAT-Router

### Lösung zur Hausaufgabe mit dem Router/Weiterleiten

D8-1
/etc/network/interfaces
        auto eth1
        iface eth1 inet static
                address 10.0.0.1
                netmask 255.255.255.0

/etc/init.d/networking restart #Adapter neustarten

D8-2
/etc/network/interfaces
        auto eth0
        iface eth0 inet static
                address 10.0.0.2
                netmask 255.255.255.0
                gateway 10.0.0.1

/etc/init.d/networking restart #Adapter neustarten

/etc/sysctl.conf
#net.ipv4.ip_forward=1

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE #Regel setzten

apt-get install iptables-persistent

#Speichert die Regel in die dauerhafte Datei
iptables-save > /etc/iptables/rules.v4

#Neustart???

  - Ja, sehr wahrscheinlich: weil die Datei /etc/iptables/rules.v4 nicht vom networking-Skript abgearbeitet wird -

Für einen dritten Nameserver schreiben wir oberhalb der ComCave-Server in die Datei ‚/etc/resolv.conf‘ hinein:

nameserver 8.8.8.8

Variante B - „Alles in einer Datei“

Voraussetzung für die Konfiguration der Namensauflösung mit dem Parameter ‚dns-nameserver‘ ist das Paket ‚resolvconf‘:

$ apt-get install resolvconf

Wir passen nun die Datei ‚/etc/network/interfaces‘ an, so dass sie dann in etwa so aussieht:

### /etc/network/interfaces auf Debian-Host "d8" (= Router)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 10.22.15.200
        netmask 255.255.255.0
        gateway 10.22.15.1

auto eth1
iface eth1 inet static
        address 10.0.0.1
        netmask 255.255.255.0

dns-nameserver 8.8.8.8
up echo 1 > /proc/sys/net/ipv4/ip_forward
up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Auf der (Surf-) Workstation sieht diese Datei so aus:

### /etc/network/interfaces auf Debian-Host "d8-2" (= Workstation)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 10.0.0.1
        netmask 255.255.255.0

dns-nameserver 8.8.8.8

Topic 104: Linux Filesystems

104.1 Create partitions and filesystems

Drei Arten der Formatierung

  1. Low-Level (Phys. Formatierung, z.B. Floppy-Diskette): fdformat /dev/fd0

  2. Partitionierung, Werkzeuge: fdisk, cfdisk, parted, gparted

  3. High-Level (Log. Formatierung, Aufbringen eines Dateisystem), Werkzeuge: mkfs, mkfs.ext4, mkdosfs, …

AUFGABE: Bitte den MBR mit dd sichern, danach nur den Bootcode-Anteil des MBR in eine weitere Datei.

Siehe dazu https://de.wikipedia.org/wiki/Master_Boot_Record

Alle erkannten Datenträger auflisten:

$ fdisk -l

Festplatte /dev/sda: 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: 0xc76ffbe3

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 15988735 15986688  7,6G 83 Linux
/dev/sda2       15990782 16775167   784386  383M  5 Extended
/dev/sda5       15990784 16775167   784384  383M 82 Linux swap / Solaris

$


Lösung
dd if=/dev/sda of=/tmp/mbrsda.bak bs=512 count=1
dd if=/dev/sda of=/tmp/bootcode.bak bs=440 count=1

Was auch geht:

dd bs=1 count=440 if=/dev/sda > mbr.bin

Sehr sinnvoll ist außerdem, die Partitionstabelle mit Hilfe von ‚sfdisk‘ zu sichern:

$ sfdisk -d /dev/sda
sfdisk: Warnung: erweiterte Partition beginnt nicht an einer Zylindergrenze.
DOS und Linux werden den Inhalt unterschiedlich interpretieren.
# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=     2048, size= 15986688, Id=83, bootable
/dev/sda2 : start= 15990782, size=   784386, Id= 5
/dev/sda3 : start=        0, size=        0, Id= 0
/dev/sda4 : start=        0, size=        0, Id= 0
/dev/sda5 : start= 15990784, size=   784384, Id=82
$
$
$ sfdisk -d /dev/sda  > myPartitiontable.sfdisk
sfdisk: Warnung: erweiterte Partition beginnt nicht an einer Zylindergrenze.
DOS und Linux werden den Inhalt unterschiedlich interpretieren.
$

Festplatte partitionieren

ZIEL: Neue Festplatte einbinden

$ shutdown -h now

In VirtualBox:

  • „Massenspeicher“

  • Markieren von „Controller: SATA“

  • Auf rechtes Symbol klicken („Festplatte hinzufügen“)

  • „Neue Platte erzeugen“ …

  • „Weiter“, „Weiter“, sinnvollen Namen vergeben, 50 GB (NICHT reserveriernd)

Wieder starten…. („F2“ für ausführliche Bootmeldungen drücken)

Nach dem Neustart kontrollieren wir, ob die neue Platte da ist:

$ fdisk -l

Festplatte /dev/sdb: 50 GiB, 53687091200 Bytes, 104857600 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
Festplatte /dev/sda: 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: 0xc76ffbe3

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 15988735 15986688  7,6G 83 Linux
/dev/sda2       15990782 16775167   784386  383M  5 Extended
/dev/sda5       15990784 16775167   784384  383M 82 Linux swap / Solaris

$
$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0    8G  0 disk
├─sda1   8:1    0  7,6G  0 part /
├─sda2   8:2    0    1K  0 part
└─sda5   8:5    0  383M  0 part [SWAP]
sdb      8:16   0   50G  0 disk
sr0     11:0    1 56,6M  0 rom
$

Zur Verdeutlichung für Einsteiger:

$ mkdir /d:
$
$ ls -l /dev/sdb
brw-rw---- 1 root disk 8, 16 Feb  3 09:57 /dev/sdb
$
$ du -sh /dev/sdb
0       /dev/sdb
$
$
$ du -sh /home/
1,2G    /home/
$
$
$ du -sh /dev/sda
0       /dev/sda
$
$ du -sh /dev/sda1
0       /dev/sda1
$
$ ls -l /etc/fstab
-rw-r--r-- 1 root root 664 Jan 11 08:47 /etc/fstab
$
$ du  /etc/fstab
4       /etc/fstab
$
$
$
$ mount /dev/sdb /d:
mount: Falscher Dateisystemtyp, ungültige Optionen, der
Superblock von /dev/sdb ist beschädigt, fehlende
Kodierungsseite oder ein anderer Fehler

    Manchmal liefert das Systemprotokoll wertvolle Informationen –
    versuchen Sie  dmesg | tail  oder ähnlich
$
$
$ dmesg | grep sdb
[   10.904107] sd 1:0:0:0: [sdb] 104857600 512-byte logical blocks: (53.6 GB/50.0 GiB)
[   10.904170] sd 1:0:0:0: [sdb] Write Protect is off
[   10.904172] sd 1:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[   10.904224] sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[   10.904815]  sdb: unknown partition table
[   10.904892] sd 1:0:0:0: [sdb] Attached SCSI disk
$

Dateisysteme

Einen guten Einblick in die komplizierte Thematik bietet diese Seite: https://www.thomas-krenn.com/de/wiki/Linux_Dateisysteme

Frondend oder Backend?

  1. mkfs, mke2fs = Frontends (= Hebel, was andere Tools aufruft)

  2. mkfs.ext4 = ein Backend (das eigentliche Werkzeug, das die schmutzige Arbeit tut)

Aufschlussreich ist hierzu (vielen Dank für den Beitrag):

$ ls -l /sbin/mk*

=> mkfs u. mke2fs erstellen per default (also ohne explizite Angabe des Types) ext2 file system

Anmerkung zum Autor Harald Maaßen; er verwendet RedHat/CentOS:

[root@c6 ~]# \ls -l /sbin/mk*
-rwxr-xr-x. 5 root root  60432 24. Jul 2015  /sbin/mke2fs
-rwxr-xr-x. 1 root root   6832 11. Mai 2016  /sbin/mkfs
-rwxr-xr-x. 1 root root  22168 11. Mai 2016  /sbin/mkfs.cramfs
-rwxr-xr-x. 5 root root  60432 24. Jul 2015  /sbin/mkfs.ext2
-rwxr-xr-x. 5 root root  60432 24. Jul 2015  /sbin/mkfs.ext3
-rwxr-xr-x. 5 root root  60432 24. Jul 2015  /sbin/mkfs.ext4
-rwxr-xr-x. 5 root root  60432 24. Jul 2015  /sbin/mkfs.ext4dev
-rwxr-xr-x. 1 root root 290768 11. Mai 2016  /sbin/mkfs.xfs
-rwxr-xr-x. 1 root root  18768 11. Mai 2016  /sbin/mkhomedir_helper
-rwxr-xr-x. 1 root root   3412 11. Mai 2016  /sbin/mkinitrd
-rwxr-xr-x. 1 root root  26128 11. Mai 2016  /sbin/mkswap
[root@c6 ~]#
[root@c6 ~]#
[root@c6 ~]# stat /sbin/mke2fs
File: „/sbin/mke2fs“
Size: 60432           Blocks: 120        IO Block: 4096   reguläre Datei
Device: fd00h/64768d    Inode: 2099569     Links: 5
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-01-19 15:41:02.671009358 +0100
Modify: 2015-07-24 12:33:24.000000000 +0200
Change: 2017-01-17 08:49:45.184000037 +0100
[root@c6 ~]#
[root@c6 ~]#
[root@c6 ~]# find /sbin -samefile /sbin/mke2fs
/sbin/mkfs.ext4
/sbin/mkfs.ext3
/sbin/mkfs.ext4dev
/sbin/mke2fs
/sbin/mkfs.ext2
[root@c6 ~]#
[root@c6 ~]#
[root@c6 ~]# find /sbin -samefile /sbin/mke2fs -ls
2099569   60 -rwxr-xr-x   5 root     root        60432 Jul 24  2015 /sbin/mkfs.ext4
2099569   60 -rwxr-xr-x   5 root     root        60432 Jul 24  2015 /sbin/mkfs.ext3
2099569   60 -rwxr-xr-x   5 root     root        60432 Jul 24  2015 /sbin/mkfs.ext4dev
2099569   60 -rwxr-xr-x   5 root     root        60432 Jul 24  2015 /sbin/mke2fs
2099569   60 -rwxr-xr-x   5 root     root        60432 Jul 24  2015 /sbin/mkfs.ext2
[root@c6 ~]#
[root@c6 ~]# ls -li /sbin/mkfs
2098060 -rwxr-xr-x. 1 root root 6832 11. Mai 2016  /sbin/mkfs
[root@c6 ~]#

Wir experimentieren zuerst einmal mit dem Hauptgerät ‚/dev/sdb‘ (Major-Device, keine Partitionstabelle vorher erstellt):

$ mke2fs /dev/sdb
mke2fs 1.42.12 (29-Aug-2014)
Ein Dateisystems mit 13107200 (4k) Blöcken und 3276800 Inodes wird erzeugt.
UUID des Dateisystems: f1f10ed0-b433-4621-93ac-e8bcfab89cb7
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424

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

$
$ mount /dev/sdb /d:
$
$ dmesg | grep sdb
[   10.904107] sd 1:0:0:0: [sdb] 104857600 512-byte logical blocks: (53.6 GB/50.0 GiB)
[   10.904170] sd 1:0:0:0: [sdb] Write Protect is off
[   10.904172] sd 1:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[   10.904224] sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[   10.904815]  sdb: unknown partition table
[   10.904892] sd 1:0:0:0: [sdb] Attached SCSI disk
[ 1407.123824] EXT4-fs (sdb): mounting ext2 file system using the ext4 subsystem
[ 1407.133690] EXT4-fs (sdb): mounted filesystem without journal. Opts: (null)
$
$ mount | tail -1
/dev/sdb on /d: type ext2 (rw,relatime)
$
$ df -h /d:
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb         50G     52M   47G    1% /d:
$

$ cp -a /etc /d:/etc-$(date +%F)
$
$ ls -l /d:
insgesamt 28
drwxr-xr-x 140 root root 12288 Feb  3 09:57 etc-2017-02-03
drwx------   2 root root 16384 Feb  3 10:20 lost+found
$
$
$ cp -a /usr/share/doc /d:/usr_share_doc-$(date +%F)
$
$
$ ls -l /d:
insgesamt 96
drwxr-xr-x  140 root root 12288 Feb  3 09:57 etc-2017-02-03
drwx------    2 root root 16384 Feb  3 10:20 lost+found
drwxr-xr-x 1655 root root 65536 Feb  2 12:23 usr_share_doc-2017-02-03
$
$
$ df -h /d:
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb         50G    332M   47G    1% /d:
$

Sehr nützlich (vielen Dank für den Beitrag):

$  file -s /dev/sdb1
/dev/sdb1: Linux rev 1.0 ext2 filesystem data, UUID=207cd7a7-1ef3-45f4-8d42-c3b9b550b593 (large files)

zeigt den file system Type AUCH wenn NICHT gemountet !

Im bisherigen Szenario mit dem Hauptgerät /dev/sdb können wir allerdings nicht ohne weiteres den Bootloader GRUB installieren:

$ mount | tail -1
/dev/sdb on /d: type ext2 (rw,relatime)
$
$ grub-install --no-floppy --root-directory=/d:  /dev/sdb
Installing for i386-pc platform.
grub-install: Warnung: Dateisystem »ext2« unterstützt keine Einbettungen.
grub-install: Warnung: Einbettung ist nicht möglich. GRUB kann in dieser Konfiguration nur mittels Blocklisten installiert werden. Blocklisten sind allerdings UNZUVERLÄSSIG und deren Verwendung wird daher nicht empfohlen..
grub-install: Fehler: mit Blocklisten wird nicht fortgesetzt.
$


rmdir /d:
$
$
$ file /dev/sdb
/dev/sdb: block special (8/16)
$
$
$ file /dev/sdb1
/dev/sdb1: cannot open `/dev/sdb1' (No such file or directory)
$

Um ganz von Vvrn beginnen zu können, überschreiben wir 10 Sektoren der zweiten Festplatte:

$ dd if=/dev/zero of=/dev/sdb bs=512 count=10
10+0 Datensätze ein
10+0 Datensätze aus
5120 Bytes (5,1 kB) kopiert, 0,000756306 s, 6,8 MB/s
$

Nun ist zu sehen, dass ein DOS-Label und damit einen neue Partitionstabelle geschrieben wird:

$ 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 0xe6af85ff.

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):

Standardantwort p wird verwendet.
Partitionsnummer (1-4, Vorgabe 1):
Erster Sektor (2048-104857599, Vorgabe 2048):
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (2048-104857599, Vorgabe 104857599): +100M

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

Befehl (m für Hilfe): p
Festplatte /dev/sdb: 50 GiB, 53687091200 Bytes, 104857600 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: 0xe6af85ff

Device     Boot Start    End Sectors  Size Id Type
/dev/sdb1        2048 206847  204800  100M 83 Linux


Befehl (m für Hilfe): n
Partitionstyp
p   Primär (1 primär, 0 erweitert, 3 frei)
e   Erweitert (Container für logische Partitionen)
Wählen (Vorgabe p):

Standardantwort p wird verwendet.
Partitionsnummer (2-4, Vorgabe 2): +20G
Wert außerhalb des Bereichs.
Partitionsnummer (2-4, Vorgabe 2):
Erster Sektor (206848-104857599, Vorgabe 206848):
Letzter Sektor, +Sektoren oder +Größe{K,M,G,T,P} (206848-104857599, Vorgabe 104857599): +20G

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

Befehl (m für Hilfe): p
Festplatte /dev/sdb: 50 GiB, 53687091200 Bytes, 104857600 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: 0xe6af85ff

Device     Boot  Start      End  Sectors  Size Id Type
/dev/sdb1         2048   206847   204800  100M 83 Linux
/dev/sdb2       206848 42149887 41943040   20G 83 Linux


Befehl (m für Hilfe): w
Die Partitionstabelle wurde verändert.
ioctl() wird aufgerufen, um die Partitionstabelle neu einzulesen.
Festplatten werden synchronisiert.

$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Feb  3 11:02 /dev/sdb
brw-rw---- 1 root disk 8, 17 Feb  3 11:02 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Feb  3 11:02 /dev/sdb2
$
$
$ \rm /dev/sdb[12]
$
$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Feb  3 11:02 /dev/sdb
$
$
$ 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.
$
$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Feb  3 11:05 /dev/sdb
brw-rw---- 1 root disk 8, 17 Feb  3 11:05 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Feb  3 11:05 /dev/sdb2
$

Aufbringen von Windows-Dateisystemen:

$ mkfs.vfat -F16 /dev/sdb1
mkfs.fat 3.0.27 (2014-11-12)
$
$
$ mkfs.msdos -F16 /dev/sdb1
mkfs.fat 3.0.27 (2014-11-12)
$

$ mkfs -t ntfs -f   /dev/sdb2
Cluster size has been automatically set to 4096 bytes.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.
$

Nun mounten wir, wobei der Kernel seine Standardoptionen anwendet: ::

$ mkdir /media/tmp{1,2}
$
$ mount /dev/sdb1 /media/tmp1
$
$ mount /dev/sdb2 /media/tmp2
$
$ mount | tail -3
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=205864k,mode=700,uid=1000,gid=1000)
/dev/sdb1 on /media/tmp1 type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=utf8,shortname=mixed,errors=remount-ro)
/dev/sdb2 on /media/tmp2 type fuseblk (rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096)
$


$ cp /etc/fstab /root/fstab.orig
$
$ set -o noclobber
$
$ echo '/dev/sdb2   /storage  fuseblk   defaults,uid=tux,group=users,user,sync  0   0' >> /etc/fstab
$
$ mkdir /storage
$
$ mount -a
mount: /dev/sdb1 ist bereits eingehängt oder /storage wird gerade benutzt
    /dev/sdb1 ist bereits auf /media/tmp1 eingehängt
$
$ umount /dev/sdb1
$ umount /dev/sdb2
$
$ umount /dev/sdb1
umount: /dev/sdb1: nicht eingehängt
$ umount /dev/sdb2
umount: /dev/sdb2: nicht eingehängt
$
$
$ mount -a
mount: Falscher Dateisystemtyp, ungültige Optionen, der
Superblock von /dev/sdb2 ist beschädigt, fehlende
Kodierungsseite oder ein anderer Fehler

    Manchmal liefert das Systemprotokoll wertvolle Informationen –
    versuchen Sie  dmesg | tail  oder ähnlich
$
$ sed -i 's/fuseblk/ntfs-3g/g' /etc/fstab
$
$
$ mount -a
$
$
$ mount | tail -1
/dev/sdb2 on /storage type fuseblk (rw,nosuid,nodev,noexec,relatime,sync,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,user)
$
$
$ lsmod | grep fuse
fuse                   83350  3
$

Der bisherige Stand:

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0    8G  0 disk
├─sda1   8:1    0  7,6G  0 part /
└─sda5   8:5    0  383M  0 part [SWAP]
sdb      8:16   0   50G  0 disk
├─sdb1   8:17   0  100M  0 part
└─sdb2   8:18   0   20G  0 part /storage
sr0     11:0    1 56,6M  0 rom
$
$
$ blkid
/dev/sr0: UUID="2017-01-16-16-48-32-00" LABEL="VBOXADDITIONS_5.1.14_112924" TYPE="iso9660"
/dev/sda1: UUID="549e3713-ece9-4337-a09c-fed9450bcc28" TYPE="ext4" PARTUUID="c76ffbe3-01"
/dev/sda5: UUID="19488118-f9ed-4186-b4b0-6d945a34f9ac" TYPE="swap" PARTUUID="c76ffbe3-05"
/dev/sdb1: SEC_TYPE="msdos" UUID="8581-E972" TYPE="vfat" PARTUUID="e6af85ff-01"
/dev/sdb2: UUID="0332E32E70832122" TYPE="ntfs" PARTUUID="e6af85ff-02"
$

Linux-Partition anlegen

ZIEL: Umzug von /opt (= /usr/local)

$ cfdisk /dev/sdb
  • Anwählen von „Freier Bereich“

  • Mit Cursor auf „Neue“ gehen, Enter

  • Den gesamten Rest mit Enter übernehmen

  • Anwählen von „Erweitert“ (=> /dev/sdb3), früher/SuSE: ext’d 95

  • Wiederum „Freier Bereich“ anwählen, Enter

  • Dann „Schreiben“, „yes“, „Ende“

$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Feb  3 12:52 /dev/sdb
brw-rw---- 1 root disk 8, 17 Feb  3 12:52 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Feb  3 12:52 /dev/sdb2
$
$ 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.
$
$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 Feb  3 12:52 /dev/sdb
brw-rw---- 1 root disk 8, 17 Feb  3 12:52 /dev/sdb1
brw-rw---- 1 root disk 8, 18 Feb  3 12:52 /dev/sdb2
brw-rw---- 1 root disk 8, 19 Feb  3 12:52 /dev/sdb3
brw-rw---- 1 root disk 8, 21 Feb  3 12:52 /dev/sdb5
$
$ mke2fs -t ext4 /dev/sdb5
mke2fs 1.42.12 (29-Aug-2014)
Ein Dateisystems mit 7838208 (4k) Blöcken und 1962240 Inodes wird erzeugt.
UUID des Dateisystems: 3fb8bb14-4a51-4a46-98e0-d3a6cc7d9484
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

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

$

Inhalt von /opt VOR dem überlagernden Mounten der neuen Partition ist weder etwas von ‚lost+found‘ zu sehen noch etwas von der Datei ‚neue.datei‘, die sowie erst später auf diese neue Fläche gelangt:

$ ls -l /opt
insgesamt 12
drwxr-xr-x 2 root root 4096 Jan 19 10:24 bin
drwxr-xr-x 5 root root 4096 Jan 19 10:24 share
drwxr-xr-x 9 root root 4096 Jan 11 12:13 VBoxGuestAdditions-5.1.12
$

Temporär mounten wir die für /opt vorgesehende Fläche in das Verzeichnis /mnt und
kontrollieren den Vorgang auf Korrektheit: ::

$ mount /dev/sdb5 /mnt/
$
$ ls -l /mnt/
insgesamt 16
drwx------ 2 root root 16384 Feb  3 12:53 lost+found
$
$ df -h /mnt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb5        30G     44M   28G    1% /mnt
$
$ mount | tail -1
/dev/sdb5 on /mnt type ext4 (rw,relatime,data=ordered)
$
$
Als nächstes werden die alten Nutzdaten auf das neues Laufwerk kopiert (ACHTUNG Bei
sich ändernden Datenbeständen muss dies im Runlevel 1 oder S geschehen!!): ::
$
$ cp -a /opt/* /mnt/
$
$ du -s /opt /mnt/
19648   /opt
19664   /mnt/
$

Nun hängen wir das Laufwerk wieder aus und erstellen einen Eintrag im „filesystem table“, durch welchen wir festlegen, wie und wo unsere neue Partition gemountet werden soll. Dabei beinhaltet ‚defaults‘ u.a. ‚auto‘, was bedeutet, das das Gerät beim Booten automatisch gemountet wird:

$ umount /mnt
$
$ echo '/dev/sdb5  /opt  ext4  defaults  0  2' >> /etc/fstab
$

Mit ‚-a‘ oder ‚–all‘ können wir einen ‚reboot‘ simulieren:

$ mount -a
$
$ mount | tail -3
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=205864k,mode=700,uid=1000,gid=1000)
/dev/sdb2 on /storage type fuseblk (rw,nosuid,nodev,noexec,relatime,sync,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,user)
/dev/sdb5 on /opt type ext4 (rw,relatime,data=ordered)
$
$ df -h /opt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb5        30G     64M   28G    1% /opt
$

Was aber passiert hier?

Zuerst einmal wird eine neue Datei erzeugt, anhand der wir die gemountete Partition leicht wiedererkennen können:

$ echo 123 > /opt/neue.datei
$
$ ls -l /opt/
insgesamt 32
drwxr-xr-x 2 root root  4096 Jan 19 10:24 bin
drwx------ 2 root root 16384 Feb  3 12:53 lost+found
-rw-r--r-- 1 root root     4 Feb  3 13:02 neue.datei
drwxr-xr-x 5 root root  4096 Jan 19 10:24 share
drwxr-xr-x 9 root root  4096 Jan 11 12:13 VBoxGuestAdditions-5.1.12

Nach dem Aushängen ist diese Datei natürlich verschwunden: das den selben Mountpunkt benutzende, überlagernde Gerät haben wir ja ähnlich wie eine nicht transparente Folie weggezogen:

$ umount /opt
$
$ ls -l /opt/
insgesamt 12
drwxr-xr-x 2 root root 4096 Jan 19 10:24 bin
drwxr-xr-x 5 root root 4096 Jan 19 10:24 share
drwxr-xr-x 9 root root 4096 Jan 11 12:13 VBoxGuestAdditions-5.1.12
$
$ df -h /opt
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1       7,4G    5,9G  1,2G   84% /
$

Nur Dateien auf der Wurzelpartition finden, nicht auf anderen Partitionen (Die Datei „neue.datei“ erscheint hierbei nicht):

$ touch /tmp/alte.datei
$ find / -xdev -name "*.datei"
/tmp/alte.datei
$

Daneben lässt sich auch ganz bequem das Kommando ‚mountpoint‘ verwenden, um zu prüfen, ob ein Verzeichnis ein selbständiger Einhängepunkt ist.

Transparente „Folien“ erhalten wir übrigens mit Union Filesystems, siehe dazu http://www.linux-magazin.de/Ausgaben/2005/10/Hochstapler

Softwaretipp: „Greenshot“ - ein Werkzeug für Windows, um effizient Screenshots erzeugen zu können. Download unter http://getgreenshot.org/downloads/

TESTPHASE: Funktioniert unser System nach dem Umzug von /opt (/dev/sda => /dev/sdb5) tadellos?

Nach einem Neustart des Systems wird ‚/dev/sdb5‘ automatisch via ‚/etc/fstab‘ in ‚/opt‘ gemountet. Da dort die VBoxGuestAdditions hininstalliert wurden, wird diese neue Partition nun auch tatsächlich benutzt. Testen wir also, ob alles wie gewünscht funktioniert (z.B. der Vollbildmodus des VirtualBox-Gastfensters mit STRG + F).

Danach können wir Platz schaffen (Bitte vorsichtig zu Werke gehen!):

  • In den Runlevel 1 fahren: init 1

  • Die Partition aushängen: umount /opt

  • Vergewissern, dass wir das alte Verzeichnis vor uns haben: ls -l /opt

  • Den INHALT des alten /opt-Verzeichnisses löschen: \rm -r /opt/*

  • Die Partition wieder einhängen: mount /opt

  • In den Runlevel 5 fahren: init 5

104.2 Maintain the integrity of filesystems

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 automatische Reparatur (= Default) fehlgeschlagen ist. Das könnte z.B. so aussehen:
    $ fsck -f -n /dev/sdb5
    fsck von util-linux 2.25.2
    e2fsck 1.42.12 (29-Aug-2014)
    Warnung! /dev/sdb5 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/sdb5: 11/262144 Dateien (1254.5% nicht zusammenhängend), 18510/1048576 Blöcke
    $
    
  • -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

Tools Tuning und Recovery

  • tune2fs - Tuningmöglichkeiten

    • 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/sdb5 | 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/sdb5      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/sdb5       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 mit watch -n1 -d df -i /opt/ Monitoring betreiben:

Siehe dazu auch:

PROJEKT: DHCP-Server und Clients

ZIEL: Installation und Konfiguration eines DHCP-Servers auf unserem NAT-Router

Installation

Die Software ist auf Debian-basierten Systemen schnell installiert:

$ apt-get update
$ apt-get install isc-dhcp-server

Konfiguration

Nach der Installation des Servers konfigurieren wir zuerst einmal die Startoption, die das Listening-Interface betrifft:

$ vi /etc/default/isc-dhcp-server

Dabei setzen wir als Wert ‚eth1‘ ein (= die zum ‚intnet‘ hin gerichtete Schnittstelle). Das Ergebnis sieht dann so aus:

INTERFACES="eth1"

Danach ist die Hauptkonfigurationsdatei dran:

$ vi /etc/dhcp/dhcpd.conf

Hierbei müssen zwei Dinge eingerichtet werden:

  1. Zu übermittelnde DNS-Server als globale Serveroption

Hierbei wollen wir an die DHCP-Clients mittels ‚option domain-name-servers‘ die IP-Adressen von 2 ausgewählten Nameservern senden:

  • public-dns-b.primawebtools.de. (84.200.55.104)

  • google-public-dns-a.google.com. (8.8.8.8)

  1. Zu übermittelnde Adressinformationen über das physische Netzsegment

Hier geht es um speziell um unser isoliertes Netzwerk namens ‚intnet‘, in dem ja die MAC-Adressen umherschwirren:

  • Deklaration von Netzwerkpräfix und Pool für Adresszuweisungen (mit ‚subnet‘ und ‚range‘)

  • Übermittlung des Standard-Routers als lokale Bereichsoption (mit ‚option routers‘)

Die betreffenden Abschnitte sollten nach dem Editieren dann in etwa wie folgt aussehen:

# Bei Zeile 20
option domain-name-servers 84.200.55.104, 8.8.8.8;

# Bei Zeile 35
subnet 10.0.0.0 netmask 255.255.255.0 {
   range 10.0.0.10 10.0.0.20;
   option routers 10.0.0.1;
}

Inbetriebnahme

Jetzt sollte sich gleich der dhcp-Daemon ohne größere Fehlermeldungen starten lassen. Ob das aber tatsächlich der Fall ist und um später dem Ausliefern der Informationen an die Clients beiwohnen zu können, starten wir vorher in einem zweiten Terminal (natürlich als root) diesen Log-Monitor:

$ tail -f /var/log/syslog

Für den ersten Start verwenden wir am besten gleich ‚restart‘:

$ /etc/init.d/isc-dhcp-server restart

Testing

Nun können sich DHCP-Clients, die sich im ‚intnet‘ befinden, Adressinformationen holen.

Auf einem typischen Ubuntu-System könnte sich das manuelle Testen so gestalten:

$ sudo -i
$ systemctl stop NetworkManager
$ dhclient -r
$ dhclient
$ less /var/lib/dhcp/dhclient.leases

Neben ‚dhclient‘ gibt es weitere DHCP-Clienttools wie ‚dhcpcd‘, ‚udhcpc‘ und ‚pump‘.

104.3 Control mounting and unmounting of filesystems

Klassisches, statisches Mounten

Wichtiges Grundwissen: Aufbau der Datei /etc/fstab:

#<Ressource>  <Mountpunkt>  <Dateisystemtyp>  <Optionen>  <Sichern mit dump?>  <Prüfen mit fsck?>
# Wurzel
/dev/sda1     /             ext4              defaults    0                    1

# Swap
/dev/sda5     none          swap              sw          0                    0

# Optionale Daten
/dev/sdb5    /opt           ext4              defaults    0                    2

# NetworkFileSystem-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` ...

Anmerkungen:

  • In Spalte 3 kann man als Dateisystemtyp z.B. auch auto angeben (der Kernel soll es selber erkennen; für Wechseldatenträger günstig)

  • Zu den Optionen user und users: Wenn kein Automounter läuft (udev, autofs, usw.), dann ist die Datei ‚/etc/fstab‘ mit eben diesen Optionen der einzige Weg, User zu berechtigen, es OHNE root-Rechte selber zu tun.

  • Eine wichtige Datei im Hintergrund ist die /etc/mtab (Siehe dazu ‚/proc/self/mounts‘ bzw. den entsprechenden Symlink ‚/proc/mounts‘)

Aufgabe 1: Ermitteln Sie mit Hilfe der Kommandozeile blkid /dev/sdb5 den Universally Unique Identifier (UUID) für Ihre neue /opt-Partition und tragen Sie diese Kennung anstelle von ‚/dev/sdb5‘ in die Datei ‚/etc/fstab‘ ein. Dabei müssen allerdings die Double Ticks entfernt werden. Zu den Vorteilen der UUID siehe http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_Laufwerke.html Dort sind auch Informationen über den Pfad ‚/dev/disk/by-uuid‘ zu finden.

Aufgabe 2: Studieren Sie die mount-Optionen (Spalte 4 der Datei /etc/fstab)

  • auto (Ressourcen automatisch mounten, ist in ‚defaults‘ enthalten)

  • noauto (Ressourcen NICHT automatisch mounten, sinnvoll für Wechseldatenträger)

  • usrquota (Benutzerquotas unterstützen, Datei in der Dateisystemwurzel: ‚aquota.user‘)

  • grpquota (Gruppenquotas unterstützen, Datei in der Dateisystemwurzel: ‚aquota.group‘))

  • suid (Dateien mit erhöhen Rechten akzeptieren)

  • nosuid (Dateien mit erhöhen Rechten ignorieren)

  • exec (eXecute-Rechte unterstützen)

  • noexec (eXecute-Rechte NICHT unterstützen)

  • ro (read only mounten)

  • rw (read write mounten)

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

  • users (Ein beliebiger Nutzer darf diese Ressource mounten; hier darf aber jeder 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)

Aufgabe 3: Erzeugen und Einbinden von Swap-Space in Dateiform (bitte praktisch umsetzen)

  • Swapdatei erzeugen: dd if=/dev/zero of=/swapfile bs=1M count=500

  • Swapdatei formatieren: mkswap /swapfile

  • Swapdatei temorär einbinden: swapon -v /swapfile

  • Swapnutzung kontrollieren: swapon -s sowie free

  • Swapdatei deaktivieren: swapoff -v /swapfile

  • Swapdatei dauerhaft einbinden: echo '/swapfile  none  swap  sw  0  0' >> /etc/fstab

  • Swapspaces deaktivieren: swapoff -av

  • Swapspaces gemäß ‚/etc/fstab‘ aktivieren: swapon -av

Systemd-Mountunits

Für LPI 101 sollte hier ein Grundwissen über Mountunits ausreichen. Man kann sie sich mittels systemctl -t mount anzeigen lassen. Die hier sichtbaren Units werden durch das Programm systemd-fstab-generator aus der /etc/fstab gebildet.

Es lassen sich aber auch eigene mount-Units erstellen, wie sie z.B. bei USB-Hotplugbackup benötigt werden, siehe dazu Backup beim Anstecken von USB-Storage.

Daneben ist es gut zu wissen, dass Systemd auch einen eigenen Automounter mitbringt. Mit der folgenden /etc/fstab-Zeile lässt sich die 1. Partition der 2. Festplatte (z.B. USB-Stick via hotplug) beim Betreten des Verzeichnisses /media/hot automatisch mounten. Entscheidend ist dafür die erste Option x-systemd.automount:

/dev/sdb1  /media/hot  auto  x-systemd.automount,x-systemd-timeout=10,x-systemd.idle-timeout=1min,noauto  0  2

Nach dem Anlegen des Mountpunkt-Verzeichnisses mittels mkdir /media/hot sind noch folgenden Zeilen erforderlich, wenn man nicht gerade einen Rechnerneustart durchführen will:

systemctl daemon-reload
systemctl restart local-fs.target
systemctl restart remote-fs.target

Danach listet systemctl -t automount die neue Unit auf.

HINWEIS: Es gibt auch einen altgestandenen Automounter namens „autofs“, der nicht parallel mit diesem neuen Mechanismus betrieben werden sollte (kein automatisches umount!) Siehe dazu auch hier bei Manjaro.

104.4 Manage disk quotas

(nicht mehr in LPI 101-500 enthalten)

ZIEL: Es sollen Disk Space Limitierungen für Nutzeraccounts eingerichtet werden (bei Microsoft: Datenträgerkontingente). In der Praxis wird dies häufig für die meist schon separate Partion /home angewendet, wenn es inbesondere gilt, sehr viele Benutzer zu verwalten. Ein klassisches Szenario findet sich bei E-Mail-Anbietern wie web.de.

Software installieren

Unter Debian ist dies schnell erledigt:

$ apt-get install quota

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:

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

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.

$ quotacheck -agv
quotacheck: Prüfe /dev/sdb5 [/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.
$
$ 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
$

Quotas aktivieren

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

$ quotaon -avu [-g]

In unserem Beispiel sieht das so aus:

$ quotaon -agv
/dev/sdb5 [/opt]: group Quotas angeschalten
$

Ausflug ins Thema Benutzerverwaltung

$ groupadd technik
$ mkdir /opt/users
$ useradd -m -d /opt/users/heide -g technik -G audio,video,lpadmin,plugdev heide
$ passwd heide
Geben Sie ein neues UNIX-Passwort ein:
Geben Sie das neue UNIX-Passwort erneut ein:
passwd: Passwort erfolgreich geändert
$
$ ls -l /opt/users/
insgesamt 36
-rw------- 1 root  root     7168 Jan 29 12:33 aquota.group
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
$
$
$ su - heide
$
$ bash
heide@deb8-2:~$
heide@deb8-2:~$ pwd
/opt/users/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
$

Quotas für User/Group editieren

Es gibt dafür zwei Tools:

  • edquota (interaktiv, manuelle Umrechnung erforderlich)

  • setquota (Kommando mit bequemen Übergabeparametern)

Beispiel zu Verwendung von edquota:

$ edquota -u max
$ #   >>> Für Gruppen-Quota: edquota -g users

Beispiel zu Verwendung von setquota (Softlimit 1GB, Hardlimit 2GB, keine Inode-Einschränkungen):

$ setquota -u max 1G 2G 0 0 /opt

Hinweise zur Berechnung bei Verwendung von edquota:

  • Als Einheit werden Datenblöcke in der Größe von jeweils 1kB angegeben (1024 Bytes).

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

  • Einfache Umrechnungshilfe: von edquota angezeigte Blockgröße / 1024 = Größe in MB

  • Auswirkung der Blockgröße des Dateisystems:

    • Ausgangspunkt ist die Standard-Dateisystemblockgröße von ext4 = 4096 Bytes

    • Zur Ermittlung dieses Wertes: dumpe2fs -h /dev/sdb5| grep Block\ size

    • Angenommen, wir haben nur noch 4 Datenblöcke zu je 1024 Bytes als Reserve, dann kostet uns echo > 1-byte-datei genau so viel wie dd if=/dev/zero of=4k-datei count=1 bs=4096, nämlich einen ganzen Dateisystemblock, wonach das Limit erreicht ist.

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/sdb5                        20         24         24          5        0        0

Mit dieser Einstellung testen wir nun die Angelegenheit:

$ su - heide
$
$ bash
heide@deb8-2:~$ pwd
/opt/users/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
sdb5: write failed, group block limit reached.
bash: echo: Schreibfehler: Der zugewiesene Plattenplatz (Quota) ist überschritten.
heide@deb8-2:~$

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]

Parallele Verwendung von User- und Group-Quotas

Wir wollen an dieser Stelle der Frage nachgehen, wie die Prioritäten bei User- und Group-Quotas gestaltet sind, wenn sie gleichzeitig zur Anwendung gebracht werden. Dabei gilt:

  • Der kleinere Wert setzt sich durch (das striktere Limit)

  • Das gilt auch, wenn eine User-Quota mehr Platz einräumen würde.

  • Bei beiden Benutzern kommt die Meldung, dass das Limit überschritten ist.

Siehe dazu den folgenden Screenshot:

../_images/vorrang.png

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.)

104.5 Manage file permissions and ownership

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

Zugriffsrechte für Sonderfälle

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

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:~#

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.

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

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!

  1. Maximalrecht einer Datei: 666

  2. 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
========
  1. 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.

Screenshots zur Verdeutlichung

Bei Dateien gibt es eine Besonderheit:

  • Wenn in der umask gerade Zahlen stehen, muss ‚-1‘ gerechnet werden.

  • Sind aber ungerade Zahlen enthalten, ist an der jeweiligen Stelle kein Abzug erforderlich. Das eXecute-Recht fehlt ja bereits. Siehe dazu folgendes Bild:

../_images/umask1.png

Eine einfache Frage aus einem Braindump, man muss hier lediglich die Standardrechte kennen:

../_images/umask2.png

Eine kompliziertere Frage aus einem Braindump (Und immer dran denken: „Geben Sie die am besten passendste Antwort an!“):

../_images/umask3.png

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.

Gängige umask-Werte (Quelle: http://www.webune.com/forums/umask-calculator.html)

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------)

Eigentümerschaft von Files ändern

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:~#

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.

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.

104.7 Find system files and place files in the correct location

Ziel: Lage und Bezeichnung wichtiger Verzeichnispfade kennen und mit Tools herausfinden

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

Suchen nach Dateisystemobjekten

  1. Langsame Just-in-Time-Suche mit find (siehe man-Page)

  2. 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“

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