Migrating between architectures

出自 Arch Linux 中文维基

本文內容或本節內容已經過期。

原因: 請提供模板的第一個位置參數以概括原因。 (在Talk:Migrating between architectures討論)

這篇文章或章節的翻譯不反映原文。

原因:No updates since 2013(在 Talk:Migrating between architectures# 中討論)

該頁文檔包含了在32位與64位這兩個架構之間雙向遷移的潛在方法。這些方法避免了重裝整個系統,方法一使用liveCD,另一種從系統本身更改......

警告: 除非明確說明,所有的方法都是未經過測試的,並可能不可挽回地損害你的系統。請自己斟酌利弊,承擔風險。

基本需求[編輯 | 編輯原始碼]

確定64位架構[編輯 | 編輯原始碼]

如果你已經運行x86_64系統但是想要遷移到32位架構,這一步與你無關,可以略過此步。

為了運行64位軟件,你必須有一個兼容64位指令集的CPU。大多數現代CPU可以運行64位軟件。你可以通過以下命令檢查你的CPU:

grep --color -w lm /proc/cpuinfo

對支持x86_64的cpu將返回 lm 標誌 (「long mode」) 被高亮。注意 lahf_lm 是不同的標誌,與是否支持64位無關。

空間需求[編輯 | 編輯原始碼]

你應該在遷移期間為 /var/cache/pacman/pkg 預備當前大約兩倍的空間。這是假設只有當前安裝的軟件包都在緩存中, 好像 「pacman -Sc」 (clean) 剛剛運行過。磁盤占據空間的增加源於在兩個架構間遷移時沒個軟件包的複製。

如果你沒有足夠的空間請使用GParted 重新劃分相關分區的大小,或者將另一個分區掛載到 /var/cache/pacman

在系統完全在新架構操作前請勿從緩存中移除舊架構中的軟件包。過早地移除軟件包將使你不能回退和撤銷改變。

電力供應[編輯 | 編輯原始碼]

遷移可能相當耗費時間,而且不方便中斷。你應該至少計劃一個小時,取決於你要安裝的文件大小和網速(儘管你可以在關鍵部分前把一切都先下載下來)。確定你連上了穩定的電源,最好有某種故障恢復或備用電池。

Fallback packages[編輯 | 編輯原始碼]

如果遷移中途失敗了,有些軟件包可以解決這種情況,但它們要在主要的包被遷移之前安裝。關於它們的更多細節參見下面的#疑難解答 部分。

一個軟件包叫作busybox, 可以用來撤銷更改。 它靜態鏈接並不依賴任何庫。32位(i686)版本應使用如下命令安裝:

# pacman -S busybox

另一個包是 lib32-glibc, 來自 Multilib x86_64 倉庫。可能僅僅在從32位遷移時有用,任何情況下你都可以安全的略過這個包。你可以通過顯式調用 /lib/ld-linux.so.2來運行32位的程序。通過以下命令安裝:

# pacman -S lib32-glibc

方法 1: 使用 Arch LiveCD[編輯 | 編輯原始碼]

  1. 下載、刻錄、並從64位liveCD啟動
  2. 在LiveCD上配置你的網絡,然後讓pacman使用你要遷移到的新架構的軟件倉庫。
  3. 把你當前系統掛載到 /mnt 目錄. 例如: mount /dev/sda1 /mnt
  4. 使用如下腳本升級本地pacman數據庫,獲得你已經安裝的所有軟件列表然後重新安裝它們:
  5. 你可能需要運行這個腳本兩次, 因為許多包第一次運行post-install(edit:這是什麼?)腳本會失敗. 這是因為sed、 grep、perl等在錯誤的架構下。
  6. 你可能還需要更新initrd, chroot到/mnt並且運行mkinitcpio -p linux.
#!/bin/bash

MOUNTED_INSTALL='/mnt'
TEMP_FILE='/tmp/packages.list'

pacman --root $MOUNTED_INSTALL -Sy
pacman --root $MOUNTED_INSTALL --cachedir $MOUNTED_INSTALL/var/cache/pacman/pkg --noconfirm -Sg base base-devel
pacman --root $MOUNTED_INSTALL -Qq > $TEMP_FILE
for PKG in $(cat $TEMP_FILE) ; do
   pacman --root $MOUNTED_INSTALL --cachedir $MOUNTED_INSTALL/var/cache/pacman/pkg --noconfirm -S $PKG
done

exit 0

重啟到你的64位系統後,運行這個命令去找到那些你仍保有的32位二進制文件,並且重裝它們:

find /usr/bin -type f -exec bash -c 'file {} | grep 32-bit' \;

方法 2: 從正在運行的系統[編輯 | 編輯原始碼]

確認你的系統是更新到最新的並且在下一步之前運行良好。

# pacman -Syu

準備軟件包[編輯 | 編輯原始碼]

緩存舊軟件包[編輯 | 編輯原始碼]

注意: 如果你有任何來自沒有新架構支持的AUR 或第三方軟件倉庫的包, pacman將讓你知道它不能找到合適的替代。列出這些軟件以便升級後重裝並運行pacman -Rsn package_name來清除它們。

如果緩存中沒有你已安裝的所有軟件,下載它們(舊架構)為回退做準備。

 # pacman -Qqn | pacman -Sw -

或者用pacman包裡的bacman來生成它們。

如果你是從32位遷移,現在可以安裝32位的Busybox:

# pacman -S busybox

改變 Pacman 架構[編輯 | 編輯原始碼]

編輯 /etc/pacman.conf 文件 並將 Architectureauto 更改到新值。可以使用這些 sed 命令:

對於 x86_64:

# sed -i  '/^Architecture =/s/auto/x86_64/' /etc/pacman.conf

對於 i686:

# sed -i  '/^Architecture =/s/auto/i686/' /etc/pacman.conf

確定/etc/pacman.conf/etc/pacman.d/mirrorlist中的server列表使用$arch來代替顯式指定i686或x86_64。現在強制pacman同步新的倉庫:

# pacman -Syy

下載新的軟件包[編輯 | 編輯原始碼]

下載所有已安裝軟件對應的新架構的包:

 # pacman -Sw $(pacman -Qqn|sed '/^lib32-/ d')  # download new package versions

既然已經配置好了32位的pacman,如果遷移到32位系統就現在安裝Busybox:

# pacman -S busybox
警告: 不要現在安裝 lib32-glibc 軟件包。在執行命令 ldconfig 後,當你安裝 linux(內核)時,生成的鏡像文件中,librt.so 等庫文件會在 /usr/lib32 目錄下,啟動的時候二進制文件不會在此搜索庫文件,導致啟動失敗。

軟件包安裝[編輯 | 編輯原始碼]

安裝64位內核[編輯 | 編輯原始碼]

將內核升級到64位既安全又直接:32位和64位應用可以同時很好地運行在64位內核上。對於從64位遷移,現在保留64位內核並跳過此步

安裝標準Arch Linux內核,使用如下命令:

# pacman -S linux

現在該安裝 lib32-glibc 軟件包了(你需要添加[multilib]軟件倉庫,如果你還沒有:

# pacman -S lib32-glibc
注意: 如果由於已存在不同名的軟件包導致失敗,使用-f選項強制安裝。

重啟後驗證一下正在運行64位的內核:

$ uname -m
x86_64

控制台終端[編輯 | 編輯原始碼]

是時間轉移到文本模式的虛擬控制台(e.g. Ctrl+Alt+F1) 來完成剩下的過程了。像ssh的偽終端也許可以工作但並不提倡. 在升級過程中有幾個包的移除和取代可能造成X11桌面變得不穩定並讓你的系統無法啟動。

安裝 Pacman[編輯 | 編輯原始碼]

警告: 一旦你開始升級Pacman和它的依賴軟件,過程將不能中斷,它們必須在一個單獨命令行同時安裝。

使用 pactree 來安裝Pacman和它的所有依賴:

# pactree -l pacman | pacman -S -

可能會返回錯誤,但只要pacman在工作就沒事。這條命令之後立即只有busybox,bash和pacman可以被執行,直到其它包被遷移。你一定不要在下面這些命令完成之前重啟。已經警告過你了。

安裝剩餘的軟件包[編輯 | 編輯原始碼]

安裝先前為新架構下載的軟件包 (用同學電腦打一局dota或看個電影再回來:))

# pacman -Qqn | pacman -S -

如果有的包沒有被正確安裝,你現在應該能成功地安裝它們了;如果你很懶,你可以僅僅重複運行最後一條命令來安裝所有東西。

對於從64位遷移,你可能想跳過32位內核安裝,因為先前的64位內核仍能運行32位程序。

這一部之後任何遷移步驟都應該大功告成了,可以安全地重啟計算機了。

清理[編輯 | 編輯原始碼]

現在可以隨意移除Busybox 和lib32-glibc.

# pacman -Rcn busybox lib32-glibc

Makepkg 編譯器標誌[編輯 | 編輯原始碼]

在升級過程中新版本的 /etc/makepkg.conf 應被自動保存為 /etc/makepkg.conf.pacnew. 你不得不自己替代舊版本或更改它,如果你將來想用 makepkg 編譯任何東西。

# mv /etc/makepkg.conf /etc/makepkg.conf.backup && mv /etc/makepkg.conf.pacnew /etc/makepkg.conf

得到有關新添加到/etc的列表也許是個好注意。你可以通過以下命令獲得:

# find /etc/ -type f -name \*.pac\*

疑難解答[編輯 | 編輯原始碼]

升級過程中, 當 glibc 被新架構版本取代時, 舊架構的任何程序都將不能運行 如果發生問題,你可以通過busyboxlib32-glibc解決。

Busybox[編輯 | 編輯原始碼]

在Arch中, Busybox是靜態鏈接的; 它不需要庫運行。有很多能用的命令。例如從緩存中提取i686版本的pacman:

# busybox tar xf /var/cache/pacman/pkg/pacman-3.3.2-1-i686.pkg.tar.gz -C <some folder>

Lib32-glibc[編輯 | 編輯原始碼]

例如運行32位的/bin/ls:

# /lib/ld-linux.so.2 /bin/ls

KDE不能正確啟動[編輯 | 編輯原始碼]

當從32位遷移到64位時KDE將會發生衝突。(edit:從splash退回到kdm) 這是由於殘存在 /var/tmp 中的32位KDE包,使用下列命令清楚kde緩存來修正這個問題:

# rm -rf /var/tmp/kdecache-*

Mutt 開啟 cache 後出問題[編輯 | 編輯原始碼]

如果完成後發現 mutt 在打開郵件目錄時死掉,重命名 cache 目錄試試。如果可以解決問題,原來的 cache 可以刪除。

參閱[編輯 | 編輯原始碼]