没有标题的博客

记录与分享

将Arch Linux从32位升到64位

准备工作

确认为64位平台

如果你已经正在使用x86_64但是想安装i686,可以跳过此步。 为了运行64位软件,你的CPU必须支持64位。现在大部分CPU都支持64位。你可以通过运行一下命令来确认:

1
$ grep --color 'lm' /proc/cpuinfo

(原文中为grep --color '\' /proc/cpuinfo, 应该不对) 当CPU为x86_64平台时,输出结果里会出现高亮的 lm (“long mode”)。 注意不是lahf_lm,它和64位无关。

硬盘空间

在迁移过程中,/var/cache/pacman/pkg的大小将翻倍,请为此做好准备。这是假定cache里只有当前安装的包,就像$ pacman -Sc(clean)刚运行过一样。使用空间增长是因为所有包同时有i686和x86_64两个版本。 如果你没有足够的空间,可以使用gparted来调整相关分区大小,或者mount另一个分区到/var/cache/pacman。 在迁移过程中请不要移除老框架的软件包,知道完全升级成功。过早的移除会使你无法回退和还原变更。

电源支持

升级时间比较长,并且不可中断。根据你的 安装包大小及网络速度,你最好为此准备至少一个小时的升级时间(虽然你可以先把它们下载下来)。请保证你的电源稳定。

回退准备

如果迁移过程中失败,有些包可以帮助你解决此时的问题,但是需要你在迁移之前安装。详情可以参考后面的 #Troubleshooting 。 包busybox可以用来还原变更。它不依赖于其他包,可以单独安装。通过下面命令可以安装32位(i686)的版本

1
$ pacman -S busybox

另一个包是lib32-glibc,在Multilib的x86_64资源库里。这个只有当你从32位迁移至其它版本时才可能使用(It is probably only useful when migrating away from 32 bits);无论如何你可能安全跳过这个包。你可以用这个包来运行32位程序,通过明确的调用/lib/ld-linux-x86-32.so.2。可用下面命令行安装。

1
$ pacman -S lib32-glibc

方法1:使用Arch LiveCD

  1. 下载、刻录并启动64位Arch ISO LiveCD。
  2. 配置LiveCD的网络,然后pacman用新的库。
  3. 将现在的安装挂在到/mnt目录。如:mount /dev/sda1 /mnt
  4. 使用下面的脚本来执行:升级本地pacman数据库、取得本地安装包列表并重新安装:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

MOUNTED_INSTALL='/mnt'
TEMP_FILE='/tmp/packages.list'

pacman --root $MOUNTED_INSTALL -Sy
pacman --root $MOUNTED_INSTALL -Qqet > $TEMP_FILE

for PKG in $(cat $TEMP_FILE) ; do
   pacman --root $MOUNTED_INSTALL -S $PKG --noconfirm
done

exit 0

方法2:从当前系统升级

准备

Cache old packages

注意:如果你有从AUR或第三方库的包,并且在新的平台里查询不到,pacman会告知找不到相应替代。将这些包记录下来,以便在升级成功后重新安装,并用$ pacman -Rsn package_name来卸载。

确保你现在的包都在你的cache里,下载它们(老平台的)以便回退。

1
$ pacman -Sw $(comm -23 <(pacman -Qq) <(pacman -Qmq))

或者用pacman-contrib包里的bacman来生成它们。 如果你是从32位迁移,现在可以安装32位的Busybox

1
$ pacman -S busybox

更换pacman平台

编辑配置文件/etc/pacman.conf并且把Architectureauto改为新值。你可以参考下面的sed命令: For x86_64

1
$ sed -i -e s/'Architecture = auto'/'Architecture = x86_64'/g /etc/pacman.conf

For i686

1
$ sed -i -e s/'Architecture = auto'/'Architecture = i686'/g /etc/pacman.conf

手动移除Pacman软件仓库的数据库,强制同步新的软件仓库:

1
2
$ rm -rf /var/lib/pacman/sync/*   # remove existing repository cache
$ pacman -Sy                      # sync new architecture repositories

下载新包

给所有当前安装包下载新平台版本

1
$ pacman -Sw $(pacman -Qq|sed '/^lib32-/ d')  # download new package versions

如果有些包不能下载,请删除它们。 如果是迁移到32位,安装32位的Busybox fallback now that Pacman has been configured with the 32-bit architecture:

1
$ pacman -S busybox

或者,如果是迁移到64位,安装lib-32-glibc fallback:

1
$ pacman -S lib32-glibc

安装包

安装内核(64位)

将内核升级到64位(x86_64)很安全很简单:32位和64位的应用在64位内核下都能很好的运行。如果是从64位迁移至其它平台,leave the 64-bit kernel installed and running for now and skip this step. 用下面命令安装Arch Linux内核:

1
$ pacman -S linux

启动新的64位内核,并确认它运行x86_64平台:

1
$ uname -m

控制台终端

现在切换到一个text-mode虚拟控制台(可以通过Ctrl+Alt+F1)来完成接下来的步骤。你可以使用SSH之类的伪终端,但不建议你这么做。有些包会被移除或者被替换,可能会导致X11桌面不稳定,以至于系统无法启动。

安装Pacman

警告:一旦你开始升级pacman及相关依赖,便不能中断。Pacman及相关依赖必须在同一条命令行上同时安装。

1
$ pacman -S pacman glibc libfetch libarchive openssl acl attr xz-utils bzip2 zlib readline bash ncurses expat

Immediately following this command only Busybox, Bash and Pacman will be executable until the other packages are migrated below. 安装成功前不能重启。

安装已存在的包

为新平台安装所有之前下载的替换。(此时可以休息休息,因为需要花费一段时间。)

1
$ pacman -S $(pacman -Qq)

For migration away from 64 bits, you may want to skip installing a 32-bit kernel in the command above, since the old 64-bit kernel will still run 32-bit programs. 完整这步迁移后,各方面都已经完成并且可以重启电脑。

清理

你现在可以移除Busybox和lib32-glibc。

1
$ pacman -Rcn busybox lib32-glibc

Makepkg compiler flags

升级中新版的/etc/makepkg.conf可能会被保存至/etc/makepkg.conf.pacnew。如果你以后要用makepkg进行编译,你必须替换或修改老版本。

1
$ mv /etc/makepkg.conf /etc/makepkg.conf.backup && mv /etc/makepkg.conf.pacnew /etc/makepkg.conf

It might also be a good idea to just get a list of “new” additions to /etc. You can get a list with the following command:

1
$ find /etc/ -type f -name \*.pac\*

问题解决

在升级过程中,当glibc替换为新版本后,许多老版本的程序将不能运行。如果发生此类问题,你可以用busyboxlib32-glibc来解决。

Busybox

In Arch, Busybox is statically linked; it can run without any libraries. There are many commands available to you. For example, to extract an i686 version of Pacman from a cached package:

1
$ busybox tar xf /var/cache/pacman/pkg/pacman-3.3.2-1-i686.pkg.tar.gz -C <some folder>

Lib32-glibc

Example run 32 bit /bin/ls:

1
$ /lib/ld-linux-x86-32.so.2 /bin/ls

其它

Comments