如何在 Ubuntu 16.04 xenial 上安裝 Unison 2.40(解決“致命錯誤:收到意外標頭”)
在我的樹莓派電腦上:
pi@mizu:~ $ unison -version unison version 2.40.102
在我的桌面 ubuntu 16.04 xenial 上:
kayd@Trunk:~$ unison -version unison version 2.48.3
嘗試同步時:
kayd@Trunk:~$ unison . ssh://pi@mizu/. ... Fatal error: Received unexpected header from the server: expected "Unison 2.48\n" but received "Unison 2.40\n\000\000\000\000\017", which differs at "Unison 2.40".
一個相關的文章1要求我安裝
unison-all
,我這樣做了,但它只包含 2.48 版:kayd@Trunk:~$ ls -l /usr/bin/unison* lrwxrwxrwx 1 root root 24 Mai 20 22:15 /usr/bin/unison -> /etc/alternatives/unison lrwxrwxrwx 1 root root 13 Mär 18 16:10 /usr/bin/unison-2.48 -> unison-2.48.3 -rwxr-xr-x 1 root root 2169968 Mär 18 16:10 /usr/bin/unison-2.48.3 lrwxrwxrwx 1 root root 13 Mär 18 16:10 /usr/bin/unison-latest-stable -> unison-2.48.3
我看到的兩個選項:
- 為 xenial 找到包含 2.40 的 PPA
- 為覆盆子找到一個包含 2.48 的 PPA
到目前為止,兩者都沒有成功。
根據以下來自使用者mapierce271的答案,我考慮自己編譯它,但結果似乎有點像噩夢。unison dev 郵件列表中的最後 一篇文章例如指出*“新的 OCaml 4.03 版本對庫進行了小的不兼容更改。我已經修復了 2.48 版本,以便它可以與 4.02 或 4.03 一起編譯並發布新版本。”* 和*“PS 當在執行時遇到可怕的‘ocaml 4.02.1 與 ocaml 4.02.2’失敗時,我還添加了一些希望更好的錯誤報告。我剛剛做了這個,所以如果你已經抓住了源 tarball 請再做一次。”* 這使我得出結論,一切都是高度脆弱,如果有任何更新,即使修訂號有微小的變化,也可能會損壞。有許多電腦要同步,其中一台或另一台會定期更新。
是的,您執行的 Unison 版本必須相同。這是因為 Unison 用於跟踪內容的存檔文件的格式在每個新版本中都得到了改進。
為什麼不直接從原始碼安裝 Unison?我建議在你的樹莓上安裝 2.48。您可以在此處下載Unison 2.48.3的原始碼,並在此處查看有關如何編譯和安裝它的說明。事實上,我也建議在執行 Ubuntu 的桌面上從原始碼編譯和安裝 Unison。這樣,如果 Ubuntu 決定更新其 Unison 軟體包,您將避免任何意外的問題,並且您可以確保它們都使用相同版本的 OCaml 編譯,這在以前一直是個問題。
同樣重要的是要注意,您可能必須在 raspberry 上編譯成字節碼而不是本機程式碼。您可以通過
Native=false
在 Makefile 中進行設置來執行此操作。請參閱我的答案以獲取更多資訊。
遇到了一個解決方案:
Debian測試有2.48,應該兼容Ubuntu版本。您需要在 Pi 上添加測試儲存庫,但優先級較低(因此只有在明確請求時才會使用儲存庫)。
將以下行添加到
/etc/apt/preferences
(如果文件尚不存在則創建該文件):Package: * Pin: release o=Raspbian,a=stable Pin-Priority: 500 Package: * Pin: release o=Raspbian,a=testing Pin-Priority: 300
然後將以下行添加到
/etc/apt/sources.list
:deb http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi
現在執行:
sudo apt-get update sudo apt-cache policy
確認測試儲存庫(剛剛添加的儲存庫)的優先級低於其他儲存庫。
最後:
sudo apt-get install -t testing unison-all
這在 Pi 上給了我 2.48,我能夠連接和同步。
您還可以在現有版本旁邊安裝顯式版本的 Unison。跑
sudo apt-cache search unison
查找提供的版本,然後安裝您選擇的版本,例如:
sudo apt-get install -t testing unison2.40.102
帶有版本號的包是實際的。
unison
是一個總是依賴於最新版本的元包,而unison-all
是一個依賴於版本選擇的元包。如果您的伺服器上有多個版本,您可能需要使用以下
-addversionno
選項執行 Unison:這樣做會導致客戶端將其版本號發送到伺服器,並告訴伺服器執行相同的版本而不是其預設版本。或者,您可以在 Ubuntu 桌面上嘗試類似的操作。你需要:
- 在您的 Pi 上查找具有 Unison 版本的版本。
- 將該版本的儲存庫添加到
/etc/apt/sources.list
. (複製目前版本的行,並更改版本名稱——它是形容詞,例如xenial
Xenial Xerus。)- 相應地修改
etc/apt/preferences
。而不是stable
andtesting
,使用您目前的版本名稱和您想要的 Unison 版本的版本。您目前的版本具有更高的500
優先級。- 請務必執行
sudo apt-get update; sudo apt-cache policy
並驗證輸出以確保正確設置優先級。否則你可能會弄亂你的 Ubuntu 安裝!- 當您確定一切正常時,安裝
unison
(或unison-all
顯式版本),選擇您的新儲存庫。或者直接抓取
.deb
文件並安裝。