2009年11月30日星期一

Fedora 11 到 Fedora 12 升级历险

Fedora 11 到 Fedora 12 升级历险

===========================
Fedora 11 upgrade to Fedora 12 travel
LinFeiYu, 2009,11,28

按照官方的升级建议使用 preupgrade 满以为可以很快地升级成功。不过过程很是辛苦,因为 preupgrade 并不完美。

1. 下载升级安装所需要的文件

虽然我使用几个非官方的软件源,但是升级中依赖的解决却很是顺利。在下载了大量的 metadata 之类的信息文件之后,开始漫长的软件包的下载,一共需要下载大约 1.1GB 。下载时候的速度并不受到 /etc/yum.conf 的控制,这点出乎我的意料。缓慢的下载速度导致我在下载中必须暂停,然而目前 preupgrade 的第一个大问题是,在继续下载升级的过程中出现了 bug ,经常出现的问题是由于所有用于 preupgrade 的 metadata 都下载在 /var/cache/yum 中了,所以继续升级的时候它要么出现可以重启升级的“成功”消息,要么是扔出一个 preupgrade Python执行代码的错误(也就是 bug538118 https://bugzilla.redhat.com/show_bug.cgi?id=538118),这些都使得升级无法正常继续。在我完全没有看完 bug538118 页面上的所有回帖之后做了一些傻事。google 到的大部分解决方案就是把所有 preupgrade 已经下载的 metadata 信息文件和软件包统统删除::

# rm -rf /var/cache/yum/preupgrade*

这导致了我又一次次的下载所有的升级相关文件,既浪费了大量的时间也浪费了大量的带宽。而且没有充足的时间一次性地完成这个艰巨的任务。知道我看到了 Comment #26 之后才摆脱这个没完没了的升级下载过程。Comment #26 提供的方法是只删除已经下载的 metadata 信息文件::

# rm /var/cache/yum/preupgrade-*/!(packages)

相对来说所有的软件包都保存,只需要在暂停之后重新下载几十 MB 的 metadata 信息文件,已经是很好的解决方法了。

等升级下载完成之后以为接下来会很顺利,然而这却让我浪费了将近一周的时间。。。

2. 安装新的软件包

preupgrade 升级下载完成之后,按照提示信息,重启了机器,恶梦于是真正开始了。preupgrade 添加了一条 GRUB 启动条目,重启之后就进入这个启动条目了。这是经典的 Fedora 安装界面。然而,升级并没有开始,而是出现无法设置 FAT32 分区的错误,我觉得很奇怪,重启机器进入原来的 Fedora 11,将 /etc/fstab 中 FAT32 分区挂载条目注释掉。重新进入安装程序己可开始真正的安装,晕。安装软件包安装完之后,是否有重新安装设置 GRUB 我已经不太清楚了,可能我就在这个地方出了问题。然后就是提示信息说安装已经成功,可以重启机器了,在忍受了安装 1400 多个安装包之后我想终于可以舒服地松口气了。然而!重启之后,我的笔记本再也无法找到硬盘上的任何系统了。

3. 进入新的系统

这里我需要说明下我的硬盘的分区情况::

/dev/sda1 NTFS C:\
/dev/sda5 NTFS D:\
/dev/sda6 NTFS E:\
/dev/sda7 NTFS F:\
/dev/sda8 NTFS G:\
/dev/sda9 NTFS H:\
/dev/sda10 NTFS I:\
/dev/sda11 FAT32 J:\
/dev/sda12 SWAP
/dev/sda13 ext3 Fedora
/dev/sda14 ext3 Fedorahome
/dev/sda15 ext3 Archlinux
/dev/sda16 ext3 Archlinuxhome

Fedora 安装在 /dev/sda13 , Fedora 的 /home 目录挂载于 /dev/sda14
Archlinux 安装在 /dev/sda15 , Archlinux 的 /home 目录挂载于 /dev/sda16
GRUB 安装在各自的分区,如 Fedora 的 GRUB 安装在 /dev/sda13 , Archlinux 的 GRUB 安装在 /dev/sda15 中。 /dev/sda1 中安装的是 Windows XP ,使用 GRUB4DOS 来进入各自的 GRUB 。比如对于 Fedora 的 GRUB4DOS 条目是这样的::

title Fedora Inside
root (hd0,12)
chainloader +1

无法找到硬盘上的任何操作系统?我一开始想到的是可能升级 Fedora 的时候不小心把 GRUB 安装到 MBR 上,而且猜测是安装了 GRUB2 所致,因为不久前我安装的 debian testing 中升级了 GRUB 之后就出现类似的问题。于是我找来自己的 128M U盘 WinPE ,从 U盘 启动进入支持 SATA硬盘 的 DOS 环境,希望通过 fdisk /mbr 去掉 MBR 上的 "GRUB2" 。然而这个命令却把 U盘 中的 WinPE 的 GRUB 去掉了。。。 U盘也启动不了 WinPE 了!于是我找了几张旧光盘,其中一张是 Fedora 8 LiveCD ,可能由于刻录的原因(比如刻录速度过快,盘片质量差)花了好长时间听着“咔咔咔”的声音进入 LiveCD 中,所有分区看上去均正常,都可以正常挂载和读取数据。看上去应该是硬盘分区表启动信息的问题。用 Windows XP SP3 (集成SATA驱动)启动进入故障控制台没有找到任何 Windows 系统!试着使用 fixmbr 命令和fixboot命令然后重启机器,还是无法找到硬盘上的任何操作系统,不过用 Windows XP 安装光盘进入故障控制台已经可以找到 /dev/sda1 上的 Windows XP 了。然而,无论怎么折腾都没有效果。同事刻录了一张 GParted 的光盘也显示硬盘分区好像都正常。等到做完 U盘 WinPE ,用 U盘 启动的时候,居然进入了我的 GRUB4DOS 菜单了!然而所有 chainloader 条目都不能进入其 GRUB ,按 c 进入命令行模式,才发现 U盘 现在是 (hd0,0) ,而笔记本硬盘的分区为 (hd1,N)。这样,我更改了 Archlinux 的 root 为 (hd1,14) 之后顺利地进入了 Archlinux 中。 chroot 到 /dev/sda13 的 Fedora 系统中,一开始试着使用 grub-install 的 --recheck 参数,出现了错误,找不到任何需要的字符串。进入 GRUB 环境,试图进行修复之类的操作都提示找不到任何需要的字符串的错误。不过最后还是执行了::

root (hd0,12)
setup (hd0,12)

然后退出,重启机器。依然无法找到任何操作系统!这个时候我想到了一个最有可能的问题就是:启动分区标志的丢失。再次使用 U盘 进入 Archlinux 中,进入 fdisk /dev/sda 发现的确地,/dev/sda13 被设置为启动分区。将其调整为 /dev/sda1 ,写入分区表,退出,重启系统之后终于可以顺利找到并进入 Windows XP 的 ntldr 菜单了。太好了!接下来就是试着进入 GRUB4DOS 中的 Fedora 的 GRUB 了,然而失败了。我记起了 Fedora 的 GRUB 条目中 kernel 中使用的是 UUID ,或许该分区的 UUID 已经被更改了?于是进入 Archlinux 中 chroot 到 Fedora 中。
使用 findfs 找不到原来的 /dev/sda13 的 UUID 的对应设备信息。
使用 blkid 命令查找 udev 信息::

# blkid -o udev /dev/sda13

没有返回任何信息!而使用 tune2fs 却可以得到所有信息当然包括其 UUID ::

# tune2fs -l /dev/sda13

于是一个大胆的猜测在我脑海中形成:因为某些兼容的原因,分区的某些信息比如 UUID 至少保留在两个地方,一些比较旧的程序只能读取到一部分地方的这些分区信息,而比较新的程序可以读取到这些新区信息新的设置地方,因为升级的原因可能把旧地方的某些分区信息去掉了。我进入 Ubuntu 9.04 LiveCD 中,使用其 GParted 可以读取到完整的分区信息,而使用 WinPE 中的 PM 工具却把 /dev/sda13 当成了一个 FAT32 分区,尽管其分区号是 83 !另外一个猜测是这些分区信息可能使用了新的规则,使得旧的程序读取不到。于是我尝试一些命令来将这些信息写入到旧地方中,但是没有一个凑效。最后我做了一个最下下策的方法:重新格式化 /dev/sda13 ,并将其新的 UUID 更新到 /boot/grub/grub.cfg 和 /etc/fstab 中。这个方法中我将 /dev/sda13 格式化为 ext4 了, /etc/fstab 根分区挂载文件系统格式当然也改成 ext4 了。做完这些之后就可以进入到 /dev/sda13 中的 Fedora 12 了!除了 SELinux 对 dbus 的一个设置有问题和其他一些小问题之外好像其他一些都正常工作了。终于升级到并使用上 Fedora 12 啦!

4. 一些想法

虽然 presto 升级技术已经非常稳定和有效了,但是从旧版本升级到新版本却没有这种处理,这也让人还有些遗憾。但无论如何也将是一个需要实现的功能,是吧。

令我感到很遗憾的是,所有 Fedora 12 的软件包都已经被清除得一干二净,虽然我的 /etc/yum.conf 中设置了 keepcache=1 。在下载 preupgrade 生成的 GRUB 相关的文件中可以看到最后是删除了 /var/cache/preupgrade* 所有目录的,这个问题没有解决之前最好备份一下所有 f12 安装包。正确的做法我想应该是让所有的 f12 安装包都放在了新的 /var/cache/yum/* 各自的目录中。/etc/yum.conf 的设置也发生了一个变化,就是 cachedir 的定义?另外软件源的设置也不见了。

最后, preupgrade 这种升级方法虽然技术性强,但是还是不够成熟稳定。我想目前比较好的升级方法还是 fedora-zh 论坛中 bbbush 转载的一个文章的方法: http://bbs.fedora-zh.org/showthread.php?t=356 。而且只需要 LiveCD 作为升级安装媒质。

没有评论:

发表评论