Migrating between architectures (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Migrating_Between_Architectures_Without_Reinstalling翻译。上次翻译日期:2013-05-09。如果英文版本有所更改,则您可以帮助同步翻译。

该页文档包含了在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 可以删除。

参阅