[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
文件,内容如下
[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
后面跟随的就是需要开机执行的指令,如果有多个目录需要挂载,就使用&&
或者||
连接起来(前者失败一个后面的不执行,后者会执行所有连接的指令),又或者写到脚本中