今天在處理一個案子,需要將檔案備份到另一台主機。要備份的時候發現各種利用一般的指令的備份方法好像都不大可行。
這個案例的情境大概是這樣的,有一台FileServer因為不斷的擴充容量,所以很多的目錄都是透過Symbolic link放到主目錄中。例如原本的硬碟有三個mount在 /data1、/data2、/data3,舊的資料只需要唯讀就好了,目前在使用的是/data3這個硬碟,為了讓而一般User在主目錄中就可以讀到原本的內容所以就建了Symbolic link。放在/data3/link1、/data3/link2。
如果利用FTP的mput也無法直接處理多層子目錄(沒有類似cp的recursive),所以在沒有client端可以使用的情況下,要傳多層目錄的檔案到另一台主機可以說用FTP根本不可行。
而SCP不支援子目錄是Symbolic link的情況下傳檔案到另外一台電腦(有看到解法是用rsync不過我沒有試成功)。
所以我最後的解決方法是用tar把檔案包起來後,直接透過filter傳ssh到另一台電腦。
Sample:
tar czvhf – /local/dir | ssh ssh_user@remote_host “cat > /dest/dir/filename.tgz
這個指令的重點是 h 參數 (等同於 –dereference),因為許多系統都不支援符號連結,所以下這個參數tar會將Symbolic link內的資料用一般檔案來處理,如此檔案就會確實的被包進tar檔裡面了,filter後面的結果是透過ssh傳檔案到連到目的主機。如此就可以正確的將檔案般去另一台主機嚕。