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) - - 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: a) Unter http://pemmann.de/cc/Handouts/lpi-101.html über "Vergleich mit Windows" nachlesen Kommandos: :: $ cd $ ls -F b) VM-Snapshot in VBox anfertigen, Name: "incl Guest Additions" c) Innerhalb der Debian-VM via Firefox das folgende Buch durchstöbern: https://de.wikibooks.org/wiki/Linux-Praxisbuch **Windows Emulator unter Linux** https://wiki.debian.org/Wine Wir installieren als root: :: $ dpkg --add-architecture i386 && sudo apt update $ apt-get install wine In einem neuen konsole-Fenster als root: :: $ cd Downloads $ wine CLauncher-2-PC.exe (dotnet NICHT installieren, also 'Abbrechen') Rungang im neuen Linux-System a) 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:~# b) 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-. 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/ 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/ - Infos ausgeben: Kommandos lsmod, modinfo, Datei /lib/modules//modules.dep - Module laden: Kommandos insmod, modprobe - Module entfernen: Kommandos rmmod, modprobe -r - Modulabhängigkeitsdatenbank neu aufbauen: Kommando depmod, Datei modules.dep Hardwareinformationen ^^^^^^^^^^^^^^^^^^^^^ **Virtuelle Dateisysteme** Dank virtueller Dateisysteme, die vielfältige Hilfsaufgaben wahrnehmen, lassen sich auch bequem hardware- und kernelnahe Informationen direkt aus Dateien auslesen. So z.B. mittels *procfs*, was in /proc residiert (Prozessdateisystem) sowie mittels *sysfs* in /sys (Kernel-Subsysteme). Wichtige Dateisystempfade und Dateien für /proc sind: - /proc/cpuinfo (Eigenschaften der CPU) - /proc/interrupts (Hardwareressource Nr. 1: Auflistung der vorhandenen Interrupt-Kanäle) - /proc/ioports (Hardwareressource Nr. 2: verwendete I/O-Speicherbereiche im RAM) - /proc/dma (Hardwareressource Nr. 3: verwendete DMA-Kanäle) - /proc/cmdline (Bootparameter für den Kernel) - /proc/scsi/scsi (Datei mit SCSI-Informationen, ist nach /sys gewandert) - /proc/bus/usb (Verzeichnis mit USB-Informationen, ist ebenfalls nach /sys gewandert) Hierzu folgen nun einige Beispiele. :: root@d8:~# egrep "vmx|svm" /proc/cpuinfo ## KVM-Support vorhanden? ... root@d8:~# root@d8:~# cat /proc/sys/kernel/osrelease 3.16.0-4-amd64 root@d8:~# root@d8:~# cat /proc/sys/kernel/ostype Linux root@d8:~# root@d8:~# cat /proc/sys/kernel/hostname d8 root@d8:~# root@d8:~# hostname d8 root@d8:~# root@d8:~# cat /proc/sys/kernel/modprobe /sbin/modprobe root@d8:~# root@d8:~# ls -F /proc/sys/kernel/ Drei Dateien sind für die Hardwareressourcen von Schnittstellenkarten und Festplatten wichtig: 1. Die Interrupts des Systems: :: root@d8:~# cat /proc/interrupts CPU0 0: 34 IO-APIC-edge timer 1: 11007 IO-APIC-edge i8042 8: 0 IO-APIC-edge rtc0 ... 2. Die derzeit benutzten I/O-Portbereiche im RAM: :: root@d8:~# cat /proc/ioports 0000-0cf7 : PCI Bus 0000:00 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 ... 3. Die derzeit benutzten Direct-Memory-Access-Kanäle ausgeben: :: root@d8:~# cat /proc/dma 4: cascade root@d8:~# Weiterhin LPI-relevant: Die Cheatcodes, die dem Kernel als Bootparameter beim Systemstart übergeben wurden: :: root@d8:~# cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro quiet root@d8:~# Eine Textsuche nach dieser Kernelversion in der Konfigurationsdatei des Bootloaders: :: root@d8:~# grep --color vmlinuz-3.16.0-4-amd64 /boot/grub/grub.cfg linux /boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro quiet linux /boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro quiet linux /boot/vmlinuz-3.16.0-4-amd64 root=UUID=549e3713-ece9-4337-a09c-fed9450bcc28 ro single Was auch damit zusammenhängt: :: root@d8:~# ls -l /dev/disk/by-uuid/549e3713-ece9-4337-a09c-fed9450bcc28 lrwxrwxrwx 1 root root 10 Jan 11 16:03 /dev/disk/by-uuid/549e3713-ece9-4337-a09c-fed9450bcc28 -> ../../sda1 root@d8:~# Das Kernel-Release mit Hilfe einer Kommandozeilensubstitution herausfinden (automatisierbar): :: root@d8:~# uname -r 3.16.0-4-amd64 root@d8:~# root@d8:~# root@d8:~# du -sh /lib/modules/`uname -r` 173M /lib/modules/3.16.0-4-amd64 root@d8:~# root@d8:~# root@d8:~# du -sh /lib/modules/$(cat /proc/sys/kernel/osrelease) 173M /lib/modules/3.16.0-4-amd64 root@d8:~# Zum zweiten virtuellen Dateisystem /sys muss man wissen, dass viele Infos aus /proc jetzt hier zu finden sind, so über die Bussysteme in /sys/bus; z.B. das Verzeichnis /sys/bus/usb: :: root@tux-pc:~# ls -F /sys block/ bus/ class/ dev/ devices/ firmware/ fs/ hypervisor/ kernel/ module/ power/ root@tux-pc:~# root@tux-pc:~# ls -F /sys/bus/usb devices/ drivers/ drivers_autoprobe drivers_probe uevent root@tux-pc:~# **Kommandos lspci und lsusb** Neben den virtuellen Dateisystemen existieren natürlich gewisse Kommandos, die bessere Veranschaulichung bieten. Wichtige Optionen für das Kommando *lspci*: :: -v (Verbose, zeigt auch die Bez. des geladenen Modules an) -k (Kernel-Module ausgeben) -n (Numerische Ausgabe von Vendor- und Device-ID) -t (Ausgabe in Tree-Form) USB-Geräte im System auffinden: :: a) dmesg b) lsusb # (falls nicht vorhanden: 'apt-get install usbutils') Das Kommando ``lsusb`` geht dabei die Pfade unter /proc/bus/usb bzw. /sys/bus/usb durch und gibt Infos aus. Automatische Erzeugung von Gerätedateien, Automounter ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Anders als früher, als noch die Gerätedateien unter /dev (= "devices", allgemeines Verzeichnis für Gerätedateien) mittels ``mknod`` massenweise erzeugt und dann vorgehalten wurden, gibt es heute dafür den Userspace Device Manager 'udev', der die Devices bei Bedarf automatisch anlegt. Im Überblick der gemounteten "Laufwerke" findet sich neben dem Shared Memory Device "/dev/shm" der Mountpunkt für den Userspace Device Manager 'udev': :: root@d8:~# df -h Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/sda1 7,4G 6,0G 1,1G 86% / udev 10M 0 10M 0% /dev tmpfs 403M 5,9M 397M 2% /run tmpfs 1006M 164K 1006M 1% /dev/shm tmpfs 5,0M 4,0K 5,0M 1% /run/lock tmpfs 1006M 0 1006M 0% /sys/fs/cgroup tmpfs 202M 8,0K 202M 1% /run/user/1001 root@d8:~# Dazu aus einem Braindump: "The /dev/ directory is a filesystem of type tmpfs and is mounted by udev during system startup". Deshalb schauen wir uns auch nun diesen Mountpunkt von udev, nämlich /dev direkt an: :: root@d8:~# mount | grep udev udev on /dev type devtmpfs (rw,nosuid,relatime,size=1358552k,nr_inodes=339638,mode=755) root@d8:~# root@d8:~# df -h /dev Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf udev 10M 0 10M 0% /dev root@d8:~# Zuallererst denken wir dabei an Blockgerätedateien, hier ein kleiner Auszug: - IDE-Geräte (max. 4): /dev/hda, /dev/hdb, /dev/hdc, /dev/hdd - SCSI-Geräte: /dev/sda, /dev/sdb, ... - Partitionsnummern: 1 - 4 (max. 4 primäre Partitionen), die erste log. bekommt immer die 5 zugewiesen (/dev/sda5) - SCSI-CD/DVD/RW-Laufwerke: /dev/sr0, /dev/scd0 Nun wollen wir ein wenig mehr über diesen modernen, aktuellen Autokonfigurationsdienst, den *User Space Device Manager* erfahren: :: root@d8:~# apt-cache show udev ... Description-de: /dev/ und hotplug Hintergrundprozess udev ist ein Hintergrundprozess der Gerätedateien in /dev/ dynamisch erzeugt und entfernt, hotplug-Ereignisse verarbeitet und Treiber während des Systemstarts lädt. ... root@d8:~# ps aux | grep udev root 170 0.0 0.1 41592 3660 ? Ss 00:18 0:00 /lib/systemd/systemd-udevd root 19082 0.0 0.1 12752 2100 pts/0 S+ 12:36 0:00 grep udev root@d8:~# root@d8:~# ## Dies ist der Mountpunkt für das virtuelle Dateisystem, welches udev verwaltet: root@d8:~# df -h /dev Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf udev 10M 0 10M 0% /dev root@d8:~# root@d8:~# ## Hier können eigene Regeln abgelegt werden (*.rules-Dateien): root@d8:~# ls -l /etc/udev/rules.d/ insgesamt 4 -rw-r--r-- 1 root root 134 Jan 11 12:13 60-vboxadd.rules -rw-r--r-- 1 root root 0 Sep 17 15:40 70-persistent-cd.rules root@d8:~# root@d8:~# ps aux | grep udev root 170 0.0 0.1 41592 3660 ? Ss 00:18 0:00 /lib/systemd/systemd-udevd root 19437 0.0 0.1 12752 2284 pts/0 S+ 12:41 0:00 grep udev root@d8:~# root@d8:~# root@d8:~# ## Und dann spielt noch der Desktop Bus zur Information von Apps eine wichtige Rolle: root@d8:~# ps aux | grep dbus message+ 17498 0.0 0.1 42952 4016 ? Ss 11:18 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation max 18173 0.0 0.0 10700 340 ? Ss 11:18 0:00 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session x-session-manager max 18176 0.0 0.0 15960 1924 ? S 11:18 0:00 /usr/bin/dbus-launch --exit-with-session x-session-manager max 18177 0.0 0.1 42352 2596 ? Ss 11:18 0:00 /usr/bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session root 19439 0.0 0.1 12752 2096 pts/0 S+ 12:42 0:00 grep dbus root@d8:~# Am besten zeigen wie uns die Änderungen im Verzeichnis '/dev' zeitlich sortiert an, wobei für das Kommando ``ls`` praktischerweise die Optionen ``-t`` (time sorted), ``-l`` (long output), ``-r`` (reverse sorted) und ``-c`` (change inode time zeigen) verwendet werden. Danach wird die zeitlich sortierte Ausgabe einfach via Pipeline dem Kommando "tail -5" zugespielt, was nur die letzten 5 Zeilen anzeigt: :: root@d8:~# ls -ltrc /dev | tail -5 brw-rw---- 1 root disk 8, 16 Jan 13 12:40 sdb drwxr-xr-x 6 root root 120 Jan 13 12:40 disk drwxr-xr-x 2 root root 180 Jan 13 12:40 block prw-r----- 1 root adm 0 Jan 13 12:40 xconsole brw-rw---- 1 root disk 8, 17 Jan 13 12:40 sdb1 root@d8:~# root@d8:~# In Schichtenmodelldenkweise: a) udevd => erzeugt im Hintergrund eine Gerätedatei (/dev/sdb1) und eventuelle symbolische Verknüpfungen b) 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 - http://bestandserfassung.blogspot.de/2013/02/lpic-i-prufungsvorbereitung-teil-1.html - http://www.xenuser.org/lpic-1-cheat-sheet-module-101/ - http://www.lpi-academy.de/wiki/101-7/ - http://www.linux-praxis.de/lpic1/lpi101/1.101.7.html - http://www.pc-erfahrung.de/linux/lpi/lpi11051.html 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): 1. Power-Knopf drücken (ATX-Formfaktor, Stromsparfunktionen via Taster => Netzteil) 2. Start-OS "BIOS", Power On Self Test (POST) `http://www.grundlagen-computer.de/... `_ 3. Auf der Festplatte wird MBR gesucht (512 Bytes insgesamt, 440 Bytes Bootcode, 64 Bytes Partitionstabelle) - Siehe https://de.wikipedia.org/wiki/Master_Boot_Record - 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`` 4. Bootloader des OS starten (GRUB lädt sich selbst in den RAM: First Stage) 5. Bootloader lädt den Kernel mitsamt seines Initramfs in den RAM (GRUB: Second Stage) 6. Kernel startet den ersten Prozess mit der PID 1 (init / systemd) 7. Bereitstellen von Dateisystem und User-Login Wenn es um das Booten bei modernen EFI-Systemen geht, gestalten sich insbesondere die Schritte 2 bis 4 anders. Hier ein paar wichtige Kennzeichen: - Eine Firmware im UEFI-Chip tritt als First Stage Bootloader auf. - Eine DOS-Zwischenschicht liefert den Bootcode aus. - Die Festplatten- und Partitionsdaten werden in einer umfangreicheren Tabelle namens GPT (GUID Partition Table) abgelegt. - Der MBR beinhaltet keinen Bootcode und auch keine Partitionstabelle mehr. - Der darauf folgende Bootloader GRUB fungiert quasi nur noch als Boot Manager zur komfortablen Auswahl verschiedener Konfigurationen bzw. Betriebssysteme. Weitere Hinweise zum neuen UEFI-Bootverfahren: - Es wurde ein verbessertes BIOS nötig, um von Festplattenpartitionen größer als 2,2 TB booten zu können. Dank des GPT-Schemas können maximal 128 Partitionen verwaltet werden (historisches MBR-Schema: nur 4 primäre Partitionen). - Ein herkömmliches Backup vom MBR mittels 'dd' hat keinen Effekt mehr, weil er nur noch eine Schutzfunktion inne hat, dass die Festplatte alten BIOS-Rechnern nicht als unpartitioniert erscheint. - GRUB ist im Prinzip nur noch für das Verwaltung mehrerer OS und Kernel zuständig (-> Boot Manager, kein "Loader") - Der neue EFI Bootloader benötigt zum Laden weiterer Software eine separate FAT-Ablagefläche in ``/boot/efi``. Diese Partition nennt sich Efi System Partition (ESP). Siehe dazu https://www.computerweekly.com/de/definition/UEFI-Unified-Extensible-Firmware-Interface Startprotokollierung ^^^^^^^^^^^^^^^^^^^^ ⇒ läuft über zwei Ebenen: A. | Kernel-Ringbuffer: dmesg (Bei RedHat zusätzlich in der Datei /var/log/boot.log) | Siehe auch http://www.ibm.com/developerworks/linux/tutorials/l-lpic1111/ B. 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: a) Ordnerstruktur auf /mnt erzeugen: /mnt/boot/grub b) 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: - https://drive.google.com/file/d/0B7lYRXhb5JSeY3ZvODlaQUZ0WHM/view?usp=sharing - https://sourceforge.net/projects/systemrescuecd/files/latest/download?source=files - http://mirror.slitaz.org/iso/4.0/slitaz-4.0.iso 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: https://drive.google.com/file/d/0B7lYRXhb5JSeY3ZvODlaQUZ0WHM/view?usp=sharing :: 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:\Users\apemmann\usbboot.vmdk created successfully." 101.3 Change runlevels / boot targets and shutdown or reboot system ------------------------------------------------------------------- In diesem Kapitel werden die eben kennengelernten Aspekte über Init-Systeme vertieft und ergänzt. Systemstart nach System V (SysVinit) ------------------------------------ Grundlegendes ^^^^^^^^^^^^^ 1. Dienst hinter der PID 1 ist */sbin/init*, siehe ``pstree -pn | head`` 2. Hauptkonfigurationsdatei: */etc/inittab* - Standardrunlevel konfigurieren: ``id:3:initdefault:`` (Hier bitte niemals 0 (poweroff) oder 6 (reboot) eintragen!) - Affengriff konfigurieren: ``ca::ctrlaltdel:/sbin/shutdown -r +4`` 3. 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:~# 4. Runlevel-Links sind symbolische Links, die auf die eigentlichen Init-Skripte zeigen. Sie starten und stoppen die Daemons beim Systemstart und Shutdown sowie beim Runlevel-Wechsel. Die liegen in entsprechend nummerierten Verzeichnissen, beispielsweise für Level 3 in ``/etc/rc3.d/``. Die Links für den SSH-Daemon können so aussehen: - Im Level 3: ``/etc/rc3.d/S02ssh -> ../init.d/ssh`` - Im Level 5: ``/etc/rc5.d/S02ssh -> ../init.d/ssh`` - Zur Benennung der Runlevel-Links: * ``S`` bedeutet, dass dem Init-Skript "start" übergeben wird * ``K`` bedeutet, dass dem Init-Skript "stop" übergeben wird (kill-Signal) * Danach folgt eine zweistellige Zahl, welche die Reihenfolge der Abarbeitung festlegt. * Insgesamt wird alphanumerisch abgearbeitet: zuerst die mit ``K`` beginnenden Links, danach die mit ``S`` Runlevel ^^^^^^^^ - Runlevel sind bestimmte Systemzustände, in denen unterschiedlich viele Dienste gestartet werden, so wird z.B. im Level 5 zusätzlich zum Multiuser- und Netzwerk-Betrieb ein grafischer Login mittels "Display Manager" ermöglicht. - Im Vergleich: Abgesicherter Modus (Windows) ⇒ Runlevel 1 bzw. Single User Mode - Herausfinden, in welchem wir uns gerade befinden: ``runlevel``, wir sehen dabei - als erstes Zeichen oft ein "N", was bedeutet: "it was (n)o change before" - als zweites Zeichen eine Zahl, die den aktuellen Runlevel ausgibt - Wechseln: ``init [NR]`` bzw. ``telinit [NR]``, im Bsp.: ``telinit 1``, wieder ins GUI fahren: ``telinit 5`` - Kernelparameter für Single-User-Modus: ``1`` (gibt man der GRUB-Config mit) - Zum Beispiel (man achte auf die "1" am Ende der Zeile): :: kernel /boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda3 ro initrd=/install/initrd.gz 1 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"... a) Debian bekommt den Wechsel automatisch mit, Kontolle: ``ifconfig eth0`` b) Unter CentOS 6 müssen wir die Adresse abgeben und neu beziehen: - ``dhclient -r eth0`` - ``dhclient eth0`` Auf CentOS: - läuft der ssh-Server? ``ps -C sshd`` => JA. - wie lautet die Identität (digitalen Fingerabdruck ausgeben): ``$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub`` Auf Debian: :: root@d8:~# exit Abgemeldet tux@d8:~$ tux@d8:~$ ssh root@10.22.15.187 The authenticity of host '10.22.15.187 (10.22.15.187)' can't be established. RSA key fingerprint is 85:5f:56:9c:82:50:ff:60:a5:c3:07:ae:30:5c:fc:06. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.22.15.187' (RSA) to the list of known hosts. Connection closed by 10.22.15.187 tux@d8:~$ tux@d8:~$ cat .ssh/known_hosts |1|mwnHX7oJvaUYWkmW6csfD8954BA=|3+iU0XZbjo5C3Xas9vbjos6DODs= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxqek4eoZImQI/eLsgkOdt25/m9Bsj+wD0vQ4O2bAnPFClUmCe8pTZ1IVELq5Jy9RCncry2PQhsAAcrYhufd3682Zmit6dgkvL8vJFkjh2MMPzvQpC99qBqUAD9rISVv06eTqrup84s1TjxE5fecsnCjEsnqTzCkOcxt7qxeDlQbVlnVkBmz+FzumukOd5wN7I4pQMPEBYl7+nTH2vMCTyqT0dRdVxJnlPG62PdPFOCynC/MwYtdzTXTT5qd1bp7ypCaUjwUZykNAbZEt90lAWCWWkKFYVstI5YqmpJJLtGwEStf7diFeTMv6jE9HvORtPf5F1zoeWcOStoqEwrRqnw== tux@d8:~$ Jetzt sind wir auf CentOS einloggt: Tipp: Systemd-freie Distributionen siehe unter http://without-systemd.org/wiki/index.php/Main_Page - Puppy Linux - Slackware - Gentoo - Alpine Linux (BusyBox/OpenRC) Wir konfigurieren eth0, so dass die Schnittstellenkarte beim Bootvorgang automatisch aktiviert wird: :: vi /etc/sysconfig/network-scripts/ifcfg-eth0 # Für vim-Neulinge: # ESC ESC ESC # 5G # l (mehrfach, bis wir auf no stehen) # D (Delete upt up end of line) # a (In den Insert-Modus gehen, appending one character) # # Jetzt schreiben wir das "yes" hin: # Das einzige, was anzupassen ist: # ONBOOT=yes # ESC # # :wq Nun können wir eth0 über das Netzwerkskript steuern: :: $ /etc/init.d/network stop $ /etc/init.d/network start **Wiederholung Module** Den Schnittstellennamen "eth0" einem bestimmten Treiber via "/etc/modules.conf" zuordnen: :: alias eth0 ne2k-pci Siehe http://linux-sxs.org/networking/ne2k.html Ein Datenbank-basiertes Init-System, wir erforschen wichtige Bestandteile: :: root@d8:~# ## find /var -iname "*systemd*" root@d8:~# root@d8:~# ls -l /var/lib/systemd/ insgesamt 16 drwxr-xr-x 2 root root 4096 Jan 11 08:50 catalog drwxr-xr-x 2 root root 4096 Jan 11 09:01 coredump drwxr-xr-x 11 root root 4096 Jan 11 08:51 deb-systemd-helper-enabled -rw------- 1 root root 512 Jan 17 07:54 random-seed root@d8:~# root@d8:~# ls -l /var/lib/systemd/catalog/ insgesamt 40 -rw-r--r-- 1 root root 40665 Sep 17 15:21 database root@d8:~# root@d8:~# file /var/lib/systemd/catalog/database /var/lib/systemd/catalog/database: data root@d8:~# root@d8:~# root@d8:~# pgrep -a systemd 1 /sbin/init 153 /lib/systemd/systemd-udevd 155 /lib/systemd/systemd-journald 476 /lib/systemd/systemd-logind 1093 /lib/systemd/systemd --user root@d8:~# root@d8:~# root@d8:~# mount | grep udev udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=254308,mode=755) root@d8:~# root@d8:~# root@d8:~# pstree -pn | head systemd(1)-+-systemd-udevd(153) |-systemd-journal(155) |-rpcbind(438) |-rpc.statd(448) |-rpc.idmapd(462) |-sshd(465) |-ModemManager(467)-+-{gmain}(572) | `-{gdbus}(782) |-cron(468) |-NetworkManager(469)-+-{NetworkManager}(836) root@d8:~# root@d8:~# ps aux | grep systemd root 153 0.0 0.1 41596 3768 ? Ss Jan17 0:00 /lib/systemd/systemd-udevd root 155 0.0 0.1 29924 3780 ? Ss Jan17 0:00 /lib/systemd/systemd-journald root 476 0.0 0.1 28268 3016 ? Ss Jan17 0:00 /lib/systemd/systemd-logind message+ 483 0.0 0.2 43040 4240 ? Ss Jan17 0:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation tux 1093 0.0 0.1 35656 3904 ? Ss Jan17 0:00 /lib/systemd/systemd --user root 4580 0.0 0.0 12752 2040 pts/0 S+ 08:28 0:00 grep systemd root@d8:~# **Steuerung des Systemd** **Runlevel wechseln** (auf Debian): :: $ systemctl isolate runlevel1.target Wir lesen dann: "Give root passwort for maintenance..." :: $ runlevel $ who -r Default-Runlevel ändern: :: $ systemctl set-default multi-user.target $ systemctl set-default graphical.target Standard-Operationen für Dienste: :: $ ps -C sshd $ systemctl status ssh $ systemctl stop ssh $ systemctl disable ssh Topic 102: Linux Installation and Package Management ==================================================== 102.1 Design hard disk layout ----------------------------- **Installation II mit manueller Partitionierung (Debian mit Cinnamon-Oberfläche)** Als Voraussetzung bitte einfach das passende Netinstall-ISO von https://www.debian.org/CD/netinst/ herunterladen und als Bootmedium für einen jetzt neu anzulegenden VirtualBox-Gast verwenden: - Schalter "Neu" - Name: "Debian Cinnamon" (Bevorzugter Typ: "Linux 64-bit") - RAM: 1024 MB - Festplatte erzeugen (VDI, dynamisch alloziiert, Größe auf 50 GB erhöhen) - Schalter "Start" - Als Boot-Medium die eben heruntergelade Netinst-CD einlegen... Der erste Teil der Installation gestatltet sich wie üblich. Im zweiten Teil partitionieren wir manuell. Hier ein Vorschlag für ein Disk-Layout: 1. Partition: 1 GB swap (prim. => /dev/sda1, sw) 2. Partition: 10 GB /usr (log. => /dev/sda5, ext4) 3. Partition: 5 GB /var (log. => /dev/sda6, ext4) 4. Partition: 500 MB /tmp (log. => /dev/sda7, ext4) 5. Partition: 15 GB /home (log. => /dev/sda8, xfs) 6. Partition: 3 GB / (log. => /dev/sda9, ext4) Von den insgesamt 50 GB Festplattenplatz verbleiben uns schließlich für spätere Experimente noch 19 GB freier Speicher. Zur Problematik Festplattenlayout siehe auch https://www.debian.org/releases/slink/i386/ch-Partitionieren.de.html Im dritten Teil der Installation wählen wir im Menü "Softwareauswahl" (= Konsolenprogramm 'tasksel') den Eintrag "Debian desktop environment" mit der Leertaste ab und an Stelle dessen den Eintrag "Cinnamon" aus. Außerdem kann gern 'SSH server' mit ausgewählt werden. ZIEL: Linux-Server stabil betreiben, ohne dass die Festplatten voll laufen können. Wir haben bei der Installation bereits Vorsorge getroffen, die veränderlichen Daten liegen auf separaten Partitionen: :: $ df -h /home $ df -h /var $ df -h /tmp FRAGE 1 : Welche Probleme kann es mit */boot* geben? - Durch veraltete BIOS-Versionen konnte der Bootloader u.U. nicht über die Grenze von 1024-Zylinders zugreifen (ca. 8GB), wenn dabei - LILO als Bootmanager zum Einsatz kam. - Deshalb musste dann eine separate, kleine /boot-Partition am Anfang der Festplatte angelegt werden. FRAGE 2: Welche Verzeichnisse müssen auf der Wurzel-Partition verbleiben (Systemrelevant)? - /dev, /proc/, /sys, /etc, /bin, /sbin, /lib, … (Siehe auch Screenshot) Was sollte der Admin auslagern (Nutzer können dort schreiben!): - /tmp, /var, /home Logical Volume Manager ---------------------- Was ist das? Siehe - http://www.net-it.de/LVM/Basic/ - http://www.linux-magazin.de/Online-Artikel/Volumenkontrolle Aus einer LPI-Prüfung: What can the Logical Volume Manager (LVM) be used for? (Choose THREE correct answers.) A. To create RAID 9 arrays. B. To dynamically change the size of logical volumes. C. To encrypt logical volumes. D. To create snapshots. E. 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: a) Downloaden von geeigneten Linux-ISOs https://wiki.archlinux.org/index.php/Multiboot_USB_drive b) ISOs in das in der Stick-Wurzel befindliche Verzeichnis ISO kopieren c) Die Konfigurationsdatei des Bootloaders '\boot\grub\grub.cfg' anpassen (von der Stickwurzel ausgehend) d) 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 [] ... 102.3 Manage shared libraries ----------------------------- Welchen Sinn haben gemeinsam genutzte Bibliotheken? - Jedes Programm müsste sonst seine eigenen Libs mitbringen (oft die selben noch einmal). - Vorteil: Speicherplatzersparnis - Nachteil: Sicherheit - Hat eine Lib einen Fehler, dann haben ihn alle Apps auch :: root@d8:~# file /opt/bin/synbak /opt/bin/synbak: Bourne-Again shell script, UTF-8 Unicode text executable root@d8:~# apt-get install sash root@d8:~# file /bin/sash /bin/sash: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=15ee0faf016357ea99c1db841638de40ec641090, stripped root@d8:~# root@d8:~# file /bin/bash /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=a8ff57737fe60fba639d91d603253f4cdc6eb9f7, stripped root@d8:~# root@d8:~# file /usr/bin/passwd /usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=573580ce2ad86ffabbec30ef6b5bb4f8dd2f4910, stripped root@d8:~# root@d8:~# file /usr/bin/k3b /usr/bin/k3b: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=907bf0af022b0d76463ecffe52af1f4f50f67d01, stripped root@d8:~# root@d8:~# ls -lh /usr/bin/k3b -rwxr-xr-x 1 root root 2,0M Okt 26 2014 /usr/bin/k3b root@d8:~# root@d8:~# root@d8:~# root@d8:~# ldd /usr/bin/k3b linux-vdso.so.1 (0x00007ffe75d83000) libk3bdevice.so.6 => /usr/lib/libk3bdevice.so.6 (0x00007fb14b097000) libk3blib.so.6 => /usr/lib/libk3blib.so.6 (0x00007fb14ac96000) root@d8:~# ldd /usr/bin/cal linux-vdso.so.1 (0x00007ffe80f1e000) libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007f99f8bbb000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f99f8991000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f99f85e6000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f99f83e2000) /lib64/ld-linux-x86-64.so.2 (0x00007f99f8de0000) root@d8:~# root@d8:~# root@d8:~# file /etc/ld.so.c* /etc/ld.so.cache: data /etc/ld.so.conf: ASCII text /etc/ld.so.conf.d: directory root@d8:~# **Methode A)** Root ergänzt die Liste der Library-Pfade: ``vi /etc/ld.so.conf``, danach muss der Cache neu aufgebaut werden: :: root@d8:~# ldconfig root@d8:~# root@d8:~# ls -ltrcd /etc/ld.so.c* -rw-r--r-- 1 root root 34 Jan 11 08:47 /etc/ld.so.conf -rw-r--r-- 1 root root 122432 Jan 19 10:51 /etc/ld.so.cache root@d8:~# root@d8:~# ldconfig -p | wc -l 1327 root@d8:~# Methode B) Ein einfacher Nutzer (Praktikant) kann sich selber helfen: :: $ export LD_LIBRARY_PATH=/home/practise1/testlibs Zum Finden von Verzeichnissen und ausführbaren Programmen: :: root@d8:~# find /etc -maxdepth 1 -type d -name "*.d" | head -5 /etc/rc4.d /etc/libpaper.d /etc/rc2.d /etc/sysctl.d /etc/Muttrc.d root@d8:~# root@d8:~# root@d8:~# root@d8:~# find / -maxdepth 5 -type f -name "*d" -perm -700 | head /lib/udev/scsi_id /lib/udev/cdrom_id /lib/udev/v4l_id /lib/udev/ata_id /lib/systemd/systemd-journald /lib/systemd/systemd-shutdownd /lib/systemd/systemd-networkd /lib/systemd/systemd-udevd /lib/systemd/systemd-localed /lib/systemd/systemd-socket-proxyd root@d8:~# http://www.commandlinefu.com/commands/view/1489/display-calendar-with-specific-national-holidays-and-week-numbers http://www.deutschlandfunk.de/denken-wird-ueberschaetzt-warum-unser-gehirn-die-leere-liebt.676.de.html?dram:article_id=368111 102.4 Use Debian package management ----------------------------------- Debian als Mutter vieler Distributionen hat en sehr flexibles und stabiles Paketverwaltungssystem. Es gibt Backend- und Frontend-Tools. **Backends** NACHTEILE: Sie sind nicht netzwerkfähig, können keine Paketabhängigkeiten auflösen. - dpkg (einzelne Paket installieren / löschen) - dpkg-reconfigure (Konfigurationsassitent aufrufen) Ein einzelnes Paket namens 'dos2unix' installieren. Dazu laden wir am besten mit den Frontendtools das Paket lediglich herunterladen: :: $ apt-get update $ apt-get -d install dos2unix $ cd /var/cache/apt/archives $ ls -ltrc | tail -5 -rw-r--r-- 1 root root 199524 Jan 16 10:40 libparted-fs-resize0_3.2-7_amd64.deb -rw-r--r-- 1 root root 1927462 Jan 16 10:40 gparted_0.19.0-2_amd64.deb -rw-r--r-- 1 root root 356124 Jan 19 10:38 sash_3.8-3+b1_amd64.deb drwxr-xr-x 2 root root 4096 Jan 20 08:19 partial -rw-r--r-- 1 root root 77768 Jan 20 08:19 dos2unix_6.0.4-1_amd64.deb $ Nun können wir das Paket installieren: :: $ dpkg -i dos2unix_6.0.4-1_amd64.deb $ dpkg -s dos2unix Package: dos2unix Status: install ok installed Priority: extra Section: text Installed-Size: 307 Maintainer: Jari Aalto 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 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 `` 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:\ProgramData\BlueStacks\UserData\SharedFolder") 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 '. 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 tux@d8:~$ tux@d8:~$ manpath /usr/local/man:/usr/local/share/man:/usr/share/man tux@d8:~$ tux@d8:~$ set | grep MANPATH tux@d8:~$ tux@d8:~$ env | grep MANPATH 103.2 Process text streams using filters ---------------------------------------- Zur Motivation: "Kein Programmierballast - höhere Stabilität!" => KISS-Prinzip :: root@d8:~# df -h Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/sda1 7,4G 5,3G 1,8G 76% / udev 10M 0 10M 0% /dev tmpfs 403M 5,8M 397M 2% /run tmpfs 1006M 264K 1005M 1% /dev/shm tmpfs 5,0M 4,0K 5,0M 1% /run/lock tmpfs 1006M 0 1006M 0% /sys/fs/cgroup shared 466G 447G 19G 96% /media/sf_shared tmpfs 202M 8,0K 202M 1% /run/user/1000 root@d8:~# root@d8:~# root@d8:~# du -sh /usr/* | sort -h | tail 124K /usr/local 1,7M /usr/games 20M /usr/include 27M /usr/sbin 49M /usr/src 138M /usr/bin 1,5G /usr/share 1,9G /usr/lib root@d8:~# root@d8:~# du -sh /usr/lib/* | sort -h | tail 17M /usr/lib/vlc 38M /usr/lib/python3 79M /usr/lib/jvm 93M /usr/lib/gcc 96M /usr/lib/firefox-esr 97M /usr/lib/kde4 107M /usr/lib/python2.7 224M /usr/lib/i386-linux-gnu 256M /usr/lib/libreoffice 647M /usr/lib/x86_64-linux-gnu root@d8:~# In dem Zusammenhang ein Softwaretipp: :: D8> apt-get install ncdu D8> D8> whoami tux D8> D8> pwd /home/tux D8> D8> D8> D8> vi obst.txt D8> D8> cat obst.txt 1 Birnen 2 Äpfel 3 Bananen 4 Erdbeeren D8> D8> cat obst.txt -A 1^I^IBirnen$ 2^I^IM-CM-^Dpfel$ 3^I^IBananen$ 4^I^IErdbeeren$ D8> D8> D8> tac obst.txt 4 Erdbeeren 3 Bananen 2 Äpfel 1 Birnen D8> D8> head -2 obst.txt 1 Birnen 2 Äpfel D8> D8> D8> head -2 ~/obst.txt /etc/hosts ==> /home/tux/obst.txt <== 1 Birnen 2 Äpfel ==> /etc/hosts <== 127.0.0.1 localhost 127.0.1.1 d8.localdomain d8 D8> ACHTUNG: tail benötigt die Option '-n', um mehrere DAteien zu verarbeiten: :: D8> tail -2 ~/obst.txt /etc/hosts tail: Option in ungültigen Kontext benutzt – 2 D8> D8> tail -n2 ~/obst.txt /etc/hosts ==> /home/tux/obst.txt <== 3 Bananen 4 Erdbeeren ==> /etc/hosts <== ff02::1 ip6-allnodes ff02::2 ip6-allrouters D8> Im Terminal 1 schreiben wir Daten in eine Datei: :: D8> echo 123 > /tmp/mylog Im Terminal 2 beobachten wir nur: :: D8> tail -f /tmp/mylog tail: „/tmp/mylog“ kann nicht zum Lesen geöffnet werden: tail: Keine Dateien mehr übrig D8> D8> D8> tail -f /tmp/mylog 123 12345 1234567 123456789 Schluss... ^C D8> Im Terminal 1 schreiben wir Daten anhängend weiter in die Datei: :: tux@d8:~$ echo 123 > /tmp/mylog tux@d8:~$ tux@d8:~$ echo 12345 >> /tmp/mylog tux@d8:~$ tux@d8:~$ echo 1234567 >> /tmp/mylog tux@d8:~$ tux@d8:~$ echo 123456789 >> /tmp/mylog tux@d8:~$ D8> expand obst.txt | cat -A 1 Birnen$ 2 M-CM-^Dpfel$ 3 Bananen$ 4 Erdbeeren$ D8> D8> D8> expand obst.txt | wc 4 8 96 D8> D8> expand obst.txt > obst-expanded.txt D8> D8> wc obst-expanded.txt 4 8 96 obst-expanded.txt D8> D8> unexpand obst-expanded.txt | wc 4 8 96 D8> D8> D8> man unexpand D8> D8> D8> unexpand -a obst-expanded.txt | wc 4 8 44 D8> D8> D8> fmt -w 10 obst.txt 1 Birnen 2 Äpfel 3 Bananen 4 Erdbeeren D8> D8> D8> D8> fmt -w 3 obst.txt 1 Birnen 2 Äpfel 3 Bananen 4 Erdbeeren D8> D8> D8> nl obst.txt 1 1 Birnen 2 2 Äpfel 3 3 Bananen 4 4 Erdbeeren D8> D8> D8> cat obst.txt 1 Birnen 2 Äpfel 3 Bananen 4 Erdbeeren D8> D8> cat -n obst.txt 1 1 Birnen 2 2 Äpfel 3 3 Bananen 4 4 Erdbeeren D8> D8> Eine Druckvorstufe mit 'pr' (print), das eigentliche Drucken geschieht mit 'lpr' oder 'lp': :: D8> cat /etc/hosts | pr -o 7 -h "Für meinen lieben Boss" | head 2017-01-25 14:32 Für meinen lieben Boss Seite 1 127.0.0.1 localhost 127.0.1.1 d8.localdomain d8 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback D8> Hexadezimal- und oktale Ausgabe jeweils mit 'hexdump' und 'od': :: D8> hexdump obst.txt 0000000 0931 4209 7269 656e 0a6e 0932 c309 7084 0000010 6566 0a6c 0933 4209 6e61 6e61 6e65 340a 0000020 0909 7245 6264 6565 6572 0a6e 000002c D8> D8> hexdump -o obst.txt 0000000 004461 041011 071151 062556 005156 004462 141411 070204 0000010 062546 005154 004463 041011 067141 067141 067145 032012 0000020 004411 071105 061144 062545 062562 005156 000002c D8> D8> od -x obst.txt 0000000 0931 4209 7269 656e 0a6e 0932 c309 7084 0000020 6566 0a6c 0933 4209 6e61 6e61 6e65 340a 0000040 0909 7245 6264 6565 6572 0a6e 0000054 D8> D8> od obst.txt 0000000 004461 041011 071151 062556 005156 004462 141411 070204 0000020 062546 005154 004463 041011 067141 067141 067145 032012 0000040 004411 071105 061144 062545 062562 005156 0000054 D8> Den MBR ausgeben (32 Zeilen zu a' 16 Byte), davon aber nur die letzten 5 Zeilen herausfiltern, was dann nun die Partitionstabelle beinhaltet (5 Zeilen zu a' 16 Byte): :: D8> hexdump /dev/sda | head -32 | tail -5 00001b0 10cd c361 0000 c3f4 120e 6436 c9cf 2080 00001c0 0021 1a83 1f3b 0800 0000 9800 0007 3b00 00001d0 1f1d fe8e ffff a800 0007 5000 0638 0000 00001e0 0000 0000 0000 0000 0000 0000 0000 0000 00001f0 0000 0000 0000 0000 0000 0000 0000 aa55 D8> D8> cat sorttest Zum Glück aber hier 1 Birnen sind 2 Äpfel 3 Bananen wir in 4 Erdbeeren der IT-Welt 999 01815 gut aufgehoben. 4711 Zzzz Abc 6000000 ---- ### :: D8> D8> sort sorttest ---- :: ### 01815 1 Birnen 2 Äpfel 3 Bananen 4711 4 Erdbeeren 6000000 999 Abc aber hier der IT-Welt gut aufgehoben. sind wir in Zum Glück Zzzz D8> D8> D8> sort -n sorttest ---- :: ### Abc aber hier der IT-Welt gut aufgehoben. sind wir in Zum Glück Zzzz 1 Birnen 2 Äpfel 3 Bananen 4 Erdbeeren 999 01815 4711 6000000 D8> ACHTUNG: Soll das Ergebnis in die selbe Datei zurückgeschrieben werden, muss die Option '-o' verwendet werden und nicht '>', ansonsten würde die Datei zuerst einmall geleert! :: D8> sort -nr sorttest -o sorttest D8> D8> head sorttest 6000000 4711 01815 999 4 Erdbeeren 3 Bananen 2 Äpfel 1 Birnen Zzzz Zum Glück D8> D8> echo Abc > doppelteZeilen.txt D8> echo 007 >> doppelteZeilen.txt D8> echo 007 >> doppelteZeilen.txt D8> echo Xyz >> doppelteZeilen.txt D8> D8> cat doppelteZeilen.txt Abc 007 007 Xyz D8> D8> uniq doppelteZeilen.txt Abc 007 Xyz D8> D8> ### LPI-relevant: Das Kommando 'sort' kann auch gleich 'uniq' ausführen: D8> sort -u doppelteZeilen.txt 007 Abc Xyz D8> D8> mkdir splittest D8> D8> cd splittest/ D8> D8> ls -la insgesamt 8 drwxr-xr-x 2 tux tux 4096 Jan 25 15:07 . drwxr-xr-x 23 tux tux 4096 Jan 25 15:07 .. D8> D8> ls -l /etc/services -rw-r--r-- 1 root root 19605 Okt 21 2014 /etc/services D8> D8> grep -i 80/tcp /etc/services http 80/tcp www # WorldWideWeb HTTP socks 1080/tcp # socks proxy server http-alt 8080/tcp webcache # WWW caching service amanda 10080/tcp # amanda backup services canna 5680/tcp # cannaserver D8> D8> wc -l /etc/services 612 /etc/services D8> D8> cp /etc/services . D8> cat services >> services.txt D8> cat services >> services.txt D8> cat services >> services.txt D8> cat services >> services.txt D8> D8> wc -l services.txt 2448 services.txt D8> D8> split services.txt D8> D8> ls -l insgesamt 180 -rw-r--r-- 1 tux tux 19605 Jan 25 15:09 services -rw-r--r-- 1 tux tux 78420 Jan 25 15:10 services.txt -rw-r--r-- 1 tux tux 31460 Jan 25 15:10 xaa -rw-r--r-- 1 tux tux 32557 Jan 25 15:10 xab -rw-r--r-- 1 tux tux 14403 Jan 25 15:10 xac D8> D8> wc -l x* 1000 xaa 1000 xab 448 xac 2448 insgesamt D8> D8> D8> dd if=/dev/zero of=myCD.iso bs=1M count=50 50+0 Datensätze ein 50+0 Datensätze aus 52428800 Bytes (52 MB) kopiert, 0,0335793 s, 1,6 GB/s D8> D8> split -b 1400K myCD.iso myFloppy_ D8> D8> ls -1 myFloppy_* | wc -l 37 D8> D8> cat myFloppy_* > myCD-merged.iso D8> D8> sha512sum myCD* 50173936f83822c28812ea23f7f843a27e8b85f65626cbc339cea0e63aa770809f932343af9e6a0cd26bfa490d6d1928f19cf529ebd1e76ef74264fda961f810 myCD.iso 50173936f83822c28812ea23f7f843a27e8b85f65626cbc339cea0e63aa770809f932343af9e6a0cd26bfa490d6d1928f19cf529ebd1e76ef74264fda961f810 myCD-merged.iso D8> https://www.heise.de/ct/ausgabe/2017-2-Fundstuecke-im-Web-Cyberwar-Gehaelter-Internet-Radio-3583695.html **Weiter zu den Textfiltern** :: D8> cut -d: -f1,6 /etc/passwd | pr -o 7 -h "Benutzer mit ihren Heimatverzeichnissen" | head 2017-01-26 08:20 Benutzer mit ihren Heimatverzeichnissen Seite 1 root:/root daemon:/usr/sbin bin:/bin sys:/dev sync:/bin D8> D8> grep tux /etc/group | cut -d: -f1,4 | pr -o 7 -h "Gruppen + sek. Mitglieder" | sort -u 2017-01-26 08:32 Gruppen + sek. Mitglieder Seite 1 audio:pulse,tux bluetooth:tux cdrom:tux dip:tux floppy:tux lpadmin:tux netdev:tux plugdev:tux scanner:saned,tux tux: video:tux D8> D8> groups tux cdrom floppy audio dip video plugdev netdev lpadmin scanner bluetooth D8> Die Kommandos 'paste' und 'join': :: D8> echo hellgrün >> farben D8> echo rot >> farben D8> echo gelb >> farben D8> echo dunkelgrün >> farben D8> D8> D8> paste obst.txt farben 1 Birnen hellgrün 2 Äpfel rot 3 Bananen gelb 4 Erdbeeren dunkelgrün D8> D8> D8> nl farben > farben.txt D8> D8> D8> paste obst.txt farben.txt 1 Birnen 1 hellgrün 2 Äpfel 2 rot 3 Bananen 3 gelb 4 Erdbeeren 4 dunkelgrün D8> Ähnlich wie bei relationalen Datenbanken kann 'join' die Spalten anhand eines Schlüsselfeldes zusammenführen: :: D8> join -j 1 obst.txt farben.txt 1 Birnen hellgrün 2 Äpfel rot 3 Bananen gelb 4 Erdbeeren dunkelgrün D8> Eine Liste von Feldern kann man z.B. so abfragen: ``cut -d: -f1-3 /etc/passwd`` Wird die Option '-d' (Delimiter) nicht angegeben, wird per Default ein Tabulatorschritt verwendet. Außerdem kann die Option '-c' Zeichenweise ausschneiden (Characters): :: D8> df -h / Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/sda1 7,4G 5,4G 1,6G 78% / D8> D8> D8> df -h / | tail -1 /dev/sda1 7,4G 5,4G 1,6G 78% / D8> D8> df -h / | tail -1 | cut -c 38-39 78 D8> D8> join -j 1 obst.txt farben.txt | tr 'a-z' 'A-Z' 1 BIRNEN HELLGRüN 2 ÄPFEL ROT 3 BANANEN GELB 4 ERDBEEREN DUNKELGRüN D8> D8> D8> D8> join -j 1 obst.txt farben.txt | tr '[:lower:]' '[:upper:]' 1 BIRNEN HELLGRüN 2 ÄPFEL ROT 3 BANANEN GELB 4 ERDBEEREN DUNKELGRüN D8> Translate mit 'tr' (eine vereinfachte Form von 'sed'): :: D8> tr -d '\r' < testdatei.txt | cat -A Ein Zeile endet in der DOS-Welt mit LF + CR.$ (Das erzeugt man im vi mit STRG + v und STRG + m)$ In Unix-Files gibt es aber nur ein LF.$ D8> D8> tr -d '\r' < testdatei.txt > testdatei2.txt D8> D8> file testdatei* testdatei2.txt: ASCII text testdatei.txt: ASCII text, with CRLF line terminators D8> ACHTUNG 'tr' kann NICHT direkt mit Dateinamen als Übergabeparameter arbeiten: :: D8> tr -d \r testdatei.txt tr: zusätzlicher Operand „testdatei.txt“ Beim Löschen ohne Verdichten darf nur eine Zeichenkette angegeben werden. „tr --help“ liefert weitere Informationen. D8> AUFGABE: Bitte erkunden, was die Option '-s' bedeutet: :: D8> man tr | grep squeeze Translate, squeeze, and/or delete characters from standard input, writing to standard output. -s, --squeeze-repeats D8> Siehe dazu: http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2005/02/tr-dos2unix/(article_body_offset)/2 Aber dieser Satz stimmt nicht ganz: Das Löschen macht man mit '-d', hier haben wir eine Schrumpfung: "So löscht das Kommando tr -s ' ' < test.txt alle Spaces aus einer Datei heraus." Siehe dazu: :: D8> cat squeeze-repeat.txt Zeile mit vielen Spaces . Zeile2 mit vielen Spaces . Zeile 3 Zeile 4 mit immer nur einem Leerzeichen dazwischen. D8> D8> ### Löscht alle Spaces (delete): D8> D8> cat squeeze-repeat.txt | tr -d ' ' ZeilemitvielenSpaces. Zeile2mitvielenSpaces. Zeile3 Zeile4mitimmernureinemLeerzeichendazwischen. D8> D8> D8> ### Schrupft mehrmaliges Vorkommen von Spaces, eins aber bleibt immer erhalten: D8> D8> cat squeeze-repeat.txt | tr -s ' ' Zeile mit vielen Spaces . Zeile2 mit vielen Spaces . Zeile 3 Zeile 4 mit immer nur einem Leerzeichen dazwischen. D8> Jetzt die Ersetzung: Einen Unterstrich anstelle der Spaces verwenden: :: D8> cat squeeze-repeat.txt | tr -s ' ' '_' Zeile_mit_vielen_Spaces_. Zeile2_mit_vielen_Spaces_. Zeile_3 Zeile_4_mit_immer_nur_einem_Leerzeichen_dazwischen. D8> **Der streaming Editor** Geben sei eine Datei: :: D8> cat squeeze-repeat.txt Zeile mit vielen Spaces . Zeile2 mit vielen Spaces . Zeile 3 Zeile 4 mit immer nur einem Leerzeichen dazwischen. Spaces, Spaces, Spaces.... !!! D8> Mit dem Befehl '/d' können Zeien gelöscht werden: :: D8> sed '/Zeile2 /d' squeeze-repeat.txt Zeile mit vielen Spaces . Zeile 3 Zeile 4 mit immer nur einem Leerzeichen dazwischen. Spaces, Spaces, Spaces.... !!! D8> Suchen und ersetzen (substitute) ACHTUNG: Ohne "global auf der Zeile" zu agieren ('g') wird nur das erste Auftreten ersetzt: :: D8> sed 's/Spaces/Leerzeichen/' squeeze-repeat.txt Zeile mit vielen Leerzeichen . Zeile2 mit vielen Leerzeichen . Zeile 3 Zeile 4 mit immer nur einem Leerzeichen dazwischen. Leerzeichen, Spaces, Spaces.... !!! D8> Mit dem 'g' ist alles OK: :: D8> sed 's/Spaces/Leerzeichen/g' squeeze-repeat.txt Zeile mit vielen Leerzeichen . Zeile2 mit vielen Leerzeichen . Zeile 3 Zeile 4 mit immer nur einem Leerzeichen dazwischen. Leerzeichen, Leerzeichen, Leerzeichen.... !!! Sed kann auch Dateien direkt ändern: :: D8> man sed | grep in-place -i[SUFFIX], --in-place[=SUFFIX] D8> D8> D8> sed -i 's/Spaces/Leerzeichen/g' squeeze-repeat.txt D8> D8> tail -1 squeeze-repeat.txt Leerzeichen, Leerzeichen, Leerzeichen.... !!! D8> 103.3 Perform basic file management ----------------------------------- :: D8> mkdir ZumAussortieren D8> mv splittest/ ZumAussortieren/ D8> D8> touch Bilder-TOC.txt D8> D8> ls -l insgesamt 35324 drwxr-xr-x 2 tux tux 4096 Jan 11 09:02 Bilder -rw-r--r-- 1 tux tux 0 Jan 26 10:49 Bilder-TOC.txt -rw-r--r-- 1 tux tux 4 Jan 25 14:29 datei ... ACHTUNG: Anders als 'mv' benötigt 'cp' die Option '-R' (aber auch: '-r' und '-a') für "rekursiv": :: D8> cp Bilder* ZumAussortieren/ /bin/cp: Verzeichnis „Bilder“ wurde ausgelassen D8> D8> alias cp alias cp='/bin/cp -i' D8> D8> cp -r Bilder* ZumAussortieren/ /bin/cp: „ZumAussortieren/Bilder-TOC.txt“ überschreiben? D8> D8> ls -l ZumAussortieren/ insgesamt 24 drwxr-xr-x 2 tux tux 4096 Jan 26 10:51 Bilder -rw-r--r-- 1 tux tux 0 Jan 26 10:49 Bilder-TOC.txt drwxr-xr-x 2 tux tux 20480 Jan 25 15:25 splittest D8> Warum muss 'mv' immer rekursiv arbeiten können und besitzt und daher keine Option für rekursives Arbeiten ('-R')? Siehe das Verschieben von gesamten Strukturen; es muss die Pfade an neuer Stelle im Dateibaum befestigen können. :: D8> mkdir -p Container/Kiste/Schachtel/Box D8> D8> mv Container /tmp D8> D8> pwd /home/tux D8> D8> ls -lR /tmp/Cont* /tmp/Container: insgesamt 4 drwxr-xr-x 3 tux tux 4096 Jan 26 10:55 Kiste /tmp/Container/Kiste: insgesamt 4 drwxr-xr-x 3 tux tux 4096 Jan 26 10:55 Schachtel /tmp/Container/Kiste/Schachtel: insgesamt 4 drwxr-xr-x 2 tux tux 4096 Jan 26 10:55 Box /tmp/Container/Kiste/Schachtel/Box: insgesamt 0 D8> **tar/gzip automatisieren** :: root@d8:~# crontab -e no crontab for root - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny Choose 1-3 [1]: 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: - http://pemmann.de/cc/Handouts/lpi-101.html#_topic_103_4_use_streams_pipes_and_redirects - https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Stdstreams-notitle.svg/2000px-Stdstreams-notitle.svg.png **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: 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 ) id 1cX56V-0002Gp-3B for tux@localhost; Fri, 27 Jan 2017 12:54:07 +0100 To: tux@localhost Subject: Logdatei mit Problem Message-Id: From: root 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' << 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> 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: a) Hoher Nice-Wert -> geringe Priorität b) 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] [-p|--pid] … renice [-n] -g|--pgrp … renice [-n] -u|--user … Optionen: -g, --pgrp Argument als Prozessgruppen-ID interpretieren -n, --priority Nice-Hochzählungswert angeben -p, --pid Argument als Prozess-ID interpretieren (Vorgabe) -u, --user 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 '\ 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 - https://downloads.raspberrypi.org/raspbian_latest 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. a) Netzwerkkarte anstecken b) 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** a) Der Fernsteuernde = Debian Desktop (Paket: 'xtightvncviewer'): ``vncviewer -listen`` b) 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: A) Command (= Default), Navigieren, Kopieren (ganze Zeile: yy) B) Insert (schreiben..., mit ESC kommt man zurück in den Commando-Modus) C) 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: a) ESC :w b) :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 a) Low-Level (Phys. Formatierung, z.B. Floppy-Diskette): ``fdformat /dev/fd0`` b) Partitionierung, Werkzeuge: fdisk, cfdisk, parted, gparted c) 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?** a) mkfs, mke2fs = Frontends (= Hebel, was andere Tools aufruft) b) 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