GNU / Linux für Fachinformatiker (Systemintegration)

Unterrichtsmaterialien

Folien

Installation Hyper-V

... und bei der Gelegenheit auch WSL.

Windows-Server

Einrichtung Hyper-V VM

  1. Maschine Erstellen

    • Name "Live" oder so (eigentlich egal)
    • Generation 2 (nicht egal!)
    • 4096 MB Arbeitsspeicher (2048 reichen eigentlich auch)
    • Festplatte ist erstmal egal
    • Live-Medium live-dvd.iso (wie oben)
  2. Zusätzliche Konfiguration

    • Rechtsklick auf "Live" → Einstellungen
    • Prozessor: CPU-Kerne nach Bedarf (z.B. 4)
    • Arbeitsspeicher: kein dynamischer Arbeitsspeicher
    • Sicherheit: Sicheren Start deaktivieren (wichtig!)

Aufgabe Dateipfade

Benutzt ls um folgende Ausgabe anzuzeigen:

-r--r--r-- 1 root root 12M 17. Nov 11:30 /boot/vmlinuz

-r--r--r-- 1 root root 12M 17. Nov 11:30 vmlinuz

-r--r--r-- 1 root root 12101568 17. Nov 11:30 ../boot/vmlinuz

-r--r--r-- 1 root root 12M 17. Nov 11:30 ../vmlinuz

                       ^- Größe beachten ^- Pfad beachten

Antwort wieder als Screenshot im Privatchat

Hiniweis:

  • Absolute Pfade beginnen immer mit einem /.
  • Relative Pfade beginnen niemals mit /.
  • Relative Pfade gelten relativ zum Arbeitsverzeichnis.
  • Das Arbeitsverzeichnis wechselt man mit cd.

Hinweis: Es gibt mehrere Dateien namens vmlinuz im System. Diese sehen aber unterschiedlich aus und alle Beispiele hier zeigen die selbe Datei.

Zusatz: Sorge dafür, dass alle vier Zeilen direkt untereinander stehen.

Dateisysteme

Dateisysteme_1.svg

Aufgabe Dateien und Ordner

Mit dem Kommando tree kann man Dateien in einer Baumansicht anzeigen.

Erstelle folgenden Ordnerbaum. Ortsnamen sind Ordner, Bahnhöfe sind Dateien.

~$ tree -C DE/
DE/
├── Berlin
│   ├── Berlin Alexanderplatz
│   ├── Berlin Friedrichstraße
│   ├── Berlin Ostbahnhof
│   ├── Berlin Ostkreuz
│   └── Betriebsbahnhof Rummelsburg
└── Brandenburg
    ├── Brand Tropical Island
    ├── Cottbus
    │   ├── Cottbus Hbf
    │   ├── Cottbus-Merzdorf
    │   ├── Cottbus-Sandow
    │   └── Cottbus-Wilmersdorf Nord
    ├── Lübbenau (Spreewald)
    ├── Lübben (Spreewald)
    ├── Raddusch
    └── Vetschau

4 directories, 14 files

Schickt mir am Ende via Teams einen Screenshot per Privatnachricht.

Hinweis: Benötigte Kommandos sind touch und mkdir. Nutzt cd, um weniger Schreibarbeit zu haben. Wenn ihr euch vertippt, müsst ihr auch rm, rmdir, oder mv nutzen.

Hinweis: Nicht nur Leerzeichen müssen besonders behandelt werden ;-)

Zusatz

Man kann den ganzen Ordnerbaum mit zwei Befehlen erstellen. Postet mir die Befehlszeilen.

Manuelle Installation

Teil 1, Freitag 28. Nov.

~# fdisk /dev/sda
 : g
 : n
 > 1
 > 2048
 > +64M
 : n
 > 2
 > (enter)
 > +20G
 : n
 > 3
 > (enter)
 > -8G
 : n
 > 4
 > (enter)
 > (enter)
 : t
 > 1
 > 1
 : w

~# mkfs.vfat -F32 -n SYSTEM /dev/sda1
~# mkfs.ext3 -L Debian /dev/sda2
~# mkfs.btrfs -L home /dev/sda3
~# mkswap -L SWAP /dev/sda4

~# mount /dev/sda2 /mnt
~# debootstrap --variant=minbase trixie /mnt
~# mount -o rbind /dev /mnt/dev
~# mount -o rbind /proc /mnt/proc
~# mount -o rbind /sys /mnt/sys

~# chroot /mnt
  ~# apt-get install --no-install-recommends grub-efi network-manager init nano linux-image-amd64
  ~# update-initramfs -u
  ~# mkdir /boot/efi
  ~# mount /dev/sda1 /boot/efi
  ~# grub-install
  ~# update-grub

