====== 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