Kernel and filesystem compatibility¶
This page lists what AWC needs from a Linux host.
The host admission probe gates every entry below. A host that fails an assessed probe is unschedulable for writable mounts.
Supported host profile¶
The certified host profile.
| Requirement | Value |
|---|---|
| Kernel | 6.1 or newer |
| Cgroup hierarchy | cgroup v2 |
| FUSE | enabled |
| OverlayFS | enabled |
| Local filesystem for cache and upper | ext4 or XFS |
| xattrs | usable |
| Privileges | root or equivalent host capabilities for mount management |
| Local storage | local SSD or NVMe strongly recommended |
| Network | outbound access to the control plane and object store |
| Operating system | Linux only (no Windows or macOS mounts) |
The daemon reads the kernel release from /proc/sys/kernel/osrelease and parses the leading major.minor. A release below 6.1 fails the probe.
Kernel facilities AWC depends on¶
| Facility | What AWC uses it for |
|---|---|
| OverlayFS | Composes the read-only base snapshot (lower) with a private writable delta (upper). |
| FUSE | Serves the shared read-only base filesystem. |
| cgroup v2 | Freezes the execution cgroup for a quiesced checkpoint. |
| ext4 or XFS | Backs the cache and the per-session upper and work directories. |
| xattrs | Carries OverlayFS whiteout and opacity markers. |
| Mount namespaces | Publishes the merged view to the host, then bind-mounts it into a sandbox. Not a probe category; enforced by the mount helper. |
OverlayFS mount contract¶
The workspace overlay is mounted as overlay over three directories:
lowerdir=/var/lib/awc/basefs/tenants/<tenant-id>/snapshots/<root-digest>
upperdir=/var/lib/awc/workspaces/<workspace-id>/<generation>/upper
workdir=/var/lib/awc/workspaces/<workspace-id>/<generation>/work
The mounter shells out to mount -t overlay overlay -o <options> <merged>.
Required mount options¶
AWC disables every OverlayFS behavior that makes checkpoint delta interpretation ambiguous. Each of the following MUST be explicitly off before a workspace is exposed.
| Option | Required value | Reason |
|---|---|---|
redirect_dir |
off |
Directory redirects would defeat delta interpretation. |
metacopy |
off |
Metadata-only copy-up splits content from metadata. |
index |
off |
Hard-link index adds state AWC does not interpret. |
xino |
off |
Inode remapping is not needed and complicates stable inodes. |
AWC rejects any option set where one of these four is absent or set to a value other than off. The mount path checks the policy before it exposes the workspace. Unsupported combinations fail mount creation.
OverlayFS delta interpretation¶
The checkpoint builder scans the upper directory and interprets the kernel's overlay representation. The recognized markers and their xattr namespaces are:
| Marker | xattr | Meaning |
|---|---|---|
| Whiteout | character device 0/0 entry in upper |
The matching lower entry is deleted. |
| Opaque directory | trusted.overlay.opaque=y or user.overlay.opaque=y |
Lower children of this directory are hidden. |
AWC tries user.overlay.opaque first, then trusted.overlay.opaque. An unsupported redirect or metacopy marker causes a safe checkpoint failure, never an incorrect snapshot.
Lowerdir path component¶
OverlayFS reserves : as the lowerdir list separator. The lower path component therefore uses a colon-free form: the digest's first colon is replaced with a dash, for example sha256-<hex> instead of sha256:<hex>. The digest keeps its canonical sha256:<hex> form everywhere else.
FUSE read-only basefs¶
One shared read-only FUSE filesystem is mounted at the configured basefs path.
| Property | Value |
|---|---|
| Mount point | /var/lib/awc/basefs (required field, no default) |
| Snapshot path | /var/lib/awc/basefs/tenants/<tenant-id>/snapshots/<root-digest>/ |
| Exposed operations | lookup, getattr, readdir, open, read, readlink, statfs |
| Write operations | Return EROFS |
| Mount options | RO, FSName=awc-basefs, AutoUnmount, AllowRoot |
There is one multiplexed FUSE daemon per host, not one per workspace.
AllowRoot and the overlay-over-FUSE mount¶
The OverlayFS lowerdir points into the FUSE basefs that awcd itself serves. The kernel resolves the lowerdir with root-class credentials. Without AllowRoot, the FUSE mount denies that resolution with EACCES and the overlay mount fails. AllowRoot grants access to root and to the mount owner, which is awcd. This behavior is recorded in the awcd.service capability note.
Privileges and capabilities¶
awcd runs as the unprivileged awc user but holds a fixed, minimal capability set so it can perform privileged mount operations and access /dev/fuse.
| Capability | Reason |
|---|---|
CAP_SYS_ADMIN |
Mount, OverlayFS, bind, cgroup freeze, and setns. |
CAP_DAC_OVERRIDE |
Required for the workspace OverlayFS mount whose lowerdir lives in the read-only FUSE basefs. Without it, the kernel's lowerdir resolution fails with EACCES. |
CAP_DAC_READ_SEARCH |
Checkpoint upper-directory bookkeeping. |
CAP_CHOWN |
Per-session upper-directory ownership. |
CAP_FOWNER |
Upper-directory file operations. |
See systemd units for the full unit. Device access is scoped with DeviceAllow=/dev/fuse rw; PrivateDevices is not set because awcd needs /dev/fuse.
Mount namespace visibility¶
awcd creates the internal merged mount in the host mount namespace, then bind-mounts the path into an authorized sandbox namespace or a configured host target.
The awcd.service unit deliberately omits the systemd directives that create a private mount namespace with disconnected propagation: ProtectSystem, ProtectHome, PrivateTmp, ProtectKernelModules, ProtectKernelLogs, ProtectClock, ProtectProc, and ReadWritePaths. Those directives would confine awcd mounts to a namespace that clients, the worker, and acceptance checks cannot see. Other hardening axes are retained. See systemd units.
Namespace target handles¶
A bind target into a sandbox namespace MUST be identified by a stable, integration-provided handle, never by a raw PID supplied by an untrusted process.
- A raw PID is rejected as a namespace handle.
- When a PID is used internally,
awcdretains a pidfd-modeled token and re-checks the reuse generation before it enters a namespace or binds.
Bind mount hardening¶
| Option | Default |
|---|---|
nodev |
Always on |
nosuid |
Always on |
noexec |
Off by default; policy-selected by the sandbox |
The inverse options dev and suid are rejected. noexec is off by default because agents may need to run built binaries; the sandbox owns that decision, not the storage layer. The bind target MUST be under an allow-listed root.
cgroup v2 quiesce¶
A quiesced checkpoint freezes the execution cgroup, synchronizes the filesystem, scans a stable delta, publishes, and resumes. The freezer writes and reads the cgroup v2 freeze file.
| Operation | Action |
|---|---|
| Freeze | Write 1 to <cgroup>/cgroup.freeze. |
| Thaw | Write 0 to <cgroup>/cgroup.freeze. |
| Confirm frozen | Read <cgroup>/cgroup.freeze and poll until 1. |
The freeze timeout is bounded by checkpoint.freeze_timeout_seconds (default 10 seconds). The cgroup MUST be below an allow-listed agent subtree, awcd MUST never freeze itself, and a quiesced checkpoint MUST be rejected if the execution group cannot be safely controlled.
Host admission probe¶
Before admitting a host for writable mounts, awcd MUST run or verify a compatibility probe. Admission is fail-closed.
Registration-time checklist¶
The full checklist a host MUST pass at registration. Each item names one required FUSE or overlay behavior.
| Check name | Behavior verified |
|---|---|
fuse_lower_directory |
FUSE lower-directory support. |
file_create_modify_delete_rename_chmod |
File create, modify, delete, rename, and chmod. |
symlink_behavior |
Symlink creation and read. |
directory_opacity_whiteouts |
Directory opacity and whiteouts. |
copy_up_behavior |
Copy-up from lower to upper. |
supported_mount_options |
The AWC option set is accepted. |
checkpoint_interpretation |
Delta interpretation matches the live merged view. |
unmount_cleanup |
The overlay unmounts cleanly. |
A host with every check passing is ACTIVE. Any failure leaves the host UNSCHEDULABLE for writable mounts.
Live readiness probe¶
The /readyz endpoint runs four privilege-free probes on every scrape. They read /proc or /sys and need no capabilities.
The four probes are Kernel, CgroupV2, Fuse, and OverlayFs.
Readiness fails closed on kernel compatibility: an unverified host reports Unknown and /readyz denies new mounts.
Probe states and admission decision¶
A probe result is one of Pass, Fail, or NotAssessed. NotAssessed is distinct from Fail: the host is not known-bad, it is unverified.
| Report | Admission decision | Readiness component |
|---|---|---|
| Every assessed probe passes | Schedulable |
Ok |
| One or more critical probes could not be assessed | Unverified |
Unknown |
| One or more assessed probes failed | Unschedulable |
Down |
The functional probes (rename, chmod, symlink, copy-up, whiteout, opacity, checkpoint interpretation, unmount cleanup) require an overlay mount and therefore CAP_SYS_ADMIN. On an unprivileged host they report NotAssessed rather than Fail, so the host is Unverified, not Unschedulable.
Certified tool suite¶
The tool compatibility suite materializes a snapshot to a real directory and runs one documented operation of each certified tool against it.
| Tool | Documented operation |
|---|---|
| Git | init, add, commit, log. |
| ripgrep | Recursive content search. |
| GNU coreutils | ls, executable script run, readlink, chmod. |
| Python and pytest | A stdlib-only test run. |
| Node.js and a package manager | Offline package script run. |
| Rust and Cargo | Offline cargo build of a std-only crate. |
| A compiler and linker | cc compile and link. |
| Archive tools | tar create and extract. |
| A language server | Crate indexing. |
A tool absent from the environment is skipped, not failed. Network-bound operations are out of scope, so the suite runs offline. The suite proves the materialized tree is byte-, mode-, and symlink-faithful. OverlayFS-specific behavior (whiteouts, copy-up) is verified separately from this suite; a live privileged FUSE mount is out of scope for this suite.
Kernel version matrix¶
A tested kernel matrix is meant to be published with each release. The current repository does not publish that matrix; the only version fact is the minimum floor.
| Range | Status | Reason |
|---|---|---|
| 6.1 and newer | Minimum supported | Minimum floor enforced at admission. |
| Below 6.1 | Unsupported | Fails the admission probe. |
| Specific certified versions | Per release | Not present in this repository. |
A host between the floor and a future certified-version matrix reports Schedulable from the static probes only if it also passes the functional probe. See Current scope.
Current scope¶
What the current build does not yet do:
- No published kernel matrix. A tested kernel matrix is required per release. The repository ships the minimum floor (
6.1) and a probe harness, but no certified-version table. - The functional admission probe is privilege-gated. The registration-time checklist is aggregated by the daemon, but the live functional checks that require an overlay mount run only where the daemon has
CAP_SYS_ADMIN. On an unprivileged host the functional categories reportNotAssessedand the host isUnverified, notSchedulable. - No language server is certified in this environment. The language-server slot in the tool suite skips when no functioning server is installed.
- File watchers are not in the tool suite. Common file watchers are conditional on design-partner need. No watcher test is shipped.
- The live readiness probe covers four categories.
/readyzassesses onlyKernel,CgroupV2,Fuse, andOverlayFs. The remaining static probes (UpperFilesystem,Xattrs,MountOptions) and all functional probes are part of the registration-time report, not the per-scrape readiness aggregate. See observability.