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 可以删除。