[Linux] Linux 自动挂载mount --bind 实现类似目录硬链的效果 (包含ZFS方案)

说明

这个命令用以将一个目录挂载到另一个目录,以实现类似于硬链的操作

但是这个命令只是在内存中建立了一个映射,重启系统之后挂载就消失了

linux是不支持目录硬链的,具体原因见linux为什么不能硬链接目录? - 知乎 (zhihu.com)

手动挂载

mount --bind olddir newdir

例如 mount --bind /home/st/go /home/st/1

取消挂载 umount /home/st/1

需要使用root权限

fstab自动挂载

修改/etc/fstab文件,按照olddir newdir none bind 0 0的格式增加挂载项

例如: /home/st/go /home/st/1 none bind 0 0

可以将go目录挂载到1目录,此时1里面就有go里面的目录了

需要注意的是,如果fstab文件编写错误,会导致系统不能开机,所以修改完之后一定要执行两个命令

  • systemctl daemon-reload
  • mount -a
    后者用来测试文件格式是否合法,如果不合法会报错,那么重启之后系统就会启动失败。必须确认mount -a执行没有问题才能重启系统

zfs自动挂载方法

以上的方法对zfs文件系统不好用,我猜测应该是/etc/fstab文件被执行时zfs文件系统还没有加载完成,所以挂载失败。

或者zfs有自己的挂载逻辑?

找了一圈之后没有发现类似的功能,只能是将dataset或者文件系统挂载到目录,并且挂载点只能有一个。

所以,方案就只能是开机后自动执行mount --bind命令了

使用systemd实现

编写/etc/systemd/system/bind-mounts.service文件,内容如下

ini 复制代码
[Unit]
Description=Bind Mount Services
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c "mount --bind /export/docker/syncthing/st-sync/照相机 /export/docker/photoprism/Pictures/照相机"

[Install]
WantedBy=multi-user.target

ExecStart后面跟随的就是需要开机执行的指令,如果有多个目录需要挂载,就使用&&或者||连接起来(前者失败一个后面的不执行,后者会执行所有连接的指令),又或者写到脚本中