内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
-
- 帖子: 308
- 注册时间: 2008-06-23 14:42
内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
我办公室电脑的硬盘有两个主分区,一个扩展分区,包含两个逻辑分区。
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居然“无法找到挂载点”。。。
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产生的磁盘分区编号不同,导致每次升级引导失败
学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
- 543082593
- 帖子: 234
- 注册时间: 2008-11-07 8:41
Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
恩 2楼正解 用UUID才是王道
虽然有的时候 UUID有点麻烦 但是 确实可以解决lz的问题
虽然有的时候 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
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
-
- 帖子: 308
- 注册时间: 2008-06-23 14:42
Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
2楼的UUID代替root让我明白了一个问题,就是fstab里root的挂载点设置是无效的。debian的内核启动参数里也有root=UUID=...
我刚试了把fstab里的sda3改成sda2并重启,我都准备好它启动失败后用live恢复了,但它居然完全正常!
而且GParted里显示的sda2的挂载点也正确了。fstab反而起了一个混淆的作用。
剩下的就是看看内核再次升级的时候自动配置是否正确了。
好奇怪,难道grub是否装在mbr上会使内核对分区逻辑产生不同的认知?
我刚试了把fstab里的sda3改成sda2并重启,我都准备好它启动失败后用live恢复了,但它居然完全正常!
而且GParted里显示的sda2的挂载点也正确了。fstab反而起了一个混淆的作用。
剩下的就是看看内核再次升级的时候自动配置是否正确了。
好奇怪,难道grub是否装在mbr上会使内核对分区逻辑产生不同的认知?
-
- 帖子: 308
- 注册时间: 2008-06-23 14:42
Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
UUID不错啊,但解决的不是debian分区对应错乱的问题,我都要手动编辑它,那么编辑回(hd0,1)还更简单
- careone
- 帖子: 839
- 注册时间: 2007-12-17 21:41
Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
1
sudo fdisk /dev/sda
再选择相应选项,修正分区顺序,以后就不会出现这种情况。
2
可能导致分区表顺序混乱,这应该就是问题根源所在。可以运行复原了windows的mbr
sudo fdisk /dev/sda
再选择相应选项,修正分区顺序,以后就不会出现这种情况。
2
在 menu.lst 中加上 win 的启动项就行,文件中自带样例因为升级内核时总会把windows引导项丢掉
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
-
- 帖子: 308
- 注册时间: 2008-06-23 14:42
Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
应该没有。其实我用的不是真的windows的MBR,而是syslinux附带的,用dd命令写入的,440字节,完全不接触分区表,我开始想用windows的,但发现没安装盘不行,diskpart不会单独做这件事。careone 写了:1可能导致分区表顺序混乱,这应该就是问题根源所在。可以运行复原了windows的mbr
sudo fdisk /dev/sda
再选择相应选项,修正分区顺序,以后就不会出现这种情况。
2在 menu.lst 中加上 win 的启动项就行,文件中自带样例因为升级内核时总会把windows引导项丢掉
我就是烦每次一升内核就非得改menu.lst,才有这些问题。
----------------
编辑一下,你说的第一点不无可能。回想起来diskpart我用了一次,虽然没起作用,但它不知做了什么多余事使syslinux的引导代码失败了,于是我又写了一次mbr。可能diskpart做了另一件多余事就是动了分区表的顺序。之前的MBR没保存,没法证明了。
-
- 帖子: 3681
- 注册时间: 2008-05-03 23:42
Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
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 里指定的挂载选项。
显然原来的分区是乱序的,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 里指定的挂载选项。
-
- 帖子: 3681
- 注册时间: 2008-05-03 23:42
Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
windows 下大部分的分区软件都有这种行为,哪怕你什么也没干,只是看一下分区再退出,它都会悄悄排列编号。 windows 恨乱序的分区。而 linux ,恨分区编号的变化,因为这会使 grub 出毛病。linux 经常制造乱序分区,为的是保持原有序号不变。比如你在磁盘中部的空白处建立新分区,在 Linux 下通常会给它分配一个最末的编号,而不是把后面的分区编号都改变,这就造成乱序。编辑一下,你说的第一点不无可能。回想起来diskpart我用了一次,虽然没起作用,但它不知做了什么多余事使syslinux的引导代码失败了,于是我又写了一次mbr。可能diskpart做了另一件多余事就是动了分区表的顺序。之前的MBR没保存,没法证明了。
-
- 帖子: 308
- 注册时间: 2008-06-23 14:42
Re: 内核和grub产生的磁盘分区编号不同,导致每次升级引导失败
强!彻底明白了 感谢!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 里指定的挂载选项。
于是我才发现menu.lst里的注释说的很明白,只是我不看。。。