其实grub、mbr这些东西主要是当时本本装arch时看的,现在整理知识发现好些又都记不清了,看来还是有必要记录下来啊。
先来说说grub1。我们知道磁盘的前512个字节叫MBR,那么在系统启动时,BIOS会根据启动顺序选择一个设备执行启动操作,如果刚刚好选择了一块使用grub作为引导程序的磁盘(可能是U盘、硬盘等),那么BIOS会把控制权交给这块磁盘的MBR,由MBR来完成操作系统的加载。加载过程又可以分为两种情况,一是grub处于磁盘的MBR中,另一种是grub被安装在某块分区中,由另一个引导程序来加载grub(被称为chain loader)。
我们先来看看安装于MBR中的grub是如何工作的。grub的启动可以分为三个阶段,stage1,stage1.5,stage2。我们知道MBR只有前446个字节可以被用来安放引导程序,这块空间其实并不大,不可能所有的事情都在这里做完,比如启动时要加载一些配置文件,那我们肯定要有一个读取文件系统的程序,这就是stage1.5了。在安装grub到MBR时,前446个字节其实是安装了stage1,可以使用
sudo dd if=/dev/sda of=mbr bs=512 count=1
来查看一下MBR,然后再用hexdump -C命令和/boot/grub/stage1(不同的系统、安装方法路径可能不同),可以发现前446个字节是一样的。前面说过,stage1的主要作用就是加载stage1.5,而stage1.5就放在MBR后、第一个分区前,这个空间大概有32K,足够实现许多主流文件系统的读取了。加载完stage1.5后再的过程被说过太多次了,读取配置文件等等,我就不再啰嗦了。我们再看看stage1.5这个东西,它放在MBR之后,而这个地方其实是还有可能放其它东西的,不像MBR前446个字节,已经约定俗成放引导程序了,那么当它一部分空间不可用时,grub1就无法正常工作,比如如果磁盘的空间分配比较特别,不符合标准或是磁盘上已经安装了LVM,GPT等。
简单地说来grub2相对于grub1改进之处就在于stage1可以加载一个任意的LBA48地址,因而最终可以完整地加载一个并不在传统位置上的stage1.5,因此可以和LVM,GPT等同时使用。
如果grub是安装在某个分区上启动过程其实也是类似的,只不过这时候需要一个引导程序来讲控制权转交给grub,思考一下用grub启动windows的代码:
set root=(hd0,X) chainloader +1
其实和别的引导程序加载grub是一样的道理,指定了root分区后再把控制权转交到这个分区上面的引导程序。
最后还想讲讲分区表的错误,在natty出来的时候我也想装个玩玩,个人觉得ubuntu还是个不错的发行版的,上手简单,要折腾的话其实也可以折腾的起来。当时电脑上面已经有了win 7和arch,win7有一个c盘,接下来所以的划了个逻辑分区,d盘是扩展分区。后来装arch的时候就从逻辑分区里又分了两块出来,结果没留意安装时分出来的分区是主分区。于是就出现了主分区在扩展分区中的问题,这下装ubuntu时硬盘的分区完全不能识别了,出来一整块硬盘,后来发现右边的哥们就是因为没注意这个把整个硬盘都格掉了装了个ubuntu,= =||。搜了搜发现这个问题还很常见,http://forum.ubuntu.org.cn/viewtopic.php?f=77&t=194802。如果单单这样还好说,arch的两个主分区在磁盘最尾部,只要强行把分区表的逻辑分区和扩展分区尾调整到主分区之前就好了,但是我又在最后面分了两个分区想装ubuntu的,这下又不能那样调整了,因为如果把逻辑分区放在arch之前,那么主分区就多于四个了。删掉后面的分区是可以的,但是调整arch的主分区就不行,用gparted时说是分区表错误不行,这下可绕回去了,几十G的空间还是舍不得丢在那里不用啊。最后居然是在windows下面用acronis弄好的,它可以移动分区,把arch两个分区移到最末尾,这样未分配的空间可以并入d盘,再调整分区表使扩展分区不要包含主分区就好了。
ps1. linux扩展分区也可以放系统。所以都用扩展分区吧。。
ps2. acronis好像可以把主分区转换成扩展分区,但不好用。arch下好像会出错。
ps3. 修改分区表很危险,一定得先备份啊。