說明
這個命令用以將一個目錄掛載到另一個目錄,以實現類似於硬鏈的操作
但是這個命令只是在記憶體中建立了一個對映,重啟系統之後掛載就消失了
而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
後面跟隨的就是需要開機執行的指令,如果有多個目錄需要掛載,就使用&&
或者||
連線起來(前者失敗一個後面的不執行,後者會執行所有連線的指令),又或者寫到指令碼中