3.3 KiB
name, description, metadata
| name | description | metadata | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| podman-nfs-bind-rprivate-blind | Containers bind NFS paths rprivate, so a mount landing after container start leaves them permanently blind while podman ps looks fine; fix is podman restart |
|
The eleven containers that bind NAS paths (jellyfin, jellyseerr, sonarr,
radarr, lidarr, whisparr, prowlarr, transmission, sftpgo,
syncthing, lazylibrarian) declare plain binds in compose.yml:
- /home/connor/video:/video
With no propagation flag podman defaults to rprivate. A bind captures the
directory as it exists at bind time, so if the NFS mount lands after the
container starts, the container holds the empty pre-mount directory forever.
Nothing re-syncs it and nothing reports it.
Measured 2026-10-02:
11:06:10 boot
11:06:22 home-connor-video.mount FAILED (mount.nfs: mount system call
failed, status=32 -- NAS not ready)
11:06:23 podman-restart.service started all containers -> empty bind
11:38:01 mount retried -> failed again
11:41:22 mount succeeded; no container ever saw it
Ten hours. Jellyfin playback failed with Error opening input: No such file or directory on every title, which reads as a per-file or per-client problem — the
report that opened the session was "Chromecast won't play Psych". It was neither
Chromecast nor Psych: all 24 bind mounts across all 11 containers were blind.
Sonarr logged 376 errors, all failed imports, no deletions.
Why: podman ps says Up, healthchecks pass, the host path is correct and
fully populated, and ls /home/connor/video from a shell looks perfect. The
breakage is only visible from inside the container's mount namespace.
How to apply: compare host and container counts rather than trusting either
alone, using each container's REAL bind destination — they differ
(sonarr is /mnt/nas -> /nas, transmission is downloads -> /data,
sftpgo is /srv/sftpgo/data/connor/*). Checking a guessed path returns 0 for
a directory that does not exist and fakes the symptom:
sudo podman inspect <ctr> --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}
{{end}}'
sudo podman exec <ctr> sh -c 'ls -A <dest> | wc -l'
Fix is sudo podman restart <ctr> — the bind re-resolves against the live
mount. No compose change needed, and podman-compose up -d is not required
because the definition has not changed.
Tested, not assumed: a tmpfs mounted onto a shared host path after container
start is seen by an rslave bind (1 entry) and NOT by an rprivate bind
(0 entries). So :rslave on these binds would make containers follow late
mounts and remounts, including the NAS-reboot case in
nfs-pnfs-scsi-layout-wedge. Connor declined this on 2026-10-02 along with
the boot-mount retry — do not add either without being asked. This is the
same scoping call recorded in nfs-mountpoints-immutable.
Unrelated but found in the same pass: an 847 MB file named
Taskmaster S22E05 Youre Nice 1080p WEB H264-NTb.exe in
downloads/completed/tv-sonarr/. Flagged to Connor as a malware-shaped name.
Related: nfs-mountpoints-immutable, podman-compose-bind-mount-restart, nfs-pnfs-scsi-layout-wedge, nas-dual-homed-wifi-path