= Vorbereitung auf LPI 101 :homepage: http://pemmann.de/doc/lpi101/ :Date: 03.05.2016 :numbered: :toc: :imagesdir: img :ascii-ids: // Schreiben in asciidoc-Markup.... == Linux installieren **Voraussetzung:** Downloaden einer ISO-Datei, die im besten Falle für beides herhalten kann: für ein schnelles Arbeiten und Ausprobieren, ohne dass man die Festplatte berühren muss (Live-System) sowie für eine feste Installation. Solche Images findet man (was Debian betrifft) unter: http://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/ Die Auswahl an ISO-Images ist hier groß, empfehlenswert ist zuerst einmal ein System mit dem schlanken und reich mit Zubehörprogrammen ausgestatten Desktop LXDE. Debian liegt aktuell (Stand: 28. Juli 2016) in Version 8.5 vor, die entsprechende Datei ist 959M groß. http://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-8.5.0-amd64-lxde-desktop.iso[Bitte hier herunterladen...] In der bereits installierten Virtualsierungsumgebung 'VirtualBox' erstellen wir uns nun einen neuen Gast: * Schalter "Neu" * Name: Debian 8 LXDE (Linux 64-bit) * RAM: 1800 MB * Festplatte erzeugen (VDI, dynamisch alloziiert, Größe 50 GB) * Schalter "Start" * Als Boot-Medium die CD 'debian-live-8.5.0-amd64-lxde-desktop.iso' einlegen * Mit Cursor nach unten => "Install" * Sprache wählen: "German", 3x Enter * Host- und Domainnamen vergeben * Benutzer einrichten (root, tux) * Zeitzone: "Berlin" * Partitionierung: Geführt - vollständige Platte => sda => Separate /home, /var- und /tmp-Partitionen * Partitionierung beenden => Änderungen schreiben? => JA * [Was bei der XFCE-Iso-Installation fehlt: Auswahlmenü "tasksel"] (Taskselektor) ein altes Tool: "dselect" * Kopieren des Systems... * Netzwerkspiegel (Repository) verwenden? JA, welchen Mirror? => Deutschland / ftp-stud.hs-esslingen.de * Proxy? * Bootloader installieren: GRUB in den MBR der Festplatte "sda" installieren + (Dies ist das Gerät '/dev/sda', was das Hauptgerät darstellt; hier keine Partitionsnummer angeben.) * Neustart (CD muss nicht manuell entfernt werden) Siehe auch das mit vielen Screenshots versehene Tutorial unter https://www.howtoforge.com/tutorial/debian-8-jessie-minimal-server/2/ === Software aktualisieren, Gasterweiterungen installieren Sinnvollerweise installiert man sich in den virtuellen Gästen passende Erweiterungen und Treiber, die den Austausch von Daten zwischen Host und Guest ermöglichen und die Handhabung erleichtern. * System als root (im Terminal: `su -`) aktualisieren: `apt-get update && apt-get -y upgrade` * Hilfspakete installieren und Module bauen: - Tools installieren: `apt-get install build-essential module-assistant` - Module bauen: `m-a prepare` * Gasterweiterungen im laufenden Virtualbox-Gastfenster installieren: - Evl. eine eingelegte, andere CD auswerfen: Unter 'Geräte' / 'Optische Laufwerke' / 'Medium entfernen' (evl. "Auswurf erzwingen") - Unter 'Geräte' den Eintrag 'Medium mit Gasterweiterungen einlegen...' auswählen - CD mounten: `mount /dev/sr0 /mnt` - Erweiterungen installieren: `bash /mnt/VBoxLinuxAdditions.run` - X-Server (gewaltsam) neu starten: `killall Xorg` * Gast-Maschine evl. exportieren, um sie später auf anderem Rechner laufen lassen zu können: - Gast herunterfahren als root mit `shutdown -h now` - Im VirtualBox-Hauptfenster den Export-Assistenten ausführen: 'DATEI / APPLIANCE EXPORTIEREN ...' **Kontrolle und Nutzung** A. Austausch von markierten Texten mit der Maus (Voraussetzung: unter 'Geräte' wählen wir 'Gemeinsame Zwischenablage' / 'bidirektional') B. Vollbildmodus: rechte STRG-Taste + F + (Diese Tastenkombination noch einmal drücken, um diesen Modus wieder zu verlassen) == Login und kleiner Rundgang Es steht für den Login ein grafischer Displaymanager zur Verfügung: Bitte als tux einloggen Im Hauptmenü unter "Systemwerkzeuge": * Arbeitsmittel: LXTerminal * Zum Vergleichen gern den Dateimanager "pcmanfm" öffnen Im Terminal: => df -h # disk free, human readeable Vergleich mit Windows: * Nutzerdaten: c:\Users => /home * Installierte Programme: c:\Program Files => /usr (Unix System Ressources) * Bestriebssystem: c:\WINDOWS => Rest von / Es gibt keine LW-Buchstaben, die sich verschieben können, einen systemweit einheitlichen Namensraum unter der Wurzel "/"! Zur Kontrolle der Partitionierung: * mount # (cat /proc/self/mounts), gern filtern: mount | grep ^/dev * df -h # disk free * lsblk # list block devices, USB-Hostpluggeräte herausfinden * fdisk -l # Nur als root möglich * blkid # Auflisten der Devices unter Angabe der UUIDs == Grundlegende Konzepte === Benutzerschnittstellen a) GUIs (Graphical User Interface) * X-Window-System (Fenstermanager + X-Server, X-Clients) * Desktops (LXDE, XFCE, GNOME, KDE), Kennzeichen: Integriert sind Zubehörprogramme, einheitliches Look & Feel b) Cmdline * Vorteile: Geringer Ressourcesbedarf, bessere Stabilität, weil kein Programmierballast für Kommandozeilenbackends * Syntax: KOMMANDO [OPTIONEN] [PATAMETER] BSP: ncal -w 2016 Wer kümmert sich um die Interpretation der Kommandozeile? + ---- tux@deb8:~$ echo $0 /bin/bash ---- ACHTUNG: Leerzeichen sind Trenner der einzelnen Bestandteile, daher müssen sie evl. maskiert werden: => mkdir Eigene\ Dateien Wichtige Mechanismen: * Dateinamensexpansion (Platzhalter, Wildcard, Joker): rmdir -v Eigen* touch abc.{1,2,3} # Nur zum Erzeugen von Testdateien rm -v abc.? touch abc.{1,2,3}{x,y,z} # Nur zum Erzeugen von Testdateien rm -v abc.[0-9]* # EIN beliebiges Zeichen aus der Menge 0 bis 9 (Negation: "[!1-5]") * Variablenexpansion (Variableninhalte einfügen) echo $PATH # Suchpfad für Anwendungen echo $USER echo $PWD # Print Working Directory * Kommandozeilensubstitution (Zuerst eine andere Befehlsfolge ausführen, dann der Rest ringsherum); es gibt zwei Varianten, die gleichberechtigt sind: ls -l /lib/modules/`uname -r` ls -l /lib/modules/$(uname -r) == Topic 101.1 - Determine and configure hardware settings Im Buch: S. 21 ff **Ziel: Kernelmodule zur Laufzeit des Rechners laden und kontrollieren können** Der Kernel befindet sich unter: /boot/vmlinuz- Zur des Laufzeit des Rechners werden Module geladen, aus dem Verzeichnis /lib/modules/`uname -r` * Ausgabe des Kernel-Releases: `uname -r` * Ausgabe des Hardware Typs (32 oder 64 bit): `uname -m` * Wie setzt sich die Release-Nummer zusammen? + "MAJOR.MINOR.PATCH", z.B. 3.16.0 + (Weitere Nummern und Kürzel je nach Distribution - die Bezeichnung lässt sich im Makefile mittels "EXTRAVERSION = " festlegen) * Stabile Kernel: gerade-MINOR-Nummer, Entwickerkernel: ungerade MINOR-Nummer * Ab Kernel 3.0.0 ist dieses Unterscheidung aufgegeben worden BEISPIEL: Suche nach einem Novell-kompatiblen Netzwerkkartentreiber: ---- find /lib/modules -name "*ne2k-pci*" /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko ---- Informationen darüber einholen: ---- root@deb8:~# modinfo ne2k-pci filename: /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko license: GPL description: PCI NE2000 clone driver author: Donald Becker / Paul Gortmaker alias: pci:v00008C4Ad00001980sv*sd*bc*sc*i* alias: pci:v000012C3d00005598sv*sd*bc*sc*i* alias: pci:v000012C3d00000058sv*sd*bc*sc*i* alias: pci:v00001050d00005A5Asv*sd*bc*sc*i* alias: pci:v000010BDd00000E34sv*sd*bc*sc*i* alias: pci:v00001106d00000926sv*sd*bc*sc*i* alias: pci:v00004A14d00005000sv*sd*bc*sc*i* alias: pci:v00008E2Ed00003000sv*sd*bc*sc*i* alias: pci:v000011F6d00001401sv*sd*bc*sc*i* alias: pci:v00001050d00000940sv*sd*bc*sc*i* alias: pci:v000010ECd00008029sv*sd*bc*sc*i* depends: 8390 intree: Y vermagic: 3.16.0-4-amd64 SMP mod_unload modversions parm: msg_enable:Debug message level (see linux/netdevice.h for bitmap) (uint) parm: options:Bit 5: full duplex (array of int) parm: full_duplex:full duplex setting(s) (1) (array of int) ---- Welche Optionen können die Ausgabe einschränken? -a, -d, -l, -p, -n Zum Beispiel nur den Autor eines Modules ausgeben: Option "-a", z.B.: ---- root@deb8:~# modinfo -a ne2k-pci Donald Becker / Paul Gortmaker ---- Zum Testen: ---- root@deb8:~# lsmod | grep ne2k root@deb8:~# root@deb8:~# root@deb8:~# insmod ne2k-pci insmod: ERROR: could not load module ne2k-pci: No such file or directory root@deb8:~# root@deb8:~# find /lib/modules -name "ne2k*" /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko root@deb8:~# root@deb8:~# insmod /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko insmod: ERROR: could not insert module /lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/8390/ne2k-pci.ko: Unknown symbol in module root@deb8:~# ---- FEHLERURSACHE: Bei insmod werden keine Modulabhängigkeiten aufgelöst! => modprobe ---- root@deb8:~# modprobe ne2k-pci root@deb8:~# root@deb8:~# lsmod | grep ne2k ne2k_pci 12955 0 8390 17143 1 ne2k_pci ---- Module aus dem RAM entfernen: a) rmmod ne2k-pci b) modprobe -r ne2k-pci (BITTE FÜR LPI MERKEN!) Man sieht hier, dass BEIDE entfernt wurden, da das Modul 8390 nur von ne2k-pci gebraucht wurde (kein anderes Modul benötigt es außerdem auch). ---- root@deb8:~# lsmod | grep ne2k root@deb8:~# root@deb8:~# lsmod | grep 8390 root@deb8:~# ---- Kontrolle der Modul-Lade-Aktion: `dmesg` (Debug Messages des Kernels als Ringpuffer) Abhängigkeiten von Modulen prüfen und in einer Datenbank "modules.dep" zu speichern: ---- depmod -n (non execute + verbose) => d.h. KEINE modules.dep erstellen -v (verbose) -A (Append = Anhängen, d.h. nur wenn neue Module gefunden wurden, eine neue modules.dep erstellen) ---- Nach erfolgreicher Erstellung der Abhängigkeits-Datenbank: ---- root@deb8:~# grep ne2k-pci /lib/modules/3.16.0-4-amd64/modules.dep kernel/drivers/net/ethernet/8390/ne2k-pci.ko: kernel/drivers/net/ethernet/8390/8390.ko ---- Wo legt der Kernel Informationen beim Bootvorgang ab? Unter /proc (Processing) Spezielles Verzeichnis: /proc/sys/kernel ---- root@deb8:~# cat /proc/sys/kernel/ostype Linux root@deb8:~# root@deb8:~# cat /proc/sys/kernel/hostname deb8 root@deb8:~# ---- AUFGABE FÜR DAS SELBSTSTUDIUM: Welche Dateien unterhalb von /proc/sys/kernel werden ausgelesen, wenn man `uname -a` (all) eingibt? Weitere Pfade für Hardware- und Kernel-nahe Informationen: * /sys (Viele Infos aus /proc sind hier hinein gewandert, zB: /sys/bus/usb) * /dev (Allgemeines Verzeichnis für Gerätedateien) - IDE-Geräte (max. 4): /dev/hda, /dev/hdb, /dev/hdc, /dev/hdd - SCSI-Geräte: /dev/sda, /dev/sdb, .... - Partitionsnummern: 1 - 4 (max. 4 primäre Partitionen), die erste log. bekommt immer die 5 zugewiesen (/dev/sda5, max 63 Partitionen) - SCSI-CD/DVD/RW-Laufwerke: /dev/sr0, /dev/scd0 AUFGABE: Dateien auf Seite 32 mit cat ausgeben, Namen einprägen! * /proc/ioports (Gibt nur die Port aus, die gerade benutzt werden.) * ... Außerdem => less /proc/bus/pci/devices Aus diesen Files bezieht 'lspci' dann seine Informationen und bereitet sie auf. Wichtige Optionen für das Kommando 'lspci': -v (Verbose, zeigt auch die Bez. des geladenen Modules an) -k (Kernel-Module ausgeben) -n (Numerische Ausgabe von Vendor- und Device-ID) -t (Ausgabe in Tree-Form) Weitere Aufgaben/Hinweise: * USB-Geräte einbinden/konfigurieren (S. 34) * Welcher Host-USB-Controller ist eingebaut? -> laut geladener Module `lsmod | grep hci`, u.a. taucht ohci_pci und ehci_pci auf! * Seit welchen Kernel-Versionen wird USB überhaupt unterstützt und wie ausgeprägt? * Unter http://www.tldp.org/HOWTO/Webcam-HOWTO/hardware.html liest man: "USB subsystem support has been present in the Linux kernel since the late 2.2 series." * Bessere USB-Unterstützung gab es erst mit dem Kernel 2.4 USB-Support bei verschiedenen Kerneln und Hostcontroller-Treibern: * Kernel 2.0 = **überhaupt kein USB-Support!** * Kernel 2.2.7 = USB 1.0 = ohci_pci * Kernel 2.4.0 = USB 2.0 = ehci_pci * Kernel 2.6.31 = USB 3.0 = xhci_pci USB-Geräte im System auffinden: a) dmesg b) lsusb (Geht die Pfade unter /proc/bus/usb bzw. /sys/bus/usb durch und gibt Infos aus.) => apt-get install usbutils Was findet man unter /dev/bus/usb? * Zeichengeräte für die Autoerkennung des Userspace Device Managers 'udev' * Siehe auch http://weininger.net/how-to-write-udev-rules-for-usb-devices.html AUFGABE: Erkunden Sie die Device-Manager: * usbmgr * hotplug * udev Zur Klärung der Aufgabe zuerst einmal Debians Paketmanager heranziehen: ---- apt-cache show udev ... Description-de: /dev/ und hotplug Hintergrundprozess udev ist ein Hintergrundprozess der Gerätedateien in /dev/ dynamisch erzeugt und entfernt, hotplug-Ereignisse verarbeitet und Treiber während des Systemstarts lädt. ... ---- === 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 == Topic 101.2 - Boot the system => Siehe Seite 38 ff === Typischer Ablauf eines Linux-Bootvorganges 1. BIOS startet Power-on-self-Test (POST-Routine) 2. Suche nach einem MBR mit Bootcode über mehrere Datenträger hinweg (laut Bootsequenz) + MBR sichern: `dd if=/dev/sda of=/root/myMBR.dd count=1 bs=512` + * if - Input File * of - Output File * count - Counter (Zähler), wie oft mal der Block kopiert werden soll * bs - Block size (kleinste Einheit im Intel-PC = Sektor, = 512 Byte) 3. Bootcode wird geladen und damit der Bootloader, bei aktuellen Linux-Systemen ist das der Grand Unified Boot Loader (GRUB) 4. Bootloader findet Kernel auf Boot-Partition und lädt ihn in den RAM 5. Der sich im RAM breit machende Kernel startet den ersten Prozess init bzw. systemd (Prozess-ID 1, lässt sich nicht killen) + Zur Kontrolle: `pstree -pn | less` (Optionen: p = Prozess-IDs zeigen; n = numerische Sortierung) 6. Login via Konsole (tty) oder Displaymanager (grafisch) === Kernel-Parameter Im 3. Schritt der obigen Startreihenfolge können dem Kernel verschiedene Parameter mitgegeben werden, z.B. * init=/bin/bash (root-Passwort überschreiben) * ide=nodma (für alte Festplatten: Keinen DMA-Kanal aktivieren) * apm=off (= das alte Verfahren "Advanced Power Management") * acpi=off (= das neue Verfahren "Advanced Configuration Power Interface") Diese Parameter können im gebooteten System später ausgelesen werden: ---- tux@deb8:~$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=d426bdb3-2e30-4599-bc17-810bef991d42 ro quiet tux@deb8:~$ ---- === Initiale RAM-Disk Vielleicht aus DOS-Zeiten bekannt: RAM-Drive **Ziel: Für den Bootvorgang elementare Treiber frühzeitig bereitstellen (Die root-Partition ist nicht nicht gemountet)** Inhalt der RAM-Disk: * Minimales Dateisystem ähnlich ('/') * Treiber für Festplatten-Controller * Dateisystemtreiber für Festplattenpartitionen ( root-Partition mounten) Wo liegt sie und wie groß ist sie? ---- tux@deb8:~$ ls -lh /boot/initrd.img-3.16.0-4-amd64 -rw-r--r-- 1 root root 22M Dez 23 09:34 /boot/initrd.img-3.16.0-4-amd64 tux@deb8:~$ ---- Den Inhalt der RAM-Disk erforschen: ---- root@deb8:~# file /boot/initrd.img-3.16.0-4-amd64 /boot/initrd.img-3.16.0-4-amd64: gzip compressed data, last modified: Mon May 9 14:41:46 2016, from Unix root@deb8:~# root@deb8:~# root@deb8:~# gunzip -c /boot/initrd.img-3.16.0-4-amd64 > /tmp/initrd root@deb8:~# root@deb8:~# file /tmp/initrd /tmp/initrd: ASCII cpio archive (SVR4 with no CRC) root@deb8:~# root@deb8:~# cd /tmp/ root@deb8:/tmp# root@deb8:/tmp# cpio -idm < initrd 127156 blocks root@deb8:/tmp# root@deb8:/tmp# ls -ltrc | tail -8 drwxr-xr-x 2 root root 1024 Mai 10 16:29 sbin drwxr-xr-x 2 root root 1024 Mai 10 16:29 run drwxr-xr-x 2 root root 1024 Mai 10 16:29 lib64 drwxr-xr-x 8 root root 1024 Mai 10 16:29 lib -rwxr-xr-x 1 root root 7137 Mai 10 16:29 init drwxr-xr-x 7 root root 1024 Mai 10 16:29 etc drwxr-xr-x 3 root root 1024 Mai 10 16:29 conf drwxr-xr-x 2 root root 5120 Mai 10 16:29 bin root@deb8:/tmp# root@deb8:/tmp# ls -ltrc lib | tail -8 drwxr-xr-x 3 root root 1024 Mai 10 16:29 udev drwxr-xr-x 2 root root 1024 Mai 10 16:29 systemd drwxr-xr-x 3 root root 1024 Mai 10 16:29 modules drwxr-xr-x 2 root root 1024 Mai 10 16:29 modprobe.d -rw-r--r-- 1 root root 47712 Mai 10 16:29 libnss_files.so.2 -rw-r--r-- 1 root root 47712 Mai 10 16:29 libnss_files-2.19.so -rwxr-xr-x 1 root root 71416 Mai 10 16:29 klibc-IpHGKKbZiB_yZ7GPagmQz2GwVAQ.so drwxr-xr-x 4 root root 1024 Mai 10 16:29 firmware root@deb8:/tmp# ---- Tools zur erzeugen der Initrds: a) RedHat: whatis mkinitrd mkinitrd (8) - is a compat wrapper, which calls dracut to generate an initramfs b) Debian: whatis mkinitramfs mkinitramfs (8) - low-level tool for generating an initramfs image === 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: ---- root@deb8:~# tail -f /var/log/messages ---- Nachrichten als einfacher Nutzer ins Syslog schreiben: => logger "ALARM: Festplatte voll $(df -h /)" === Init-System, Runlevel a) Startverfahren nach System V Konfigurationsdatei: `cat /etc/inittab`, hier wird der Standardrunlevel mit 'initdefault' festgelegt => Diese Datei definiert außerdem Runlevelverzeichnisse, in denen Skripte liegen und deren aufrufende Links ebenso * Ausführbare Skripte liegen im Verzeichnis: `/etc/init.d` - Im Beispiel Slitaz: DHCP-Server starten: `/etc/init.d/udhcpd start` - Kontrolle: `netstat -una` => Port 67 ist offen, Konfigdatei `/etc/udhcpd.conf` * Runlevelverzeichnisse, in denen die aufrufenden, symbolischen Verknüfungen liegen: `/etc/rc0.d` bis `/etc/rc6.d` - Unter DSL-Linux (root werden mit 'sudo su') ** Kommando `runlevel` zum Ausgeben des vorherigen (N = kein vorheriger Level) und aktuellen Levels ** Änderung der /etc/inittab einlesen: `telinit q` (telinit ist nur ein symbolischer Link auf /sbin/init) ** Runlevelverzeichnis z.B. für Level 5: /etc/rc5.d ** Runlevel wechseln (z.B. in den Level 0 = system halt): `init 0` - Rechner herunterfahren, wobei alle Nutzer darüber informiert werden: die kann allein nur `shutdown -h 16:00` + (Das im Hintergrund für Broadcasts verwendete Kommando lautet 'wall'; zur Übung einfach `wall` eingeben, Nachricht schreiben und mit STRG + D abschicken) - Rechner herunterfahren, wobei beim nächsten Bootvorgang ein Dateisystemcheck durchgeführt werden soll: `shutdown -F -h 16:00` (force file system check) - Rechner herunterfahren, wobei beim nächsten Bootvorgang ein evl. fälliger Dateisystemcheck verhindert werden soll: `shutdown -f -h 16:00` (no file system check) b) Ubuntu-Startverfahren * Name des Systems: 'upstart' * Benutzung mit dem Kommando 'service' anhand des ssh-Daemons: - Infos ausgeben: `service sshd status` - Starten: `service sshd stop` - Stoppen: `service sshd start` Siehe auch Cheat Cheets unter: * https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet * https://raymii.org/s/snippets/Systemd_Rosetta_Reference.html * http://terry.im/wiki/terry/systemd.html c) Neues Startverfahren mit dem Systemd Das 'd' steht für Disks AND Extensions MONitor (daemon) = Dienst bzw. Service Es gibt drei Sub-Systeme: . systemd-udevd - für die Geräteerkennung . systemd-journald - für das Schreiben eines eigenen System-Logs . systemd-logind - für das Aktivieren der User-Umgebungen beim Login ---- ps x | grep systemd 163 ? Ss 0:00 /lib/systemd/systemd-udevd 164 ? Ss 0:00 /lib/systemd/systemd-journald 483 ? Ss 0:00 /lib/systemd/systemd-logind ---- Benutzung als root (ACHTUNG: nicht mit 'sshd' ausführen, sondern nur mit 'ssh'): * Den ssh-Dienst stoppen: `systemctl stop ssh` * Den ssh-Dienst starten: `systemctl start ssh` * Den Status ausgeben: `systemctl status ssh` * Den ssh-Dienst nicht mehr automatisch beim Booten starten: `systemctl disable ssh` * Den ssh-Dienst beim Booten mit starten: `systemctl enable ssh` * Das Journal des Systemd ausgeben: `journalctl` (Komplettes Logfile mit dem Pager 'less' lesen) * Das Journal des Systemd ausgeben, aber nur die letzten Änderungen mit 'follow data stream': `journalctl -f` (wichtig unter SUSE, da hier kein Syslogd vorinstalliert) * Das "Fehler"-Journal mit Hinweisen ausgeben: `journalctl -xn` * Runlevel wechseln (hier Level 1 = SingleUser-Modus, ReparaturModus): `systemctl isolate rescue.target` * Runlevel wechseln (hier Level 5): `systemctl isolate graphical.target` * Standard-Runlevel anzeigen: `systemctl get-default` * Standard-Runlevel auf "nicht-grafisch" ändern: `systemctl set-default multi-user.target` * Standard-Runlevel wieder auf "grafisch" ändern: `systemctl set-default graphical.target` Siehe auch: https://fedoraproject.org/wiki/Systemd == Topic 101.3 - Change runlevels / boot targets and shutdown or reboot system In diesem Kapitel werden die eben kennengelernten Aspekte über Init-Systeme vertieft und ergänzt. === Systemstart nach System V (SysVinit) Wichtige Kennzeichen: * Dienst '/sbin/init' -> Siehe auch 'pstree -p | head' => init(1) * Hauptkonfigurationsdatei '/etc/inittab' - Standardrunlevel konfigurieren: 'id:3:initdefault:' (Hier bitte NIEMALS 0 (poweroff) oder 6 (reboot) eintragen!!) - Affengriff konfigurieren: 'ca::ctrlaltdel:/sbin/shutdown -r +4' === Runlevel * Runlevel sind bestimmte Systemzustände, in denen unterschiedlich viel Dienste gestartet werden, z.B. * Im Vergleich: Abgesicherter Modus (Windows) => Runlevel 1 bzw. Single User * Herausfinden, in welchem wir uns gerade befinden: 'runlevel' * Wechseln: init [NR] bzw. telinit [NR], im Bsp.: 'telinit 1', wieder ins GUI fahren: 'telinit 5' * Kernelparameter für GRUB für Single-User-Modus: '1' - Zum Beispiel: + ---- kernel /boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda3 ro initrd=/install/initrd.gz 1' ---- === Rechner herunterfahren / neu starten * Nutzer dabei zu informieren, ist nur mit dem Kommando 'shutdown' möglich (im Hintergrund verwendet es 'wall') * Wichtige Optionen: S. 52 unten, mit der Option '-f' kann ein evl. anstehender 'fsck' übergangen werden, ein '-F' erzwingt einen Check. === 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:~# ---- == Topic 102.1 - Design hard disk layout => Seite 57 ZIEL: Linux-Server stabil betreiben, ohne dass die Festplatten voll laufen können. Wir haben bei der Installation bereits Vorsorge getroffen, die veränderlichen Daten liegen auf separaten Partitionen: ---- df -h /home df -h /var df -h /tmp ---- FRAGE 1: Welche Problem kann es mit '/boot' geben? * Durch veraltete BIOS-Versionen konnte der Bootloader u.U. nicht über die Grenze von 1024-Zylinders zugreifen (ca. 8GB), wenn dabei * LILO als Bootmanager zum Einsatz kam. * Deshalb musste dann eine separate, kleine /boot-Partition am Anfang der Festplatte angelegt werden. FRAGE 2: Welche Verzeichnisse müssen auf der Wurzel-Partition verbleiben (Systemrelevant)? * /dev, /proc/, /sys, /etc, /bin, /sbin, /lib, ... (Siehe auch Screenshot) Was sollte der Admin auslagern (Nutzer können dort schreiben!): * /tmp, /var, /home === Partitionierung Typischerweise sollte sich die Partitionierung der Festplatte so gestalten: . Part.: Größe 300 MB => Primär => Anfang => Dateisystem: ext4 => Einbindungspunkt: /boot [/dev/sda1] . Part.: Größe 30 GB => Logisch => Anfang => Dateisystem: btrfs => Einbindungspunkt: / => (Name: root) [/dev/sda5] . Part.: Größe 1 GB => Logisch => Anfang => Dateisystem: btrfs, => Einbindungspunkt: /tmp [/dev/sda6] . Part.: Größe 3 GB => Logisch => Anfang => Dateisystem: btrfs, => Einbindungspunkt: /var [/dev/sda7] . Part.: Größe 5 GB => Logisch => Anfang => Dateisystem: xfs, => Einbindungspunkt: /home [/dev/sda8] . Part.: Größe 2 GB (Doppelte RAM-Größe) => Benutzen als: Swap (kein Einbindungspunkt) [/dev/sda9] Hier sind die Verzeichnisse, in denen Nutzer Daten ablegen können, konsequent auf getrennte Partitionen verteilt worden. Das bringt Stabilität - auch ohne den Einsatz von Disk-Quotas. === Logical Volume Manager Was ist das? Aus einer LPI-Prüfung: What can the Logical Volume Manager (LVM) be used for? (Choose THREE correct answers.) 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 Im Experiment: Eine zweite Festplatte einbauen (VBox: Massenspeicher / Controller SATA markieren, '+' anklicken...) ---- root@deb8:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 8,4G 0 part / ├─sda2 8:2 0 1K 0 part ├─sda5 8:5 0 2,8G 0 part /var ├─sda6 8:6 0 3,4G 0 part [SWAP] ├─sda7 8:7 0 380M 0 part /tmp └─sda8 8:8 0 35G 0 part /home sdb 8:16 0 8G 0 disk sr0 11:0 1 55,5M 0 rom /media/cdrom0 root@deb8:~# ---- Installation und Einrichtung: ---- apt-get install lvm2 # Physische Kennung für LVM erzeugen root@deb8:~# pvcreate /dev/sdb Physical volume "/dev/sdb" successfully created root@deb8:~# # Volumengroup erzeugen root@deb8:~# vgcreate backup /dev/sdb Volume group "backup" successfully created root@deb8:~# # Volumes erzeugen root@deb8:~# lvcreate -n doc -L 3G backup Logical volume "doc" created root@deb8:~# root@deb8:~# lvcreate -n app -L 2G backup Logical volume "app" created root@deb8:~# # Kontrolle root@deb8:~# pvs PV VG Fmt Attr PSize PFree /dev/sdb backup lvm2 a-- 8,00g 3,00g root@deb8:~# root@deb8:~# vgs VG #PV #LV #SN Attr VSize VFree backup 1 2 0 wz--n- 8,00g 3,00g root@deb8:~# root@deb8:~# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert app backup -wi-a----- 2,00g doc backup -wi-a----- 3,00g root@deb8:~# # Dateisystem aufbringen root@deb8:~# mke2fs /dev/backup/doc mke2fs 1.42.12 (29-Aug-2014) Ein Dateisystems mit 786432 (4k) Blöcken und 196608 Inodes wird erzeugt. UUID des Dateisystems: 7b7adc78-9537-4197-88b4-efbcd8dacc33 Superblock-Sicherungskopien gespeichert in den Blöcken: 32768, 98304, 163840, 229376, 294912 beim Anfordern von Speicher für die Gruppentabellen: erledigt Inode-Tabellen werden geschrieben: erledigt Die Superblöcke und die Informationen über die Dateisystemnutzung werden geschrieben: erledigt root@deb8:~# ---- ---- # Mounten und kontrollieren root@deb8:~# mount /dev/backup/doc /mnt root@deb8:~# root@deb8:~# ls -l /mnt/ insgesamt 16 drwx------ 2 root root 16384 Mai 12 16:47 lost+found root@deb8:~# root@deb8:~# df -h /mnt/ Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/mapper/backup-doc 3,0G 4,5M 2,8G 1% /mnt root@deb8:~# root@deb8:~# mount | tail -1 /dev/mapper/backup-doc on /mnt type ext2 (rw,relatime) root@deb8:~# ---- Bitte nicht gesamten Platz für Volumes aufbrauchen, da sonst keine LVM-Snapshots angelegt werden können. Man nutzt u.a. gern Snapshots, um das Wurzeldateisystem überhaupt mit 'fsck' prüfen zu können. == Topic 102.2 - Install a boot manager => Seite 60 ff **Bootloader für Linux** a) LILO (veraltet, 1024-Zylinder-Problem) b) GRUB (neu, zwei Versionen) === Unterschiede zwischen GRUB 1 und GRUB 2 ==== Der veraltete (legacy) GRUB 1 * Konfigurationsdatei: /boot/grub/menu.lst - Schlüsselwort für die Kernel-Zeile (Übergabe von Bootparametern): 'kernel' z.B.: kernel /boot/vmlinuz-3.2.4 root=/dev/sda1 * Interaktive GRUB-Shell vorhanden (S. 62): Kommando: 'grub' * Bezeicher für /boot-Partition z.B. für 1. Festplatte, 1. Partition: hd0,0 - Beispiel: root (hd0,0) - ACHTUNG: HIER BEGANN MAN BEI DEN PARTITIONEN UNGEWÖHLICHERWEISE MIT NULL ZU ZÄHLEN AN! ==== Der neue GRUB 2 * Konfigurationsdatei: /boot/grub/grub.cfg - Schlüsselwort für die Kernel-Zeile (Übergabe von Bootparametern): 'linux' z.B.: linux /boot/vmlinuz-3.2.4 root=/dev/sda1 * Interaktive GRUB-Shell NICHT mehr vorhanden * Bezeicher für /boot-Partition z.B. für 1. Festplatte, 1. Partition: hd0,1 - Beispiel: root (hd0,1) === Gemeinsamkeiten der beiden GRUB-Versionen: * Zweistufig - Stage 1: /boot mounten, Kernel + Initrd in den RAM bringen - Stage 2: sysVinit bzw. Systemd starten, den Rest mounten (siehe /etc/fstab) * Installation von Stage 1 (Bootcode im MBR, 444 Byte von insgesamt 512 Byte) - BEISPIEL: mount /dev/sda1 /mnt grub-install --root-directory=/mnt /dev/sda + ==== FRAGE DAZU: Wo befindet sich in dem Falle, wenn wir die Wurzelpartition unter /mnt gemountet haben, das Verzeichnis namens 'grub'? ANTWORT: Unter /mnt/boot (Gesamter Verzeichnispfad: /mnt/boot/grub) ==== Siehe auch die LPI-Frage: http://pemmann.de/doc/lpi101/2016-05-17/20160517-153823-014.png * Eine weitere Gemeinsamkeit ist die Art, wie eine neue Konfigurationsdatei erzeugt wird: - Allgemein mit dem Kommando 'grub-mkconfig' An dieser Stelle leiten wir nur mal in eine temoräre Datei um: ---- root@deb8:~# grub-mkconfig > /tmp/grub.cfg Generating grub configuration file ... Found background image: /usr/share/images/desktop-base/desktop-grub.png Linux-Abbild gefunden: /boot/vmlinuz-3.16.0-4-amd64 initrd-Abbild gefunden: /boot/initrd.img-3.16.0-4-amd64 Found memtest86+ image: /boot/memtest86+.bin Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin erledigt root@deb8:~# ---- Viele Distributionen haben allerding ihre eigenen Tools, bei Debian ist das 'update-grub': ---- root@deb8:~# update-grub Generating grub configuration file ... Found background image: /usr/share/images/desktop-base/desktop-grub.png Linux-Abbild gefunden: /boot/vmlinuz-3.16.0-4-amd64 initrd-Abbild gefunden: /boot/initrd.img-3.16.0-4-amd64 Found memtest86+ image: /boot/memtest86+.bin Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin erledigt root@deb8:~# root@deb8:~# find /boot/ -cmin 1 /boot/grub /boot/grub/grub.cfg root@deb8:~# ---- Weitere Tipps und Dokumentation zu diesem Thema unter http://pemmann.de/doc/lpi1/101/2016-01-08/whlg-lvm-grub.html == Topic 102.3 - Manage shared libraries Siehe Seite 64 ff Zum Einstieg: * Parallele zu Windows? => dll-Dateien * 'whatis ld' - The GNU linker (= das Hauptwerkzeug) * Was ist der Vorteil? => Schlankere Anwendungen (sie greifen auf gemeinsame Funktionsbibliotheken zurück) * Ist das sicherer als bei statisch gelinkten Programmen? NEIN! Ein Fehler in der Library und alle Apps haben ihn sofort auch. * Gibt es Programme, die keine shared Libs benötigen? Ja, früher z.B. Opera-Browser, Stichwort: portable Apps) - http://www.srware.net/downloads/iron-linux-64.tar.gz === Abhängigkeiten ausgeben mit ldd Gegeben sei ein Programm: 'grep' (Searching with regulary ExPressions) * Zuerst ermitteln wir, wo es im Dateisystem liegt (über den Suchpfad der Shell hinweg auch gern mittels 'which') * Danach lassen wir uns mit 'ldd' die Abhängigkeiten ausgeben + ---- tux@deb8-2:~$ type grep grep ist /bin/grep tux@deb8-2:~$ tux@deb8-2:~$ ldd /bin/grep linux-vdso.so.1 (0x00007ffe8cf8a000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f2b4836e000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2b4816a000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2b47dc1000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2b47ba4000) /lib64/ld-linux-x86-64.so.2 (0x00007f2b4880f000) tux@deb8-2:~$ ---- Am Beispiel unserer vermeintlich portablen App 'iron': ---- tux@deb8:~$ tar zxf iron-linux-64.tar.gz tux@deb8:~$ tux@deb8:~$ cd iron-linux-64/ tux@deb8:~/iron-linux-64$ tux@deb8:~/iron-linux-64$ file iron iron: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.26, BuildID[sha1]=caa29fe2e, not stripped tux@deb8:~/iron-linux-64$ tux@deb8:~/iron-linux-64$ du -sh . 219M . tux@deb8:~/iron-linux-64$ ldd iron linux-vdso.so.1 (0x00007ffc19fda000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f39580fc000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f3957ef8000) ... ---- Wir sehen hier deutlich, dass nach Shared Libraries auf dem vorliegenden Linux-System gesucht wird. Testweise das Programm natürlich auch mal starten: ./iron & Eine wichtige Fragestellung, die mit 'ldd' beantwortet werden kann ist außerdem: "Kann der SSH-Server mittels dem 'tcpd' (/etc/hosts.allow bzw. /etc/hosts.deny) abgesichert werden?" Ja, wenn er gegen die 'libwrap' gelinkt ist. Und das ist hier der Fall: ---- root@deb8:~# ldd `which sshd` | grep --color wrap libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f695be0e000) root@deb8:~# ---- HINWEIS für die LPI-Prüfung: Es lassen sich auch Bibliotheken abfragen: ---- root@deb8:~# ldd /lib/x86_64-linux-gnu/libresolv-2.19.so linux-vdso.so.1 (0x00007ffce804e000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feca408e000) /lib64/ld-linux-x86-64.so.2 (0x00007feca4650000) root@deb8:~# ---- === Den Cache erzeugen mit ldconfig * 'whatis ldconfig' - configure dynamic linker run-time bindings - Erzeugt nach Änderungen in den Configs (i.d.R. '/etc/ld.so.conf') einen neuen Cache * Die Datenbank-Cachedatei: '/etc/ld.so.cache' Im Experiment: ---- root@deb8:~# ldconfig root@deb8:~# root@deb8:~# find /etc/ -cmin 1 /etc/ /etc/ld.so.cache root@deb8:~# root@deb8:~# file /etc/ld.so.cache /etc/ld.so.cache: data root@deb8:~# root@deb8:~# strings /etc/ld.so.cache | head -7 ld.so-1.7.0 glibc-ld.so.cache1.1 libzzipwrap-0.so.13 /usr/lib/x86_64-linux-gnu/libzzipwrap-0.so.13 libzzipmmapped-0.so.13 /usr/lib/x86_64-linux-gnu/libzzipmmapped-0.so.13 libzzipfseeko-0.so.13 root@deb8:~# ---- === Konfiguration der Suchpfade für Libraries Dank des mit 'ldconfig' zu erzeugenden Caches ist ein schnelles Auffinden der einzelnen Bibliotheken kein Problem. Es gibt keine Textdateien, in denen alle Libs vermerkt sind, sondern eine zu bildende Datenbankdatei, die '/etc/ld.so.cache' heißt. **Konfiguration:** In der Datei '/etc/ld.so.conf' können die einzelnen Pfade direkt hinterlegt werden, in denen dann 'ldconfig' nach den .so-Dateien sucht (Shared Objects) und den Cache daraus baut. === Neuerstellen des Caches und Prüfen des Inhaltes Nach Installation oder Einbindung neuer Bibliotheken muss wie bereits erwähnt `ldconfig` ausgeführt werden. (zur Kontrolle Zeitstempel vergleichen: `ls -ld /etc/ld.so.c*`) Wichtig ist es für die LPI-Prüfung außerdem zu wissen, wie man den Inhalt des Caches ausgeben (= printing) kann: `ldconfig -p` === Einfaches Bereitstellen von Libraries via Variable * Ein einfacher Nutzer kann sich seinen Lib-Pfad selbst konfigurieren * Libs liegen angenommen unter '~/mylibs' * Variable erstellen und zugleich exportieren: '`export LD_LIBRARY_PATH="~/mylibs"`' **Fragen - ???** * Kann man Libs anderer Distributionen auf dieses System übertragen und damit einbinden? Ja, aber nur bedingt (gleicher Release-Stand erforderlich) * Wird das in jedem Falle funktionieren? NEIN!! Siehe http://linuxundich.de/gnu-linux/linus-torvalds-schmimpft-bauen-von-anwendungen-fur-linux/ * TIPP: Man nutze am besten Distributionen mit breitem Softwareangebot wie Debian (43.000 Packages!): https://www.debian.org/distrib/packages == Topic 102.4 - Use Debian package management Seite 66 ff === Das Debian Backend dpkg Der "Debian Packager" ist das eigentliche Werkzeug, welches das Entpacken und Ausrollen von Debian Paketen (Datei-Suffix: .deb) durchführt. Welches Archivformat liegt hierbei vor? **'ar'** (archiver). Das Paket 'dos2unix' im Experiment lediglich herunterladen und entpacken: ---- root@deb8:~# apt-get -d install dos2unix Paketlisten werden gelesen... Fertig Abhängigkeitsbaum wird aufgebaut. Statusinformationen werden eingelesen.... Fertig Die folgenden Pakete wurden automatisch installiert und werden nicht mehr benötigt: libgssapi3-heimdal libheimntlm0-heimdal Verwenden Sie »apt-get autoremove«, um sie zu entfernen. Die folgenden NEUEN Pakete werden installiert: dos2unix 0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert. Es müssen 77,8 kB an Archiven heruntergeladen werden. Nach dieser Operation werden 314 kB Plattenplatz zusätzlich benutzt. Holen: 1 http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie/main dos2unix amd64 6.0.4-1 [77,8 kB] Es wurden 77,8 kB in 0 s geholt (733 kB/s). Herunterladen abgeschlossen; Nur-Herunterladen-Modus aktiv root@deb8:~# root@deb8:~# root@deb8:~# mkdir dos2unix root@deb8:~# root@deb8:~# cd dos2unix/ root@deb8:~/dos2unix# root@deb8:~/dos2unix# ar x /var/cache/apt/archives/dos2unix_6.0.4-1_amd64.deb root@deb8:~/dos2unix# root@deb8:~/dos2unix# ls -l insgesamt 84 -rw-r--r-- 1 root root 1391 Mai 19 16:17 control.tar.gz -rw-r--r-- 1 root root 76184 Mai 19 16:17 data.tar.xz -rw-r--r-- 1 root root 4 Mai 19 16:17 debian-binary root@deb8:~/dos2unix# ---- Der Packager 'dpkg' ist ein sehr intelligentes Werkzeug, was alles kann, außer: * Downloads via Netzwerk durchführen * Paketabhängigkeiten selbständig auflösen (In begrenztem Maße dank Wildcard '*': `dpkg -i *.deb`) **Beispiele:** - Installation eines Paketes: `dpkg -i /var/cache/apt/archives/dos2unix_6.0.4-1_amd64.deb` (Anwendung, z.B. `unix2dos mytextfile.txt`) - Auflisten aller installierten Pakete: `dpkg -l` oder ausführlich `dpkg --list` (listing, Filtern: `dpkg -l | grep smb`) - Auflisten aller Dateien, zum installierten Paket gehören: `dpkg -L bash` oder ausführlich `dpkg --listfiles bash` + (Nach config-files suchen: `dpkg -L bash | grep rc` => bei der bash mit "rc" = run command oder ressource control) - Nach dem Paketnamen suchen, aus dem eine vorgefundene Datei stammt: `-S` bzw. `--search` + ---- root@deb8:~# dpkg -S /usr/bin/unix2mac dos2unix: /usr/bin/unix2mac root@deb8:~# ---- - Ausgeben von Informationen: `dpkg -s bash` oder alternativ: `dpkg --status bash` (Für die Prüfung: nicht `--info` merken!!) - Ausgeben, welche Pakete nur teilweise installiert sind (**and suggest how to get them correctly installed**): `dpkg -C` oder alternativ: `dpkg --audit` - Selections vornehmen: 'echo "fglrx-driver hold" | dpkg –set-selections' Siehe auch http://debiananwenderhandbuch.de/dpkg.html - Entfernen eines einzelnen Paketes (Config-files verbleiben im System): `dpkg -r fortune-mod` - Komplettes entfernen eines einzelnen Paketes (Config-files werden ebenfalls gelöscht): `dpkg -P fortune` oder mit langer Option`--purge` - Paket neu konfigurieren (Starten eines Assistenten): `dpkg-reconfigure keyboard-configuration` * Installation von 'fortune' unter Debian - Vorbereitung mit Option "download only": `apt-get -d install fortune`, dabei wird automatisch das Paket + 'fortune-mod' ausgewählt und mitsamt Abgängigkeiten nach '/var/cache/apt/archives' heruntergeladen - Wegen den Abhängigkeiten erfolgt die Installation dann so: ** Ins Downloadverzeichnis wechseln: `cd /var/cache/apt/archives` ** Nachsehen, was soeben heruntergeladen wurde (zeitlich sortiert): `ls -ltrc` ** Die betreffenden Pakete alle zusammen angeben (Dateijoker: **`*`**): `dpkg -i fortune*.deb librecode0_3.6-21_amd64.deb` === Frontends für Debian Frontends sorgen dafür, dass die dpkg-Paketdatenbank komfortabel durchsucht und neue Pakete mitsamt Abhängigkeiten via Netzwerk leicht nachinstalliert werden können. Wichtige Frontends sind: * dselect (veraltet) * apt-Tools (apt-get, apt-cache, apt-key, ..., apt) * aptitude (neu, als preudografisches GUI und als Cmdline-Tool verwendbar) - Verwendet eine andere Datenbank als "apt-get"! - Das Feature, in Abhängigkeit mit installierte Pakete automatisch zu entfernen, beherrscht heute 'apt-get' ('apt-get autoremove', s.u.) * dselect * synaptic (GUI-Werkzeug für X-Window) ==== Konfiguration der apt-Repositories Im Prinzip kann man alle Quellen in einer Datei hinterlegen, der `/etc/apt/sources.list`. Das unten notierte Beispiel beinhaltet die klassischen drei Zeilen für die aktuelle, stabile Distribution 'jessie'. Die Komponenten "contrib" und "non-free" (Zeile 1) fehlen bei einer standardmäßigen Installation, können aber jederzeit nachgetragen werden. So werden z.B. oft die Pakete * 'flashplugin-nonfree' (Flash-Player für Firefox) * 'firmware-iwlwifi' (Binary firmware for Intel Wireless cards) benötigt. Wir lassen uns mit der folgenden Zeile den aktiven Inhalt der Datei ausgeben: => grep -v ^# /etc/apt/sources.list ---- deb http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie main contrib non-free deb http://security.debian.org/ jessie/updates main deb http://ftp.tu-chemnitz.de/pub/linux/debian/debian/ jessie-updates main ---- Nach Änderungen in dieser Datei bitte immer zuerst die aktuellen Paketlisten herunterladen: => apt-get update # Im Vergleich: 'zypper refresh' (SuSE), 'yum check-update' (RedHat) Weitere Hinweise zur Konfiguration der Quellen siehe auch: * https://wiki.debian.org/SourcesList * https://wiki.debian.org/de/DebianEinsteiger * https://www.elektronik-kompendium.de/sites/raspberry-pi/2002201.htm Eine darüber hinaus gern genutzte Konfigurationsdatei ist die `/etc/apt/apt.conf`, wenn es darum geht, einen evl. erforderlichen Proxy-Server anzugeben: ---- Acquire::http::Proxy "http://10.0.0.1:3128"; ---- Nun geht es los - wir suchen nach Paketen und installieren verschiedene: => apt-cache search geany # Suchen nach der Zeichenkette 'geany', = IDE / Editor => apt-cache show geany # Ausführliche Infos ausgeben => apt-cache policy nmap # Versionen ausgeben bei verschiedenen Quellen, Siehe auch 'apt-Pinning' => apt-get install geany # In Abhängigkeit wird 'geany-common' mitinstalliert => apt-get remove geany # Entfernt nur das angegebene Paket, wobei die Configs auf dem System # verbleiben siehe 'dpkg -l geany' => apt-get autoremove # Deinstallieren von überflüssigen, in Abhängigkeit mit installierten Paketen => apt-get purge geany # Entfernt das Paket komplett ==== Beispiel Installation u. Rekonfiguration des LDAP-Servers => apt-get install slapd => dpkg-reconfigure slapd Weiterführende Literatur: http://debiananwenderhandbuch.de/apt-get.html == Topic 102.5 - Use RPM and YUM package management === Bereitstellen einer VM für Praxisübungen 1. Download durchführen + http://freefr.dl.sourceforge.net/project/virtualboximage/CentOS/6.3/CentOS-6.3-x86.7z 2. Entpacken... 3. VM in Virtualbox erstellen => Doppelklick auf die Datei "CentOS 6.3 x86.vbox" => VM starten... 4. Grafischer Login als Nutzer 'centos' * Passwort: reverse * Tastaturlayout auf Deutsch stellen: 'setxkbmap de' + (Bei Problemen mit dem Pipe-Zeichen manchmal ein Ausweg: 'setxkbmap us') === RedHat Package Manager Voraussetzung: => yumdownloader dos2unix === Archiv-Format Zuerst einmal wollen wir uns das interne Archivierungsformat anschauen. Es handelt sich um ein cpio-Archiv, an das man mittels 'rpm2cpio' herankommt: => rpm2cpio dos2unix-*.rpm > dos2unix.archiv => file dos2unix.archiv => rpm2cpio dos2unix-*.rpm | cpio -idm === Nicht installierte Pakete erforschen Wichtige Option in diesem Zusammenhang: '-p' oder '--package' Erforschen, Testen und Fragen stellen kann man nur im Query-Modus: '-q' oder '--query' Die Konfigfiles ausgeben: '-c' oder '--configfiles' === Shell-Mitschnitt ---- [root@localhost ~]# yumdownloader dos2unix Loaded plugins: fastestmirror, refresh-packagekit Loading mirror speeds from cached hostfile * base: ftp.halifax.rwth-aachen.de * extras: ftp.halifax.rwth-aachen.de * updates: centos.bio.lmu.de dos2unix-3.1-37.el6.i686.rpm | 15 kB 00:00 [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# file dos2unix-3.1-37.el6.i686.rpm dos2unix-3.1-37.el6.i686.rpm: RPM v3.0 bin i386/x86_64 dos2unix-3.1-37.el6 [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# rpm2cpio dos2unix-3.1-37.el6.i686.rpm > dos2unix.archiv [root@localhost ~]# [root@localhost ~]# file dos2unix.archiv dos2unix.archiv: ASCII cpio archive (SVR4 with no CRC) [root@localhost ~]# dos2unix.archiv: ASCII cpio archive (SVR4 with no CRC) [root@localhost ~]# [root@localhost ~]# rpm2cpio dos2unix-3.1-37.el6.i686.rpm | cpio -idm 37 blocks [root@localhost ~]# [root@localhost ~]# ls -ltr total 60 -rw-r--r--. 1 root root 15824 Jul 3 2011 dos2unix-3.1-37.el6.i686.rpm -rw-r--r--. 1 root root 12148 Jul 7 2012 post-install -rw-r--r--. 1 root root 550 Jul 7 2012 post-install.log -rw-------. 1 root root 956 Jul 10 2012 anaconda-ks.cfg -rw-r--r--. 1 root root 18556 May 24 16:31 dos2unix.archiv drwxr-xr-x. 4 root root 4096 May 24 16:33 usr [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# rpm --package --query dos2unix-3.1-37.el6.i686.rpm dos2unix-3.1-37.el6.i686 [root@localhost ~]# [root@localhost ~]# rpm --query dos2unix-3.1-37.el6.i686.rpm package dos2unix-3.1-37.el6.i686.rpm is not installed [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# rpm --package --query --changelog dos2unix-3.1-37.el6.i686.rpm | head -15 * Wed Mar 03 2010 Tim Waugh 3.1-37 - Added comments for all patches. * Mon Nov 30 2009 Dennis Gregorovic - 3.1-36.1 - Rebuilt for RHEL 6 * Fri Jul 24 2009 Fedora Release Engineering - 3.1-36 - Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild * Tue Feb 24 2009 Fedora Release Engineering - 3.1-35 - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild * Wed Sep 24 2008 Tim Waugh 3.1-34 - Moved 'make clean' to prep section and added comment about there being no upstream (bug #225706). [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# rpm -q -p -c dos2unix-3.1-37.el6.i686.rpm # Das Paket besitzt kein Config-File [root@localhost ~]# rpm -q -p -l dos2unix-3.1-37.el6.i686.rpm /usr/bin/dos2unix /usr/bin/mac2unix /usr/share/doc/dos2unix-3.1 /usr/share/doc/dos2unix-3.1/COPYRIGHT /usr/share/man/man1/dos2unix.1.gz /usr/share/man/man1/mac2unix.1.gz [root@localhost ~]# [root@localhost ~]# rpm -qpl dos2unix-3.1-37.el6.i686.rpm /usr/bin/dos2unix /usr/bin/mac2unix /usr/share/doc/dos2unix-3.1 /usr/share/doc/dos2unix-3.1/COPYRIGHT /usr/share/man/man1/dos2unix.1.gz /usr/share/man/man1/mac2unix.1.gz [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# man rpm | grep '\-c' rpm {-K|--checksig} [--nosignature] [--nodigest] [--changelog] [-c,--configfiles] [-d,--docfiles] [--dump] --changelog -c, --configfiles rpm {--checksig} [--nosignature] [--nodigest] The --checksig option checks all the digests and signatures contained --checksig is useful to verify all of the digests and signatures asso- [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# rpm -qp --configfiles dos2unix-3.1-37.el6.i686.rpm [root@localhost ~]# ---- === Kommandozeilenfrontend yum Am besten, wir vergleichen es mit Debians Frontend 'apt': |=============================================================================== |**Debian** |**RedHat** |/etc/apt/sources.list |Dateien unter /etc/yum.repos.d |apt-get update |yum check-update |apt-get upgrade |yum update |apt-get dist-upgrade |yum upgrade (entspricht 'yum --obsoletes update') |apt-cache search BEGRIFF |yum search BEGRIFF |apt-get install PACKAGE |yum search PACKAGE |apt-get -d install PACKAGE |yumdownloader PACKAGE |apt-cache show PACKAGE |yum info PACKAGE |=============================================================================== === yum-Spezialität - Paketgruppen Installation von Paketgruppen (Serverkomponenten, Desktop) => yum grouplist => yum groupinstall "Web Server" => yum groupremove "Web Server" === VBox Gasterweiterungen installieren Siehe https://wiki.centos.org/HowTos/Virtualization/VirtualBox/CentOSguest a) Software installieren * 'yum install dkms' * 'yum groupinstall "Development Tools"' * 'yum install kernel-devel' b) Gast-Erweiterungen installieren * Im VBox-Gastfenster unter Geräte => Gasterweiterungen einlegen * Mounten der CD: 'mount /dev/sr0 /mnt' * Kompilieren und Installieren der Treiber: '/mnt/VBoxLinuxAddition.run' * Logout/Login oder Neustart... == Topic 103.1 - Work on the command line === Variablen Siehe Seite 89 ff Wir unterscheiden zwei Arten von Variablen: * Umgebungsvariablen: großgeschrieben, werden automatisch vererbt - BSP: '`echo $PATH`' - BSP: '`echo $PS2`' * Shellvariablen werden manuell deklariert, bei Bedarf können sie exportiert werden - BSP: '`myname="Axel Pemmann" ; echo $myname`' - Kindterminal starten: '`gnome-terminal &`' - Wo ist diese Variable denn aber in diesem neuen Terminal? Nicht vorhanden! Sie wurde nicht exportiert. - Daher schließen wir das Terminal und starten es erst nach dem Exportieren der Variablen: + + ---- exit export myname gnome-terminal & ---- **Wichtige Variablen:** * $$ - meine eigene PID (Shell, Skript) * $! - die PID des letzten Hintergundprozesses * $PS2 - der Shell-interne Prompt Zur Kontrolle der Variablen: * Die umfangreichsten Ausgaben liefert 'set' (alle Shell- und Umgebungsvariablen): => set | grep myname * Nur die Umgebungsvariablen liefert 'env': => env | grep PATH Wenn nun die selbst erzeugte Shellvariable 'myname' auftaucht, dann wurde sie exportiert, was man aber wieder mit => export -n myname zurücknehmen kann. Ganz und gar entfernt werden kann diese eigene Variable am Schluss mit: => unset myname **Nicht nur für LPI wichtig:** Skripte, die in der aktuellen Shellumgebung eingelesen und aktiv gesetzt werden sollen, müssen mit => source myscript bzw. alternativ mit einem Punkt, worauf ein Leerzeichen folgt, => . myscript ausgeführt werden... === Konfigurationsdateien der Shell Motivation: Viele Einstellungen lassen sich temporär vornehmen, um sie festzuschreiben, müssen die verschiedensten Konfigurationsdateien editiert werden. ==== Unterscheidung zwischen alten Shells und der neuen Standardshell: bash **Alte Shells** Beispiele (siehe auch /etc/shells): /bin/sh, /bin/ksh Seite 90/ 91: Wichtiges Unterscheidungskriterium: Welche Dateinamen beinhalten NICHT den Namen 'bash'? => /etc/profile => ~/.profile ==== Startup-Dateien für User-Profiles a) Systemweit * /etc/profile - Wird als erstes nach dem User-Login abgearbeitet, allgemein für alle Shells, z.B. Variablen PATH und PS1, evl auch umask * /etc/bashrc - Wird als nächstes als Konfigurationsdatei speziell für die bash abgearbeitet, z.B. PS1 (für Promptbildung der bash) b) Benutzerdefiniert (Diese Dateien überschreiben die systemweiten Einstellungen) * ~/.profile - Wird einmalig nach dem Login nach dem Ausführen der /etc/profile abgearbeitet, Verwendung wie eben diese Datei, in der Vergangenheit war sie auch für die bash zuständig. * \~/.bash_profile - Spezielle bash-Startupdatei, die die alte ~/.profile ersetzt, wird nur einmal abgearbeitet * \~/.bash_login - Entspricht der ~/.bash_profile, wenn sie nicht existiert wird diese nämlich an dessen Stelle ausgeführt * ~/.bash_logout - Optionale Datei, die Befehle beim Logout wie clear (Bildschirm löschen) ausführt * ~/.bashrc - Eine weitere, alte bash-Startupdatei, sie wird jedesmal mit einer neuen bash-Instanz abgearbeitet (neues Terminal öffnen), z.B. Aliase, PS1 (Farbprompt) === man-Pages => Seite 96 ff ZIEL: Sich selber weiterhelfen können... mit dem Online-Manuals (Online = werden mit den Paketen ausgeliefert) Man-Pages sind Kurzbeschreibungen von Kommandos und Dateien, denen oft Beispiele fehlen. (Von Programmierern für Programmierer), deswegen gibt es die HOWTOs im Internet bzw. als Paket nachinstallieren. **Benutzung** * Aufruf: `man ` * Navigation (gemäß less-Pager): - Cursortasten, Enter, Leertaste - F (forward), B (backward) - G (go to the end), g (go to the begin) * Suchen: - Vorwärts (nach unten): /, Weitersuchen: n (next), Rückwärts nach oben suchen: N (Next) - Rückwärts (nach oben): ?, Weitersuchen: n (next), Rückwärts nach unten suchen: N (Next) * Beenden: q (quit) === Funktionsweise => man "manpath" Eine Konfigdatei, legt die Pfade fest: '/etc/manpath.config' ---- tux@deb8-2:~$ grep MANDB /etc/manpath.config # MANDB_MAP global_manpath [relative_catpath] MANDB_MAP /usr/man /var/cache/man/fsstnd MANDB_MAP /usr/share/man /var/cache/man MANDB_MAP /usr/local/man /var/cache/man/oldlocal MANDB_MAP /usr/local/share/man /var/cache/man/local MANDB_MAP /usr/X11R6/man /var/cache/man/X11R6 MANDB_MAP /opt/man /var/cache/man/opt tux@deb8-2:~$ ---- Weiterhin wird die Variable 'MANPATH' abgearbeitet, falls sie vorhanden ist. Die man-Pages liegen komprimiert vor, beim Aufruf werden sie unter '/var/cache/man' dekomprimiert abgelegt. Die tatsächliche Pfade ausgeben: `manpath -c` Der Cache lässt sich mit `catman` bereinigen, den Suchindex für 'apropos' kann man mit `mandb` neu aufbauen. Die man-Pages werden in sogenannten Abschnitten kategorisiert, siehe 'man man', z.B. * Abschnitt 1: Programme für Benutzer (unter /bin oder /usr/bin oder /usr/local/bin) * Abschnitt 4: Spezielle Dateien (Gerätedateien, siehe `man 4 null`) * Abschnitt 5: Dateiformate und Konventionen (z.B. Aufbau der Datei /etc/fstab: `man 5 fstab`) * Abschnitt 6: Spiele (z.B.: `man 6 fiberlamp`) * Abschnitt 8: Programme für root (unter /sbin oder /usr/sbin oder /usr/local/sbin) TIPP für die Praxis: Option '-a' verwenden, um sich alle Abschnitte einer gegebenen man-Page anzeigen zu lassen => man -a mount => man -a crontab (Hier werden nacheinander die Seiten der Abschnitte 1 und 5 geöffnet) Eine schnelle Suche im Beschreibungstext des Pages ist mit * apropos * man -k möglich. Hierbei wird aus 'NAME' bzw. 'BEZEICHNUNG' gesucht. Siehe auch `whatis `. Außerdem spielt hier auch das Kommando 'whereis' eine Rolle, es gibt mehrere Dinge aus: ---- tux@deb8-2:~$ whatis whereis whereis (1) - locate the binary, source, and manual page files for a command tux@deb8-2:~$ ---- == Topic 103.2 - Textströme mit Filtern verarbeiten => Seite 100 ff ZIEL: Ausfiltern von Zeichenströmen auf bestimmte, interessante Inhalt, dabei ist mehrzeilige Arbeitsweise möglich, wie es z.B. * join (join lines of two files on a common field) * paste (merge lines of files) möglich machen. Aber der Reihe nach, beginnen wir mit einfacheren Tools. === Komplettes Ausgeben von Dateien * cat (catenate = verketten), Abarbeitung von oben nach unten * tac (= reverses cat), Abarbeitung von unten nach oben Beispieldatei 1: `vi textfile1` ---- 1 Birnen 2 Äpfel 3 Bananen 4 Erdbeeren ---- Beispieldatei 2: `vi textfile2` ---- cat textfile2 hellgrün rot gelb dunkelgrün ---- === Zeilen filtern Nur eine gewisse Zahl von Zeilen ausgeben: * head (per Default die ersten 10 Zeilen ausgeben) - Wichtige Option: -n oder - * tail (per Default die letzten 10 Zeilen ausgeben) - Wichtige Optionen: ** Zeilenzahl: `-n ` oder `-` ** Folge dem Inputstrom (Monitoring) `-f` pder `--follow` + Bsp.: `tail -f /var/log/messages` Im Praxistest: ---- tux@deb8-2:~$ head -2 textfile1 textfile2 ==> textfile1 <== 1 Birnen 2 Äpfel ==> textfile2 <== hellgrün rot tux@deb8-2:~$ ---- AUFGABE: Lassen Sie sich nur die Zeilen 2 und 3 der Textdatei "textfile1" ausgeben, die insgesamt aus 4 Zeilen besteht. * Lösung 1: Nach unten bis einschließlich zur gewünschten Zeile gehen, dann von diesem ausgeschnittenen Bereich nach oben gehend den relevanten Rest stehen lassen: + + ---- tux@deb8-2:~$ head -3 textfile1 | tail -2 2 Äpfel 3 Bananen tux@deb8-2:~$ ---- * Lösung 2: Von unten bis einschließlich zur gewünschten Zeile gehen, dann von diesem ausgeschnittenen Bereich von oben herab gehend den relevanten Rest stehen lassen + + ---- tux@deb8-2:~$ tail -3 textfile1 | head -2 2 Äpfel 3 Bananen tux@deb8-2:~$ ---- === Zeilen nummerieren * nl dateiname (Leerzeilen werden per Default NICHT nummeriert) * cat -n dateiname === Pager (Textdateien seitenweise lesen) * more (Besitzt keine solchen Komfortfunktionen wie less z.B. beim Bildschirmauschnittsblättern) * less (= der Pager für man-Pages) Motto: **Less is more.** === Tabulatorschritte in Leerzeichen umwandeln Man kann mit expand/unexpand Tabulatorschritte in Leerzeichen umwandeln und umgekehrt. => AUFGABE: Welches Tool macht was genau? ---- tux@deb8-2:~$ whatis expand expand (1) - convert tabs to spaces tux@deb8-2:~$ whatis unexpand unexpand (1) - convert spaces to tabs ---- Weitere interessante Werkzeuge finden wir auf Seite 103 ff: * format text: 'fmt', Beispiel: Einen Text-Screenshot von virtueller (schwarzer) Konsole 1 formatieren + + ---- root@deb8-2:~# cat /dev/vcs1 > tty1.out root@deb8-2:~# root@deb8-2:~# fmt -w 40 tty1.out | head 5/732160 Bl�cke [ 12.054488] systemd-fsck[247]: /dev/sda7: sauber, 27/97536 Dateien, 22590/389 120 Bl�cke [ 12.115165] systemd-fsck[206]: /dev/sda6: sauber, 411/223104 Dateien, 36805/8 92416 Bl�cke [ 12.212506] systemd-fsck[245]: /dev/sda8: sauber, 42696/2297456 Dateien, 1211 ---- * print (pre stage, = Druckvorstufe z.B. für 'lp'): - Einen Offset von 7 Zeichen hinzufügen: 'pr', z.B. `pr -o 7 myfile.txt | lp` - Mit '-h' kann man auch einen eigenen Header einfügen: `pr -o 7 -h "Dienste und Portnummern" /etc/services | less` * word count: 'wc', Beispiel: `wc -l /etc/hosts`, Optionen: - Lines: '-l' oder '--lines' - Words: '-w' oder '--words' - Characters: '-m' oder '--chars' * hexadecimal dump: 'hexdump', Beispiele: - Partittionstabelle ausgeben: `hexdump /dev/sda | head -32 | tail -5` - Die Datei /etc/hostname im Oktalformat ausgeben: `hexdump -o /etc/hostname` * sort characters: 'sort', Beispiele: - Verzeichnisgrößen berechnen ('-n' = numerisch): `du -s /usr* | sort -n` - Top Ten der großen Verzeichnisse ('-r' = reverse): `du -s /usr/share/* | sort -nr | head` - Bequemer, weil "human" readeable ('-h'): `du -sh /usr/* | sort -h` - Sortierte Ausgabe in selbe Datei wieder zurückschreiben ('-o' = output file): `sort myfile.txt -o myfile.txt` ** ACHTUNG, so geht es nicht (DATENVERLUST!): `sort myfile.txt > myfile.txt` + (Zuerst wird wegen der Umleitung ein Filehandle eingerichtet, + dann die Datei geleert (mit ">>" würde append durchgeführt) und zum Schluss die leere Datei sortiert.) - Ignorieren des Case-Sensivität: Option '-i' * uniq (doppelte Zeilen entfernen): 'uniq', Beispiel: doppelte Dateien finden: - Im Experiment mit find, md5sum, sort und uniq führt dies schnell zu langen Zeilen, ein erster Versuch sieht so aus: + find -type f -exec md5sum {} \; | sort | uniq - Eine praktikable, elegante Lösung ist dann schon komplexer, siehe + + http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash + + ---- find -not -empty -type f -printf "%-30s'\t\"%h/%f\"\n" | \ sort -rn -t$'\t' | \ uniq -w30 -D | \ cut -f 2 -d $'\t' | \ xargs md5sum | \ sort | \ uniq -w32 --all-repeated=separate ---- + - PRÜFUNGSHINWEIS: Das Kommando 'uniq' kann u.U. überflüssig werden, wenn 'sort -u' (sort-option 'uniq') verwendet wird. * splitting files: 'split', per Default splittet das Kommando Dateien in **1000 ZEILEN** große Stücke auf, Beipiel: + + ---- # Top Ten der größten Dateien unter /usr/bin: ls -lhS /usr/bin/ # Die größte Datei jetzt aufsplitten (14 MB) split /usr/bin/syncthing # Zur Kontrolle die Größe der Einzelteile betrachten: du -sh x* # Jetzt die Teile wieder unter neuem Namen zusammensetzen: cat x* > syncthing.merged ---- * cutter (Spaltenweises Auftrennen von maschinenlesbaren Dateien): 'cut', - Optionen: ** Auftrennung nach Feldern (Spalten): '-f 1-3' (nur Felder 1 bis 3 ausgeben) ** Angeben des Trenners (delimiter): '-d:' (Hier ist der Trenner ist ein (":"), per Default ist es ein Tabulator-Schritt) ** Wegschneiden nach einer bestimmten Anzahl von Characters: '-c' - Beispiele: ** Ausgeben aller Benutzernamen und deren User-IDs: `cut -d: -f1,3 /etc/passwd` ** Herausfiltern des prozentualen Wertes der root-Partitionsauslastung: `df / | tail -1 | cut -c 46-47` * paste files (Dateiinhalte zeilenweise stumpf zu einer neuen, mehrspaltigen Datei zusammensetzen): 'paste', Beispiel: + ---- tux@deb8-2:~$ cat textfile1 textfile2 1 Birnen 2 Äpfel 3 Bananen 4 Erdbeeren hellgrün rot gelb dunkelgrün tux@deb8-2:~$ tux@deb8-2:~$ paste textfile1 textfile2 1 Birnen hellgrün 2 Äpfel rot 3 Bananen gelb 4 Erdbeeren dunkelgrün tux@deb8-2:~$ ---- * joining files (Dateiinhalte zeilenweise unter Verwendung eines gemeinsamen Feldes als Verbindungskriterium zur einer neuen, mehrspaltigen Datei zusammensetzen): 'join', Beispiel: + ---- tux@deb8-2:~$ cat obst farbe 1:Birnen 2:Äpfel 3:Bananen 1:hellgrün 2:dunkelgrün 3:gelb tux@deb8-2:~$ tux@deb8-2:~$ join -t: -j1 obst farbe 1:Birnen:hellgrün 2:Äpfel:dunkelgrün 3:Bananen:gelb tux@deb8-2:~$ ---- * translation of characters, Kommado 'tr', (es handelt sich um eine einfache Form von "sed", das Tool kann immer nur eine gleiche Anzahl von Zeichen übersetzen): - Beispiele: ** `echo ABC | tr 'A-Z' 'a-z'` ** `echo ABC | tr '[:upper:]' '[:lower:]'` ** Eine DOS-Datei in eine Unix-Datei umwandeln (Hintergrund: https://de.wikipedia.org/wiki/Zeilenumbruch): + + ---- tux@deb8-2:~$ vi dosfile # Am Zeilenende immer ein STRG + v sowie STRG + m anhängen (Insert-Modus)^M Zeile 1^M Zeile 2^M # Dateityp prüfen tux@deb8-2:~$ file dosfile dosfile: ASCII text, with CRLF line terminators tux@deb8-2:~$ # Zeilenumbruch umwandeln ('tr' kann man nicht Dateinamen übergeben!) cat dosfile | tr -d '\r' > unixfile tux@deb8-2:~$ tux@deb8-2:~$ file unixfile unixfile: ASCII text tux@deb8-2:~$ ---- * stream editor: 'sed' (Mehr dazu unter Topic 103.7 - "Reguläre Ausdrücke") == Topic 103.3 - Perform basic file management Literatur: Seite 111 ff, sowie http://pemmann.de/doc/lpi1/kleine-kommandoreferenz.pdf ZIEL: Neben grundlegenden Datei- und Verzeichnisoperationen lernen wir auch Kompressionswerkzeuge und Archivierungstool kennen und verstehen, sie einzusetzen. **Philosophie: 'Alles ist eine Datei.'** === Kommandos für Dateioperationen ==== Kommando "ls" Zweck: Auflisten von Verzeichnisinhalten und Dateieigenschaften Hier gleich mal eine Grafik zur wichtigsten Option '-l' (long), die sehr viele Details liefert: image::ls_long.jpg[ls mit Option 'long'] Wichtige Optionen: * '-l' - Langes Ausgabeformat * '-i' - Inode-Nummer (Datei-Knotennummer) * '-s' - Size der belegten Blöcke * '-a' - all Files: auch die versteckten "hidden" Files anzeigen (ausblenden von Profiles-Dateien, die separat + angesprochen werden müssen, sollen sie eine Aktion mit eingeschlossen werden) * '-h' - Dateigrößen menschengerecht (human readeable) in gut lesbare Einheiten umrechnen * '-S' - Nach der Größe der Datei sortieren * '-r' - Reverse (umgekehrte Sortierung) * '-R' - Rekursiv alle Unterverzeichnisse auflisten * '-d' - Directory-Eigenschaften betrachten, NICHT den Inhalt des Verzeichnisses, Dateijoker "*" entkräften für nichtrekursives Arbeiten: + ---- ls -l /usr/share/doc/*ba* ---- * '-t' Time sorted Output: Nach Änderungszeit (modification time) sortiert ausgeben ==== Kommando "cp" ZIEL: Kopieren und evl. gleichzeitig es umbenennen: Es gibt zwei grundsätzliche Modi: a) Kopiere eine oder mehrere Dateien in einen Zielordner: `cp /etc/fstab /etc/hostname /etc/hosts /tmp`, ein weiteres Beispiel: + HINWEIS: Wir verwenden hier das Kommando 'touch', das eigentlich ein Zeitstempelwerkzeug ist, um drei leere Dateien anzulegen. ---- touch a b c mkdir d cp a b c d ls -l d/ ---- b) Kopiere eine Datei auf eine andere, wobei sie ohne eine Sicherungskopie anzufertigen überschrieben wird, falls nicht der Schalter '-b' (backup) verwendet wird. ---- echo Hallo... > datei1.txt cp -b /etc/hostname datei1.txt cat datei1.txt datei1.txt~ ---- AUFGABEN: 1. Kopieren Sie in Ihr Verzeichnis '~/Dokumente' die Dateien '/etc/hosts.allow' und '/etc/hosts.deny' hinein. => cp /etc/hosts.allow /etc/hosts.deny ~/Dokumente/ 2. Kopieren Sie in Ihr Verzeichnis '\~/Dokumente' in das Verzeichnis '~/Downloads* hinein. => cp -r ~/Downloads/ ~/Dokumente/ 3. Kopieren Sie die Datei /etc/hosts unter Umbenennung zu 'IP-und-Hostnamen.txt' ins Verzeichnis '~/Dokumente'. => cp /etc/hosts ~/Dokumente/IP-und-Hostnamen.txt Bitte weitere Optionen in 'man cp' studieren, welche Optionen vereint der der Schalter '-a'? + Siehe https://wiki.ubuntuusers.de/cp/ * '-R' - Rekursiv arbeiten * '--preserve=all' - Preserve all: Dateirechte, Zeitstempel usw. erhalten * '-d' - no Dereference SymLinks: belasse die Links beim Kopieren so wie sie sind, nicht die dahinter stehenden Dateien kopieren Beispiel (als root auszuführen): ---- root@deb8-2:~# cp -a /var/lib/nfs /root/var_lib_nfs root@deb8-2:~# ls -ld /root/var_lib_nfs drwxr-xr-x 1 statd nogroup 134 Jan 19 16:29 /root/var_lib_nfs ---- ==== Kommando "mv" Das Kommando bedeutet 'move' und macht den Unterschied zu 'cp' aus: * Es benennt eine Datei oder ein Verzeichnis um, wenn die Operation im selben Pfad geschieht. * Es verschiebt Objekte, wenn als Zielpfad ein anderes Verzeichnis angegeben wird. ACHTUNG: Anders als 'cp' kann 'mv' immer rekursiv arbeiten (um die Umlagerung im Dateibaum zu ermöglichen), außerdem bleiben dabei naturgemäß Dateirechte, Zeitstempel usw. erhalten. ==== Kommando "rm" Mit 'remove' werden zuerst einmal nur Dateien gelöscht, will man Verzeichnisse löschen, muss rekursiv gearbeitet werden: Option '-r' Aus Sicherheitsgründen sollte ein Alias eingerichtet werden, der versehentliches Löschen durch interaktives Rückfragen vermeiden hilft: ---- root@deb8-2:~# alias rm='/bin/rm -i' root@deb8-2:~# cp -a /etc/ /root/etc_$(date +%F) root@deb8-2:~# root@deb8-2:~# root@deb8-2:~# du -sh /etc/ /root/etc_2016-01-20/ 12M /etc/ 12M /root/etc_2016-01-20/ root@deb8-2:~# root@deb8-2:~# rm -r /root/etc_2016-01-20/ /bin/rm: in Verzeichnis „/root/etc_2016-01-20/“ absteigen? j /bin/rm: reguläre Datei „/root/etc_2016-01-20/fstab“ entfernen? j /bin/rm: in Verzeichnis „/root/etc_2016-01-20/.java“ absteigen? j^C root@deb8-2:~# ---- Wie kann dann aber ein schnelles Löschen erzwungen werden? . Alias für einmalige Ausführung umgehen: Backslash voranstellen: `\rm -r /root/etc_2016-01-20/` . Alias aus der Umgebung entfernen: `unalias rm ; rm -r /root/etc_2016-01-20/` . Mit Hilfe der 'rm'-Option '-f' (force): `rm-rf /etc/*host*` === Kommandos für Verzeichnisoperationen ==== Kommandos 'mkdir' und 'rmdir' Mit 'mkdir' können neue Verzeichnisse angelegt werden, komplette Strukturen nur mit der Option '-p' (parents) ---- mkdir -p ~/Briefe/Privat/Einkaufen/Lebensmittel/Gesunde ---- Sicheres Löschen von Verzeichnisstrukturen am besten mit 'rmdir' durchführen, das nur leere Ordner löschen kann; hier gibt es auch wieder '-p' (parents): ---- rmdir -p ~/Briefe/Privat/Einkaufen/Lebensmittel/Gesunde ---- Metapher: Von rechts solange zurückrollen, bis man auf einen Widerstand stößt: das kann eine versteckte Datei z.B. '.keep' oder auch ein leerer Ordner sein. VORSICHT: Diese Art Aufräumaktionen NICHT mit der Systemwurzel durchführen!! ---- tux@deb8-2:~$ touch ~/Briefe/Privat/.keep tux@deb8-2:~$ rmdir -p ~/Briefe/Privat/Einkaufen/Lebensmittel/Gesunde rmdir: konnte Verzeichnis „/home/tux/Briefe/Privat“ nicht entfernen: Das Verzeichnis ist nicht leer tux@deb8-2:~$ ---- === Weitere wichtige Kommandos für Dateiarbeit: * 'touch' - Files "berühren", um den Zeitstempel zu ändern, wenn das File nicht existiert, wird es einfach erzeugt - FRAGE: Welchen der Zeitstempel kann 'touch' nicht ändern? - ANTWORT: Die 'Change Inode Time' (chown/chmod; find-Kürzel: -cmin/-ctime) zu ändern ist nicht direkt bzw. unabhängig möglich! ** Modification Time (vi / nano, libreoffice; find-Kürzel: -mmin/-mtime): Aus der man-Page: '-a change only the access time' ** Access Time (cat, more, less; find-Kürzel: -amin/-atime): Aus der man-Page: ' -m change only the modification time' * **dd** - disk dump: Files bestimmter Größe erzeugen, z.B. 100kB: `dd if=/dev/zero of=myLittleFile.img bs=100k count=1` * **find** - finden von Files aller Art, grundlegende Syntax `find [PFADE] [PFADTIEFE] [DATEISYSTEM] [BEDINGUNGen...] [AKTIONen...]` - Wichtige Optionen: ** Case-Sensitiv: '-name ' (es arbeitet immer rekursiv, auch versteckte Dateien werden mit gefunden) ** Ignore Case-Sensivity: '-iname ' ** Dateityp-Suche: '-type ' (Typen: file, directory, symlink, socket, pipe) ** Max. Verzeichnistiefe: '-maxdepth ', Beispiel: `find / -maxdepth 3 -name resolv.conf` ** Einschränkung auf das lokale Dateisystem: '-xdev', Beispiel: `find / -maxdepth 5 -xdev -name "*bashrc*"` ** Zeitstempel: siehe oben bei 'touch' ** Besitzer von Files: '-user , '-uid ** Leerzeichen durch Null-Zeichen für nachfolgende Ausführung via xargs ersetzen: '-print0' + + ---- tux@deb8-2:~$ find Dokumente/2016-01-21/* -print0 | xargs -0 du -h 4,0K Dokumente/2016-01-21/dateimanagement-redirects-pipes.adoc 0 Dokumente/2016-01-21/dateiname mit spaces.txt tux@deb8-2:~$ ### Weitere Beispiele: # Alle Dateien, die in eben dieser Minute durch 'make install' nach /usr kopiert wurden, # ausgeben: find /usr -cmin 1 # Ein Verzeichnis als Vergleichswert für Zeitstempelsuche heranziehen find -cnewer /home/tux/TimeStamp/ -type f -mmin -60 ---- === Wildcards für Dateinamen und -pfade (S. 117 f) * Stern ('*'): Bringt Übereinstimmung für eine beliebig lange Zeichenkette beliebiger Zeichen, auch kein Zeichen * Fragezeichen ('?'): Bringt Übereinstimmung für ein beliebiges Zeichen * In eckigen Klammen ('[abcxyz]'): Bringt Übereinstimmung für ein beliebiges Zeichen aus der hier angegebenen Menge bzw. des Bereiches + **Negation:** Mit einem nach der öffnenden Klammer eingefügten Ausrufezeichen ('!') wird Umkehrung erreicht (ACHTUNG: Bei regexp ist dies ähnlich, aber mit einem anderen Zeichen verbunden: ('^') Zum Beispiel nicht die Dateien ausgeben, die entweder auf eine 1 oder eine 2 enden: `ls -l textfile[!12]` === Wichtige Kommandos für Archivierung ==== tar - Für Tapes geschaffenes Archivierungsprogramm: - Ohne Komprimierung: `tar cf Dokumente.tar Dokumente/` - Mit GnuTar zugleich komprimieren (Dies können alte Unixe nicht!): `tar czf Dokumente.tar.gz Dokumente/` ** Hierbei bedeuten die Optionen: c = create, z = Packen mit gzip, f = filename of the archive ** Weitere Optionen: *** '-v' = verbose *** '-C' = change directory (`mkdir TMP ; tar xzvf Dokumente.tar.gz -C TMP/`) *** '-x' = eXtract *** '-j' = Packen mit bzip2 *** '-J' = Packen mit xz *** '-t' = table of content ausgeben, nicht entpacken ==== cpio (S. Seite 121, über STDIN / STDOUT kopieren): Einsatz beim rpm-Paketformat (rpm2cpio), es kennt drei Modi: A. Copy-IN: Schalter '-i' oder '--extract' (ins Dateisystem extrahieren) * Beispiel (im Verzeichnis /tmp): `cpio -i < ~/textfiles.cpio` B. Copy-OUT: Schalter '-o' oder '--create' (aus dem Dateisystem ins Archiv kopieren; = Erzeugung des Archivs) * Beispiel: `ls *.txt | cpio -o > textfiles.cpio` * Dateityp feststellen: `file textfiles.cpio` (textfiles.cpio: cpio archive) C. Copy-TROUGH: Schalter '-d' oder '--pass-through' (Via Standardinput Daten aufnehmen und ins Dateisystem kopieren) * Beispiel "Benutzer manuell erzeugen" (auszugsweise, als root durchzuführen): + + ---- # Heimatverzeichnis erzeugen mkdir /home/lisa # Vorlagen einkopieren (cp würde dot-files mit kopieren!) cd /etc/skel find | cpio -pdm /home/lisa ---- === Wichtige Kommandos für Komprimierung Anders als bei den Werkzeugen 'tar' und 'cpio' werden die Daten hier lediglich komprimiert, nicht in ein Archiv überführt. * gzip - Entpacken: gunzip oder `gzip -d` * bzip2 - Entpacken: bunzip2 oder `bzip -d` * xz - Entpacken: unxz oder `xz -d` Die typische Unix-Komprimierung läuft so, dass direkt mit der Originaldatei gearbeitet wird, die danach ein anderes Dateisuffix erhält und somit umbenannt wurde! Am Beispiel von gzip: ---- tux@deb8-2:~$ cp /etc/services . tux@deb8-2:~$ tux@deb8-2:~$ ls -lh services -rw-r--r-- 1 tux tux 20K Jan 22 10:40 services tux@deb8-2:~$ tux@deb8-2:~$ gzip -9 services tux@deb8-2:~$ tux@deb8-2:~$ ls -lh services ls: Zugriff auf services nicht möglich: Datei oder Verzeichnis nicht gefunden tux@deb8-2:~$ tux@deb8-2:~$ ls -lh services* -rw-r--r-- 1 tux tux 7,4K Jan 22 10:40 services.gz tux@deb8-2:~$ tux@deb8-2:~$ file services.gz services.gz: gzip compressed data, was "services", last modified: Fri Jan 22 10:40:29 2016, max compression, from Unix tux@deb8-2:~$ tux@deb8-2:~$ ### Wollen wir den Inhalt der komprimierten Datei sehen, ohne sie zu entpacken, müssen wir mit '-c' über STDOUT gehen: tux@deb8-2:~$ gunzip -c services.gz | less ---- AUFGABE: Führen Sie die selben Operationen mit 'bzip2' und 'xz' durch. Beispielhafte Lösungen: ---- cp /etc/services . bzip2 services cp /etc/services . xz services cp /etc/services . xz -9 -c services > services-level9.xz xz -1 -c services > services-level1.xz # Zum besseren Vergleichen nur die tatsächliche Dateigröße in Byte und den Dateinamen ausgeben ls -l services* | awk '{print$5, $9}' 19605 services 7229 services.bz2 7548 services.gz 7484 services-level1.xz 7156 services-level9.xz 7156 services.xz ---- === Archivierung mit Komprimierung verbinden Angenommen, es liegt nicht das moderne GNU-tar vor, sondern ein ein altes Unix-System, können die beiden Sparten trotzdem miteinander arbeiten: **a) Erzeugen eines komprimierten Archivs:** ---- # Der Bindestrich bedeutet in diesem Kontext: STDOUT für das Erzeugen des Archiv-files benutzen tar cvf - foodir | gzip > foo.tar.gz ---- **b) Entpacken des komprimierten Archivs:** ---- # Der Bindestrich bedeutet in diesem Kontext: STDIN für das Entpacken des Archiv-files benutzen gunzip -c foo.tar.gz | tar xvf - # oder gunzip < foo.tar.gz | tar xvf - ---- Bitte den Schalter '-c' bei den Komprimierern gzip, bzip2 und xz wahrnehmen, durch ihn lassen sich erst die von tar stammenden Daten weiterverarbeiten. == Topic 103.4 - Use streams, pipes and redirects === Standard-Datenströme der Unix-Shells Siehe S. 125 oben * **Kanal STDIN:** Dateideskriptor = 0, Umleitungs-Kürzel: "<", anhängende Arbeitsweise als Here-Dokument: "<", anhängende Arbeitsweise ">>" * **Kanal STDERR:** Dateideskriptor = 2, Umleitungs-Kürzel: "2>", anhängende Arbeitsweise "2>>" ANMERKUNG: Den Dateidekriptor kann man weglassen, wenn das Kürzel eine eindeutige Interpretation durch die "Pfeilrichtung" zulässt, ansonsten muss die Ziffer angegeben werden. Bei STDERR muss sie immer mit notiert werden. a) Zu Kanal STDIN: Motto: Ein Kommando liest von der Tastatur: ---- tux@deb8-2:~$ wc -l Hallo? ABC... Fertig? 5 tux@deb8-2:~$ tux@deb8-2:~$ #### Ja, durch Drücken von 'STRG + D' (End of File, EoF) ---- b) Zu Kanal STDOUT: ---- tux@deb8-2:~$ df -h / Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/sda5 28G 6,2G 21G 24% / tux@deb8-2:~$ ---- c) Zu Kanal STDERR (wird genauso wie STDOUT ins Terminal gesendet): ---- tux@deb8-2:~$ df -h /SERVER df: „/SERVER“: Datei oder Verzeichnis nicht gefunden tux@deb8-2:~$ ---- Siehe http://www.netzmafia.de/skripten/unix/unix2.html === Pipelines zum Weiterverarbeiten der Datenströme Das Kürzel für Pipes ist lediglich ein einzelnes Bar-Zeichen ('|'), dabei wird die Ausgabe eines Kommandos immer zur Eingabe des nächsten (STDOUT wird zu STDIN): => cmd1 | cmd2 | cmd3 Beispiel: ---- tux@deb8-2:~$ df -h / | tail -1 /dev/sda5 28G 6,2G 21G 24% / tux@deb8-2:~$ ---- Beim Durchreichen der Daten tritt jetzt allerdings ein Problem auf: **Zwischenergebnisse gehen verloren!** Im Beispiel von oben ist uns ja der Header, also die folgende Zeile verlorengegangen: Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf Wie kann man nun darauf zurückgreifen: Es muss ein T-Stück (engl: 'tee') eingebaut werden: ---- tux@deb8-2:~$ df -h / | tee header+content.txt | tail -1 /dev/sda5 28G 6,2G 21G 24% / tux@deb8-2:~$ tux@deb8-2:~$ cat header+content.txt Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/sda5 28G 6,2G 21G 24% / tux@deb8-2:~$ ---- Siehe: https://de.wikipedia.org/wiki/Tee_%28Unix%29 Dort liest man auch über die für uns wichtige Option '-a' (append): "Mit -a wird an die angegebene Datei angehängt (anstatt eine neue leere Datei zu eröffnen)" === Umleitungen der Standardkanäle durchführen Siehe oben bei der Erklärung der drei Standard-Ströme. Es lassen sich Kanäle verbinden, daszu wird das Kaufmanns-Und eingesetzt: ---- Aus Prüfung B) In bash, inserting 2>&1 after a command redirects A. standard error to standard input. B. standard input to standard error. C. standard output to standard error. D. standard error to standard output. E. standard output to standard input. Richtige Antwort: D ---- Hintergrund: Für typische Aufgaben wie das Kompilieren von Anwendungen soll jeglicher Output, auch Fehlermeldungen gespeichert werden: ---- make > my-important-file.log 2>&1 ---- Weitere Verbindungsmöglichkeiten: https://www.thomas-krenn.com/de/wiki/Bash_stdout_und_stderr_umleiten ---- ### Bash redirection # stdout -> Datei umleiten programm > Datei.txt # stderr -> Datei umleiten programm 2> Datei.txt # stdout UND stderr -> Datei umleiten programm &> Datei.txt # stdout -> stderr programm 1>&2 #stderr -> stdout programm 2>&1 ---- Ein Beispiel mit einer Datei, in der Klein- und Großschreibung wild gemischt sind. Es soll alles in Kleinbuchstaben umgewandelt werden: ---- tux@deb8-2:~$ tr '[:upper:]' '[:lower:]' < kontakte | nl 1 müller 2 meier 3 schulze tux@deb8-2:~$ ---- === Weitere Verarbeitungskürzel der bash * Kommandozeilen OHNE Prüfung des Exitcodes aneinanderreihen mit Hilfe dem Semikolon (';') * Kurztests auf Erfolg durchführen - Nur bei Erfolg weiterarbeiten (zwei Ampersand-Zeichen): '&&' - Nur bei Misserfolg weiterarbeiten (zwei Bar-Zeichen): '||' + Beispiele: ---- tux@deb8-2:~$ cat /etc/hostname && echo Alles OK. deb8-2 Alles OK. tux@deb8-2:~$ tux@deb8-2:~$ cat /etc/HOSTNAME && echo Alles OK. cat: /etc/HOSTNAME: Datei oder Verzeichnis nicht gefunden tux@deb8-2:~$ ---- ---- tux@deb8-2:~$ cat /etc/hostname || echo Wir gehen zu Plan über.... deb8-2 tux@deb8-2:~$ tux@deb8-2:~$ cat /etc/HOSTNAME || echo Wir gehen zu Plan über.... cat: /etc/HOSTNAME: Datei oder Verzeichnis nicht gefunden Wir gehen zu Plan über.... tux@deb8-2:~$ ---- == Topic 103.5 - Create, monitor and kill processes Siehe Seite 128 ff === Überwachen von Prozessen Wichtige Werkzeuge sind unter anderem: * **ps** - Process Snapshots (ohne Option: Nur die Prozesse der aktuellen Shellumgebung werden angezeigt) - Optionen (Achtung: Bindestriche zu verwenden, bedeutet die Syntax gemäß POSIX/Unix (Stichwörter: AT&T, Solaris) anzuwenden, keine Bindestriche dagegen heißt BSD-Syntax zu wollen): ** **a** - Alle Prozesse ausgeben, auch die von anderen Benutzern ** **u** - User defined Format (ausführlich) ** **x** - Nicht mit einer Shell verbundenen Daemons ebenfalls ausgeben (Kennzeichen in Spalte 'TTY': ('?')) ** **l** - Long Listing, auch Prioritäts- und Nice-werte auflisten ** **-C** - Die Prozesse, die ein bestimmter Dienst verursacht, auflisten, Bsp.: `ps -C sshd` ** **-U** - Die Prozesse, die ein bestimmter Nutzer verursacht, auflisten * **pstree** - Prozess in Baumform ausgeben - Optionen: ** **-p** - Prozess-IDs ausgeben ** **-n** - Prozess-ID numerisch sortieren * **top** - Prozesse in einem sich selbst aktualisierenden Monitor präsentieren (top = die größten Ressourcenverbraucher zuerst) - Wichtige Ausgaben im Programmfenster: ** Erste Zeile: Statistiken gemäß Kommando 'uptime' ** Zweite und dritte Zeile: Statistiken über Prozesse und CPU-Auslastung ** Vierte und fünfte Zeile: RAM-Auslastung gemäß Kommando 'free' anzeigen ** Die weiteren Zeilen: Live-Monitor - Interaktive Bedienung des Programmes: ** **q** - quit ** **1** - alle Prozessoren anzeigen ** **u** - Nach einem Nutzer filtern ** **r** - Renice von Prozessen durchführen (Nice-Wert nachträglich ändern) ** **k** - Killen von Prozessen (PID und Signalnummer angeben) - Wichtige Optionen: ** **-i** - Nur aktive Prozesse anzeigen ** **-d