内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

启动讨论 grub/grub2/syslinux/grub4dos/Lilo
回复
kappa8086
帖子: 308
注册时间: 2008-06-23 14:42

内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#1

帖子 kappa8086 » 2009-09-03 11:06

我办公室电脑的硬盘有两个主分区,一个扩展分区,包含两个逻辑分区。
debian装在第二主分区。正常情况下应该是sda2是吧?而grub里应该写root (hd0, 1)。
我家里的电脑分区模式基本相同的是这样没错。

但这台里按照fstab里面的配置,sda3是root,而且内核配置grub时,产生的是root (hd0,2)。
一直以来没在意这个问题。当时grub安装在mbr上。

因为升级内核时总会把windows引导项丢掉,我复原了windows的mbr,并用live系统试图把grub4dos安装在分区里。
但grub4dos不认(hd0,2)。tab列表一看,只有(hd0,1)了。这没什么不好,于是将menu.lst里的(hd0,2)都换成(hd0,1),启动成功。

结果内核一升级,又启动不能了。用live启动一看,menu.lst又被改回了(hd0,2),grub4dos不认。
我只好又手动改回。并用默认的grub 0.97重写引导。可是没用,grub还是认(hd0,1),而内核照旧写(hd0,2)。

我该怎么样它正常一点?@_@

现在自己都没法搞清楚sda2 sda3哪个是debian分区,哪个是扩展分区。因为fstab里面还是/dev/sda3 /
但GParted显示sda3是扩展分区,sda2居然“无法找到挂载点”。。。
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#2

帖子 cnkilior » 2009-09-03 11:14

学ubuntu的,使用UUID,怎么都错不了!

代码: 全选

title		Ubuntu 9.04, kernel 2.6.28-15-generic
uuid		c9705c84-3f9a-4463-b4cc-1b85c11eb250
kernel		/boot/vmlinuz-2.6.28-15-generic root=UUID=c9705c84-3f9a-4463-b4cc-1b85c11eb250 ro quiet splash 
initrd		/boot/initrd.img-2.6.28-15-generic
quiet
头像
hcym
帖子: 15634
注册时间: 2007-05-06 2:46

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#3

帖子 hcym » 2009-09-03 11:14

一直眼专家门诊
头像
543082593
帖子: 234
注册时间: 2008-11-07 8:41

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#4

帖子 543082593 » 2009-09-03 11:31

恩 2楼正解 用UUID才是王道
虽然有的时候 UUID有点麻烦 但是 确实可以解决lz的问题
fall again
smooth criminal
they don't care about us
billie jean
beat it
dangerous
the lost children
childhood
ben
i will be there
speechless
she is out of my life
rock with you
...
LOVE U FOREVER
kappa8086
帖子: 308
注册时间: 2008-06-23 14:42

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#5

帖子 kappa8086 » 2009-09-03 11:31

2楼的UUID代替root让我明白了一个问题,就是fstab里root的挂载点设置是无效的。debian的内核启动参数里也有root=UUID=...

我刚试了把fstab里的sda3改成sda2并重启,我都准备好它启动失败后用live恢复了,但它居然完全正常!
而且GParted里显示的sda2的挂载点也正确了。fstab反而起了一个混淆的作用。
剩下的就是看看内核再次升级的时候自动配置是否正确了。

好奇怪,难道grub是否装在mbr上会使内核对分区逻辑产生不同的认知?
kappa8086
帖子: 308
注册时间: 2008-06-23 14:42

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#6

帖子 kappa8086 » 2009-09-03 11:37

UUID不错啊,但解决的不是debian分区对应错乱的问题,我都要手动编辑它,那么编辑回(hd0,1)还更简单
头像
careone
帖子: 839
注册时间: 2007-12-17 21:41

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#7

帖子 careone » 2009-09-03 12:21

1
复原了windows的mbr
可能导致分区表顺序混乱,这应该就是问题根源所在。可以运行
sudo fdisk /dev/sda
再选择相应选项,修正分区顺序,以后就不会出现这种情况。

2
因为升级内核时总会把windows引导项丢掉
在 menu.lst 中加上 win 的启动项就行,文件中自带样例
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
kappa8086
帖子: 308
注册时间: 2008-06-23 14:42

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#8

帖子 kappa8086 » 2009-09-03 15:05

careone 写了:1
复原了windows的mbr
可能导致分区表顺序混乱,这应该就是问题根源所在。可以运行
sudo fdisk /dev/sda
再选择相应选项,修正分区顺序,以后就不会出现这种情况。

