Repository navigation
bug(vm): capability probe cannot read /proc/self/status on rootless RHEL HPC host #4014
Description
User Story
As a user on a locked-down HPC cluster,
I want the MicroVM driver to start a sandbox using the available unprivileged KVM access,
so that I can use OpenShell where Docker and Podman are unavailable.
Problem Statement
With OpenShell 0.1.2 and the opt-in MicroVM driver, openshell sandbox create --name demo allocates the sandbox, pulls and boots the image, completes privileged guest initialization, and then enters the Error phase. Immediately after the guest reports starting OpenShell VM sandbox, the capability-free startup probe fails to read /proc/self/status with EACCES.
The gateway and VM compute driver remain healthy. The failure occurs after the guest reconciles the sandbox identity to UID/GID 1000 and before the workload starts.
Impact / Why This Matters
No sandbox can be created on this host despite /dev/kvm being available and the MicroVM booting successfully. Docker and Podman are not installed, and the site-provided Apptainer runtime is not supported by OpenShell, so there is currently no usable OpenShell compute driver on this cluster.
Increasing VM memory does not appear relevant: the host has ample available memory, no process or cgroup PID cap was reached, and the first actionable failure is the procfs permission denial. The later workqueue message appears while the failed guest is shutting down.
Acceptance Criteria
- A MicroVM sandbox reaches the Running phase on this host configuration.
- The capability-free runtime qualification can inspect its own capability state, or reports the exact unsupported guest procfs configuration and an actionable remediation.
- The documented VM prerequisites identify any required host or guest procfs, namespace, SELinux, or sysctl settings.
Reproduction Steps
- Install the v0.1.2 Linux release archives without root privileges.
- Configure the gateway with
compute_driver = "vm", the releasedopenshell-driver-vm, andnvcr.io/nvidia/base/ubuntu:24.04as both the default and bootstrap image. - Start the user-level gateway service.
- Confirm
openshell statusis connected andopenshell gateway inforeports the v0.1.2 VM driver healthy. - Run
openshell sandbox create --name demo. - Observe that image preparation and VM boot succeed, followed by the procfs permission failure below.
Environment
- OpenShell CLI, gateway, VM driver, and guest sandbox: 0.1.2
- Host OS: RHEL 9.8
- Host kernel:
5.14.0-687.52.1.el9_8.x86_64 - Architecture: x86_64
- Deployment: rootless user-level gateway, libkrun MicroVM driver, KVM accessible
- Host security: SELinux enforcing
- Host storage: home and OpenShell state under NFS
- Host
user.max_user_namespaces:0 - Host
kernel.yama.ptrace_scope:0 - Host
fs.suid_dumpable:0 - VM allocation: 2 vCPUs, 2048 MiB RAM
- Sandbox/bootstrap image:
nvcr.io/nvidia/base/ubuntu:24.04 - Docker: unavailable
- Podman: unavailable
- Apptainer/Singularity: 1.5.3 available
Logs
Created sandbox: demo
VM guest console:
[0.010s] setting up writable overlay root
[0.237s] reconciled sandbox account (1000:1000)
[0.272s] prepared /sandbox ownership (1000:1000)
[0.303s] hostname=demo
[0.370s] OPENSHELL_SANDBOX_ID=<redacted>
[0.375s] starting OpenShell VM sandbox
Error: x read /proc/self/status
`-> Permission denied (os error 13)
[ 0.755621] workqueue: Failed to create a worker thread: -12openshell gateway info reports the gateway and openshell-driver-vm as healthy. Host diagnostics showed ample available RAM, pids.max=max, and no session memory limit.
Initial Investigation
The v0.1.2 guest startup path changes to the configured non-root identity, clears capabilities, sets no_new_privs, and then the mandatory runtime qualification reads /proc/self/status to verify the capability sets. That read is the first failing operation. This localizes the failure but does not establish whether the incompatible procfs behavior originates in the guest mount options, the embedded libkrun runtime/kernel, or another host-specific interaction.
Related Apptainer Roadmap Question
This environment is representative of an HPC cluster where Apptainer is provided but Docker/Podman and unprivileged user namespaces are unavailable. The directly relevant Apptainer proposal #1393 was closed as not planned, while the open native OCI driver proposal #2255 lists rootless mode as a non-goal for its initial release.
Is there now a supported path or roadmap estimate for Apptainer-compatible HPC environments? If Apptainer support is still not planned, confirmation that there is no expected timeline would help users plan around this class of cluster.
Activity
elezar commentedon Oct 1, 2026
github-actions commentedon Oct 16, 2026
This issue has had no activity for 14 days and is now marked stale. It may be closed in 14 days if there is no further activity. Comment or remove the state:stale label to keep it open.
bombazook commentedon Oct 25, 2026
Same failure on a different host profile, which may help narrow it down: it reproduces here without SELinux, NFS, rootless mode, or x86_64.
Environment
openshell-driver-vmfrom the0.1.5-1arm64.deb)6.1.115-vendor-rk35xx, aarch64 (Rockchip RK3588: 4× Cortex-A55 + 4× Cortex-A76), 16 GB RAMcompute_driver = "vm", TLS on,/dev/kvmpresentcapability,apparmor,bpf; no SELinux, no Yamafs.suid_dumpable = 0,user.max_user_namespaces = 63711Gateway config (
[openshell.drivers.vm])Repro
These are the conditions afterwards. The phase is
Error, and the provisioning phase ispreparation.WorkloadIdentityDriverResolvedConfigurationReadyConfigurationPendingReadyProcessExitedGuest console (
rootfs-console.log)Sandbox logs
The same happens with our own image, a Debian-based image with a
sandboxuser, and with the community base image.The failing read is the first one in
qualify_runtime(crates/openshell-sandbox/src/main.rs). This host differs from the original report in SELinux, NFS, rootless mode and architecture. That points to the guest side, such as the procfs mount or the guest kernel config of the VM runtime on Linux, rather than to anything specific to the RHEL host.vpzed commentedon Oct 26, 2026
User Story
I am evaluating OpenShell to run AI agents with separate-kernel MicroVM isolation and integrated policy controls. On my test deployment, the guest fails before its main workload starts, which blocks that evaluation.
The diagnostic commands were executed by an AI assistant on systems I provided, under my approval. I reviewed the configuration, mechanism, and results, but I am not claiming that I manually typed every command.
I need the released MicroVM driver to start a non-root workload without relaxing the gateway's shipped file-creation permissions or exposing host directories.
Problem Statement
Ubuntu 26.04.1 LTS x86_64, kernel 7.0.0-38, with the OpenShell 0.1.5 Debian package, a non-root gateway running as UID/GID 2001:2001 and a (bind) mount-free MicroVM workload configured as 1000:1000 fails runtime qualification under the package's shipped
UMask=0077setting.Similar to other reports here, the guest console reports
read /proc/self/status: Permission denied (os error 13)after reconciling the guest account to 1000:1000. The sandbox entersError, with configuration pending and no main-process start recorded.A controlled fresh-state sequence using service umasks
0077 → 0022 → 0077producedfailure → success → failure, with the same released binary, pinned image, explicit policy, guest identity, and VM sizing. Each case used its own database, VM cache, and writable overlay. All three reportedWorkloadIdentity=True, reasonDriverResolved, with UID:GID 1000:1000./proc/self/statusread/uppermode/upperUID:GIDThe directory metadata was inspected read-only after confirmed sandbox stop. These observations strongly implicate umask-dependent guest-root traversal permissions, but do not prove that
/upperis the only affected object. The error naming/proc/self/statusdoes not by itself establish a procfs-specific defect.Impact / Why This Matters
The failure prevents the intended non-root MicroVM workflow from reaching application execution, so I cannot proceed to evaluate the remaining policy controls.
Using
0022in an isolated diagnostic case allowed startup, but I have not accepted it as a deployment workaround: the safety of all other generated files and credentials under that broader setting has not been evaluated. Running the workload as root or changing its identity merely to avoid the failure would also change the workflow being evaluated.Acceptance Criteria
UMask=0077, a mount-free MicroVM on the described host configuration reachesReadyand accepts its configuration with gateway UID/GID 2001:2001 and guest UID/GID 1000:1000.idand actually reads/proc/self/statusas that non-root identity.Reproduction Steps
Use an isolated Linux test deployment of the released 0.1.5 Debian package, with KVM accessible to its non-root user-service account. In the tested setup that account had UID/GID 2001:2001, while the guest was explicitly configured as 1000:1000. A host account already numbered 1000 is not an equivalent ownership comparison.
Prerequisites: the packaged user service and local TLS are already configured, the CLI has an authenticated registration for this gateway, and no sandbox is running. Keep the package-managed TLS location unchanged across cases. Save existing nonsecret gateway configuration/drop-ins privately before changing them. Do not overwrite an existing installation's configuration or run this against valuable retained workloads. No OpenShell source checkout, custom image build, Docker/Podman installation, or project-specific helper is required for the failing operation.
1. Prepare one fresh case
Run the cases sequentially as
a1/0077,b/0022, anda2/0077, stopping and preserving each case before preparing the next. The shell umask stays 077 for private administrative files; the service override below is the variable being tested.Write this explicit policy to
$CASE_DIR/policy.yaml. It is the same custom keyless policy in every case, not the upstream default policy:2. Select the case and start the user service
After reviewing/backing up the existing nonsecret configuration, select the new case:
Verify the actual gateway and driver
/proc/<pid>/statusshow the intended umask and UID/GID, and that the new database is under$CASE_DIR/state/openshell/gateway/. Use bounded read-only readiness checks if the listener is still starting; do not repeatedly restart the service. Before creation, require authenticated status and a complete empty inventory:Stop if the inventory is nonempty or the active paths/identity/umask do not match the new case. Check other unit drop-ins/environment overrides rather than assuming this one is effective.
3. Make one create attempt and inspect the result
The executed comparison bounded each create client at 210 seconds; none timed out. A timeout or client failure is not permission to retry: inspect the exact sandbox first and preserve evidence. Examine
WorkloadIdentity, readiness, configuration admission, and main-process start separately. Preserve a small relevant guest-console excerpt from this case's sandbox UUID directory; do not publish tokens, runtime descriptors, keys, or full private logs.For any Ready case, including an unexpectedly successful A case:
4. Preserve and stop before the next case
Capture the case's bounded diagnostics before stopping. Then:
Require
Stoppedand no VM/supervisor writers before inspecting disk metadata. Optional supporting evidence, using the exact UUID returned bysandbox getand the already-present VM prerequisitedebugfs:Do not use
debugfs -w, change disk permissions, delete the sandbox, or reuse its database/cache. Preserve post-stop diagnostics, then stop the case gateway and verify it and its descendants are gone:Repeat from step 1 with
CASE=b,MASK=0022, thenCASE=a2,MASK=0077, always using unused paths. Keep image, policy, guest identity and sizing unchanged. Leave the service stopped after the final case, retain evidence, and record which configuration remains selected. This is a diagnostic comparison, not installation guidance for a permissive umask.Suggested UX (if applicable)
No new CLI or configuration interface is requested. The existing documented MicroVM identity configuration should work under the packaged service permissions. This report does not prescribe a particular internal fix.
Environment
openshell_0.1.5-1_amd64.deb(latest stable at draft review).[5]6af7859a87ab0b3bf96aef2216db191b597308ac00df9bfe5d0e5e9912f8e2ab.c93fc9a2d9612817ce205ea1c3a74f49df6cda75ced0bd72af93c848488a4874.7.0.0-38-generic; systemd 259.9; e2fsprogs 1.47.2-3ubuntu4.--vm-mountarguments.pids.maxwas unavailable. This comparison does not establish resource-limit enforcement, egress enforcement, artifact export, or comprehensive isolation.Logs
Minimal excerpt from each failing A case, with ANSI escapes removed and variable timestamps omitted:
Failing A cases' authenticated conditions:
Successful B exec output (exit 0):
All three sandboxes were explicitly stopped and verified
Stopped; the gateway was then stopped, with its prior service cgroup removed and no visible runtime descendants. Evidence and disks were preserved. The process inspection was unprivileged, not an exhaustive privileged host audit.