更改分区后,引导Linux小结
前些天装完Slack后,想装一个Suse,就在Slack前的分区一分为二,作为Suse的/和/home,共用Swap,在安装过程中,仔细的观察了一下分区和Grub的信息,其实引导也不是那么麻烦。当然,首先还是在网上找了些相关的资料,所以才知道会出现情况,分区时特别小心,呵呵。。
来源:互联网 时间: 2006-04-11 今天整理硬盘,把整个D盘(hda5)腾了出来,终于有空间试验raid+lvm+reiserfs v4.0啦,立刻用PQ删除了分区,成了未分配空间。正如预料的,由于分区改动了,linux进不去了。于是开始了一番恢复。。。。。。
Ok,Let`s go ! 先来看看分区情况吧!
未删除分区情况:
/dev/md0 <---------------> RAID设备 (lfs-6.0优化根分区)
/dev/hda1 <---------------> C盘 (主分区)
/dev/hda2 <---------------> 扩展分区
/dev/hda3 <---------------> 主分区,未分配
/dev/hda4 <---------------> 主分区,未分配
/dev/hda5 <---------------> D盘 (逻辑分区)
/dev/hda6 <---------------> E盘 (逻辑分区)
/dev/hda7 <---------------> lfs-6.0根分区(未优化)
/dev/hda8 <---------------> /boot分区(全局)
/dev/hda9 <---------------> 线性RAID使用的分区(0)
/dev/hda10<---------------> Mandrake根分区
/dev/hda11<---------------> SWAP交换分区
/dev/hda12<---------------> 线性RAID使用的分区(1)
删除后分区情况:
/dev/md0 <---------------> RAID设备 (lfs-6.0优化根分区)
/dev/hda1 <---------------> C盘 (主分区)
/dev/hda2 <---------------> 扩展分区
/dev/hda3 <---------------> 主分区,未分配
/dev/hda4 <---------------> 主分区,未分配
/dev/hda5 <---------------> E盘 (逻辑分区)
/dev/hda6 <---------------> lfs-6.0根分区(未优化)
/dev/hda7 <---------------> /boot分区(全局)
/dev/hda8 <---------------> 线性RAID使用的分区(0)
/dev/hda9<---------------> Mandrake根分区
/dev/hda10<---------------> SWAP交换分区
/dev/hda11<---------------> 线性RAID使用的分区(1)
很明显,更改后的分区号=原分区号-1 (删除的D盘)
进入grub命令行:grub> root (hd0,6)
Filesystem type is ext2fs, partition type 0x83
grub> kernel (hd0,6)/vmlinuz-lfs-6.0 root=/dev/hda6 vga=791
因为我的vmlinuz-lfs-6.0(lfs内核)是放在/boot分区(hda7)的,而grub中(hd0,0)表示第一块硬盘的第一个分区(/dev/hda1),所以(hd0,6)就对应了/dev/hda7,(/boot分区),而lfs-6.0根分区修改后是/dev/hda6,所以是root=/dev/hda6,当我得意的按下enter时,意外发生了:
Error 15: File not found
咦?怎么会找不到文件呢?莫非我的分析完全错误了?接着我输入了:
grub> find / 按下TAB键,让grub列出(hd0,6)/下面的东东:
Possible files are: lost+found bin boot dev etc home lib .viminfo
mnt opt proc root sbin sys include tmp usr var
grub>
真是奇怪,怎么(hd0,6)会是我的lfs根分区呢?它应该是/boot呀。
查看下当前的分区情况吧:
grub> root (hd0, 按下TAB键显示当前分区:
Possible partitions are:
Partition num: 0, Filesystem type is fat, partition type 0xb
Partition num: 5, Filesystem type unknown, partition type 0x7
Partition num: 6, Filesystem type is ext2fs, partition type 0x83
Partition num: 7, Filesystem type is ext2fs, partition type 0x83
Partition num: 8, Filesystem type is reiserfs, partition type 0xfd
Partition num: 9, Filesystem type is ext2fs, partition type 0x83
Partition num: 10, Filesystem type unknown, partition type 0x82
Partition num: 11, Filesystem type unknown, partition type 0xfd
grub>
将分区号+1,竟然仍然是修改前的分区号,只是少了(hd0,4)=/dev/hda5 真是#%^&
grub> find (hd0,7)/ 再次按下TAB键,显示/dev/hda8的内容:
grub vmlinuz us.klt System.map-2.6.8.1-12mdk config-2.6.8.1-
12mdk vmlinuz-2.6.8.1-12mdk diag1.img diag2.img message-graphic
initrd-2.6.8.1-12 vmlinuz-lfs-6.0 .................
grub>
果然!/dev/hda8仍然是/boot分区,/dev/hda7是我的lfs根分区
既然这样,那么原来的引导信息就应该可以正常引导了。
grub > kernel (hd0,7)/vmlinuz-lfs-6.0 root=/dev/hda7 vga=791
结果可想而知,还是不能正常引导。(当然喽,能引导的话,就没意义记下了 ^_^)
引导过程中,出现"no init found root=.........."
看来是没有找到根分区,真是奇怪,(hd0,6)下的确是我的lfs根分区阿!?
莫非grub中标识的分区号和linux中的分区号标识不相同?? 试试先:
grub > kernel (hd0,7)/vmlinuz-lfs-6.0 root=/dev/hda6 vga=791
grub > boot
根据grub中标识的分区号,vmlinuz-lfs-6.0在(hd0,7)下
根据上面的分析,lfs-6.0的根分区是在/dev/hda6下
顺利进入!看来果真如此。grub仍然使用原始分区号,而linux中则是修改后的分区号
[root@NEWLFS ~]#cfdisk
Name Flags Part Type FSType [Label] Size (MB)
--------------------------------------------------------------------------------
hda1 Boot Primary W95FAT32 6859.89
Logical FreeSpace 22413.89
hda5 Logical NTFS [^C] 26386.70
hda6 Logical Linuxext3 10734.00
hda7 Logical Linuxext3 106.93
hda8 Logical Linux raidautodetect 3619.13
hda9 Logical Linuxext3 7221.80
hda10 Logical Linux swap /Solaris 534.65
hda11 Logical Linux raidautodetect 2146.80
结论:删除一个分区,在grub中只是将这个分区号去掉 (hd0,4)而其他的分区号并不改变
而linux中其他的分区号会改变,例如删除hda5,位于hda5以后的分区:分区号=原分区号-1
因此删除位于中间的分区是不好的,会导致grub与linux标识分区号不同,比较混乱。
俺也要赶紧把hda5做成lvm+ReiserFS v4.0,这么多分区,真要糊涂了。:)
另外grub中的TAB键补全功能十分的好用,相信从上面已经体现了一些
使用linux第一步就要会一些grub基本用法啦,不然会很痛苦哟 :)
#################################################################################
总结:经过验证,像这些问题完全可以解决,先说明一下,我的Linux系统是用grub for Dos来引导和安装的,包括Slackware和Suse。
(小弟也是凭自己的试验和理解来写的,如果有误的话,请各位指出来,让小弟也学习一下,谢了)
1、首先确定要怎么样对分区操作,是在Windows下,还是在Linux下,是合并分区还是增加分区,是在Linux系统前面还是后面,这些很关键。
2、不管在Windows下还是Linux下完成更改分区的操作,在执行前要先进入Linux系统,然后修改以下几个地方:
a、/etc/fstab,修改其中的载入点地址,在原来分区的基础上增加或减少,如增加1个分区,且在Linux系统前面,那么就载入点的值相应的增加1,减少也一样,如果在Linux后面,则不用任何修改。
如我在安装Suse前的硬盘分配如下:
### 前面4个为主分区,我用了两个,一个做扩展分区。
/dev/hda1 ----------- C(Windows XP安装目录)
### 以下为扩展分区
/dev/hda5 ----------- D盘
/dev/hda6 ----------- E盘
/dev/hda7 ----------- swap(交换分区)
/dev/hda8 ----------- /(Slack)
/dev/hda9 ----------- /home(Slack)
/dev/hda10 ----------- F盘
现在要将E盘分为3个区,来安装Suse系统,分配后硬盘分区如下:
### 前面4个为主分区,我用了两个,一个做扩展分区。
/dev/hda1 ----------- C(Windows XP安装目录)
### 以下为扩展分区
/dev/hda5 ----------- D盘
/dev/hda6 ----------- /boot(Suse)
/dev/hda7 ----------- /(Suse)
/dev/hda8 ----------- /home(Suse)
/dev/hda9 ----------- swap(交换分区)
/dev/hda10 ----------- /(Slack)
/dev/hda11 ----------- /home(Slack)
/dev/hda12 ----------- F盘
分区后比原来多了2个分区,然后原来Slack的分区号都增加2,那么fstab中的分区也应该加2
如原fstab内容如下:
# /etc/fstab
/dev/hda7 swap swap defaults 0 0
/dev/hda8 / ext2 defaults 1 1
/dev/hda9 /home ext2 defaults 1 2
/dev/hdb /cdrom iso9660 noauto,user 0 0
none /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
这时应修改为:
# /etc/fstab
/dev/hda9 swap swap defaults 0 0
/dev/hda10 / ext2 defaults 1 1
/dev/hda11 /home ext2 defaults 1 2
/dev/hdb /cdrom iso9660 noauto,user 0 0
none /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
b、修改Slack系统/boot/grub下的menu.lst文件,重新指向Slack分区。
原/boot/grub/menu.lst内容:
title Slackware 11.0
root (hd0,7)
kernel (hd0,7)/boot/vmlinuz root=/dev/hda8 vga=791 ro
修改为:
title Slackware 11.0
root (hd0,9)
kernel (hd0,9)/boot/vmlinuz root=/dev/hda10 vga=791 ro
3、按照计划好的空间进行格式化,建立分区,然后在C盘根目录下的menu.lst中添加上Suse的引导信息,
title SUSE 10.1 Linux
fallback 2
kernel (hd0,5)/boot/vmlinuz root=/dev/hda7 vga=791 ro
initrd (hd0,5)/boot/initrd
注意:在“(hd0,5)/boot/vmlinuz root=/dev/hda7 vga=791 ro”里面,第一个(hd0,5)其实就是/dev/hda6,因为grub是从(hd0,0)开始,而Linux是从/dev/hda1开始的,我也是反复用TAB试了好多次才确定的,因为不这样的话,系统就引导不了,最后只能这么解释,后来查了些资料也证实了这一点。
后记:其实fstab文件可以不修改的,在安装好系统后用single模式进入,然后再修改也可以。
##################################################################################
双系统由于win修改分区引起的linux无法启动问题的解决方法-Grub问题
在装有windows和linux双操作系统上,由于更改了windows分区(合并或拆分)而导致linux无法启动的解决方法(多操作系统也如此):
问题起因:在windows上合并了两个分区,导致linux系统的分区符发生了变化,原来是sda10,现在变成了sda9,重新启动时无法看到grub菜单,显示 Grub loading ...... Please waiting.(死掉了)
解决方法:
准备:一张fedora急救盘或者redhat急救盘。我的系统是debian,fedora的急救盘仍然管用。
以debian为例讲述修复过程:
步骤:1.插入光盘,重新启动(BIOS设置光盘启动)
2、在boot提示符下,输入:linux rescue
boot> linux rescue
3、选择默认(询问选择语言和键盘,直接回车就可以了)
4、按Tab选择No (询问是否配置网络,这个就不用了)
5、continue (是否继续,选择是)
6、回车(无法映像到/mnt/sysimage,直接启动shell(因为我的是debian))
7、fdisk -l(查看分区)
找到你安装debian的分区ext3格式,记下盘符sda*(*为数字),下面是我的fdisk列表
/dev/sda1 * 1 1275 10241406 7 HPFS/NTFS
/dev/sda2 1276 9726 67882657+ f W95 Ext'd (LBA)
/dev/sda5 1276 2550 10241406 7 HPFS/NTFS
/dev/sda6 2551 4462 15358108+ 7 HPFS/NTFS
/dev/sda7 4463 7116 21318223+ b W95 FAT32
/dev/sda8 7117 7179 506016 82 Linux swap / Solaris
/dev/sda9 7180 9064 15141231 83 Linux
8、mkdir /mnt/linux
创建linux下ext3的映像文件夹
9、mkdir /mnt/linux/boot
创建linux下boot的映像文件夹(无boot分区可跳过)
10、mount -t ext3 /dev/sda* /mnt/linux
挂载linux的ext3(sda*为linux的ext3分区)
11、mount -t ext3 /dev/sda* /mnt/linux/boot(无boot分区可跳过)
挂载linux的boot分区(sda*为linux的boot分区)
12、chroot /mnt/linux
现在你已经进到你的debian的shell了
13、vi /boot/grub/menu.lst
此刻开始进入关键的核心步骤,修改menu,将linux的ext3分区的标号-1替换原来的标号.
例如:原linux系统是sda10,更改分区后linux的ext3变为sda9,则将(hd0,9)变为(hd0,8);root=/dev/sda10变为root=/dev/sda9
title Debian GNU/Linux, kernel 2.6.11-1-686-smp
root (hd0,8)
kernel /boot/vmlinuz-2.6.11-1-686-smp root=/dev/sda9 ro
initrd /boot/initrd.img-2.6.11-1-686-smp
......
linux的其他核菜单类似修改,windows不变仍然是(hd0,0)
14、vi /etc/fstab
修改ext3和swap(和boot)的引导位置,将ext3的路径/dev/sda10改为/dev/sda9;swap的路径/dev/sda9改为/dev/sda8(如上例)
/dev/sda9 / ext3 defaults,errors=remount-ro 0 1
/dev/sda8 none swap sw 0 0
15、exit
退出chroot模式
16、exit
退出急救模式
系统会自动重启,退出光盘,看看是不是一切ok了,呵呵,偷着笑吧,刚才的担忧都风消云散了。
备注:如果你的系统是redhat或者fedora就更简单了,按照前面的步骤运行到5,然后查看分区fdisk -l,这之后执行chroot /mnt/sysimage接13步。如果是其他的原因引起grub错误,那这里的步骤仅供参考,可能需要重装grub(这个我就不赘述了,google一下就会找到解决方法)。
建议使用 knoppix,做这种恢复系统的事情非常方便。
1. 用 knoppix 引导系统,如果不想进图形界面,在启动的时候打 "knoppix 2"
2. 挂原来系统的 / 分区,一般只要挂这个分区就好了,譬如 /mnt/hda9 之类
3. 修改 /mnt/hda9/etc/fstab
4. 修改 /mnt/hda9/boot/grub/menu.lst
5. 执行 grub-install --root-directory=/mnt/hda9 /dev/hda
6. reboot
该方法对Ide硬盘可以,但是Scsi的硬盘就不行,如果knoppix用的内核是2.6也许能用,2.4的内核肯定不行(试过的)。大家根据自己的情况选择吧!