Root-Passwort fixen via GRUB-"Hack"

  • Im grub-Menü e drücken
  • in der linux ...-Zeile quiet ersetzen durch init=/bin/bash

    • Amerikanische Tastatur (muhahaha)
  • F10 zum durchbooten
  • → Prozess 1 wird eine bash als root-User (win!)
  • → Filesystem ist aber readonly :-(
  • ~# mount -o remount,rw /
  • ~# passwd
    ...
  • ~# mount -o remount,ro /

/etc/fstab erzeugen mit nano

# Quelle     Mountpunkt   Typ    Optionen       Dump/Pass
/dev/sda2    /            ext4   rw             0 0
/dev/sda3    /home        btrfs  defaults       0 0
/dev/sda1    /boot/efi    vfat   ro,umask=0077  0 0
UUID=...     none         swap   sw             0 0

Teil 2, Dienstag, 2. Dez. (Legacy-Boot)

~# fdisk /dev/sda
 : o
 : n
 > p
 > 1
 > 2048
 > -8G
 : n
 > p
 > 2
 > (enter)
 > (enter)
 : w

~# mkfs.btrfs /dev/sda1
~# mkswap /dev/sda2

~# mount /dev/sda1 /mnt
~# btrfs subvolume create /mnt/trixie
~# btrfs sub cre /mnt/home
~# debootstrap --variant=minbase trixie /mnt/trixie

~# umount /mnt
~# mount -o subvol=trixie /dev/sda1  /mnt
~# mount -o rbind /dev /mnt/dev
~# mount -o rbind /proc /mnt/proc
~# mount -o rbind /sys /mnt/sys

~# chroot /mnt
  ~# apt-get install --no-install-recommends grub-pc net-tools ifupdown busybox-static nano vim isc-dhcp-client iputils-ping linux-image-amd64 init systemd-

~# grub-install /dev/sda
~# update-grub
~# passwd
   ...

-> REBOOT

Aufgabe Pipelines

überfliegt die man-pages zu den Mini-Pipeline-Programmen
wc, grep, sort, uniq, cut, tr

Frage 1:

Wie viele verschiedene Straßen- u. Platznamen gibt es in Berlin?

Hinweis: Es gibt 13171 Einträge im Straßenverzeichnis. Hier kommen einige Straßen jedoch mehrfach vor, wenn sie durch mehrere Bezirke gehen.

Antwort via Teams-Privatnachricht.

Zusatz: Wie kann man genau die Einträge auflisten, die mehrfach vorkommen?

Frage 2:

Wie viele verschiedene Stadtteile gibt es laut Liste in Berlin.

Task-Switching und Speicherschutz (Multitasking)

CPU-Architektur

"Virtualisierung"

Historisch wird bereits Einfacher Speicherschutz als Virtualisierung betrachtet. Heutzutage sind mit dem Begriff idR. Hypervisor-Techniken gemeint, die Abstufungen sind jedoch vielfältig.

Speicherschutz, Chroot, Usermode Linux, Container, Emulation, Hypervisor

Aufgabe Reguläre Ausdrücke

Geht die Lektionen auf https://regexone.com durch.

Hinweis: beachtet den Erklärtext. Es geht darum die Muster mit den jeweils angegeben Techniken zu finden, nicht nur irgendwie.

Zusatz: Versucht die selben Suchmuster im Programm grep nachzuvollziehen. Beachtet, dass dort das Suchmuster als Argument, und der Suchtext als "Eingabedatenstrom" übergeben werden.

Hinweis: Die Regex-Syntax von der Webseite entspricht grep -P. Nutzt außerdem grep --color=auto -P ....

Aufgabe Netzwerk

Stellt sicher, dass ihr auf einem Rechner im Schulungsraum arbeitet.

Verbindet euch mit nc/netcat/ncat zu 10.0.9.104 Port 1024.

Schickt mir einen Screenshot des Textes, der euch entgegen kommt.

Zusatz: Schaut in der man-Page zu ncat nach, wie ihr den augehenden Port bestimmen könnt. Verbindet euch von Port 2048 aus.

Hinweis: Das Programm auf dem Server ist

~$ ncat -vklp 1024 0.0.0.0 -c 'cat "Text.txt"'

Aufgabe TMUX

Benutzt tmux um Text vom Terminal zu kopieren.

Auf dem Dozentenrechner (ssh user@10.0.9.104) liegt eine Datei namens "ソニー株式会社" (der Name der Firma Sony). Benutzt die Kopieren-und-Einfügen-Funktion von tmux um den Dateinamen zu Kopieren und jeweils eine Datei namens "ソニー株式会社-NAME" (mit eurem Namen) anzulegen.

  1. Strg+b [ → zum Text scrollen
  2. Strg+SPACE → Text markieren
  3. Alt+w → kopiert den Text
  4. Strg+b ] → fügt den Text ein

Hinweis: Benutze dazu eine eigene tmux-Session → Strg+b d (um die gemeinsame Session zu verlassen), tmux (ohne Argument) starten.

WSL - Windows Subsystem for Linux

\> wsl --update
\> wsl --install -d debian
\> wsl --set-version debian 2
\> wsl --list -v
-> sollte Debian in WSLv2 listen
\> wsl
-> Startet die Linux-Shell
~$ sudo apt-get update
~$ sudo apt-get install pciutils usbutils psutils psmisc net-tools x11-apps kcalc
^^ für die Beispile, die wir hier fahren

Logical Volume Manager (LVM)

Physical Volumes - Volume Group - Logical Volumes

Aufgabe VIM

Startet im Terminal das Programm vimtutor und geht das Tutorial durch.

Zusatz (einfach):

  • Probiert den vi-Modus in kate aus.

Zusatz (Advanced!):

  • Wie kann man eigentlich automatisch Klammern schließen lassen?
  • Wie kann ich Zeilennummern einblenden

    • in roter Farbe ;-)
  • Wie kann man in einem Shellscript IF-Bedingungen einklappen

