Skip to main content Milestones Snippets Activity Groups Projects Create a new issue
svc's avatar
svc authored
6d50d7b4

Linux Administration im Seminar SVC und WIS

0. Bedienungshilfen

- history # Anzeige der Kommandohistorie, beim User student und root: "h"
- Mit der Pfeil-nach-oben-Taste (↑) können Sie durch die vorherigen Befehle blättern.
- Mit der Pfeil-nach-unten-Taste (↓) gehen Sie in der Liste wieder nach vorne.
- !!  # Letztes Kommando wiederholen
- !42 # Wiederhole Kommando 42 in der Historie
- Suchen in der History (Ctrl + R)
- Drücke erneut Ctrl + R, um zum nächstälteren passenden Befehl zu springen. 

- Doppelklick -> Wort markieren
- Mausrad drücken -> Wort wird an aktueller Cursorstelle eingefügt

1. Erste Schritte

pwd
who
who am i          # IP-Adresse des Client
whois
curl ipinfo.io
date
hostname
echo $PATH        # Kommandosuchpfade
env               # Umgebungsvariablen anzeigen        
clear             # Bildschirm löschen
sudo -i           # Root bash starten
uname -a          # Kernelversion
lsb_release -a    # Linuxversion (sudo apt-get install lsb-core)
nano Dateiname    # 

Cheatsheet zum Nano-Editor

1.1 sshd Konfiguration

sshd -T # Anzeige der aktuellen Einstellungen im sshd
nano /etc/ssh/sshd_config :
PasswordAuthentication yes
PermitRootLogin yes
PubkeyAuthentication yes

systemctl status sshd
systemctl restart sshd

# Auf dem Linuxclient:
ssh-keygen 
ssh-copy-id root@name.tp10cloud.de
ssh root@name.tp10cloud.de "apt install -y mtr"

# Auf Windows
CMD starten
c:\Users\...>powershell
ssh-keygen.exe
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@PDB220001 "cat >> .ssh/authorized_keys"


ssh-keygen -y -f priv_key.pem   > pub_key # Public key aus dem private Key erzeugen
# Privacy Enhanced Mail, Klartext Header+Foot + Base64 Kodierung

Ansible Module: https://docs.ansible.com/projects/ansible/latest/collections/index_module.html

1.2 /etc/ssh/ssh_config:

. . ServerAliveInterval 60

2. Dateisystem

cd                      # Verzeichniss wechseln
cp, mv,rm               # Kopieren, verschieben/umbenennen, löschen 
du -sh * Verzeichnis    # Speicherplatzbelegung der Verz.
tree                    # Anzeige des Dateisystems als Baumstruktur
tree  -L Level          # 
mc                      # Midnight Commander <ctrl><o> ausblenden/aktivieren
vi, nano                # Editoren

rsync --archive --delete Quelleverz. Zielverzeichnis  

chown Datei User        # Den Besitzer einer Datei ändern
chmod Modus Datei       # Die Zugriffsrechte auf eine Datei ändern
iotop                   # Anzahl der Schreib/Lesevorgänge auf den Datenspeicher
lsblk                   # Anzeige aller Blockdevices
file -s /dev/sda        # Dateisystem auf Blockdevice anzeigen
# Self-Monitoring, Analysis and Reporting Technology S.M.A.R.T.
smartctl --all /dev/sda # Control and Monitor Utility for SMART Disks
                        # pin_Up_Time (verweist auf Motor-/Lagerschaden)
                        # Seek_Error_Rate und Calibration_Retry_Count (Probleme mit der Kopfmechanik)
                        # (Raw_)Read_Error_Rate und Reallocated_Sector_Ct (Kopf-/Oberflächenprobleme). I

2.1 Dateisystem, Backup

