====== std.sysadmin — System-Administration ====== ''import std.sysadmin;'' Wrapper für privilegierte Kernel-Operationen: Dateisystem-Einhängen, Chroot, Hostnamen, Sync und Reboot. > **Achtung**: Fast alle Funktionen erfordern ''CAP_SYS_ADMIN'', ''CAP_SYS_CHROOT'' oder ''CAP_SYS_BOOT''. Auf normalen Nutzersystemen geben sie ''-EPERM'' zurück. Syscalls: ''mount(165)'', ''umount2(166)'', ''chroot(161)'', ''sethostname(170)'', ''reboot(169)'', ''sync(162)''. → [[lyx_-_programmiersprache:units:security_ext|std.security_ext]] · [[lyx_-_programmiersprache:units:ns|std.ns]] · [[lyx_-_programmiersprache:units:xattr|std.xattr]] ---- ===== mount-Flags ===== ^ Konstante ^ Wert ^ Bedeutung ^ | ''MS_RDONLY'' | 1 | Schreibgeschützt einhängen | | ''MS_NOSUID'' | 2 | SUID/SGID-Bits ignorieren | | ''MS_NODEV'' | 4 | Gerätedateien verbieten | | ''MS_NOEXEC'' | 8 | Ausführen verbieten | | ''MS_SYNCHRONOUS'' | 16 | Synchrone Schreibvorgänge | | ''MS_REMOUNT'' | 32 | Eingehängten Mount neu konfigurieren | | ''MS_NOATIME'' | 1024 | Zugriffszeiten nicht aktualisieren | | ''MS_BIND'' | 4096 | Bind-Mount (Verzeichnis an anderer Stelle einblenden) | | ''MS_MOVE'' | 8192 | Mount verschieben | | ''MS_REC'' | 16384 | Rekursiver Bind/Unbind | | ''MS_SILENT'' | 32768 | Kernel-Meldungen unterdrücken | | ''MS_STRICTATIME'' | 16777216 | Zugriffszeiten immer schreiben | ===== umount-Flags ===== ^ Konstante ^ Wert ^ Bedeutung ^ | ''MNT_FORCE'' | 1 | Erzwingen (kann Datenverlust verursachen) | | ''MNT_DETACH'' | 2 | Lazy Unmount (unsichtbar machen, wird später gelöst) | | ''MNT_EXPIRE'' | 4 | Für abgelaufene Mounts markieren | ===== Reboot-Kommandos ===== ^ Konstante ^ Wert ^ Beschreibung ^ | ''LINUX_REBOOT_CMD_RESTART'' | 0x01234567 | Neustart | | ''LINUX_REBOOT_CMD_HALT'' | 0xCDEF0123 | Halt (kein Poweroff) | | ''LINUX_REBOOT_CMD_POWER_OFF'' | 0x4321FEDC | Ausschalten | | ''LINUX_REBOOT_CMD_RESTART2'' | 0xA1B2C3D4 | Neustart mit Nachricht | | ''LINUX_REBOOT_CMD_CAD_ON'' | 0x89ABCDEF | Ctrl-Alt-Del aktivieren | | ''LINUX_REBOOT_CMD_CAD_OFF'' | 0 | Ctrl-Alt-Del deaktivieren | Die Magic-Zahlen (''LINUX_REBOOT_MAGIC1'', ''LINUX_REBOOT_MAGIC2'') werden intern von ''Reboot()'' eingesetzt — nicht selbst übergeben. ---- ===== Funktionen ===== ^ Funktion ^ Signatur ^ Beschreibung ^ | ''SyncAll'' | ''(): int64'' | Schreibt alle gepufferten Daten auf Speichermedien; kein root nötig | | ''Chroot'' | ''(path: pchar): int64'' | Setzt Wurzelverzeichnis (erfordert ''CAP_SYS_CHROOT'') | | ''SetHostname'' | ''(name: pchar, len: int64): int64'' | Setzt Kernel-Hostname (erfordert ''CAP_SYS_ADMIN'') | | ''Mount'' | ''(source: pchar, target: pchar, fsType: pchar, flags: int64): int64'' | Hängt Dateisystem ein | | ''MountData'' | ''(source: pchar, target: pchar, fsType: pchar, flags: int64, data: pchar): int64'' | Wie Mount, mit zusätzlichen Mount-Optionen | | ''Umount'' | ''(target: pchar, flags: int64): int64'' | Hängt Dateisystem aus | | ''Reboot'' | ''(cmd: int64): int64'' | Neustart/Halt/Poweroff (erfordert ''CAP_SYS_BOOT'') | ---- ===== Verwendung ===== ==== tmpfs einbinden ==== import std.sysadmin; fn main(): int64 { // tmpfs mit max. 100 MB, ohne SUID und ohne Geräte var r: int64 := MountData("tmpfs", "/tmp/sandbox", "tmpfs", MS_NOSUID | MS_NODEV, "size=100m,mode=0755"); if (r < 0) { return r; } // Aufräumen Umount("/tmp/sandbox", 0); return 0; } ==== Bind-Mount ==== import std.sysadmin; fn BindMount(src: pchar, dst: pchar): int64 { return Mount(src, dst, "", MS_BIND); } ==== proc einhängen ==== import std.sysadmin; fn MountProc(): int64 { return Mount("proc", "/proc", "proc", MS_NOSUID | MS_NODEV | MS_NOEXEC); } ==== Schreibsicher aushängen ==== import std.sysadmin; fn SafeUmount(path: pchar): int64 { // Zuerst versuchen var r: int64 := Umount(path, 0); if (r = 0) { return 0; } // Falls beschäftigt: lazy unmount return Umount(path, MNT_DETACH); } ==== System herunterfahren ==== import std.sysadmin; fn Shutdown(): int64 { SyncAll(); // Erst alle Daten schreiben return Reboot(LINUX_REBOOT_CMD_POWER_OFF); } ---- ===== Hinweise ===== * **SyncAll** ist der einzige Aufruf ohne Privileges. Vor ''Reboot'' sollte immer ''SyncAll'' aufgerufen werden. * **Chroot allein reicht nicht** für sicheres Sandboxing: Ein root-Prozess kann chroot verlassen. Für echte Isolation: ''Chroot'' + ''ProcessSetNoNewPrivs()'' + Capability-Dropping (→ [[lyx_-_programmiersprache:units:security_ext|std.security_ext]]). * **Mount-Optionen**: ''MountData'' übergibt den ''data''-String direkt an den Kernel. Format ist Dateisystem-spezifisch: ''tmpfs'' = ''size=X,mode=0NNN''; ''ext4'' = ''noatime,data=writeback''. * **Reboot sofort**: Der Kernel führt ''Reboot'' sofort aus — kein Graceful-Shutdown der Prozesse. Vorher ''SyncAll()'' und Prozesse beenden. * **CAP_SYS_ADMIN**: Mount-Operationen erfordern in Namespaces (Container) unter Umständen nur Mount-Namespace-Rechte, nicht full ''CAP_SYS_ADMIN''. ---- Letzte Aktualisierung: 2026-06-06