Hinweis: vergesst nicht, Pause zu machen.

Aufgabe xargs

LPIC-1 101 Handbuch, Seite 298 (nach gedruckter Seitenzahl), Aufgabe 4:

Der Befehl convert image.jpeg -resize 25% small/image.jpeg erzeugt eine kleinere Version von "image.jpeg" und legt das resultierende Bild in einer gleichnamigen Datei des Unterverzeichnis "small" ab. Wie ist es mit xargs möglich, für jedes in der Datei "filelist.txt" aufgeführte Bild den gleichen Befehl auszuführen?

Hinweis um die Voraussetzungen zu erfüllen:

~$ sudo apt-get install imagemagick
~$ wget "https://plutz.net/training/damago_2025_11/[attachment]/"HVServer-{1..5}.png
~$ mkdir small/
~$ printf %s\\n HVServer*png >filelist.txt
~$ convert HVServer-1.png -resize 25% small/HVServer-1.png

(die letzte Zeile ist nur ein Beispielhafter Aufruf. Dieser Befehl soll via xargs automatisiert werden)

Oktale Zugriffsberechtigungen (Einführung)

 U   G   O
rwx rwx rwx

111 111 111
  7   7   7

  6   4   4
110 100 100
rw- r-- r--

rwx r-x r-x
  7   5   5

Beispiele:

~$ chmod 644 filelist.txt, ~$ chmod 755 filelist.txt

Aufgabe / Wiederholung Systeminstallation

  1. Legte eine neue VM in Hyper-V an

  2. Installiert Archlinux gemäß der Anleitung auf

    https://wiki.archlinux.org/title/Installation_guide

Hinweis: Die Signaturprüfung des Downloadmediums kann bequem in wsl ausgeführt werden.

Hinweis: Bei der GRUB-Installation sollte auch das Paket "efibootmgr" mit installiert sein

Kurs Teil 2

Begriffe / Programme für grafische Oberflächen

  • Grafikserver: xorg

    • Xorg vt07
    • export DISPLAY=:0; ...
  • Display-Manager

    • lightdm, gdm, lxdm, nodm, ...
    • Startet den Grafikserver und fragt idR. Benutzerlogins ab
  • Session-Manager

    • Startet die Komponenten des grafischen Desktops (Menüleiste, Programmautostart, ...)
  • Window-Manager

    • Zichnet "Fensterdekoration" / "Titelleiste"
    • Verwaltet Größenänderungen u. Position von Fenstern

Dienstprogramme

  • setxkbmap (Tatstaturbelegung)

    • setxkbmap de, setxkbmap us
  • xrandr (Bildschirmauflösung)

    • Beispiel: xrandr --output eDP-1 --mode 1024x768
    • Beispiel: xrandr --output eDP-1 --rotate left
  • xinput

    • xinput list-props "Gerätename"

    • xinput set-prop "Gerätename" "Propertyname" Wert

      z.B.: xinput set-prop "Microsoft Vmbus HID-compliant Mouse" "libinput Natural Scrolling Enabled" 1

Diagnose / Debugging

  • xev (Input-Events zeigen)

Aufgabe numerische Zugriffsmodi

