setcap Error: 'Failed to set capabilities on file: Operation not supported' — Cause, Fix, and Troubleshooting Guide
Fix setcap 'Failed to set capabilities ... Operation not supported': the filesystem lacks xattr support (overlay/NFS/tmpfs). Diagnose and fix.
- #security
- #hardening
- #troubleshooting
- #linux
- #capabilities
Stuck on this DevOps Security & Hardening error? Get the free incident triage checklist
A one-page PDF — the exact steps to isolate, fix, and verify a production error like this one. No spam, unsubscribe anytime.
What this error means
setcap stores file capabilities in a security.capability extended attribute (xattr) on the binary. This error means the target filesystem does not support that xattr — commonly an overlay layer, NFS, some tmpfs/container filesystems, or a mount that strips the needed attributes. Capabilities are the least-privilege alternative to setuid-root, so this blocks a common hardening step.
Failed to set capabilities on file '/usr/local/bin/myapp': Operation not supported
The binary and the syntax may be perfect; the limitation is the filesystem where the file lives.
How it presents
sudo setcap 'cap_net_bind_service=+ep' binaryfails withOperation not supported.- The same command works on
/usr/bin(ext4/xfs) but fails inside a container image layer. - A Dockerfile
RUN setcap ...fails during build on an overlay backend. getcapshows no capabilities after an apparently successful copy.
Tracing the connection
# Which filesystem backs the file, and how is it mounted?
df -T /usr/local/bin/myapp
findmnt -no FSTYPE,OPTIONS -T /usr/local/bin/myapp
# Can this filesystem hold a security xattr at all?
sudo setcap cap_net_bind_service=+ep /usr/local/bin/myapp && \
getcap /usr/local/bin/myapp || echo "xattr not supported here"
# Compare against a known-good ext4/xfs path
cp /usr/local/bin/myapp /root/myapp && sudo setcap cap_net_bind_service=+ep /root/myapp && getcap /root/myapp
If the copy on /root (ext4/xfs) accepts the capability but the original path does not, the filesystem is the cause.
Network path causes
- Filesystem without xattr/security namespace support. Overlay upper/lower quirks, older NFS, or a tmpfs that does not carry
security.*xattrs. - Network filesystem. NFS generally does not support the file-capability xattr.
- Mount options stripping attributes. A mount with restrictive options or a squashed read-only layer.
- Building on the wrong layer.
setcapin a container build lands on an overlay layer that discards the xattr. - 9p / virtiofs shared folders (common in VMs) not passing
security.capabilitythrough.
Remediation steps
1. Place the binary on an xattr-capable filesystem (ext4/xfs on local disk), then set the capability:
sudo install -m 0755 myapp /usr/local/bin/myapp
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/myapp
getcap /usr/local/bin/myapp
2. In container builds, set capabilities at runtime, not on an overlay layer that drops the xattr:
# Instead of RUN setcap in the Dockerfile, grant at run time:
docker run --cap-add=NET_BIND_SERVICE myimage
# or for k8s, use securityContext.capabilities.add: ["NET_BIND_SERVICE"]
3. Avoid NFS for capability-bearing binaries — deploy them to local storage on each host.
4. As an alternative to file capabilities, grant the capability to the service via systemd:
# /etc/systemd/system/myapp.service
[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
Keeping the path healthy
- File capabilities are lost on
cpacross some filesystems and on rebuilds — re-apply as part of deployment, and verify withgetcap. - Prefer granting the minimal capability (
cap_net_bind_service) over setuid-root; do not reach forcap_sys_admin, which is near-root. - Container images should grant capabilities at runtime via
--cap-add/securityContext, keeping the image itself minimal. - systemd
AmbientCapabilitiesavoids filesystem xattr issues entirely and pairs well with a tightCapabilityBoundingSet.
Related connectivity errors
- seccomp ‘syscall blocked’ Error Guide
- fapolicyd ‘denied execution’ Error Guide
- Hardening the Docker Daemon and Container Runtime
Fixed it? Get 500 DevOps Security & Hardening & DevOps AI prompts — free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.
Stuck on this? Start guided troubleshooting
Open an interactive diagnostic session with this error already loaded. Work a step-by-step plan, record what each check returns, land on a root cause, and export a clean incident summary — no account needed to start.
Did this fix your issue?
Solved it a different way?
Share the fix that worked for you — reviewed, then published to help the next engineer.
That looks like it may contain a secret (key, token, password, or connection string). Please remove it — a note with a detected secret can’t be published.
Thanks — that helps. Published notes appear after a quick review.
Trending errors this week
The error guides other engineers are actually reading right now.
- 1mount: wrong fs type, bad option, bad superblock
- 2Docker 'failed to set up container networking': Fix the Bridge and IP Pool
- 3Docker 'failed to create shim task': How to Fix the containerd Runtime Error
- 4Transport endpoint is not connected
- 5modprobe: FATAL: Module not found
- 6mount: wrong fs type, bad option, bad superblock
Get 500 Battle-Tested DevOps AI Prompts — Free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.