[Linux] Linux 自動掛載mount --bind 實現類似目錄硬鏈的效果 (包含ZFS方案)

Startu發表於2024-03-03

說明

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

相關文章