Files
dotfiles/common/claude/memory/-home-connor/podman-nfs-bind-rprivate-blind.md
T
2026-10-22 09:21:28 -04:00

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
node_type type originSessionId modified
memory project 744ca9f1-a40a-422d-9fdb-4c28998f8f25 2026-10-03T02:09:18.003Z

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