LPI 101 Vorbereitung
Grundlagen Linux
Kurs: Vorbereitung auf das Zertifikat LPI 101
Installation I (Debian mit KDE-Oberfläche)
Voraussetzungen:
Download und Installation von VirtualBox (https://www.virtualbox.org/wiki/Downloads)
Downloaden eines Debian-Live-Images mit KDE-Oberfläche (https://www.debian.org/CD/live/)
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:
Unter http://pemmann.de/cc/Handouts/lpi-101.html über „Vergleich mit Windows“ nachlesen
Kommandos:
$ cd <PFAD> $ ls -F
VM-Snapshot in VBox anfertigen, Name: „incl Guest Additions“
Innerhalb der Debian-VM via Firefox das folgende Buch durchstöbern: https://de.wikibooks.org/wiki/Linux-Praxisbuch
Windows Emulator unter Linux
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
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:~#
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:
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 ...
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 ...
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:
udevd => erzeugt im Hintergrund eine Gerätedatei (/dev/sdb1) und eventuelle symbolische Verknüpfungen
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:
http://www.trekstor.de/detail-datenspeicher/product/detail-data-storage/product/usb-stick-cs.html
evl auch USB-Card-Reader für z.B. SD-Cards
101.2 Boot the system
Typischer Ablauf eines Bootvorgangs (altes BIOS mit Master Boot Record):
Power-Knopf drücken (ATX-Formfaktor, Stromsparfunktionen via Taster => Netzteil)
Start-OS „BIOS“, Power On Self Test (POST) http://www.grundlagen-computer.de/…
Auf der Festplatte wird MBR gesucht (512 Bytes insgesamt, 440 Bytes Bootcode, 64 Bytes Partitionstabelle)
Den gesamten MBR sichern:
dd if=/dev/sda of=mbr.bin count=1 bs=512
Nur den Bootcode sichern:
dd if=/dev/sda of=bootcode.bin count=1 bs=440
Bootloader des OS starten (GRUB lädt sich selbst in den RAM: First Stage)
Bootloader lädt den Kernel mitsamt seines Initramfs in den RAM (GRUB: Second Stage)
Kernel startet den ersten Prozess mit der PID 1 (init / systemd)
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:
- Kernel-Ringbuffer: dmesg (Bei RedHat zusätzlich in der Datei /var/log/boot.log)
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:
Ordnerstruktur auf /mnt erzeugen: /mnt/boot/grub
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
Dienst hinter der PID 1 ist /sbin/init, siehe
pstree -pn | head
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
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:~#
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 mitS
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 dabeials 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
Runlevel-Links erzeugen/entfernen
Wie bereits erwähnt müssen für das automatische Starten der Daemons während des Bootvorganges Runlevel-Links erzeugt werden. Das wird nicht per Hand mittels ln -s ...
vorgenommen, sondern mit speziellen Tools. Das Problem ist, dass dabei Abhängigkeiten beachtet werden müssen. So muss zuerst das Netzwerk gestartet worden sein, danach der SSH-Server. Diese Bedingungen werden mit den sogenannten LSB-Tags abgebildet:
root@devuan-c1:~# head -11 /etc/init.d/ssh
#! /bin/sh
### BEGIN INIT INFO
# Provides: sshd
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: OpenBSD Secure Shell server
### END INIT INFO
# Das eigentliche Skript beginnt...
Zur besseren Verdeutlichung entfernen wir mit dem Debian-Tool update-rc.d
die Links zum Starten des SSH-Servers und stellen sie danach wieder her:
root@devuan-c1:~# find /etc/rc[012345]* -name "*ssh*" -ls
13995 4 lrwxrwxrwx 1 root root 13 Apr 25 10:25 /etc/rc2.d/S02ssh -> ../init.d/ssh
13996 4 lrwxrwxrwx 1 root root 13 Apr 25 10:25 /etc/rc3.d/S02ssh -> ../init.d/ssh
13997 4 lrwxrwxrwx 1 root root 13 Apr 25 10:25 /etc/rc4.d/S02ssh -> ../init.d/ssh
13998 4 lrwxrwxrwx 1 root root 13 Apr 25 10:25 /etc/rc5.d/S02ssh -> ../init.d/ssh
root@devuan-c1:~#
root@devuan-c1:~# update-rc.d -f ssh remove
root@devuan-c1:~#
root@devuan-c1:~# find /etc/rc[012345]* -name "*ssh*" -ls
root@devuan-c1:~# #
root@devuan-c1:~# # >> Keine Runlevel-Links bezüglich "ssh" mehr zu finden!
root@devuan-c1:~#
root@devuan-c1:~#
root@devuan-c1:~# update-rc.d -f ssh defaults
root@devuan-c1:~#
root@devuan-c1:~# find /etc/rc[012345]* -name "*ssh*" -ls
13999 4 lrwxrwxrwx 1 root root 13 Apr 25 10:28 /etc/rc2.d/S02ssh -> ../init.d/ssh
14000 4 lrwxrwxrwx 1 root root 13 Apr 25 10:28 /etc/rc3.d/S02ssh -> ../init.d/ssh
14001 4 lrwxrwxrwx 1 root root 13 Apr 25 10:28 /etc/rc4.d/S02ssh -> ../init.d/ssh
14002 4 lrwxrwxrwx 1 root root 13 Apr 25 10:28 /etc/rc5.d/S02ssh -> ../init.d/ssh
root@devuan-c1:~# #
root@devuan-c1:~# # >> alle wieder da :-)
Halten wir fest: Debian besitzt das Programm update-rc.d
, bei anderen Distributionen gibt es die folgenden Tools:
chkconfig
(RedHat, => https://dbigr.com/archives/3416/)insserv
(SuSE, => https://linupedia.org/opensuse/Runlevel_scripte_-_Scripts_selbst_erstellen - auch sehr informativ zu oben genannten LSB-Tags)
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“…
Debian bekommt den Wechsel automatisch mit, Kontolle:
ifconfig eth0
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:
Partition: 1 GB swap (prim. => /dev/sda1, sw)
Partition: 10 GB /usr (log. => /dev/sda5, ext4)
Partition: 5 GB /var (log. => /dev/sda6, ext4)
Partition: 500 MB /tmp (log. => /dev/sda7, ext4)
Partition: 15 GB /home (log. => /dev/sda8, xfs)
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.)
To create RAID 9 arrays.
To dynamically change the size of logical volumes.
To encrypt logical volumes.
To create snapshots.
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:
Downloaden von geeigneten Linux-ISOs
ISOs in das in der Stick-Wurzel befindliche Verzeichnis ISO kopieren
Die Konfigurationsdatei des Bootloaders ‚bootgrubgrub.cfg‘ anpassen (von der Stickwurzel ausgehend)
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.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:
Debian ist genial: http://debianforum.de/forum/viewtopic.php?f=15&t=87836
Ein Wermutstropfen durch zu das Bibliotheken-Chaos: https://linuxundich.de/gnu-linux/linus-torvalds-schmimpft-bauen-von-anwendungen-fur-linux/
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>
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:
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:
Hoher Nice-Wert -> geringe Priorität
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:
http://superuser.com/questions/203657/difference-between-nice-value-and-priority-in-the-top-output
https://www.fbi.h-da.de/~a.schuette/Vorlesungen/Unix/Skript/C-Programmierung/Scheduling.pdf
http://honglus.blogspot.de/2011/03/understanding-cpu-scheduling-priority.html
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
https://raspberry.tips/raspberrypi-einsteiger/die-richtige-sd-karte-fuer-den-raspberry-pi/
http://www.raspberry-projects.com/pi/pi-operating-systems/win32diskimager
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.
Netzwerkkarte anstecken
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
Der Fernsteuernde = Debian Desktop (Paket: ‚xtightvncviewer‘):
vncviewer -listen
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:
Command (= Default), Navigieren, Kopieren (ganze Zeile: yy)
Insert (schreiben…, mit ESC kommt man zurück in den Commando-Modus)
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:
ESC :w
: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
Low-Level (Phys. Formatierung, z.B. Floppy-Diskette):
fdformat /dev/fd0
Partitionierung, Werkzeuge: fdisk, cfdisk, parted, gparted
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?
mkfs, mke2fs = Frontends (= Hebel, was andere Tools aufruft)
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:
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)
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
sowiefree
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 wiedd 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
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:

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!
Maximalrecht einer Datei: 666
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
========
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:

—
Eine einfache Frage aus einem Braindump, man muss hier lediglich die Standardrechte kennen:

—
Eine kompliziertere Frage aus einem Braindump (Und immer dran denken: „Geben Sie die am besten passendste Antwort an!“):

—
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:
- Klappt der Login mit tux2 und dem Passwort von tux?Kommando:
su - tux2
- 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:~#
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.6 Create and change hard and symbolic links
Es gibt zwei Arten von Links, die Hinweisschilder auf die eigentlichen Dateien bzw. Verzeichnisse darstellen.
- Hard-Links
Vom Prinzip her handelt es sich nur um weitere Namen für ein und dieselbe Datei, dh. es wird kein zusätzlicher Speicherplatz auf dem Datenträger benötigt. Daraus ergibt sich, dass sie nicht partitionsübergreifend angelegt werden können.
Sie sind Grundlage für die Konstruktion von Verzeichnisstrukturen, so sieht man immer bei Verzeichnissen die Anzahl von Hardlinks als Unterverzeichniszähler.
Eine Verwendung von Hardlinks anstelle von Symlinks scheint nicht immer plausibel zu sein, betrachtet man aber das Dateisystem als Datenbank, in der es keine unnötigen Redundanzen geben soll, hilft das Hardlinken dabei, ein konsistentes System zu erhalten. Siehe auch unten bei „speicherschonende Snapshots“ (cp -al …).
Hardlinks können nicht auf Verzeichnisse gesetzt werden.
- Symbolische Links
- Hier handelt es sich um die bestens bekannten Verküpfungen, die als Zeiger auf ein Verknüpfungsziel zeigen.Man kann sie sich auch als Knauf für einen bequemen Zugriff vorstellen.
Anders als bei Hardlinks ist hier partitions- und netzwerkübergreifende Arbeitsweise möglich.
Symlinks lassen sich unter bestimmten Umständen verschieben (mittels relativer Pfade angelegt).
Sie können sowohl auf Dateien wie auch auf Verzeichnisse gesetzt werden.
Praxisbeispiele zu Hardlinks
Grundsätzlich benötigen Dateisystemstrukturen (Stichwort: Filesystem Hierarchy Standard „HFS“) Hardlinks, um Unterverzeichnisse zu referenzieren, damit schließlich auch ein cd .. funktioniert:
tux@deb8-2:~$ mkdir Container
tux@deb8-2:~$
tux@deb8-2:~$ ls -ld Container/
drwxrwxr-x 2 tux tux 6 Feb 4 10:23 Container/
tux@deb8-2:~$
tux@deb8-2:~$
tux@deb8-2:~$ ls -la Container/
insgesamt 8
drwxrwxr-x 2 tux tux 6 Feb 4 10:23 .
drwxr-xr-x 58 tux tux 4096 Feb 4 10:23 ..
tux@deb8-2:~$
tux@deb8-2:~$ mkdir Container/Kiste
tux@deb8-2:~$
tux@deb8-2:~$ ls -ld Container/
drwxrwxr-x 3 tux tux 18 Feb 4 10:23 Container/
tux@deb8-2:~$
tux@deb8-2:~$
tux@deb8-2:~$ cd Container/Kiste/
tux@deb8-2:~/Container/Kiste$
tux@deb8-2:~/Container/Kiste$ cd ..
tux@deb8-2:~/Container$
tux@deb8-2:~/Container$ cd ..
tux@deb8-2:~$
tux@deb8-2:~$ cd ..
tux@deb8-2:/home$
tux@deb8-2:/home$ cd ..
tux@deb8-2:/$
Erzeugen von Hardlinks am Beispiel (aus einem alten Windows NT Lehrbuch):

Ein Henkeltöpfchen mit zwei Anfassern
tux@deb8-2:~$ echo Spieglein, Spieglein... > spieglein
tux@deb8-2:~$ ln spieglein spiegel
tux@deb8-2:~$ ls -li spieg* # WICHTIG: Beide Dateien haben die selbe Inode-Nummer
3760 -rw-rw-r-- 2 tux tux 24 Feb 4 10:28 spiegel
3760 -rw-rw-r-- 2 tux tux 24 Feb 4 10:28 spieglein
tux@deb8-2:~$
Eine weitere Einsatzmöglichkeit sind speicherschonende Snapshots (Kein Backupersatz!!). Dies kann vor größeren Auf- und Umräumaktionen sinnvoll sein, um vor ungewollten Datenverlust gewappnet zu sein.
cp -al Dokumente Dokumente.hardlinked
Praxisbeispiele zu symbolischen Links
Erzeugen von symbolischen Links (Fortsetzung des obigen Beispiels aus dem alten Windows NT Lehrbuch):

Ein Henkeltöpfchen mit seinem Wegweiser
tux@deb8-2:~$ ln -s spieglein mirror
tux@deb8-2:~$
tux@deb8-2:~$
tux@deb8-2:~$ ls -li spieg* mirror
2648738 lrwxrwxrwx 1 tux tux 9 Feb 4 10:53 mirror -> spieglein # 'mirror' ist eine separate Datei
3760 -rw-rw-r-- 2 tux tux 24 Feb 4 10:28 spiegel # mit eigener Inode
3760 -rw-rw-r-- 2 tux tux 24 Feb 4 10:28 spieglein
tux@deb8-2:~$
In der Praxis werden bestimmte Gerätedateien gerne über allgemeine Symlinks angesprochen:
# CDROM/DVD-Laufwerk (Brenner)
ln -s /dev/sr0 /cdv/cdrom
# Modem an COM 1
ln -s /dev/ttyS0 /dev/modem
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
Langsame Just-in-Time-Suche mit find (siehe man-Page)
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