架构迁移
本页介绍了将已安装的系统从 i686(32 位)迁移到 x86_64(64 位)架构的两种潜在方法。 这些方法避免了完全重新安装(即擦除硬盘驱动器)。 一种方法使用 liveCD,另一种方法从系统内部修改。
通用准备
确认 64 位架构
为了运行 64 位软件,您必须拥有支持 64 位的 CPU。 大多数现代 CPU 都能够运行 64 位软件。 您可以使用以下命令检查您的 CPU
grep --color -w lm /proc/cpuinfo
对于支持 x86_64 的 CPU,这将返回突出显示的 lm
标志(“长模式”)。 请注意,lahf_lm 是不同的标志,本身并不表示 64 位功能。
磁盘空间
您应该为迁移期间 /var/cache/pacman/pkg
的大小增长大约两倍做好准备。 这是假设缓存中仅包含当前已安装的软件包,就像最近运行过 pacman -Sc
一样。 磁盘空间增加是由于每个软件包的 i686 和 x86_64 版本之间重复造成的。
如果您的磁盘空间不足,请使用 GParted 调整相关分区的大小,或将另一个分区挂载到 /var/cache/pacman
。
在新架构中系统完全运行之前,请勿从缓存中删除旧架构的软件包。 过早删除软件包可能会导致您无法回退和还原更改。
电源
迁移可能需要相当长的时间,中断该过程会很不方便。 您应该计划至少一个小时,具体取决于已安装软件包的数量和大小以及互联网连接速度(尽管您可以在开始关键部分之前下载所有内容)。 请确保您已连接到稳定的电源,最好带有一些故障转移或电池备份。
备用软件包
如果迁移中途失败,有一些软件包可以帮助解决这种情况,但应在迁移主要软件包之前安装它们。 有关使用它们的更多详细信息,请参见下面的 #故障排除。
其中一个软件包是 busybox,它可以用于还原更改。 它是静态链接的,不依赖于任何库。 应安装 32 位 (i686) 版本。
另一个软件包是 lib32-glibc,来自 multilib x86_64 仓库。 它可能仅在脱离 32 位迁移时有用; 在任何情况下,您可以安全地跳过此软件包。 您可以使用该软件包通过显式调用 /lib/ld-linux.so.2
来运行 32 位程序。
方法 1:使用 Arch LiveCD
- 下载并刻录最新的 Arch Linux ISO。
- 在 x86_64 模式下启动 Arch LiveCD。
- 在 LiveCD 上配置您的网络。
- 挂载您现有的安装。 例如:
mount /dev/sda1 /mnt
。 - 编辑 LiveCD
/etc/pacman.conf
仓库以匹配现有的/mnt/etc/pacman.conf
仓库。 - 使用以下命令更新本地 pacman 数据库并清除缓存目录。
# pacman --root /mnt -Syy # pacman --root /mnt -Scc
- 6. 您可以首先单独重新安装 base 组,然后安装任何触发安装错误的软件包,使用
pacman --root /mnt -Qo <error file>
识别。 然后重复 base 组安装,直到它可以干净地安装而没有错误。
# pacman --root /mnt -S base
- 7. 使用以下命令获取所有已安装软件包的列表,然后重新安装它们。
# pacman --root /mnt -Qnq | pacman --root /mnt -S -
- 8. 您可以运行该命令两次,因为许多软件包第一次运行时无法运行其安装后脚本。 这是由于 sed、grep、perl 等架构错误。 或者您可以记下任何抛出错误的单个软件包重新安装,然后在升级完成后返回以仅重新安装这些软件包。
- 此外,如果您看到有关磁盘空间不足的错误,您可以按字母顺序过滤软件包列表并分阶段升级,例如使用
...| grep '^[a-k]' |...
,然后可能是'^l'
和'^[m-z]'
。 在这种情况下,您还必须在每个安装阶段之后运行pacman --root /mnt -Scc
以释放磁盘空间。 或者,由于所有软件包都在 live 环境的 tmpfs 中下载,您也可以挂载分区或创建指向/var/cache/pacman/pkg
的符号链接(例如ln -s /mnt/var/cache/pacman/pkg /var/cache/pacman/pkg
)。
- 9. 最后,运行
# arch-chroot /mnt # mkinitcpio -p linux
- 10. 另请查看您的引导加载程序是否需要迁移。 例如
# grub-install --recheck /dev/sda
- 11. 重新启动到新的 64 位系统后,编辑然后移动
/etc/makepkg.conf.pacnew
到/etc/makepkg.conf
,以迁移 CPU 架构。 然后重建“foreign”软件包,其中将包括来自 AUR 的软件包。
- 您可能首先需要删除某些孤立的 foreign 软件包,然后再尝试重建它们。 运行此命令以找出您仍然拥有的 32 位二进制文件并重新安装它们
$ LC_ALL=C pacman -Qo `find /usr/bin -type f -exec bash -c 'file "{}" | grep 32-bit' \; | cut -d':' -f1` | cut -d' ' -f5 | sort | uniq | tee list
方法 2:从运行中的系统
在继续之前,请确保您的系统已完全更新并正常运行。
# pacman -Syu
软件包准备
缓存旧软件包
pacman -Rsn package_name
删除它们。如果您在缓存中没有所有已安装的软件包,请下载它们(对于旧架构),以备回退之用。
# pacman -Qqn | pacman -Sw -
或者使用 fakepkgAUR 软件包来生成它们。
安装 busybox
如果您要从 32 位迁移到 64 位,现在是安装 32 位 busybox 的时候了。 安装 busybox 软件包。
更改 Pacman 架构
编辑 /etc/pacman.conf
文件并将 Architecture 从 auto
更改为 x86_64
。
确保 /etc/pacman.conf
和 /etc/pacman.d/mirrorlist
中的服务器列表使用 $arch
而不是显式指定 i686
或 x86_64
。 现在强制 Pacman 与新仓库同步
# pacman -Syy # force sync new architecture repositories
下载新软件包
下载当前已安装的所有软件包的新架构版本
# pacman -Sw $(pacman -Qqn|sed '/^lib32-/ d') # download new package versions
如果要迁移到 32 位,请在 Pacman 配置为 32 位架构后立即安装 32 位 busybox 备用程序。
/usr/lib32
' 中包含 librt.so 等库,启动期间二进制文件不会搜索该位置,从而导致启动失败。软件包安装
安装内核(64 位)
将内核升级到 64 位 (x86_64) 是安全且直接的:32 位和 64 位应用程序在 64 位内核下都能同样良好地运行。
安装 linux 软件包。
安装 lib32-glibc
将 lib32-glibc 备用程序与 64 位版本的 glibc 一起安装。 如果您尚未这样做,则需要在 /etc/pacman.conf
中添加 multilib 仓库。
重启
验证您是否正在运行 x86_64 架构
$ uname -m
x86_64
切换到控制台终端
如果可能,切换到文本模式虚拟控制台(例如 Ctrl+Alt+F1)以进行其余过程。 如果您尝试使用第一个控制台时收到错误,请改用第二个控制台 (Ctrl-Alt+F2)。 像 SSH 这样的伪终端应该可以工作,但建议直接访问作为预防措施。 在更新过程中,将删除和替换多个软件包,这可能会导致 X11 桌面变得不稳定,并使您的系统处于无法启动状态。
安装 Pacman
- 一旦您开始更新 pacman 及其依赖项,就不得中断! Pacman 及其所有依赖项必须在单个命令行中同时安装。
- 紧随此命令之后,只有 Busybox、Bash 和 pacman 可执行,直到下面的其他软件包迁移完成。 如果您正在使用 sudo,则应在下一个命令之前获取 root 权限
从 pacman-contrib 安装 pactree 命令,然后使用 pactree 安装 Pacman 及其所有依赖项
# pactree -l pacman | pacman -S -
可能会打印错误,但只要 pacman 正常工作,它们就不会引起问题。
安装剩余软件包
安装先前下载的所有新架构的替换项。 (去喝一杯,做个三明治;这可能需要一段时间。)
# pacman -Qqn | pacman -S -
如果某些软件包未正确安装,您现在应该能够成功重新安装它们; 如果您很懒,可以只重新运行上一个命令来重新安装所有内容。
完成此步骤后,任一方向的迁移都应完成,并且重新启动计算机应该是安全的。
但是,如果您的系统上有任何 AUR 软件包,则必须重新安装所有这些软件包。 可以通过执行以下命令获取这些软件包的列表
$ pacman -Qqm
清理
现在您可以自由删除 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
从 2017 年及以前的旧系统迁移
您可能会遇到更新旧的 32 位系统的问题,因为 Arch Linux 在 2017 年放弃了对 i686 的支持。 为了使更新安全,您可能需要使用 Arch Linux Archive。 即修复仓库快照,然后更新当前系统,然后切换到与相同版本对应的 64 位软件包。
请注意,您可能需要在 pacman.conf
中降级所需的信任级别(例如 PackageTrustAll
以包括边缘信任),因为并非所有用于签名软件包的 GPG 密钥仍然有效。 虽然您可能需要确保您使用 HTTPS 以至少确保软件包来自 archlinux.org
域。
从 32 位切换到 64 位后 KDE 无法启动
从 32 位切换到 64 位后启动时,KDE 会崩溃。 原因是 /var/tmp 中 32 位 KDE 软件包的一些残留缓存文件。 要解决此问题,请删除所有 kdecache 文件夹,使用
# rm -rf /var/tmp/kdecache-*
启用缓存后 Mutt 出现问题
如果在完成后,您发现 mutt 在打开邮件文件夹时挂起,请尝试重命名缓存目录。 如果这有效,则可以删除重命名的目录,因为 mutt 将重新创建一个新的目录。