架构迁移

出自 ArchWiki

本文正在考虑归档

理由: i686 的弃用发生在7 年前,此页面不再需要。(在Talk:Migrating between architectures中讨论)

本页介绍了将已安装的系统从 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

  1. 下载并刻录最新的 Arch Linux ISO。
  2. 在 x86_64 模式下启动 Arch LiveCD。
  3. 在 LiveCD 上配置您的网络。
  4. 挂载您现有的安装。 例如:mount /dev/sda1 /mnt
  5. 编辑 LiveCD /etc/pacman.conf 仓库以匹配现有的 /mnt/etc/pacman.conf 仓库。
  6. 使用以下命令更新本地 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

软件包准备

缓存旧软件包

注意: 如果您从 AUR 或第三方仓库安装了任何软件包,并且没有新的架构可用性,pacman 会通知您它找不到合适的替换项。 列出这些软件包,以便您可以在更新过程后重新安装它们,然后使用 pacman -Rsn package_name 删除它们。

如果您在缓存中没有所有已安装的软件包,请下载它们(对于旧架构),以备回退之用。

# pacman -Qqn | pacman -Sw -

或者使用 fakepkgAUR 软件包来生成它们。

安装 busybox

如果您要从 32 位迁移到 64 位,现在是安装 32 位 busybox 的时候了。 安装 busybox 软件包。

更改 Pacman 架构

编辑 /etc/pacman.conf 文件并将 Architectureauto 更改为 x86_64

确保 /etc/pacman.conf/etc/pacman.d/mirrorlist 中的服务器列表使用 $arch 而不是显式指定 i686x86_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 备用程序。

警告: 现在不要安装 lib32-glibc 软件包。 在 ldconfig 之后,当您安装 linux 时,生成的镜像将在 '/usr/lib32' 中包含 librt.so 等库,启动期间二进制文件不会搜索该位置,从而导致启动失败。

软件包安装

安装内核(64 位)

将内核升级到 64 位 (x86_64) 是安全且直接的:32 位和 64 位应用程序在 64 位内核下都能同样良好地运行。

安装 linux 软件包。

安装 lib32-glibc

lib32-glibc 备用程序与 64 位版本的 glibc 一起安装。 如果您尚未这样做,则需要在 /etc/pacman.conf 中添加 multilib 仓库。

警告: 如果您不同时安装 64 位版本的 glibc 和 lib32-glibc,则 lib32-glibc 安装将无法正常工作。 但是,pacman 不会警告您这一点,因为 32 位 glibc 软件包也满足依赖关系。

重启

验证您是否正在运行 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 正常工作,它们就不会引起问题。

警告: 在完成以下命令之前,您绝不能重新启动系统。 如果您未能这样做,则应通过从另一个 linux 环境(例如从 live 安装介质)chroot 继续安装

安装剩余软件包

安装先前下载的所有新架构的替换项。 (去喝一杯,做个三明治;这可能需要一段时间。)

# pacman -Qqn | pacman -S -

如果某些软件包未正确安装,您现在应该能够成功重新安装它们; 如果您很懒,可以只重新运行上一个命令来重新安装所有内容。

完成此步骤后,任一方向的迁移都应完成,并且重新启动计算机应该是安全的。

但是,如果您的系统上有任何 AUR 软件包,则必须重新安装所有这些软件包。 可以通过执行以下命令获取这些软件包的列表

$ pacman -Qqm

清理

现在您可以自由删除 busyboxlib32-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

从 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 将重新创建一个新的目录。

参见