A point-in-time audit of what crun (the C reference runtime) supports that rsrun does not. Grouped by likelihood of biting a real Docker / Podman / Kubernetes user.
For what rsrun does implement, see README.md and
architecture.md. For features rsrun and crun share
that crun also doesn't ship (e.g. linux_seccomp runtime-tools test),
see oci-compliance.md.
Most of this tier has now landed. The remaining gap is cgroup v1.
- crun:
src/run.c:50,src/exec.c:81 - rsrun: marks fds 3..N+2 non-CLOEXEC in the parent before clone3 so they inherit into the container init.
- crun:
src/run.c:55,src/create.c:45 - rsrun: child uses
chroot(2)+chdir("/")instead of the defaultpivot_root(2)+umount2(MNT_DETACH)path.
- crun:
src/libcrun/linux.c:4413,linux.c:328 - rsrun: per idmapped mount, the parent forks a helper task that
unshares a userns and writes the requested uid_map/gid_map into it;
the parent opens
/proc/<helper>/ns/userand passes the fd into the child via clone3 fd inheritance; the child's mount loop runsopen_tree(OPEN_TREE_CLONE)on the source, appliesmount_setattr(MOUNT_ATTR_IDMAP)with the userns fd, thenmove_mounts the detached tree onto the spec target. Linux 5.12+.
- crun:
src/libcrun/linux.c:3636 - rsrun: written to
/proc/<init_pid>/oom_score_adjfrom the parent after clone3 returns the host-ns pid.
- crun:
src/libcrun/cgroup-resources.c:1202and the v1 subsystem files - What: per-controller cgroups under
/sys/fs/cgroup/<controller>/on older kernels / hosts booted withoutsystemd.unified_cgroup_hierarchy=1. - rsrun: v2 only. RHEL 8, Amazon Linux 2, older Debian default to v1.
- crun:
src/libcrun/scheduler.c:146 - What:
SCHED_FIFO,SCHED_RR,SCHED_DEADLINE, nice value, RT priority, scheduler flags. Applied viasched_setattr(2). Used by realtime workloads, latency-sensitive Kubernetes pods, audio / video containers. - rsrun: ✅ landed. Applied with
sched_setattr(2)from the parent afterclone3; unknown policies and flags are rejected at parse time.
- crun:
src/libcrun/container.c:817 - What: OCI hooks may declare a
timeout(seconds); crun kills the hook process and fails the container start if it overruns. - rsrun: ✅ landed for hooks that declare
timeout, usingpidfd_open+pollwhere available, thenSIGKILL+ reap on deadline. Hooks that omittimeoutcan still block, so runtime-level operation timeouts remain an agent-runtime roadmap item.
- crun:
checkpoint/restoreare CRIU-backed process checkpoint commands. - rsrun: has filesystem-only state primitives for overlay-backed
stopped states:
snapshot,restore,fork,checkpoint, andfork-checkpoint. These are intended for branchable agent state, not live process checkpointing.
- crun:
src/libcrun/linux.c:3666 - What: rejects
kernel.hostnameifhostnamefield also set; rejects sysctls that require a namespace not in the spec; rejects non-namespaced sysctls under user-ns. - rsrun: writes whatever's in the map; the kernel's own EACCES / EINVAL is the only check. Misconfigured bundles silently get partial application.
- crun:
src/libcrun/terminal.c - What: initial PTY rows × columns via
TIOCSWINSZafter PTY allocation. - rsrun: parsed-but-ignored —
docker run -itworks but the initial size is whatever the kernel default is.
- crun: implicit via
prlimit64returning EINVAL - What: crun rejects bundles where soft > hard at parse time; rsrun accepts and lets the kernel error.
- rsrun: relies on kernel; user gets a less helpful error.
- crun:
src/libcrun/linux.c:2230 - What: chooses between
context=mount option (mqueue, tmpfs) andsetxattr(security.selinux)(regular fs). Different per filesystem. - rsrun: not implemented — sets
process.selinuxLabelfor the exec'd process but doesn't propagatelinux.mountLabelto mount points. SELinux-enforcing hosts may see denied accesses on bind-mounted volumes.
- crun:
src/libcrun/linux.c:2212 - What: when bind-mounting over an existing directory, first copy the directory's contents into the tmpfs (overlayfs-like behavior). Used by some K8s ConfigMap / Secret mounts.
- rsrun: not implemented.
- crun:
src/libcrun/mount_flags.c:222 - What: per-mount
rro,rrw,rnoexec,rsuid, etc. — flags that propagate to all submounts viamount_setattr(MOUNT_ATTR_*, AT_RECURSIVE). Linux 5.12+. - rsrun: parses propagation modes for
rootfsPropagationbut not the per-mountr*flag set.
- crun:
src/libcrun/intelrdt.c - What: writes to
/sys/fs/resctrl/...to set per-container cache and memory-bandwidth class IDs. - rsrun: not implemented. Used in HPC + low-latency trading workloads.
- crun:
src/libcrun/mempolicy.c - What:
set_mempolicy(2)forMPOL_BIND/MPOL_INTERLEAVEbefore exec. NUMA-aware workloads. - rsrun: not implemented.
- crun:
src/libcrun/linux.c:1440 - What:
personality(2)flags (PER_LINUX32 etc.) for ABI emulation. Used by 32-bit-on-64-bit chroots. - rsrun: not implemented.
- crun:
src/libcrun/io_priority.c:49 - What:
ioprio_set(2)for I/O scheduling class. - rsrun: not implemented.
- crun:
src/libcrun/utils.c:926 - What:
change_profile(stacked) vschange_onexec(replacement) for container-in-container scenarios with pre-existing confinement. - rsrun: only does
change_onexec. Inner containers fail under some AppArmor stacking policies.
| Verb | crun source | What |
|---|---|---|
ps |
src/ps.c |
list processes inside a container |
mounts |
src/mounts.c |
dump the container's mount tree (debug) |
CRIU checkpoint, CRIU restore |
src/checkpoint.c, src/restore.c |
live process checkpoint/restore |
spec |
src/spec.c |
generate a default config.json |
ps and mounts are crun-specific debugging tools — not OCI verbs.
CRIU checkpoint/restore is a big feature (CRIU dependency, ~1500 LOC in
crun's wrapper alone). rsrun's similarly named filesystem-state
commands do not restore live processes. spec is small and worth
implementing for ergonomics but rarely hit by engines.
- Multi-arch: ✅ landed for CI coverage. Unit tests, lifecycle smoke tests, and runtime-tools validation run on x86_64 and aarch64.
- Static musl build: rsrun's release binary links dynamically against glibc. crun ships static binaries for 8 architectures.
- Distro packaging: no .deb / .rpm / AUR yet; users build from source.
When a user reports a Docker / Podman bug under --runtime=rsrun,
check this list first. Most reports fall into one of:
- cgroup v1 host (Tier 1) → reboot with cgroup v2 unified or wait for v1 support.
- SELinux-enforcing host with bind-mounted volumes (Tier 2) → known
gap (
mountLabelnot propagated). - Misconfigured
linux.sysctlvalues (Tier 2) → current errors are late or partial; parser-side conflict validation is still missing. - Initial TTY size or recursive mount flags differ from crun (Tier 2) → known compatibility gaps.
Items above with concrete LOC estimates and crun line numbers are the ones we'd implement next, in roughly this order:
linux.sysctlconflict validation (~30 LOC)process.consoleSize(~10 LOC)linux.mountLabelpropagation (~40 LOC)process.rlimits[].soft > hardvalidation (~5 LOC)tmpcopyupmount option (~25 LOC)- Recursive mount propagation flags (~30 LOC; kernel ≥ 5.12)
- cgroup v1 (~600 LOC; compatibility-driven)
- Static builds and distro packaging