Ant-Veil

Caspar Blog

Linux 启动时的一些闲言碎语

| Comments

这两天被启动的东西给弄晕了,现在回过神来写一段备用。

一、启动冲突

造成启动冲突的原因往往只有一个,MBR 覆盖。比如先装的 XP 再装的 Linux,Linux 就会把 XP 安装时写入 MBR 的数据给覆盖掉,如果先装 Ubuntu 再装 Fedora,Fedora 的 GRUB 会安装到 MBR 上覆盖了 Ubuntu 的 GRUB。这些情况都可能会造成某些操作系统不能启动。

幸好 Linux 在这方面还算人性化,它在覆盖 XP 在 MBR 中的数据之后,会自动搜索可启动的 Windows 分区,并且把 XP 的启动信息写到自己 GRUB 的 menu.lst 中,这样在装完 Linux 后能在启动菜单上看见原先的 Windows 启动项(通常在最后一项)。

而有时候不小心会把 Windows 弄坏,需要重装 Windows,等你 Windows 重新装好了,Linux 也就启动不了了,因为 Windows 把 MBR 又给更新了。Windows 和 Linux 抢 MBR 的矛盾一直如此激化……

那么如何防止两个系统吵架呢?两种方法。

第一种就是事后修复。用任何一张可以引导到 grub 的启动盘(比如,可以是你的 LiveCD),进入 grub。如果先进入的是终端,那么以超级用户模式在终端中输入grub即可进入终端,然后进行 grub 修复安装过程,如果你知道你的磁盘序号 X(一般为 0)和 Linux 分区序号(Partition Number)Y(从 0 开始数),那么可以运行:

root (hdX,Y)
setup (hd0)

后面一句的 hd0 表示把 grub 写到 MBR 上。

也可以简单地一句话:

setup (hd0) (hdX,Y)

成功了的话会返回 successful.

如果不知道或者忘记了 Linux 的分区序号(磁盘序号你应该知道吧,要是不确定就填 0),先键入

root (hdX,

然后按 TAB 键两次,将会出现自动补全信息,此时你应该就知道 Linux 分区所在的序号了吧。

输入完毕后仍旧再进行 setup 操作。这样重启后 GRUB 就修复了。

第二种方法就是在重装 XP 前,先把 Linux 写在 MBR 里的信息给保存出来,保存成一个文件,通常这个文件的大小必须是 512 字节。运行这个命令:

sudo dd if=/dev/sda of=~/linux bs=512 count=1

(如果是 SCSI 硬盘则为 sda,IDE 硬盘为 hda。of=后面的路径为输出路径,路径和文件名可以任意。)

就可以把 MBR 中的前 512 字节的信息保存到用户文件夹下名为 linux 的文件中。

然后重装 XP,把这个 linux 文件放到 Winodws 分区中,为了便于管理,我们习惯上将其放入 C 盘根目录下。

接着修改 XP 的 boot.ini,在最后一行添加如下语句:

c:\linux="Ubuntu Linux Operation System"

并修改启动菜单读秒的长度。

重启之后想办法进入 DOS 重写分区表:

fdisk /mbr

再次重启就可以看到,XP 的启动管理器中出现了双启动菜单,而选择"Ubuntu Linux Operation System"就和以前进入 MBR 的时候一样了。这种方法的原理也很清晰,将 MBR 头 512 字节(包含启动信息的头 512 字节啊~~)保存成文件,让 Windows 系统来调用这个文件并且处理启动。

以后重装 Windows,只要实现把那个长度为 512 字节的“linux”文件转移到别处,装完后移回来,修改 boot.ini 就可以了。
Linux 不同发行版之间也需要协调才能和平共处,装了 Ubuntu,还想装个 Fedora,于是在硬盘上独立分区安装。结果装好后 Ubuntu 进不去了。想到肯定是 Fedora 也霸道地把自己的启动信息写到 MBR 中去而覆盖了 Ubuntu 的信息了。

于是想到修改 menu.lst,因为 menu.lst 可以显示处理启动菜单。把 Ubuntu 分区挂载之后,找到 Ubuntu 下的 menu.lst,把和它有关的启动语句给复制到 Fedora 的 menu.lst 中,重启电脑,可以了。

二、关于 menu.lst

menu.lst 用于管理启动菜单项。包括是否隐藏启动菜单、启动菜单倒计时、启动项显示等选项。一般的操作顾名思义就可以看懂是什么意思。

值得一提的是 Linux 的启动都是通过这两个文件的引导:kernel 的 vmlinuz-XXXXX 和 initrd 的 initrd.img。也就是说需要引导一个操作系统的话,在 grub 的 menu 中告知这两个文件所在的分区,加入这两个文件的路径就可以启动了。

比如:

title Ubuntu
root root(hd0,0)
kernerl /boor/vmlinuz-2.6.22-14-generic root=UUID=XXXXXX ro quiet splash locale=zh_CN
initrd /boot/initrd.img-2.6.22-14-generic

三、启动时候的挂载

老是手动挂一个分区太麻烦了,于是想到用 fstab 来自动挂载

fstab 的每一个非注释行都挂了一个分区到对应路径下,其参数分别为:挂载的设备 挂载点 文件格式 挂载模式(此后的一大段我不甚了解)

“挂载的设备”中,我试过/dev/sda1 这种的格式,发现不好使;再看看用 UUID,先手动挂载需要的盘,在终端键入

ls -l /dev/disks/by-uuid

显示每个分区的 uuid,一串乱七八糟的数字,在 fstab 中写下:

UUID=xxxxxxxxxxxxxx /media/sda8 vfat user,noauto,utf8,umask=000,gid=46 0 0

搞定。

Comments