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[編輯 | 編輯原始碼]
- 下載、刻錄、並從64位liveCD啟動
- 在LiveCD上配置你的網絡,然後讓pacman使用你要遷移到的新架構的軟件倉庫。
- 把你當前系統掛載到
/mnt
目錄. 例如:mount /dev/sda1 /mnt
- 使用如下腳本升級本地pacman數據庫,獲得你已經安裝的所有軟件列表然後重新安裝它們:
- 你可能需要運行這個腳本兩次, 因為許多包第一次運行post-install(edit:這是什麼?)腳本會失敗. 這是因為sed、 grep、perl等在錯誤的架構下。
- 你可能還需要更新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
準備軟件包[編輯 | 編輯原始碼]
緩存舊軟件包[編輯 | 編輯原始碼]
pacman -Rsn package_name
來清除它們。如果緩存中沒有你已安裝的所有軟件,下載它們(舊架構)為回退做準備。
# pacman -Qqn | pacman -Sw -
或者用pacman包包裡的bacman來生成它們。
如果你是從32位遷移,現在可以安裝32位的Busybox:
# pacman -S busybox
改變 Pacman 架構[編輯 | 編輯原始碼]
編輯 /etc/pacman.conf 文件 並將 Architecture 從 auto
更改到新值。可以使用這些 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
軟件包安裝[編輯 | 編輯原始碼]
安裝64位內核[編輯 | 編輯原始碼]
將內核升級到64位既安全又直接:32位和64位應用可以同時很好地運行在64位內核上。對於從64位遷移,現在保留64位內核並跳過此步
安裝標準Arch Linux內核,使用如下命令:
# pacman -S linux
現在該安裝 lib32-glibc 軟件包了(你需要添加[multilib]軟件倉庫,如果你還沒有:
# pacman -S lib32-glibc
重啟後驗證一下正在運行64位的內核:
$ uname -m
x86_64
控制台終端[編輯 | 編輯原始碼]
是時間轉移到文本模式的虛擬控制台(e.g. Ctrl+Alt+F1) 來完成剩下的過程了。像ssh的偽終端也許可以工作但並不提倡. 在升級過程中有幾個包的移除和取代可能造成X11桌面變得不穩定並讓你的系統無法啟動。
安裝 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 被新架構版本取代時, 舊架構的任何程序都將不能運行 如果發生問題,你可以通過busybox包 和lib32-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 可以刪除。