rsync Quelle Ziel (https://www.computerhope.com/unix/rsync.htm)

Optionen:

  • -a (Kurzversion für --archive): gleiche Bedeutung wie -rlptgoD => recursive,links,perms,times,group,owner,devices

  • -r (Kurzversion für --recursive): Unterverzeichnisse kopieren

  • -l (Kurzversion für --links): symbolische Links kopieren

  • -p (Kurzversion für --perms): Rechte der Quelldatei beibehalten

  • -t (Kurzversion für --times): Zeiten der Quelldatei beibehalten

  • -g (Kurzversion für --group): Gruppenrechte der Quelldatei beibehalten

  • -o (Kurzversion für --owner): Besitzrechte der Quelldatei beibehalten (nur als root User möglich)

  • -D (Kurzversion für --devices --specials): Gerätedateien der Quelldatei beibehalten (nur als root User möglich)

  • -v (Kurzversion für --verbose): zeigt während der Ausführung an welche Dateien synchronisiert werden

  • --delete: entfernt Dateien im Zielverzeichnis die mittelerweile im Quellverzeichnis nicht mehr vorhanden sind

  • --exclude=.Gerätedateien

  • --bwlimit=20 #kBps

2.2 Das /proc Dateisystem

3. Datenspeicher

df -h
fdisk /dev/sdx             # Speicherdisk partitionieren
mkfs -t ext4 /dev/sdxy     # Ext4 Dateisystem auf SSD/HDD x Partition y erzeugen
mount -t nfs 172.x.y.z:/verzeichnis /mnt
sar -d Intervall Anzahl
dd if=xyz.iso of=/dev/sd... bs=1M conv=fsync # iso-Image auf sd.. sichern

4. Hauptspeicher und Swapbereich

free -m
sar -r Intervall Anzahl

4.1 Swapspeicher erweitern

sudo fallocate -l 1G /swapfile

alternativ:

sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo nano /etc/fstab

die nachfolgende Zeile einfügen:

/swapfile swap swap defaults 0 0

Die Swap - Funktion überprüfen:

sudo swapon --show
sudo free -h

5. Logdateien - "Verteidigung gegen die dunklen Künste"

Anzeigen mit cat. more, tail -f:

  • /var/log/auth.log # Auf Debian 12: journalctl -u ssh
  • /var/log/syslog
  • /var/log/nginx/access.log
  • /var/log/httpd/access.log

Verarbeitung mit grep,cut,tail,uniq,sort,nl,...:

grep "Failed password" /var/log/auth.log    # journalctl -u ssh | grep ...
grep "Failed password" /var/log/auth.log | cut -f1-2 -d":" | uniq -c 
grep "Failed password" /var/log/auth.log | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort | uniq -c | sort -n
grep -o "user [a-z]* " /var/log/auth.log | cut -f2 -d" " | sort | uniq -c | sort -n
#fail2ban

bei Debian 12 gibt es keine /var/log/auth.log mehr:

journalctl -u ssh | grep "Failed password"   # nmap -sS -Pn -p 0-1000
journalctl -u ssh | grep "Failed password" | wc -l
journalctl -u ssh | grep "Failed password" | cut -f1-2 -d":" | uniq -c
journalctl -u ssh | grep "Failed password" | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort | uniq -c | sort -n
journalctl -u ssh | grep "Failed password"| sed 's/invalid user //'  | cut -f9 -d" " | sort | uniq -c | sort -n

RIPEstat ist eine webbasierte Plattform des RIPE NCC (dem Regional Internet Registry für Europa, den Nahen Osten und Teile Zentralasiens). Man kann es sich als eine Art „Suchmaschine“ oder Analyse-Tool für IP-Adressen, Autonome Systeme (ASNs) und Routing-Informationen vorstellen.

https://stat.ripe.net/resource/107.181.128.0#tab=overview

https://www.linuxcapable.com/how-to-install-fail2ban-on-debian-linux/

https://www.ezeelogin.com/kb/article/install-and-setup-cowrie-honeypot-on-ubuntu-545.html

https://www.ionos.de/digitalguide/server/sicherheit/honeypot-it-sicherheit-durch-ablenkprogramme/

2024-11-06T11:42:28.419780Z [cowrie.ssh.factory.CowrieSSHFactory] New connection: 172.169.207.233:47284 (172.31.33.5:2222) [session: b3f5d5e79b4b]
2024-11-06T11:42:38.301736Z [cowrie.ssh.transport.HoneyPotSSHTransport#info] connection lost
2024-11-06T11:42:38.301908Z [HoneyPotSSHTransport,3,172.169.207.233] Connection lost after 9 seconds
2024-11-06T12:34:51.539217Z [cowrie.ssh.factory.CowrieSSHFactory] New connection: 125.25.33.107:51154 (172.31.33.5:2222) [session: ceb7b3a483cb]
2024-11-06T12:34:51.539904Z [cowrie.ssh.transport.HoneyPotSSHTransport#info] connection lost
2024-11-06T12:34:51.540011Z [HoneyPotSSHTransport,4,125.25.33.107] Connection lost after 0 seconds
2024-11-06T11:42:28.419780Z [cowrie.ssh.factory.CowrieSSHFactory] New connection: 172.169.207.233:47284 (172.31.33.5:2222) [session: b3f5d5e79b4b]
2024-11-06T11:42:38.301736Z [cowrie.ssh.transport.HoneyPotSSHTransport#info] connection lost
2024-11-06T11:42:38.301908Z [HoneyPotSSHTransport,3,172.169.207.233] Connection lost after 9 seconds
2024-11-06T12:34:51.539217Z [cowrie.ssh.factory.CowrieSSHFactory] New connection: 125.25.33.107:51154 (172.31.33.5:2222) [session: ceb7b3a483cb]
2024-11-06T12:34:51.539904Z [cowrie.ssh.transport.HoneyPotSSHTransport#info] connection lost
2024-11-06T12:34:51.540011Z [HoneyPotSSHTransport,4,125.25.33.107] Connection lost after 0 seconds
dmesg -HTwx   # Kernel Ringbuffer
uptime   # Anzahl der User und Waitqueue length
         # 1/5/15 Min.

journalctl -r | more
journalctl --since '2021-09-28' # Anzeige aller Journaleinträge seit dem 28.9.2021
journalctl --until '2021-09-28' # Anzeige aller Journaleinträge seit dem 28.9.2021
journalctl --vacuum-time=10d   # /var/log/journal verkleinern
journalctl --vacuum-size=100M

6. Netzwerk

6.1 Netzwerkkonfiguration

Ubuntu Server 22.04

 cat 00-installer-config.yaml
 # This is the network config written by 'subiquity'
 network:
  ethernets:
    ens160:
      addresses:
      - 172.20.46.82/24
      gateway4: 172.20.46.254
      nameservers:
        addresses:
        - 172.16.1.10
        search: []
  version: 2

 sudo netplan apply

Hostname ändern Unter Ubuntu 18.04 reicht es nicht mehr aus, den Hostname über die /etc/hostname oder hostnamectl zu setzen. Nach einem Reboot des Servers wäre der Hostname wieder verloren, da dieser nicht gespeichert wurde. Folgender Weg ermöglicht das dauerhafte Setzen des Hostnames:

nano /etc/cloud/cloud.cfg

This will cause the set+update hostname module to not operate (if true) preserve_hostname: false Hier muss der Wert preserve_hostname von false auf true gesetzt werden.

This will cause the set+update hostname module to not operate (if true) preserve_hostname: true Danach kann über folgende Befehle der Hostname dauerhaft gesetzt werden:

sudo nano /etc/hostname 
sudo hostnamectl set-hostname web-01

https://netplan.io/examples

Standard

cat /etc/network/interfaces

.
.
.
auto ens192
iface ens192 inet static
  address 172.20.46.204
  netmask 255.255.255.0
  gateway 172.20.46.254
  dns-nameservers 172.16.1.10
.
.
.

systemctl restart networking

6.2 Netzwerktools

ip a                   # Alle Netzwerkschnittstellen anzeigen
ip address add 192.168.121.45/24 dev eth0                        
                       
nmap -sS -p 0-1000     # TCP SYN Port Scan 
nmap -sT -p 0-1000     # TCP Connect Scan 
nmap -sU               # UDP Port Scan 

nmap -sV               # Versionserkennungm des Dienstes
nmap -O                # Betriebssystem Erkennung

netstat -tulpn         # Listener mit Portnummer anzeigen
ss -lp4                # Listener mit Portnummer anzeigen
ss -tulpn | grep 9100  # Prozesse an Port 9100 anzeigen
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'

lsof -i :22            # Welche Prozesse nutzen Port 22? 
lsof -niTCP            # -n: Verhindert die DNS-Auflösung von IP-Adressen.
                       # Hostnamen werden also nicht aufgelöst, sondern direkt als 
                       # IP angezeigt (schneller und übersichtlicher). 
                       # -iTCP: Beschränkt die Ausgabe auf Netzwerk-Sockets, die das TCP-Protokoll verwenden.


# Hostname.Domain.TLD.<-Root  / FQDN->www.cisco.com(.)
nslookup www.heise.de
dig name.tp10cloud.de A          # Resource Record A ->IPv4
dig tp10cloud.com TXT            # Resource Record AAAA ->IPv6   
dig tp10cloud.de NS

# "https://www.whatsmydns.net/"  oder "https://www.experte.de/dns-check"
# https://www.iana.org/domains/root/db
# https://www.denic.de/
 
whois 221.181.185.148       # Regional Internet Registry Abfrage
traceroute www.heise.de 
nslookup 
dnstop -l 5 eth0            # Anzahl den DNS Abfragen anzeigen

nc IP-Adresse 22             # Banner grabbing ;)
nc  -lvnp  2222              # Portlistening
ncat  IP-Adresse Portnummer     
ncat -l -p 1337

sar -n DEV Intervall Anzahl 
iptraf-ng  
iptables -A INPUT -s 218.92.0.247  -j DROP # Alle IP-Pakete der Adresse 218... löschen
iptables -nvL INPUT
iptables -I INPUT -p icmp -s a.b.c.d -j DROP
iptables -I INPUT -p icmp -s a.b.c.d -j ACCEPT # ????



firewall-cmd --state           # ContOS, Fedora und RHEL
uwf status                     # Ubuntu 

curl ifconfig.me  # Anzeige der öffentlichen IP-Adresse
curl url -X POST -H 'content-type: application-json' -d '{ "id" : "4711" }'
# DB AG Timetable v1 API:
curl -X GET --header "Accept: application/xml" --header "Authorization: Bearer 8bbc15fe5ad950d50aea3de633a3b89d" "https://api.deutschebahn.com/timetables/v1/plan/8000105/220610/9"
curl --verbose

wget url -o logfile -O index.html     # GET auf url
curl url -s -o ausgabe    # -s silent, -o Dateiname

python3 -m http.server 2305


# TCP - Pakete anzeigen
tcpdump src ! 5.146.250.241 and dst ! 5.146.250.241 
tcpdump -i any -n port 80

6.4 Netzwerkperformance

mtr               # Kobination von ping und traceroute
ethstatus -i eno1 # Console-based ethernet statistics monitor
iftop             # Anzeige einzelner Verbindungen und Bandbreitenmessung
nethogs           # Net top tool grouping bandwidth per process
iptraf-ng         # Interactive Colorful IP LAN Monitor

ncat -ulp 1234 >/dev/null #
pv < /dev/random | ncat -u IP-Adresse 1234 

Host1: nc -l 1234 > /dev/null
Host2: pv /dev/random | nc -N Host2 1234

# ncat als Chat
Host1: ncat --chat -l -p 8888
Hostx: ncat Host1 -p 8888

6.5 Informationsquellen zu DNS, Webseiten,...

6.6 VNC Server unter Amazon AWS

sudo apt update
sudo apt install ubuntu-desktop
sudo apt install tightvncserver
sudo apt install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal dbus-x11
vi /home/ubuntu/.vnc/xstartup
#!/bin/sh

export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey

vncconfig -iconic &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &
vncserver :1

6.6.1 remmina - VNC-Client

Server: name.sepe21.de:1

Benutzer: ubuntu

Passwort: SEPE2023!

7. Prozesse / CPU

ps -auxf
ps -auxf | grep -c defunct #Zombiejagt 
top
htop
glances # apt install glances
sar -u Intervall Anzahl # apt install sysstat
iostat
vmstat
watch sensors   #

7.1 CPU-Benchmark Geekbench ( min. "GB RAM")

mkdir geekbench-tmp
cd geekbench-tmp
wget https://cdn.geekbench.com/Geekbench-5.4.5-Linux.tar.gz
tar -zxvf Geekbench-5.4.5-Linux.tar.gz
cd Geekbench-5.4.5-Linux/
./geekbench_x86_64

8. Software

apt update              # Informationen von Paketquellen herunterladen
apt upgrade -y          # Updates aus Paketquellen installieren
apt install -y Paketname
apt remove Paketname
apt list                # Anzeige aller installierten Pakete
uname -r                # Kernel Release (z.b 5.8.0-43-generic)
apt autoremove -y

9. Systemdienste

systemctl status
systemctl start nginx
systemctl stop nginx
systemctl enable nginx
systemctl disable nginx

systemd-analyze plot > systemstart.svg # Systemstart SVG-Graphik

9.1 Zeitsynchronisierung

9.1.1 ntpd

sudo systemctl status ntp
ntpq -p

9.1.2 alternativ systemd.timesyncd

sudo apt purge ntp
sudo apt install systemd-timesyncd
sudo systemctl start systemd-timesyncd
sudo systemctl status systemd-timesyncd
timedatectl

Einstellungen für 172.20.48.x:

vi /etc/systemd/timesyncd.conf

# timesyncd.conf
.
.
.
[Time]
NTP=172.16.1.3
.
.

systemctl restart systemd-timesyncd

10. Sicherheit (Verteidigung gegen die dunklen Künste, S.Snape 1997)

10.0 ssh

ssh-keygen  # Schlüsselpaar unter .ssh erzeugen (id_ed25519, id_ed25519.pub)
ssh-copy-id root@wolf.tp10sepe.de
ssh  root@wolf.tp10sepe.de    # Ohne Passwordeingabe     
# # Privacy Enhanced Mail, Klartext Header+Foot + Base64 Kodierung

10.1 Base64 Kodierung

echo -n -e "\x00\x01\x02" | base64
echo -n "Hallo Welt" | base64

echo -n "AAA" | base64
echo -n "AAAA" | base64

Anwendung: E-Mail Anhänge, Data-URLs in HTML/CSS, Datenübertragung in API's

10.2 Hashfunktionen

echo "Text123" | sha1sum
echo "Text123" | sha256sum
echo "Text123" | sha512sum

time dd if=/dev/random bs=16k count=10000 | sha256sum # 488 MB/s Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz

# Signaturen, Passwörter, Deduplizierung, Blockchains

10.3 Symetrische Verschlüsselung mit openssl

# Advanced Encryption Standard (AES) 
# Verschlüsseln

echo "Geheim" | openssl enc -aes-256-cbc  > openssl.dat

# Entschlüsseln

openssl enc -aes-256-cbc -d -in openssl.dat

10.4 Asymetrische Verschlüsselung

# RSA (Rivest, Shamir und Adleman) 
# Der private Schlüssel wird erzeugt 
 
openssl genrsa -out private_key.pem 1024  # pem = Privacy-Enhanced Mail

# Aus dem privaten Schlüssel wird ein öffentlicher Schlüssel erzeugt
openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout


# Die Nachricht "geheim.txt" wird mit dem öffentlichen Schlüssel verschlüsselt (encrypt)
#
echo "Eine geheime Nachricht" > geheim.txt
openssl pkeyutl -encrypt -inkey public_key.pem -pubin -in geheim.txt -out encrypt.dat

# Die Nachricht wird entschlüsselt (decrypt)
 
openssl pkeyutl -decrypt -inkey private_key.pem -in encrypt.dat -out decrypt.txt

10.5 Signaturen

# Signieren
openssl dgst -sha256 -sign private_key.pem -out signatur.bin geheim.txt

# Signatur überprüfen
openssl dgst -sha256 -verify public_key.pem -signature signatur.bin geheim.txt

10.6 Selbsterstelltes Zertifikat

openssl req -x509 -new -key dein_privater_key.pem -out certificate.pem -sha256 -days 365

# Inhalt des Zertifikates anzeigen:
openssl x509 -in certificate.pem -text -noout

10.7 Zertifikat eines Dienstes anzeigen

openssl s_client -showcerts -connect gitlab.tp10cloud.de:443

10.8 Selbstzertifiziertes https Zertifikat mit openssl und apache2

cd /etc/apache2 ; mkdir ssl ; cd ssl
openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

cd /etc/apache2 ; a2enmod ssl
systemctl restart apache2

cd sites-available ;cp default-ssl.conf 001-ssl.conf
nano 001-ssl.conf

---------------------------------------------
#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

#   SSLCertificateFile directive is needed.
SSLCertificateFile      /etc/apache2/ssl/cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/key.pem
---------------------------------------------

a2nsight 001-ssl.conf ; systemctl restart apache2

# Umleitungs auf https/443 einrichten
vi 000-default.conf

-----------------------------------
.
Redirect permanent / https://3.66.188.236/
.
-----------------------------------

10.9 https Zertifikate mit openssl und nginx

cd /etc/ssl/certs
vi cert.conf

ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/certs/key.pem;

ssl_protocols TLSv1.3 TLSv1.2;


vi /etc/nginx/sites-available/default

----------default-------------
# SSL configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
.
.
.
# include snippets/snakeoil.conf;
include snippets/cert.conf;
root /var/www/html;
------------------------------

vi /etc/nginx/sites-available/default

10.8 Certbot installieren

https://certbot.eff.org/ aufrufen und Anleitung ausführen

sudo apt install certbot python3-certbot-apache
sudo certbot --apache

Zertifikat anzeigen:
cd /etc/letsencrypt/live/domain.name.de/
openssl x509 -in fullchain.pem -text --noout

11. Assembler, gcc, statisches und dynamisches Linken

cat x.c

main(void)
{
  int i=1;
  while(1){
    i=i+2;
    printf("%d\n",i);
  }
}

gcc -S  x.c
cat x.s

.L2
    addl    $2, -4(%rbp)
    movl    -4(%rbp), %eax
    movl    %eax, %esi
    movl    $.LC0, %edi
    movl    $0, %eax
    call    printf
    jmp     .L2

gcc x.c  -o x-dyn
gcc x.c -static -o x-static

ls -l x-*

ldd x-*

12. Systemaufrufe

.data
    s:
        .ascii "hello world\n"
        len = . - s
.text
    .global _start
    _start:

        movl $4, %eax   /* write system call number */
        movl $1, %ebx   /* stdout */
        movl $s, %ecx   /* the data to print */
        movl $len, %edx /* length of the buffer */
        int $0x80

        movl $1, %eax   /* exit system call number */
        movl $0, %ebx   /* exit status */
        int $0x80
as -o main.o main.S
ld -o main main.o
file main*
./main

14. Integration LLM zur Analyse von Systemdaten

https://huggingface.co/collections/google/gemma-3-release-67c6c6f89c4f76621268bb6d

14.1 Grundlagen

  • Schritt 1: Ollama installieren Ollama ist ein kostenloses Tool, das es extrem einfach macht, große Sprachmodelle (LLMs) wie Gemma, Llama oder Mistral lokal auf dem eigenen Computer auszuführen. Stell es dir wie einen App-Store oder eine Art "Steam" für KI-Modelle vor: Es bietet eine Bibliothek von Modellen und kümmert sich um den gesamten komplizierten Prozess des Herunterladens, der Installation und der Ausführung.
curl -fsSL https://ollama.com/install.sh | sh

https://github.com/ollama/ollama/blob/main/docs/linux.md

Session speichern:

# ollama run gemma3:12b
ollama run gemma-4-31B 
>>>/save meinmodel
Created new model 'meinmodel'
>>>

14.2 Beispiel Analyse CPU-Auslastung

ollama run gemma3:12b "Das System hat 8 CPU-Kerne. Analysiere die Ausgabe der CPU-Auslastung aus /proc/loadavg: $(cat /proc/loadavg | cut -d" " -f1-3). Gib eine kurze Zusammenfassung."
sar -u 10 10 | ollama run gemma3:12b "Analysiere die Systemauslastung für %sys %user %iowait"

Die System-Auslastung in den Protokollen zeigt eine Reihe interessanter Punkte:

%user: Dieser Wert repräsentiert den Anteil der CPU-Zeit, der für Benutzerprogramme verwendet wird. Er schwankt zwischen 0,95% und 7,23%, mit einem Durchschnitt von 4,28%. Dieser Bereich deutet darauf hin, dass die Systeme Lasten in unterschiedlichen Intensitäten bearbeitet.

%sys: Dieser Wert zeigt den Anteil der CPU-Zeit, der für Kernel-Prozesse benötigt wird. Er bewegt sich zwischen 0,41% und 2,67%, mit einem Durchschnitt von 1,34%. Dieser relativ niedrige Wert ist ein gutes Zeichen, da es darauf hindeutet, dass das System effizient arbeitet und wenig Zeit für interne Vorgänge verwendet.

%iowait: Dieser Wert gibt den Anteil der CPU-Zeit an, die durch Warteschleifen auf E/A-Operationen (z. B. Festplattenzugriff) verloren geht. Er liegt zwischen 0,01% und 0,96%, mit einem Durchschnitt von 0,31%. Der geringe Wert zeigt, dass der Computer schnell auf Daten zugreifen kann und wenig Zeit mit Warteoperationen verbringt.

Insgesamt: Die Protokolldaten deuten darauf hin, dass das System stabil und effizient arbeitet. Es gibt keine Anzeichen für Überlastung oder Leistungsprobleme.

Ist es möglich, weitere Informationen über den Zeitpunkt des Systems zu erhalten? Dies würde die Analyse der Systemlast noch genauer machen. Zum Beispiel:

  • Welche Programme werden im Hintergrund ausgeführt?
  • Gibt es externe Faktoren, die die Last beeinflussen könnten (z. B. Netzwerkaktivität)?

Die Kenntnis dieser Details könnte dazu beitragen, die Gründe für Schwankungen in den CPU-Auslastungsprozentsätzen besser zu verstehen.

14.4 Mit synthetischer IOWait Last

cat /dev/sda >/dev/null &
cat /dev/sda >/dev/null &
cat /dev/sda >/dev/null &
cat /dev/sda >/dev/null &
cat /dev/sda >/dev/null &
sar -u 5 10 | ollama run gemma2:9b "Analysiere die Systemauslastung für %sys %user %iowait"
The system load analysis reveals some interesting trends:

**System Load (%sys)**:

* **Generally Low:**  System usage is consistently low, hovering around 6% on average. This suggests that the Linux kernel 
itself isn't heavily taxed.
* **Spikes:** There are noticeable spikes in system usage, reaching as high as 12.51% and 12.38%. These spikes indicate periods 
of heavier kernel activity.

**User Load (%user)**:

* **Moderate:** User workload is fairly moderate, averaging around 2.12%.  This means that your applications and processes are 
consuming a reasonable amount of CPU time.
* **Variability:** There's noticeable variability in user load throughout the period, ranging from 1.08% to 4.72%.

**I/O Wait (%iowait)**:

* **Significant Portion:** I/O wait represents a substantial portion of system activity, averaging around 33.47%. This means 
that your system is spending a considerable amount of time waiting for data transfers (reading from or writing to storage 
devices).
* **High During Spikes:** During the periods with higher system load, I/O wait also increases significantly, reaching over 70% 
at times.

**Analysis and Potential Issues:**

1.  **I/O Bottleneck:** The high I/O wait suggests a potential bottleneck in your storage subsystem. This could be due to:
    * Slow hard drive(s)
    * Insufficient RAM (forcing more data to be stored on disk)
    * Network issues if you're accessing remote filesystems
2.  **Spike Causes:**  Investigate the events causing the spikes in system and I/O wait. This could involve:
    * Running resource-intensive applications at specific times
    * Scheduled tasks or backups happening during that period
3. **Tuning:** Consider optimizing your storage configuration (e.g., using faster drives, RAID configurations, or SSDs) and 
potentially adjusting system settings to improve I/O performance.

**Recommendations:**

1. **Monitor Performance:**  Continue monitoring your system's resource usage to identify patterns and potential issues.
2. **Analyze Logs:**  Check system logs for error messages or clues about the cause of the spikes in I/O wait.
3. **Storage Optimization:** Explore upgrading your storage hardware or configurations if your current setup is a bottleneck.

15. Kubernetes

15.1 kubectl

kubectl get pods -A
NAMESPACE     NAME                                    READY   STATUS    RESTARTS      AGE
kube-system   coredns-68d75fd545-d6nvt                1/1     Running   0             15h
kube-system   coredns-68d75fd545-s9k8b                1/1     Running   0             15h
kube-system   kube-apiserver-talos-146-mvz            1/1     Running   0             15h
kube-system   kube-apiserver-talos-3uq-g52            1/1     Running   0             15h
kube-system   kube-apiserver-talos-p64-hck            1/1     Running   0             15h
kube-system   kube-controller-manager-talos-146-mvz   1/1     Running   0             15h
kube-system   kube-controller-manager-talos-3uq-g52   1/1     Running   2 (15h ago)   15h
kube-system   kube-controller-manager-talos-p64-hck   1/1     Running   0             15h
kube-system   kube-flannel-7rvw7                      1/1     Running   0             15h
kube-system   kube-flannel-gqd2r                      1/1     Running   0             15h
kube-system   kube-flannel-prtjx                      1/1     Running   0             15h
kube-system   kube-flannel-z67j4                      1/1     Running   0             15h
kube-system   kube-proxy-nbkcd                        1/1     Running   0             15h
kube-system   kube-proxy-qn97z                        1/1     Running   0             15h
kube-system   kube-proxy-v9wp2                        1/1     Running   0             15h
kube-system   kube-proxy-xpwhr                        1/1     Running   0             15h
kube-system   kube-scheduler-talos-146-mvz            1/1     Running   0             15h
kube-system   kube-scheduler-talos-3uq-g52            1/1     Running   2 (15h ago)   15h
kube-system   kube-scheduler-talos-p64-hck            1/1     Running   0             15h
kubectl get node
NAME            STATUS   ROLES           AGE   VERSION
talos-146-mvz   Ready    control-plane   15h   v1.31.2
talos-3uq-g52   Ready    control-plane   15h   v1.31.2
talos-8s2-e9p   Ready    <none>          15h   v1.31.2
talos-p64-hck   Ready    control-plane   15h   v1.31.2
kubectl run nginx --image=nginx --port=80
kubectl port-forward nginx  8080:80 & # Blockiert ansonsten die aktuelle Shell
kubectl delete pod nginx
cat <<EOF >nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort  # Definiert den Service-Typ
  selector:
    app: nginx    # Findet die Pods mit diesem Label (aus Ihrem Deployment)
  ports:
    - protocol: TCP
      port: 80         # Der interne Port des Services
      targetPort: 80   # Der Port, an den der Service den Traffic weiterleitet (der Port Ihres Nginx-Containers)
      # nodePort: 30080 # Optional: Sie können einen festen Port angeben (aus dem Bereich 30000-32767)
                       # Wenn Sie dies weglassen, wählt Kubernetes einen zufälligen Port.
EOF

kubectl get services
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP        15h
nginx-service   NodePort    10.101.54.50   <none>        80:32611/TCP   2m56s
cat nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2 # Startet zwei identische Pods
  selector:
    matchLabels:
      app: nginx # Dieser Selector muss mit dem im Service übereinstimmen
  template:
    metadata:
      labels:
        app: nginx # Dieses Label wird den Pods zugewiesen
    spec:
      containers:
      - name: nginx
        image: nginx # Verwendet das neueste Nginx-Image
        ports:
        - containerPort: 80
kubectl apply -f nginx-deployment.yaml
kubectl get pods 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7769f8f85b-r9v79   1/1     Running   0          33s
nginx-deployment-7769f8f85b-tnnth   1/1     Running   0          33s

kubectl get endpoints nginx-nodeport-service
NAME                     ENDPOINTS                     AGE
nginx-nodeport-service   10.244.0.3:80,10.244.0.4:80   8m18s
kubectl port-forward service/nginx-nodeport-service 8080:80
curl http://localhost:8080
cat <<EOF >nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2 # Startet zwei identische Pods
  selector:
    matchLabels:
      app: nginx # Dieser Selector muss mit dem im Service übereinstimmen
  template:
    metadata:
      labels:
        app: nginx # Dieses Label wird den Pods zugewiesen
    spec:
      containers:
      - name: nginx
        image: nginx # Verwendet das neueste Nginx-Image
        ports:
        - containerPort: 80
        # --- Hier geschieht die Magie ---
        # 1. Mountet das Volume in den Container
        volumeMounts:
        - name: nginx-index-html-volume
          mountPath: /usr/share/nginx/html/index.html
          # 'subPath' sorgt dafür, dass nur die index.html-Datei gemountet wird
          # und nicht das gesamte Verzeichnis überschrieben wird.
          subPath: index.html
      # 2. Definiert das Volume, das auf das ConfigMap verweist
      volumes:
      - name: nginx-index-html-volume
        configMap:
          # Der Name des ConfigMaps, das Sie mit dem 'kubectl create'-Befehl erstellt haben
          name: nginx-index-html-configmap
EOF

kubectl create configmap nginx-index-html-configmap --from-file=index.html
kubectl apply -f nginx-deployment.yaml
kubectl port-forward service/nginx-nodeport-service 8080:80 &
curl http://localhost:8080
Handling connection for 8080
<!DOCTYPE html>
<html>
<head>
<title>Willkommen auf meinem Kubernetes Nginx Server!</title>
</head>
<body>

<h1>Hallo Welt aus dem Kubernetes Cluster!</h1>
<p>Diese Seite wird von einem Nginx-Pod bereitgestellt.</p>

</body>
</html>