2
因为升级内核时总会把windows引导项丢掉
在 menu.lst 中加上 win 的启动项就行,文件中自带样例
应该没有。其实我用的不是真的windows的MBR,而是syslinux附带的,用dd命令写入的,440字节,完全不接触分区表,我开始想用windows的,但发现没安装盘不行,diskpart不会单独做这件事。
我就是烦每次一升内核就非得改menu.lst,才有这些问题。


----------------

编辑一下,你说的第一点不无可能。回想起来diskpart我用了一次,虽然没起作用,但它不知做了什么多余事使syslinux的引导代码失败了,于是我又写了一次mbr。可能diskpart做了另一件多余事就是动了分区表的顺序。之前的MBR没保存,没法证明了。
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#9

帖子 billbear » 2009-09-03 15:24

1. 为什么 (hd0,2) 会变成 (hd0,1)
显然原来的分区是乱序的,linux 可以容忍 sda1-sda3-sda2 这样的顺序。你在 windows 下面整了一下, windows 一旦逮到机会就把它按顺序编号了,于是变成 sda1-sda2-sda3

2.为什么升级内核时总会把windows引导项丢掉;以及为什么升级内核后 menu.lst 又被改回了 (hd0,2)
仔细阅读 viewtopic.php?f=77&t=187058 的 8 楼。
简单地说,menu.lst 中带 # 的行不仅仅是注释这么简单。你需要修改这一行
# groot=(hd0,2)
并且把 windows 的启动项放在 ### BEGIN AUTOMAGIC KERNELS LIST 之前,或者 ### END DEBIAN AUTOMAGIC KERNELS LIST 之后。

3. 关于 fstab:
如果用的是像 /dev/sda3 这样的设备名,现在应该改成 sda2,因为 sda3 现在已经变成 sda2 了。
至于没改时也能启动,实际上是以 sda3 挂载 根 失败,根分区仍然保持为 grub 指定的 root=UUID=... ,它是正确的。
实际上 fstab 里不写关于 / 的那一行,也是可以启动的。/ 在 menu.lst 里已经指定了。如果不知道根分区是哪个 ,如何访问 /etc/fstab? 所以根分区一定早在 fstab 之前就已经挂载。 fstab 会把根重新挂载一次,用 fstab 里指定的挂载选项。
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#10

帖子 billbear » 2009-09-03 15:34

编辑一下,你说的第一点不无可能。回想起来diskpart我用了一次,虽然没起作用,但它不知做了什么多余事使syslinux的引导代码失败了,于是我又写了一次mbr。可能diskpart做了另一件多余事就是动了分区表的顺序。之前的MBR没保存,没法证明了。
windows 下大部分的分区软件都有这种行为,哪怕你什么也没干,只是看一下分区再退出,它都会悄悄排列编号。 windows 恨乱序的分区。而 linux ,恨分区编号的变化,因为这会使 grub 出毛病。linux 经常制造乱序分区,为的是保持原有序号不变。比如你在磁盘中部的空白处建立新分区,在 Linux 下通常会给它分配一个最末的编号,而不是把后面的分区编号都改变,这就造成乱序。
kappa8086
帖子: 308
注册时间: 2008-06-23 14:42

Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败

#11

帖子 kappa8086 » 2009-09-03 15:40

billbear 写了:1. 为什么 (hd0,2) 会变成 (hd0,1)
显然原来的分区是乱序的,linux 可以容忍 sda1-sda3-sda2 这样的顺序。你在 windows 下面整了一下, windows 一旦逮到机会就把它按顺序编号了,于是变成 sda1-sda2-sda3

2.为什么升级内核时总会把windows引导项丢掉;以及为什么升级内核后 menu.lst 又被改回了 (hd0,2)
仔细阅读 viewtopic.php?f=77&t=187058 的 8 楼。
简单地说,menu.lst 中带 # 的行不仅仅是注释这么简单。你需要修改这一行
# groot=(hd0,2)
并且把 windows 的启动项放在 ### BEGIN AUTOMAGIC KERNELS LIST 之前,或者 ### END DEBIAN AUTOMAGIC KERNELS LIST 之后。

3. 关于 fstab:
如果用的是像 /dev/sda3 这样的设备名,现在应该改成 sda2,因为 sda3 现在已经变成 sda2 了。
至于没改时也能启动,实际上是以 sda3 挂载 根 失败,根分区仍然保持为 grub 指定的 root=UUID=... ,它是正确的。
实际上 fstab 里不写关于 / 的那一行,也是可以启动的。/ 在 menu.lst 里已经指定了。如果不知道根分区是哪个 ,如何访问 /etc/fstab? 所以根分区一定早在 fstab 之前就已经挂载。 fstab 会把根重新挂载一次,用 fstab 里指定的挂载选项。
强!彻底明白了 :em11 感谢!
于是我才发现menu.lst里的注释说的很明白,只是我不看。。。 :em06
回复