myDevice/system.md

18 KiB

System-Konfiguration

Host-Hardware

  • CPU: Intel Core i9-14900HX
  • Hostname: kr-nb-1003

Festplatten

nvme0n1 (2 TB) — Ventoy

  • nvme0n1p1 — Ventoy NTFS-Partition (VMs), UUID: 98FA5A9DFA5A7808, Label: "Ventoy"
  • nvme0n1p2 — VTOYEFI (FAT16), UUID: 3105-B091
  • Unter Windows als D:\ verfügbar, unter Linux als /mnt/ventoy (Auto-Mount via fstab)
  • Wichtig: Das Raw-Device /dev/nvme0n1p1 kann unter CachyOS nicht direkt gemountet werden (Can't open blockdev), weil Ventoy es über den Device-Mapper belegt. Stattdessen muss /dev/mapper/nvme1n1p1 verwendet werden (Device-Mapper-Name weicht von physischem Device ab!).
  • fstab: /dev/mapper/nvme1n1p1 /mnt/ventoy ntfs3 rw,uid=1000,gid=1000,nofail 0 0
  • Symlink: ~/projects/mnt/ventoy/projects

nvme1n1 (1 TB) — Windows

  • nvme1n1p1 — BOOT/EFI (FAT32), UUID: 9EAB-CAFA
  • nvme1n1p2 — MSR (reserviert)
  • nvme1n1p3 — Windows (NTFS), UUID: D086AC4D86AC363E, Label: "Windows" — Schnellstart deaktiviert
  • nvme1n1p4 — Recovery (NTFS)
  • Mountpoint unter Linux: /mnt/windows

CachyOS VM (über Ventoy gebootet)

  • OS: CachyOS (Arch-basiert, rolling release)
  • Kernel: linux-cachyos (PREEMPT_DYNAMIC) + linux-cachyos-lts
  • Virtualisierung: VirtualBox VM
    • 14 vCPUs, 12 GB RAM
    • 250 GB Disk (sda), BTRFS mit Subvolumes
    • zram-Swap (11,6 GB)
  • Desktop: KDE auf Wayland
  • Shell: zsh (umgestellt von fish wegen fehlender POSIX-Kompatibilität — kein Heredoc, abweichende Syntax bei Online-Snippets)
    • Prompt: Powerlevel10k (~/.p10k.zsh)
    • Config: ~/.zshrc → lädt /usr/share/cachyos-zsh-config/cachyos-config.zsh (oh-my-zsh, fzf, git)
    • Plugins: zsh-autosuggestions, zsh-syntax-highlighting (bereits via CachyOS-Config aktiv — fish-äquivalentes Erlebnis)
  • Init: systemd (mit plymouth)
  • Sprache: Deutsch

SSH-Keys (gemeinsam mit Windows)

  • Quelle: C:\Users\d-chrka\.ssh\ (unter Linux: /run/media/chk/Windows/Users/d-chrka/.ssh/)
  • Kopiert nach: ~/.ssh/ (CachyOS)
  • Keys: id_ed25519, chrka_ed25519, id_rsa (jeweils mit .pub)
  • Bei Änderungen auf einer Seite müssen die Keys manuell synchronisiert werden
  • known_hosts fehlt nach Ersteinrichtung — Die Keys werden von Windows kopiert, aber known_hosts nicht. SSH-Verbindungen schlagen mit "Host key verification failed" fehl, bis die Host-Keys manuell hinzugefügt werden (z.B. ssh-keyscan -p 2211 gitssh.straso.com >> ~/.ssh/known_hosts)

Git-Konfiguration

  • user.name: Christian Kauer
  • user.email: c.kauer@krah-gruppe.de
  • Übernommen aus der Windows-Konfiguration (/run/media/chk/Windows/Users/d-chrka/.gitconfig)

OneDrive (rclone bisync)

  • Paket: rclone (über pacman)
  • Remote: onedrive: (Typ: OneDrive Business, Drive: "Dokumente")
  • SharePoint-URL: https://krahgruppe-my.sharepoint.com/personal/c_kauer_krah-gruppe_de1/Documents
  • Synchronisierter Ordner: onedrive:cachyos_windows_share~/OneDrive/cachyos_windows_share
  • Modus: bisync (bidirektional) — Änderungen werden in beide Richtungen synchronisiert
  • Automatisierung: systemd-User-Timer (rclone-onedrive.timer), alle 10 Minuten
    • Service: ~/.config/systemd/user/rclone-onedrive.service
    • Timer: ~/.config/systemd/user/rclone-onedrive.timer
  • Ersteinrichtung: rclone bisync ... --resync nötig um Baseline zu erstellen
  • Hinweis: onedrive-abraunegg (nativer Client) wurde ebenfalls installiert, aber nicht konfiguriert — OAuth-Redirect wurde vom Browser als Phishing blockiert

Sophos SSL VPN

  • Server: rcdro1.krah-gruppe.de:8443 (UDP)
  • Benutzer: d-chrka@internal.lan (AD-User, nicht c.kauer@krah-gruppe.de)
  • Verschlüsselung: AES-128-CBC, Auth SHA256
  • Authentifizierung: Zertifikat + Benutzername/Passwort + 2FA (OTP wird ans Passwort angehängt)
  • CA: Landata It-Solutions, Olpe (Sophos_CA_C330ACYPTCKJ3CA, gültig bis 2036-12-31)
  • Client-Zertifikat: muss auf d-chrka@internal.lan ausgestellt sein (gültig bis 2036-12-31)
  • Funktionierendes Profil: sslvpn-fixed.ovpn (vom Testgerät DR-NB-0142 übernommen)
  • Paket: networkmanager-openvpn

Einrichtung unter Linux (NetworkManager)

  1. Profil importieren: nmcli connection import type openvpn file sslvpn-fixed.ovpn
  2. Wichtig — Split-Tunneling aktivieren: IPv4 → Routes → "Use this connection only for resources on its network" (Häkchen setzen), sonst geht aller Traffic durch den Tunnel und Internet fällt aus
  3. DNS-Routing konfigurieren — ohne diesen Schritt werden Firmen-Hostnamen nicht aufgelöst (systemd-resolved routet DNS-Queries sonst über den lokalen Router statt über den VPN-Tunnel):
    nmcli connection modify sslvpn-fixed ipv4.dns-search "~krah-gruppe.de,~internal.lan,~krah.intranet.de,~hirsau.seuffer,~resistec.pri,~krahicenet.local"
    nmcli connection modify sslvpn-fixed ipv4.dns 172.21.20.201
    
    Das ~-Prefix markiert die Domains als Routing-Domains, sodass systemd-resolved Queries für diese Domains über tun0 (172.21.20.201) schickt.
  4. Verbinden: nmcli connection up sslvpn-fixed

Hinweise zum .ovpn-Profil (Sophos-Download vs. funktionierende Version)

Das vom Sophos-Portal heruntergeladene Profil (sslvpn-c.kauer@krah-gruppe.de-client-config_V2-clients.ovpn) funktioniert nicht unter Linux. Entscheidende Unterschiede zur funktionierenden sslvpn-fixed.ovpn:

Problem Original-Download Fixed
Client-Zertifikat (Hauptursache) Ausgestellt auf c.kauer@krah-gruppe.de Ausgestellt auf d-chrka@internal.lan
route remote_host ... Aktiv → NM-Import schlägt fehl Auskommentiert
script-security 2 Fehlt Vorhanden

Die Firewall authentifiziert über AD als d-chrka@internal.lan. Ein Zertifikat für c.kauer@krah-gruppe.de wird mit AUTH_FAILED abgelehnt (sichtbar im Firewall Log Viewer unter "SSL VPN Authentication"). Die Original-Downloads (V2/V3) vom Sophos-Portal liegen weiterhin unter ~/OneDrive/cachyos_windows_share/, werden aber nicht verwendet.

DNS-Konfiguration (Split-DNS: Firmen-DNS + öffentlicher DNS)

  • Problem: Die Firmen-DNS-Server (172.21.20.201/202/210), die via DHCP vom VirtualBox-Host kommen, können bestimmte CNAME-Ketten nicht vollständig auflösen (z.B. streams.radio21.destreamurls.streamabc.link → NXDOMAIN). Betroffen sind u.a. Audio-Streaming-Dienste.
  • Ursache: Die Sophos-Firewall/DNS-Resolver des Firmennetzwerks filtert oder blockiert bestimmte Domains (.streamabc.link, .streamabc.net).
  • Lösung: Split-DNS via systemd-resolved — Firmen-Domains gehen zum Firmen-DNS, alles andere zu öffentlichen DNS-Servern.
  • Wichtig: Alle DNS-Server auf einem Link zu mischen funktioniert nichtsystemd-resolved probiert bei NXDOMAIN nicht den nächsten Server. Split-DNS erfordert getrennte Scopes (Link vs. Global).

1. Öffentlicher DNS als globaler Default

  • Datei: /etc/systemd/resolved.conf.d/public-dns.conf
[Resolve]
DNS=9.9.9.9#dns.quad9.net 1.1.1.1#cloudflare-dns.com
printf '[Resolve]\nDNS=9.9.9.9#dns.quad9.net 1.1.1.1#cloudflare-dns.com\n' | sudo tee /etc/systemd/resolved.conf.d/public-dns.conf
sudo systemctl restart systemd-resolved

2. Firmen-DNS nur für Firmen-Domains (Routing-Domains auf der Kabelverbindung)

nmcli connection modify "Kabelgebundene Verbindung 1" ipv4.dns-search "~krah-gruppe.de,~internal.lan,~krah.intranet.de,~hirsau.seuffer,~resistec.pri,~krahicenet.local"
nmcli connection up "Kabelgebundene Verbindung 1"

Resultat

Domain DNS-Server Quelle
*.krah-gruppe.de, *.internal.lan etc. 172.21.20.201 (Firmen-DNS via DHCP) Link-Routing-Domains
Alles andere 9.9.9.9, 1.1.1.1 (Quad9, Cloudflare) Globaler DNS (resolved.conf)
  • VPN-Koexistenz: Wenn sslvpn-fixed aktiv ist, übernehmen die VPN-Routing-Domains auf tun0 den Firmen-DNS für interne Auflösung — gleiche Domains, anderer Link

Kurzname-Auflösung (Search Domains vs. Routing Domains)

  • Problem: Firmen-Hostnamen wie krah-invoice werden über VPN nicht aufgelöst — nur der FQDN krah-invoice.krah.intranet.de funktioniert.
  • Ursache: ~krah.intranet.de (mit ~-Prefix) ist nur eine Routing-Domain — DNS-Queries für *.krah.intranet.de werden an den Firmen-DNS geleitet, aber kurze Hostnamen werden nicht automatisch ergänzt. Dafür braucht systemd-resolved eine Search Domain (ohne ~).
  • Lösung: NetworkManager-Dispatcher-Script, das beim VPN-Connect automatisch die Search Domain setzt:
    • Datei: /etc/NetworkManager/dispatcher.d/10-vpn-search-domain
    #!/bin/bash
    INTERFACE="$1"
    ACTION="$2"
    if [[ "$INTERFACE" == "tun0" && "$ACTION" == "vpn-up" ]]; then
        resolvectl domain tun0 krah.intranet.de ~internal.lan ~krah-gruppe.de ~hirsau.seuffer ~resistec.pri ~krahicenet.local
    fi
    
    • Rechte: chmod 755 (muss ausführbar sein, sonst ignoriert NM das Script)
    • krah.intranet.de ohne ~ = Search Domain, der Rest mit ~ = Routing Domains
  • Manuell (falls Dispatcher nicht greift):
    sudo resolvectl domain tun0 krah.intranet.de '~internal.lan' '~krah-gruppe.de' '~hirsau.seuffer' '~resistec.pri' '~krahicenet.local'
    
    • Hinweis: Die ~-Zeichen müssen in zsh/fish mit Anführungszeichen escaped werden ('~...'), da die Shell sie sonst als Home-Directory interpretiert.
  • Verifikation: resolvectl status prüfen — beim tun0-Link muss krah.intranet.de ohne ~ erscheinen

Sophos Endpoint (Protection for Linux)

  • Paket: Sophos Protection for Linux (SPL), installiert unter /opt/sophos-spl
  • Service: sophos-spl.service (systemd)
  • Sophos Central: Gerät registriert als kr-nb-1003, Online
  • Kernel-Einschränkung: RuntimeDetections-Plugin unterstützt max Kernel 6.18.x — erfordert linux-cachyos-lts (6.18.19). Der reguläre Kernel (6.19.x) ist zu neu und führt zu FATAL Kernel version check failed.
  • Default-Kernel: LTS in GRUB als Default setzen: GRUB_DEFAULT="gnulinux-advanced-...-lts-advanced-..." in /etc/default/grub
  • SafeStore: Verzeichnis /opt/sophos-spl/plugins/av/var/safestore/ fehlte nach Installation, manuell angelegt

DataGrip (JetBrains)

  • Config: ~/.config/JetBrains/DataGrip2025.3/ (Einstellungen, Datasources, Konsolen, JDBC-Treiber, Keymaps)
  • Projekte: ~/DataGripProjects/ (SQL-Konsolen und Scratch-Dateien pro Datasource)
  • Passwörter: verschlüsselt in c.kdbx, nicht portierbar — müssen nach Migration neu eingegeben werden

Migration von Rechner A nach B

# Auf Rechner B:
# 1. Config kopieren (Windows → Linux)
cp -r "<Windows>/Users/<user>/Anwendungsdaten/JetBrains/DataGrip2025.3/"* ~/.config/JetBrains/DataGrip2025.3/

# 2. Projekte kopieren
cp -r "<Windows>/Users/<user>/DataGripProjects" ~/DataGripProjects

# Linux → Linux: Pfade sind ~/.config/JetBrains/DataGrip<version>/ und ~/DataGripProjects/

NAS (Synology DS920+)

  • Hostname: nas.straso.com
  • SSH/SFTP-Port: 2218
  • Zugriff via Dolphin: sftp://nas.straso.com:2218 in der Adressleiste
  • Hinweis: SFTP muss in der DSM-Weboberfläche aktiviert sein (Systemsteuerung → Dateidienste → FTP → SFTP)

SAP GUI for Java

  • Version: 8.10 rev 10
  • Installation: /home/chk/SAPClients/SAPGUI8.10rev10/
  • Start: GDK_SCALE=2 /home/chk/SAPClients/SAPGUI8.10rev10/bin/guilogon
  • Java: OpenJDK 25 (pacman: jre-openjdk)
  • HiDPI-Scaling: GDK_SCALE=2 als Umgebungsvariable beim Start setzen
  • Installer-Hinweis: Installation muss aus dem Unterverzeichnis com/sap/platin/micro/ gestartet werden (java -cp ".:*" com.sap.platin.micro.Microkernel), da der Installer einen Pfadfehler hat

Remote Desktop Manager

  • Paket: remote-desktop-manager (pacman), Start: /usr/bin/remotedesktopmanager
  • RDP-Client: freerdp v3 — liefert nur xfreerdp3, aber RDM erwartet xfreerdp
  • Symlink nötig: sudo ln -s /usr/bin/xfreerdp3 /usr/bin/xfreerdp
  • NLA-Problem: Der eingebaute RDP-Client von RDM (Devolutions SSPI-Modul) scheitert an NLA/SPNEGO-Authentifizierung unter Linux. Workaround: In der Verbindung unter Authentication → "Enable Network Level Authentication (NLA)" deaktivieren

Citrix Workspace App

  • Paket: icaclient (AUR, via paru)
  • StoreFront: https://apps.krah-gruppe.de (extern via Gateway) / https://apps.krah.intranet.de (intern)
  • Auth: Domain + RSA (2FA)

SSL-Zertifikate

System-Zertifikate verlinken, sonst schlagen SSL-Verbindungen fehl:

sudo ln -sf /etc/ssl/certs/* /opt/Citrix/ICAClient/keystore/cacerts/
sudo c_rehash /opt/Citrix/ICAClient/keystore/cacerts/

Fehlende Intermediate-Zertifikate: Der Citrix StoreFront-Server (apps.krah-gruppe.de) liefert kein Intermediate-Zertifikat mit. Browser laden fehlende Intermediates automatisch nach (AIA), der Citrix-Client aber nicht. Das Intermediate muss manuell hinzugefügt werden:

# Intermediate-Zertifikat von GlobalSign herunterladen und konvertieren
curl -sL http://secure.globalsign.com/cacert/gsgccr6alphasslca2025.crt \
  | openssl x509 -inform DER -out /opt/Citrix/ICAClient/keystore/cacerts/gsgccr6alphasslca2025.pem
sudo c_rehash /opt/Citrix/ICAClient/keystore/cacerts/

Hinweis: Bei Zertifikatserneuerung kann sich die Intermediate-CA ändern. Die AIA-URL steht im Server-Zertifikat:

openssl s_client -connect apps.krah-gruppe.de:443 </dev/null 2>&1 | openssl x509 -noout -text | grep 'CA Issuers'

receiver://-Protokoll-Handler

Das AUR-Paket registriert den receiver://-Protokoll-Handler nicht automatisch. Ohne diesen öffnet der Browser einen KIO-Fehler statt die Citrix App. Fix:

printf '[Desktop Entry]
Type=Application
Name=Citrix Receiver Protocol Handler
NoDisplay=true
MimeType=x-scheme-handler/receiver;
TryExec=/opt/Citrix/ICAClient/selfservice
Exec=/opt/Citrix/ICAClient/selfservice --icaroot /opt/Citrix/ICAClient %%u
' | sudo tee /usr/share/applications/citrix-receiver-handler.desktop

xdg-mime default citrix-receiver-handler.desktop x-scheme-handler/receiver

Store-Konfiguration importieren

Die StoreFront-Webseite bietet eine .cr-Datei (Provisioning-Datei) an. Diese wird als text/x-crystal erkannt und im Texteditor geöffnet statt in Citrix. Import über CLI:

/opt/Citrix/ICAClient/selfservice --icaroot /opt/Citrix/ICAClient ~/Downloads/receiverconfig.cr

keyd — Tastatur-Remapping (Logitech MX Mechanical)

  • Paket: keyd (AUR, via paru)
  • Gerät: Logitech MX Mechanical Keyboard (046d:b366)
  • Config: /etc/keyd/default.conf
  • Mapping: Calculator-Taste → Druck/Screenshot
  • Wichtig: [ids] nur auf die Logitech-ID beschränken, nicht * — sonst werden globale Shortcuts (z.B. Super+Shift+Space) blockiert
  • Keynamen ermitteln: sudo keyd -m zeigt die tatsächlichen Keynamen (z.B. calc, nicht calculator)
[ids]
046d:b366

[main]
calc = print
sudo systemctl enable --now keyd
sudo keyd reload   # nach Config-Änderungen
  • Treiber: displaylink (AUR, via paru) + evdi-dkms (AUR)
  • Service: displaylink.service (systemd)
  • Einrichtung:
paru -S evdi-dkms displaylink
sudo systemctl enable --now displaylink
  • Hinweis: evdi-dkms kompiliert per DKMS gegen den aktiven Kernel — nach Kernel-Updates wird das Modul automatisch neu gebaut

Microsoft Teams (teams-for-linux)

  • Paket: teams-for-linux (CachyOS-Repo), Electron-basierter Unofficial Client
  • Problem: Kamera und Tonausgabe funktionierten ohne zusätzliche Konfiguration nicht
    • Kamera: Electron nutzt ohne WebRTCPipeWireCapturer nicht den PipeWire-Kamerapfad
    • Tonausgabe: Chromiums AudioServiceOutOfProcess-Feature lagert Audio in einen Sandboxed-Prozess aus, der unter PipeWire/Wayland keinen Zugriff auf den PipeWire-Socket (/run/user/1000/pipewire-0) hat — es wird kein Audio-Output-Stream erzeugt
  • Lösung: Beide Probleme über electronCLIFlags in der App-Config beheben:
    • Config: ~/.config/teams-for-linux/config.json
    {
      "electronCLIFlags": [
        ["enable-features", "WebRTCPipeWireCapturer"],
        ["disable-features", "AudioServiceOutOfProcess"]
      ]
    }
    
  • Hinweis: Nach Änderung der Config muss Teams komplett neu gestartet werden (Tray-Icon schließen)

Installierte Pakete (manuell)

  • teams-for-linux — MS Teams Client (CachyOS-Repo)
  • rclone — Cloud-Sync (pacman)
  • onedrive-abraunegg — OneDrive-Client (nicht in Verwendung)
  • networkmanager-openvpn — OpenVPN-Plugin für NetworkManager
  • Sophos Protection for Linux (SPL) — /opt/sophos-spl, via SophosSetup.sh aus Sophos Central
  • SAP GUI for Java 8.10 — /home/chk/SAPClients/SAPGUI8.10rev10/, benötigt jre-openjdk
  • keyd — Tastatur-Remapping (AUR)
  • freerdp — RDP-Client für Remote Desktop Manager (Symlink xfreerdpxfreerdp3 nötig)
  • remote-desktop-manager — Devolutions RDM
  • icaclient — Citrix Workspace App (AUR)
  • dotnet-sdk-9.0 — .NET 9 SDK
  • evdi-dkms — DisplayLink-Kernelmodul (AUR, DKMS)
  • displaylink — DisplayLink-Treiber (AUR)

Polkit: Laufwerke ohne Passwort mounten

  • Regel: /etc/polkit-1/rules.d/10-udisks2-mount.rules
  • Erlaubt Mitgliedern der Gruppe storage das Mounten über den Dateimanager ohne Passwortabfrage
  • Abgedeckte Actions: filesystem-mount, filesystem-mount-other-seat, filesystem-mount-system
  • Einrichtung:
printf 'polkit.addRule(function(action, subject) {
    if ((action.id == "org.freedesktop.udisks2.filesystem-mount" ||
         action.id == "org.freedesktop.udisks2.filesystem-mount-other-seat" ||
         action.id == "org.freedesktop.udisks2.filesystem-mount-system") &&
        subject.isInGroup("storage")) {
        return polkit.Result.YES;
    }
});
' | sudo tee /etc/polkit-1/rules.d/10-udisks2-mount.rules
  • Hinweis: fish-Shell unterstützt kein << 'EOF' Heredoc — printf ... | sudo tee verwenden

BTRFS Subvolumes

  • /@/
  • /@home/home
  • /@root/root
  • /@srv/srv
  • /@cache/var/cache
  • /@tmp/var/tmp
  • /@log/var/log