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).

std.security_ext · std.ns · 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 (→ 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