Legt die Dateien a, b, c, d, e an. Ändert mit chmod die Zugriffsmodi (Berechtigungen) so, dass folgendes Bild entsteht:

-----w---- 1 damago damago 0  9. Jan 09:58 a
----r-x--- 1 damago damago 0  9. Jan 09:58 b
---x---r-- 1 damago damago 0  9. Jan 09:58 c
--w-----w- 1 damago damago 0  9. Jan 09:58 d
-r-------t 1 damago damago 0  9. Jan 09:58 e

Benutzt die numerische ("oktale") Angabe für den Zugriffsmodus. Beachtet, das "t" in der letzten Datei.

Antwort bitte als Screenshot oder Shellkommando per Teams-Chat.

Zusatzaufgabe

d----w---- 1 damago damago 0  9. Jan 10:11 a
p---r-s--- 1 damago damago 0  9. Jan 10:11 b
---S---r-- 1 damago damago 0  9. Jan 10:12 c
s-w-----w- 1 damago damago 0  9. Jan 10:14 d
lrwxrwxrwx 1 damago damago 1  9. Jan 10:11 e -> e

Shellscripting

  • Befehle genauso wie in der interaktiven Shell
  • Scriptdateien beginnen mit #!/bin/sh bzw. #!/bin/bash
  • Scriptdateien sollten Ausführungsrechte haben
  • Häufig liegen Scriptdateien nicht im normalen Ausführungspfad wie "/bin" oder "/usr/bin". Zum Ausführen auf der Shell muss dann der Pfad der Datei mit angegeben werden, im einfachsten Fall: ./scriptdatei

Aufgabe Scripting

Schreibt ein Shellscript, das

  1. nach eurem Namen fragt
  2. den Namen von der Tastatur liest und
  3. euch dann mit eurem Namen begrüßt.

Eingaben können mittels read in eine Variable gelesen werden.

Hinweise

  1. Variablen werden beim Auslesen mit $dollarzeichen geschrieben, bei der Zuweisung ohne.

  2. read hat keine eigene man-Page. Es ist ein Builtin der Shell, und wird z.B. in der man-Page der "dash" unter "Builtins" dokumentiert (man-Pages können mittels / durchsucht werden).

Zusatz

Der Befehlt head -n1 liest ebenfalls genau eine Zeile vom Terminal. Benutzt eine "Command Substitution" ($(...)) um den Namen in eine Variable zu lesen, ohne read zu benutzen.

Aufgabe Kontrollstrukturen

Erweitert das Begrüßungsscript folgendermaßen

  1. neben dem eingelesenen Namen soll auch eine Variable "stunde" gesetzt werden

    • Um die aktuelle Stunde herauszubekommen kann das Programm date verwendet werden
    • die Variable wird dann einfach via Command Substitution gesetzt
    • Zum Testen soll zunächst in der Grußausgabe einfach die Stunde mit aufgeführt werden (z.B. "11 Uhr: Hallo Friedbert!")

    Hinweis: Ihr müsst hier selbst recherchieren, wie man date dazu bekommt, nur die Stunde der aktuellen Uhrzeit auszugeben.

  2. Das Programm test kann Zahlen vergleichen (man-Page). Ergebnis eines Vergleichs ist der "Return-Code" des Programms. Dieser ist auf der Kommandozeile nicht sichtbar.

    Mit dem && Operator können Kommandos verkettet werden. Das zweite Kommando wird dann nur ausgeführt, wenn das erste einen erfolgreichen Return-Code liefert: test ... && echo Guten Morgen

    • Schreibt das Script mit einem test und && so weiter, dass zu jeder Stund kleiner 13 ein "Guten Morgen" ausgegeben wird und zu jeder Stunde größer/gleich 13 ein "Guten Abend"
  3. Mit if ... then ... else ... fi kann man Verzweigungen aufgrund eines Return Codes bauen.

    • Hinter dem if-Schlüsselwort kommt ein Programmaufruf, der entweder erfolgreich oder fehlerhaft beendet: if test...

    • bei Erfolg werden die Kommandos in einem then-Block ausgeführt:

      if ...
      then
        ...
        ...
    • Optional kann ein else-Block angegeben werden, der ausgeführt wird, wenn das Bedingungsprogramm mit einem Fehler beendet:

      if ...
      then
        ...
        ...
      else
        ...
        ...
    • Abgeschlossen wird das eine solche if-Gruppe mit dem Schlüsselwort fi ("if" rückwärts)

      if ...
      then
        ...
        ...
      else
        ...
        ...
      fi
    • Aufgabe: Schreibt die Uhrzeit-Weiche mit if-Bedingungen.

  4. Innerhalb eines then- bzw. else-Blocks kann eine weitere if-Abfrage stehen (if ... then ... fi). Dies bezeichnet man als "Verschachtelung", bzw. "Verschachtelte Bedingung":

    if ...
    then
      ...
      if ...
      then
        ...
        ...
      fi
      ...
    else
      ...
      ...
    fi

    Hier müsst ihr darauf achten, die Anweisungen aus dem äußeren und dem inneren if-Block nicht zu vermischen.

    • Unterscheidet in verschachtelten if-Blöcken folgende Uhrzeiten:

      • 0 - 9 Uhr: Guten Morgen
      • 10 - 13 Uhr: Mahlzeit
      • 14 - 18 Uhr: Guten Tag
      • 19 - 24 Uhr: Guten Abend
    • Zusatz: Zwischen 23:00 und 4:00 Uhr soll die Begrüßung "Huuuhuuu" sein.

    • Zusatz: Schaut euch das elif-Schlüsselwort an um die Verschachtelungstiefe der if-Abfragen zu reduzieren.

