如何在Ubuntu 16.04與18.04上使用SSHFS掛載遠端主機的目錄

前言

最近有主機準備進入撤退的階段,意思是說,這台主機已經準備要轉移。

而上面的服務需要整個檔案根目錄系統與根目錄做備份。

但是問題就來了,因為這台主機總共只有 50 GB 大小的硬碟空間,若是直接將整個系統備份到當地的檔案系統,可能會因為硬碟空間太小導致無法備份成功。

幸好,剛好有一台遠端的主機可以進行備份的轉移,因此考慮使用sshfs指令將遠端的主機掛載到此要退場主機的根檔案系統上某個目錄,並將主機備份壓縮檔放到此掛載目錄,以避免上述本地主機硬碟空間不夠的問題。

本文章中,是要描述該如何使用sshfs指令將遠端主機的路徑掛載到本地主機的某個路徑上。

前置條件

在使用sshfs指令之前,需要有下列的前置條件需要先達成,才可以使用sshfs指令掛載遠端主機路徑到本地主機路徑上面:

  • 一台裝有Ubuntu 16.04或是18.04主機
  • 一個使用者可以進行登入,並此使用者可以有暫時取得root使用者的權限,可以使用sudo指令。

安裝SSHFS

首先,更新此本地主機上的鏡像,指令如下:


sudo apt-get update

更新好鏡像之後,使用下列指令進行安裝sshfs:


sudo apt-get install sshfs

安裝好之後,即有sshfs可以使用了

接著,先確定遠端主機可以登入,假設遠端主機登入詳細資訊如下:


ssh user@192.168.1.100 -p 60105

上述使用ssh指令之意思如下:

使用ssh指令並使用者user以及IP位址為192.168.1.100並指定60105 port為連線的埠號(port number)。

那將上述的指令轉換成sshfs指令的方法為:


sudo sshfs -p 60105 user@192.168.1.100:/home/user /mnt/user

當依照上述的指令將遠端主機的/home/user目錄掛載到本地端主機的/mnt/user。

當這樣掛載上去之後,我們可以使用下面的指令去查看是否有掛載成功:


mount | grep "/mnt/user/"

# output

# user@192.168.1.100:/home/user on /mnt/user type fuse.sshfs (rw,nosuid,nodev)

當使用mount指令之後,有印出註解的字串則代表掛載遠端主機成功了。

我們就可以建立資料到掛載點上的/mnt/user上了,但是這樣建起來的遠端目錄無法做到將本地主機的檔案與目錄利用cp或是rsync指令並搭配保留權限的參數,複製到/mnt/user的遠端目錄上。

意即下面的指令都會跳出Permission denied:


cp -p 2020.csv /mnt/user/

# cp: failed to preserve ownership for '/mnt/user/2020.csv': Permission denied

rsync -av --progress 2020.csv /mnt/user/

# rsync -apv --progress 2020.csv /mnt/user/
# sending incremental file list
# rsync: chown "/mnt/user/2020.csv" failed: Permission denied (13)

# sent 56 bytes received 94 bytes 300.00 bytes/sec
# total size is 524 speedup is 3.49
# rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.0]

為了要將複製過去的檔案可以保留權限,則需要使用root使用者並搭配sshfs指令進行掛載遠端主機的目錄。

為了要達到下列的做法,需要先登入遠端主機並修改上面的ssh設定檔案:


sudo vim /etc/ssh/sshd_config

並從上述的設定檔找到下面的設定值:


PermitRootLogin no

預設應該是PermitRootLogin yes,這個設定值指的是,是否要允許使用root使用者利用ssh指令登入到此主機,若設定no則是不允許,設定yes則是可以。

那通常我們也可以使用白名單的機制,預設所有的IP都無法使用root使用者登入,用下面的方式允許指定的IP位址或是主機網域可以使用root使用者登入:


PermitRootLogin no

Match Address 192.168.88.1
PermitRootLogin yes
Match all

設定允許的Address也可以使用網段進行設定:192.168.88.0/24

按照上面設定好之後,可以使用下面的指令可以檢查SSH設定檔:


sudo sshd -T

若沒有跳出設定的相關錯誤,則可以使用下面的指令將ssh server服務重新載入設定檔:


sudo systemctl reload sshd

重新載入SSH server設定檔之後,則就可以讓白名單的主機可以使用root使用者使用ssh登入外,也可以使用sshfs指令掛載遠端的主機了。

當使用root使用者掛載的遠端目錄,即可以使用cp或rsync指令中保留此檔案或目錄等相關權限複製到遠端的目錄上了。

結論

從此篇文章中,我們可以了解到:

  • 安裝sshfs套件
  • 使用sshfs套件將遠端主機的指定目錄掛載到本地端的指定目錄
  • 若要使用cp和rsync時保留檔案相關權限複製到目標的遠端主機目錄,則需要先使用root使用者掛載。
  • 若root使用者預設是不允許使用ssh登入的(PermitRootLogin no),則可以使用白名單機制讓某個區段IP位址可以登入。

參考資料

  • https://gist.github.com/peter279k/8d0f54820c9ee97da25a40f2911bc4d4
  • https://unix.stackexchange.com/questions/67334/openssh-how-to-end-a-match-block
  • https://andrewaadland.me/2018-09-30-solving-sshfs-permission-denied/
  • https://www.opencli.com/linux/allow-one-ip-root-login-ssh
  • https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh