dotfiles/modules/sysbox.nix
Daniel Bulant 9f6e0f48d3
add sysbox
2026-02-27 21:13:49 +01:00

106 lines
2.8 KiB
Nix

{
config,
lib,
pkgs,
...
}:
let
cfg = config.virtualisation.sysbox;
in
{
options.virtualisation.sysbox = {
enable = lib.mkEnableOption "Sysbox, a next-generation runc for running system containers";
package = lib.mkOption {
type = lib.types.package;
description = "The sysbox package to use.";
};
};
config = lib.mkIf cfg.enable {
virtualisation.sysbox.package = lib.mkDefault pkgs.sysbox;
# Configure Docker to use sysbox-runc runtime
virtualisation.docker.daemon.settings = lib.mkIf config.virtualisation.docker.enable {
runtimes.sysbox-runc = {
path = "${cfg.package}/bin/sysbox-runc";
};
};
# Configure Podman to use sysbox-runc runtime
virtualisation.containers.containersConf.settings = lib.mkIf config.virtualisation.podman.enable {
engine.runtimes.sysbox-runc = [
"${cfg.package}/bin/sysbox-runc"
];
};
systemd.services.sysbox-mgr = {
description = "Sysbox Manager Service";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
path = with pkgs; [
rsync
kmod
iptables
];
serviceConfig = {
Type = "notify";
ExecStart = "${cfg.package}/bin/sysbox-mgr";
Restart = "on-failure";
RestartSec = "10s";
User = "root";
Group = "root";
};
preStart = ''
# Ensure iptables is available in /sbin for sysbox compatibility
mkdir -p /sbin
for cmd in ${pkgs.iptables}/bin/iptables*; do
ln -sf "$cmd" "/sbin/$(basename $cmd)" || true
done
'';
};
systemd.services.sysbox-fs = {
description = "Sysbox FileSystem Service";
wantedBy = [ "multi-user.target" ];
after = [ "sysbox-mgr.service" ];
requires = [ "sysbox-mgr.service" ];
path = with pkgs; [
rsync
kmod
fuse
iptables
];
serviceConfig = {
Type = "notify";
ExecStart = "${cfg.package}/bin/sysbox-fs";
Restart = "on-failure";
RestartSec = "10s";
User = "root";
Group = "root";
};
};
# Enable unprivileged user namespace cloning (required for sysbox)
security.unprivilegedUsernsClone = true;
# Apply sysctl configuration (sysbox requires higher values than system defaults)
boot.kernel.sysctl = {
"fs.inotify.max_queued_events" = lib.mkOverride 999 1048576;
"fs.inotify.max_user_watches" = lib.mkOverride 999 1048576;
"fs.inotify.max_user_instances" = lib.mkOverride 999 1048576;
"kernel.keys.maxkeys" = lib.mkOverride 999 20000;
"kernel.keys.maxbytes" = lib.mkOverride 999 400000;
};
# Make sysbox-runc available in PATH for container runtimes
environment.systemPackages = [ cfg.package ];
};
}