作為一名計算機程序員,您需要一個系統或工具來實時和兩種方式同步兩個目錄,這一定發生過很多次。 我們將通過一個這樣的工具 鏡子 在這篇文章中。 它旨在支持不同機器上存在的目錄之間的雙向實時同步。 它非常適用於兩台機器(例如台式機+筆記本電腦)開發工作流程,您希望在功能強大/專用的台式機上運行命令行編譯/構建過程,但仍然在筆記本電腦上遠程編輯文件。
有許多工具可用於同步目錄,如 lsyncd,但使 mirror 與眾不同的是它是雙向的:它同時同步筆記本電腦到台式機以及台式機到筆記本電腦,實時同步。 下面是它與市場上現有的類似工具的比較。
與現有選項的比較
- 統一是雙向的,但不是實時的
- rsync 不是雙向的,也不是實時的
- lsyncd 是實時的,但不正式支持雙向
- sshfs 太慢,不支持 inotify
- doppleganger(內部工具)是實時的,但不是雙向的
非目標暨限制
- 沒有合併/長時間斷開連接的支持
- 維護 Unix 權限/所有者/組
- 不支持超過 100MB 的大文件
- 沒有像 rsync 這樣的超高效差異/傳輸邏輯
如果文件發生更改,它會重新傳輸整個文件,而不是僅嘗試區分更改的內容。
安裝鏡子
步驟1: 安裝 Java 8 或更高版本。 要檢查已安裝的 java 版本,請執行“java -version”命令。 如果沒有安裝java,請執行以下命令安裝java 8。
1) 在基於 Debian 的操作系統上(Ubuntu、Debian 等)
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jre
2) 在基於 RPM 的操作系統(RHEL、CentOS、 Fedora 等等。)
$ sudo yum update
$ sudo yum install java-1.8.0-openjdk
第 2 步(可選): 安裝 守望者. 如果您沒有安裝 watchman,鏡像將使用內置的 Java WatchService API,它基本上可以工作,但是 JDK 提供的 WatchService 實現並不是那麼好:Linux 實現有問題。
第 3 步: 將最新鏡像的可執行文件下載到您的主目錄(或路徑上的其他目錄,例如 ~/bin)
$ wget https://repo.joist.ws/mirror-all.jar ~/
$ wget https://repo.joist.ws/mirror ~/
步驟4: 使鏡像文件可執行
$ chmod u+x mirror
第 5 步: 將兩者都複製到遠程主目錄(或路徑上的其他目錄,例如 ~/syncwork)
$ scp mirror-all.jar your-server.com:~/
$ scp mirror your-server.com:~/
第 6 步: 從服務器的主目錄啟動服務器端
$ ./mirror server
2017-08-15 10:44:15 INFO Listening on 49172, version unspecified
第 7 步: 現在在主目錄中使用您喜歡的任何名稱創建一個新目錄,我正在創建一個名為“code”的新目錄。 創建一個包含一些內容的文本文件,將其放在代碼目錄下以測試工具。
$ cd code
$vi test.txt
this is test.
第 8 步: 從客戶端的主目錄啟動客戶端
$ ./mirror client -h your-desktop.com -l ./code/ -r ./code/
2017-08-15 10:47:04 INFO Connected, starting session, version unspecified
2017-08-15 10:47:04 ERROR Error creating watchman channel, skipping watchman
java.lang.RuntimeException: Couldn't find watchman in possible paths [., /usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbin, /bin, /usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbin, /bin] with extensions [, .sh, .bat, .exe]
at joist.util.Execute.resolve(Execute.java:182)
at joist.util.Execute.getCommandPlusArgsArray(Execute.java:162)
:
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
2017-08-15 10:47:04 INFO Watchman not found, using WatchService instead
2017-08-15 10:47:04 INFO Note that WatchService is buggy on Linux, and uses polling on Mac.
2017-08-15 10:47:04 INFO While It will work with WatchService, especially to test, you should eventually install watchman.
2017-08-15 10:47:04 INFO Client has 2 paths
2017-08-15 10:47:04 INFO Server has 1 paths
2017-08-15 10:47:04 INFO Tree populated
2017-08-15 10:47:04 INFO Sending test.txt
從上面日誌的最後一行可以看出,mirror 已將 test.txt 發送到服務器。 太好了,我們已經成功安裝並測試了鏡像。
筆記: 小心使用波浪號(例如 ~/code),因為您的 shell 將解析它,例如 /Users/you/code,並且客戶端上解析的路徑在服務器上可能無效。 這將同步您兩台機器上的 $HOME/code 目錄。
鏡像中的額外配置
默認情況下,mirror 不會同步您在 .gitignore 文件中列出的任何文件。 但是,除了 .gitignore 之外,您還可以使用額外的包含或排除來配置它。 啟動客戶端時可以傳遞額外的包含和排除模式,並遵循 .gitignore 格式,例如:
$ ./mirror client --exclude '.m2/` --include 'classpath' --include '.install' --exclude `build/`
配置系統監視限制
請注意,如果您有很多目錄,則可能需要增加本機文件系統限制,默認情況下,max_user_watches 限制為 8192,執行以下命令將其增加到 524288
$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
使用鏡像同步兩台以上機器
Mirror 還支持同步兩台以上的機器。 例如你可以有:
服務器運行鏡像服務器進程(不需要啟動多個服務器進程)
現在假設您要在安裝過程中同步除服務器和客戶端設置之外的另一台機器,然後在新機器上(我們稱其為客戶端 2),執行安裝部分的步驟 8 以將客戶端 2 連接到服務器。
客戶端 1 和客戶端 2 連接到服務器並將它的 ~/code 同步到服務器的 ~/code
現在,所有三台機器(服務器、客戶端 1、客戶端 2)都將保持同步。 ~/code 目錄的所有這三個將是同步的。 通過相同的方法,您可以添加任意數量的機器。
我們已經在 Linux 機器上成功安裝、配置和測試了鏡像。 隨意分享任何疑問或世界應該知道的任何新事物。