前言
最近有主機準備進入撤退的階段,意思是說,這台主機已經準備要轉移。
而上面的服務需要整個檔案根目錄系統與根目錄做備份。
但是問題就來了,因為這台主機總共只有 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