GRUB惊魂

1681阅读 0评论2008-08-14 blue_stone
分类:LINUX

前天下了个kde4的liveCD, 在kvm虚拟机里边玩了一下, 感觉还可以, 就打算进一步体验体验, 于是给虚拟机增加了一个硬盘, 然后用liveCD里边的命令吧kde4给装到了虚拟的硬盘中. 虚拟硬盘上建立了2个分区, 一个用作/boot, 一个用作lvm, lvm中建立两个lv, 一个用于swap, 一个用户root. 安装过程一切顺利, 使用起来也很方便. 虽然是在虚拟机里边的硬盘,但比起用LiveCD要强多了(可能是心理感觉), 至少不提示剩余空间不足了.

我的物理机器磁盘分了8个分区, sda1用做Windows XP的第系统分区, sda2是扩展分区, sda3是一个250M
的分区, 用作Debian Linux的boot分区, sda4用作别的Linux的root分区, sda5,sda7用作Windows XP的文件分区.sda6是一个swap分区, sda8是一个pv, 用于Debian Linux的rootvg, 包含了rootlv, swaplv, homelv. sda4上原来安装了一个ubuntu, 刚刚被我删掉, 正好可以用来安装新的KDE4.

说干就干, 关闭kvm虚拟机, 将物理硬盘作为sdb添加到kvm虚拟机中, 从liveCD引导, 进入命令行, 挂载新旧root分区分别到/tmp/oldroot, /tmp/newroot, 然后运行:

cd /tmp/newroot
tar -cpf - -C /tmp/oldroot . |tar -xpf -

大概花了十多分钟, 数据复制完毕.修改/etc/fstab中root分区的配置信息, 然就将虚拟硬盘上的/boot分区挂载, 复制所有到新root分区的/boot目录下. 这样系统的所有数据就都复制到了物理硬盘的sda4分区上.

关闭kvm虚拟机, 在Debian中挂载/dev/sda4到/vm, , chroot /vm后试图运行mkinitrd, 报错, 所以决定使用原来的initrd文件启动系统, 在Debian的menu.lst上添加相应条目后重启系统, 但无法进入. 使用debian的kernel(也是2.6.25的), 并指定root=/dev/sda4启动新安装的KDE4, 运行mkinitrd生成新的initrd文件, 就可以使用KDE4自带的内核启动系统了.

KDE4基于SUSE11, 带有yast, 一个很经典的系统配置工具. 有新锤子在手, 自然想东敲敲西打打. 在使用yast配置grub的时候, 终于祸从锤子出了: 我顺手运行了一下安装boot loader, 结果yast吧grub安装到了sda1上, 也就是Windows XP的系统分区上, 当我试图mount /dev/sda1时报不能识别的分区类型, 而同样是ntfs的/dev/sda5却可以正常挂载.

进入Debian, 启动vmware, 建立一个虚拟机,硬盘使用物理硬盘, 从xp和win2003安装光盘引导试图进入恢复模式时提示找不到硬盘驱动器. 把物理硬盘添加到一个已经安装好的windows2003虚拟机后, 启动虚拟机, 硬盘认到了, 运行diskprobe时报错, 无奈, 放弃vmware.

进入Debian, 启动kvm虚拟机, 硬盘使用物理硬盘, cd-rom使用xp的引导盘, 进入挽救模式, 硬盘竟然可以识别, 但是运行dir却什么东西也没有. 进入D:后运行dir却可以正常显示/dev/sda5上的数据, 心一下子凉了一半, 难道我的数据竟然要丢失了?? 死马当活马医生吧, 运行fixboot时提示要修复H:上的引导记录, 有点奇怪, H:是什么东东. 在linux下运行fdisk -l发现/dev/sda4被标记为active, 在挽救模式下运行diskpart也验证了我的观点, H:就是/dev/sda4, 这是因为在windows, 磁盘排序是按照主分区的顺序排, 如果遇到了扩充分区, 就把扩充分区包含的分区全部排进去, 然后接着排剩下的主分区. C:对应sda1, D:对应sda5, 而H:对应sda4. 关闭kvm虚拟机, 运行fdisk, 将sda1设置为boot后重启kvm, 运行fixboot时就提示修复C:上的引导分区了, 运行fixboot后运行fixmbr, 顺便连mbr也给清除了. 重启kvm虚拟机, 从硬盘启动, BIOS过后一阵黑屏幕, 这说明mbr清除成功了, 如果清除不成功的话, 应该出现grub菜单, 马上强制重启kvm虚拟机, 自检过后按F8, 终于出现盼望已久的windows菜单. 说明sda1上的boot记录已经被修复. 关闭kvm虚拟机后, 挂载sda1成功, 并且可以正常查看挂载后的目录, 文件一个未少.

在Debian中运行grub-install /dev/sda将grub安装到mbr中, 使用kvm虚拟机验证了一下, 然后重启机器, Windows可以正常进入.

附记:

1 本文中由于要对物理硬盘进行操作, 所以把物理硬盘给vmware或kvm虚拟机用, 并且有同时在虚拟机中和真实操作系统中对磁盘进行操作(如fdisk), 这样做很危险, 稍有不慎, 就可能导致数据丢失. 但是对于同一个分区或mbr, 同一时间只有一个系统(host os或虚拟机)在对其做写操作, 还是比较安全的.

2 KDE4 liveCD是一个安装了kde4的suse11, 我的debian是sid的, 内核版本为2.6.25
上一篇:在vmware中设置guest os使用1280x800的分辨率
下一篇:Linux下CDMA的使用