nfs、systemd 和 automount(最终问题涉及使用 podman 重新启动容器中的挂载)

nfs、systemd 和 automount(最终问题涉及使用 podman 重新启动容器中的挂载)

费多拉 Linux 36

我在 /etc/fstab 中有以下形式的安装:

192.168.1.101:/volume1/video /mnt/synology_video nfs rsize=8192,wsize=8192,intr,comment=systemd.automount 0 0
192.168.1.101:/volume1/music /mnt/synology_music nfs rsize=8192,wsize=8192,intr,comment=systemd.automount 0 0

当机器启动时,systemctl 将显示安装的状态,如下所示......注意“等待”状态

mnt-synology_music.automount                     loaded active waiting   mnt-synology_music.automount
mnt-synology_video.automount                     loaded active waiting   mnt-synology_video.automount

我有一个运行 jellyfin 服务器的 podman 容器,需要使用在单元文件中设置的 podman-start 重新启动该服务器,如下所示:

[Unit]
Description=Podman Start All Containers With Restart Policy Set To Always
Documentation=man:podman-start(1)
StartLimitIntervalSec=0
Wants=network-online.target
After=network-online.target mnt-synology_music.automount mnt-synology_video.automount 

[Service]
Type=oneshot
RemainAfterExit=true
Environment=LOGGING="--log-level=info"
ExecStart=/usr/bin/podman $LOGGING start --all --filter restart-policy=always
ExecStop=/bin/sh -c '/usr/bin/podman $LOGGING stop $(/usr/bin/podman container ls --filter restart-policy=always -q)'

[Install]
WantedBy=default.target

podman 容器本身使用卷挂载(-v 选项)来挂载到主机上的那些文件系统(也许这是我需要更改的部分,直接挂载?)。

但是,当容器尝试重新启动时会失败每个安装恰好一次,然后成功有关符号链接的错误。我没有使用任何符号链接:

Error: OCI runtime error: crun: error stat'ing file `/mnt/synology_music`: Too many levels of symbolic links

当容器撞击每个安装座时,或者如果我只是手动ls安装,systemd的状态神奇地变成了跑步。目录中的一个ls现在点亮了安装座,很明显它们之前实际上并未“连接”,并且正在等待某些东西来接触它们:

  mnt-synology_music.automount                      loaded active running   mnt-synology_music.automount
  mnt-synology_video.automount                      loaded active running   mnt-synology_video.automount

然后似乎存在某种额外级别的“在启动 nfs 挂载之前等待某些内容实际接触目录”,并且它阻止我的容器干净地重新启动。当容器统计每个文件系统时,systemd 神奇地实际上启动安装,然后它就可以工作,但是,这会阻止自动重新启动工作。

我找不到任何影响此行为的选项。我实际上在某个地方看到了一条评论,说只是做ls -l来启动它们,这太疯狂了。我需要这些东西自动运行,而我必须编写一个ls -l命令来完成它,这似乎很疯狂。

如何正确解决这个问题?

答案1

好的,谢谢社区,答案是创建podman卷直接挂载到nfs,这样容器就会到达 podman 卷并由 podman 进行挂载。

我使用 ansible 所以这看起来像:

- name: mount same volumes with podman too
  containers.podman.podman_volume:
    state: present
    name: "{{ item.name }}"
    options:
      - "type=nfs"
      - "o=rw"
      - "device=192.168.1.101:{{ item.path }}"
  with_items:
    - {"name": "synology_music", "path": "/volume1/music"}
    - {"name": "synology_video", "path": "/volume1/video"}

# later, run container

- name: run container
  containers.podman.podman_container:
    image: docker.io/jellyfin/jellyfin:latest
    name: jellyfin
    recreate: "{{ force_container_rebuild|bool }}"
    restart_policy: always
    privileged: yes
    capabilities:
      - NET_ADMIN
    published_ports:
      - "{{ jellyfin_service_ip }}:8096:8096/tcp"
      - "{{ jellyfin_service_ip }}:8920:8920/tcp"
      - "{{ jellyfin_service_ip }}:1900:1900/udp"
      - "{{ jellyfin_service_ip }}:7359:7359/udp"

    volumes:
      - "{{ infrastructure_path }}/jellyfin/config:/config:Z"
      - "{{ infrastructure_path }}/jellyfin/cache:/cache:Z"
      - "synology_video:/video"
      - "synology_music:/music"

相关内容