使用 systemd 有条件挂载

使用 systemd 有条件挂载

我希望利用几个条件来执行绑定挂载或 NFS 挂载,如下所述。我已经看到了有关简单条件安装的(有限)讨论,但我还没有看到任何使用类似于“的条件的示例”(绑定)如果 Y 则挂载 X,否则挂载 Z”。

详细信息:我有一个 USB 硬盘,我可以选择将其连接到我的笔记本电脑,并且它会在启动时使用 /etc/fstab 条目自动安装,如下所示:

/dev/mapper/xusbhdd /path/to/usb/mount  btrfs  nofail,x-systemd.device-timeout=10,noatime,nodiratime,space_cache,compress=lzo,defaults,subvol=/@mysubvol/              0 0

该安装点内有一个文件夹:/path/to/usb/mount/my_special_folder

安装该设备后,我希望创建一个像这样的绑定安装:

mount --bind /path/to/usb/mount/my_special_folder /path2/my_special_folder

但是,如果该 USB 设备是不是已连接,但我已连接到公司 LAN,我希望使用 /etc/fstab 条目在该位置挂载 NFS 共享,如下所示:

fileserver:/my_special_folder/   /path2/my_special_folder/ nfs     _netdev,defaults,noatime,nodiratime,soft,retrans=6,timeo=20,retry=0,rsize=32768,wsize=32768,proto=tcp   0 0

显然,我可以手动完成所有这些工作。我的问题是如何做到自动的。如果我的笔记本电脑看到 USB HDD 已连接,则会建立所需的安装和绑定安装。相反,如果公司文件服务器可访问,则会建立 NFS 挂载。

我在这个答案中发现了一些线索:https://unix.stackexchange.com/a/568351/15010

我还发现了一个非常旧的答案(2010),它使用 bash 脚本,这不是我希望采用的方法:Linux中的条件mount:dev或nfs - 代码日志

我还在这里找到了相关答案:Systemd 有条件挂载。然而,我的要求更复杂。从该链接,我相信我可以利用与此类似的单元文件:

[Unit]
Description=Mount my_special_folder from USB HDD
ConditionPathExists=/path2/my_special_folder/NOT_MOUNTED

[Mount]
What=/dev/mapper/xusbhdd
Where=/path/to/usb/mount
Type=auto
Options=nofail,x-systemd.device-timeout=10,noatime,nodiratime,space_cache,compress=lzo,defaults,subvol=/@mysubvol/

[Install]
WantedBy=local-fs.target

然而,这实际上对我没有任何帮助,因为这些fstab选项已经安装了 USB 设备(如果存在),或者跳过它而不会失败。

因此,我需要一个单元文件来有条件地进行绑定挂载,并需要一个单元文件来进行有条件的 NFS 挂载。此外,我需要一种方法来确保在已挂载 USB 设备的情况下不会挂载 NFS 共享。

相关内容