Aufgabe read:

Lest mit read aus einer Zeile die Variablen "eins" "zwei" "drei" und "vier" ein.

Gebt alle vier Variable einzeln aus, und beantwortet folgende Fragen:

  1. Welche Eingabe muss ich machen, damit die Variable "drei" den wert "schnabbeldifoo" bekommt?

  2. Welche Werte nehmen die Variablen an, wenn in der Eingabe fünf oder sechs verschiedene Worte übergeben werden?

Anmerkungen zu read

~$ echo alpha beta gamma |read eins zwei drei

→ Das Pipe-Konstrukt zwingt die Shell dazu, read in einem Unterprozess auszuführen. Deshalb stehen mir die gelesenen Variablenwerete nich in der Aufrufshell zur Verfügung.

Ein Heredoc kann helfen:

~$ read eins zwei drei <<EOF
alpha beta gamma
EOF

Eine Command Substitution im Heredoc erlaubt das lesen von Programmrückgaben:

~$ read stunde minute sekunde <<EOF
$(date "+%H %M %s")
EOF

Aufgabe Scripting / Netzwerk

Der read-Befehl kann mehrere Variablen auf einmal einlesen. Diese werden an Leerzeilen separiert.

  1. Benutzt read um von einer Zeile die Variablen "method", "info" und "proto" zu lesen.

  2. gebt mittels cat eine Datei aus, die dem Dateinamen aus "info" entspricht.

  3. Richtet das Script als inetd-Service auf Port 1080 ein.

Beispiel für die Bedienung:

~$ echo foo /etc/inetd.conf bar |nc localhost 1080

-> soll die Datei inetd.conf auf dem Terminal ausgeben.

(Das macht jetzt noch nicht viel sinn, wird aber bald weiter entwickelt)

Mit Überprüfung:

Bevor cat die Datei ausgibt soll überprüft werden, ob diese existiert und gelesen werden kann. Hierzu kann das test-Programm benutzt werden.

  1. Schreibt eine if/test-Abfrage um zu überprüfen, ob die Datei "$info" existiert. Gebt die Datei in dem Fall wie bisher mit cat aus. Ansonsten soll ausgegeben werden "Not Found".

Aufgabe while-Schleife

Schreibt eine Scriptdatei mit einer einzelnen While-Schleife:

while TESTPROGRAMM; do
  KOMMANDO
  KOMMANDO
  ...
done

Die Schleife soll prüfen, ob die Datei "TEST" im Heimverzeichnis existiert und lesbar ist. Solange dies der Fall ist, soll die Schleife konstant einen Punkt (".") auf dem Terminal ausgeben. Das Programm endet, sobald die Datei TEST verschwindet oder Leserechte verliert.

Hinweis: zum testen muss die Datei "TEST" natürlich existieren.

Zusatz

Damit die Schleife nicht eine Billion Punkte ins Terminal schreibt, soll sie durch ein sleep ausgebremst werden. Außerdem sollen alle Punkte auf der selben Zeile aufgereiht werden.

Aufgabe Netzwerkdienst

Das inetd-Script aus der vorletzten Aufgabe soll angepasst werden. Nachdem die Variablen "method", "info" und "proto" gelesen wurden, sollen noch weitere Zeilen eingelesen werden, bis eine Leerzeile auftaucht.

Der Inhalt der gelesenen Zeilen wird ignoriert.

Schleifenbedingung ist, dass die zuletzt gelesene Zeile nicht leer ist (siehe man-Page zu test).

Die Ausgabe der "$info"-Datei erfolgt erst, nachdem eine Leerzeile gelesen wurde.