Ubuntu

如何在 Ubuntu 16.04 xenial 上安裝 Unison 2.40(解決“致命錯誤:收到意外標頭”)

  • April 7, 2017

在我的樹莓派電腦上:

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

我看到的兩個選項:

  1. 為 xenial 找到包含 2.40 的 PPA
  2. 為覆盆子找到一個包含 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. (複製目前版本的行,並更改版本名稱——它是形容詞,例如xenialXenial Xerus。)
  • 相應地修改etc/apt/preferences。而不是stableand testing,使用您目前的版本名稱和您想要的 Unison 版本的版本。您目前的版本具有更高的500優先級。
  • 請務必執行sudo apt-get update; sudo apt-cache policy並驗證輸出以確保正確設置優先級。否則你可能會弄亂你的 Ubuntu 安裝!
  • 當您確定一切正常時,安裝unison(或unison-all顯式版本),選擇您的新儲存庫。

或者直接抓取.deb文件並安裝。

引用自:https://unix.stackexchange.com/questions/296295