说明
这个命令用以将一个目录挂载到另一个目录,以实现类似于硬链的操作
但是这个命令只是在内存中建立了一个映射,重启系统之后挂载就消失了
而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-reloadmount -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后面跟随的就是需要开机执行的指令,如果有多个目录需要挂载,就使用&&或者||连接起来(前者失败一个后面的不执行,后者会执行所有连接的指令),又或者写到脚本中