跨架构升级 Fedora

Posted on Sat 16 July 2016 in misc

有个很久以前建立的 Linode VPS,系统是 32 位的 Fedora。在 Linode 换成 KVM 时被要求换成了 64 位内核,看似没有问题就一直在使用。前些天发现许久不用的 strongswan 不能连接,报错信息让人感觉用户空间的什么东西和内核的什么东西不合拍,加上这个 Fedora 20 已经停止了更新,便萌生了作死变换架构然后升级的念头。

在这期间 Linode 一共给我发了 27 封提醒邮件,Orz...

Linode Events Notification

整个过程中主要参考了这篇文章。

大致过程与原文相同,先滚系统,然后安装发行版提供的 64 位内核并确保启动,然后执行命令输出软件包列表,并替换 i686x86_64 生成要安装的软件包列表,然后下载所有软件包准备。

# rpm -qa --qf '%{name}.%{arch}\n' |grep -E '\.i.86' |sed s/i.86/x86_64/g >rpmlist.txt
# yum --downloadonly --downloaddir=$SOMEPLACEWITHSPACE install $(cat rpmlist.txt)

此时要注意,由于目录结构的区别,要首先安装 filesystem 这个包,否则 /lib64 会成为一个目录,而不是到 /usr/lib64 的软链接。安装完成后可以继续安装所有软件包:

# rpm -Uvh filesystem*.rpm --replacepkgs --replacefiles --ignorearch
# rpm -Uvh *rpm --replacepkgs --replacefiles --ignorearch

注意 SELinux 相关包的状态,如果出现问题可能无法启动。我遇到的情况是莫名其妙的丢了 selinux-policy-targeted 这个包,导致重启之后 dbus 启动不能,卡住 systemd。

重启,确定系统正常之后可以删掉剩余的 *.i686* 包了。如果需要的话,使用 rpmconf -a 来处理各类 .rpm{save,new}

接下来是 Linode 限定部分。

  • 先在控制面板里做一个 snapshot
  • 全程使用 Glish 进行操作
  • 启动卡住时,进 Rescue 模式,chroot 进去用 journalctl -b -1 看日志

Linode 给虚拟机分配的磁盘一般是格式化好的一个完整文件系统镜像,相当于只有分区的内容,不是完整的磁盘。好在 ext 系基本都可以缩小,Linode 控制面板里也方便修改分区大小。实际上中途折腾失败时恢复 snapshot 自动建立的磁盘只有 23GB,而实际文件系统的使用量不到 10GB,不知道这个数字是怎么算出来的。

磁盘镜像的问题带来了第二个坑:bootloader。由于只有文件系统,装不上 bootloader,只能使用 Linode 的 GRUB2 方式启动系统。这种方式是由 Linode 提供 GRUB2,然后读取分区中的 /boot/grub/grub.cfg 作为配置文件进行启动,而 Fedora 默认的 GRUB2 配置文件在 /boot/grub2 里…与此相关的还有诸如 GRUB 界面乱码、卡死等问题。

为了解决这些坑,并且避免这些神奇的配置在以后升级过程中带来其他玄学问题,我创建了一个新的 unformatted/raw 格式的磁盘,进入 Rescue 分区,并将原磁盘的内容 rsync 到新磁盘的分区中。然后 chroot 进去,用 grub2-install /dev/sda 科学的安装 GRUB2。最后将启动方式改成 Direct Disk。

最大的折腾感受:滚动大法好!跨版本升级什么的太坑啦!