GRUB 可以用统一的方式来加载与Multiboot兼容的内核,不过对于一些免费的系统,你需要一些特殊的处理。
1. 通用的启动方法
2. loopback 启动
3. lvm缓存 启动
4. 与操作系统相关的注意事项
如何启动操作系统
GRUB 有两种不一样的启动方法。第一,直接加载才做系统,第二,通过chain-load加载另一个boot loader,让后通过这个boot loader来加载操作系统。一般来说,由于不用安装和维护其他boot loader并且GRUB 可以从任意分区、磁盘加载操作系统,因此第一种方法是大家所希望的。但是,第二种方法有时也是必须的,因为GRUB不能原生的支持所有的操作系统。
1. 直接加载操作系统
2. chain-loading加载才做系统
Multiboot是GRUB原生支持的格式。此外,也支持linux、FreeBSD、NetBSD和OpenBSD。如果要加载其他操作系统,那么就要用到chain-load。
FIXME:这个章节是没有完成的
运行boot命令
因为DOS和Windows有些不足,所以,你要用更加复杂的命令来启动他们。
通过chain-loading启动操作系统
对于那些不支持Multboot或者GRUB中没有特殊支持的操作系统(Linux, FreeBSD, NetBSD 和 OpenBSD在GRUB中有特殊的支持),那么就要用到chain-load,通过这个东西在加载另外一个boot loader,然后通过这个boot loader来加载对应的操作系统。
chainloader命令就是用来设置这个的。通常,在使用这个的时候需要加载一些GRUB模块和配置好root驱动器。举个例子,这里有个windows系统,放在第一块硬盘的第一个分区,那么写法就是类似于下面的:
menuentry "Windows"{
insmod chain
insmod ntfs
set root=(hd0, 1)
chainloader +1
}
如果涉及的系统有多个硬盘,那么还要做其他的配置。
chain-loading仅在PC BIOS和EFI的平台上得到支持。
通过loopback启动
只要存储介质能够被访问,那么GRUB就可以读取里面的映像。但操作系统本身要能够找到它自己的根(目录)。通常,在找到root之前,需要运行用户空间的程序。GRUB通过加载一个特殊的小的镜像,并把它当做内存盘(ramdisk)传给内核来做到这点。通过这些命令就可以做到: kfreebsd_module, knetbsd_module_elf, kopenbsd_ramdisk, initrd (see initrd), initrd16 (see initrd), multiboot_module, multiboot2_module or xnu_ramdisk,具体用哪个就看你的用的时候什么操作系统。
要注意,knetbsd必须放到miniroot.kmod里面并且miniroot.kmod必须被加载。在kopenbsd的配置中,这个是被默认禁掉的。此外,ramdisk的默认行为会依据命令的选项而定。有些发行版提供了这个镜像,或者集成在标准的ramdisk里,通过特殊的选项来激活。至于怎么弄,就要看内核、发行版的手册了。其他loader,比如说appleloader, chainloader (BIOS, EFI, coreboot), freedos, ntldr 和 plan9就不提供这种ramdisk。除非这些loader的作者认识到payloads既不支持ramdisk也不支持loopback启动。那么请考虑下把所有文件都拷贝到分区来启动的方法。更多的信息就要查看操作系统文档了。
通过LVM缓存逻辑卷来启动
LVM 缓存逻辑卷有一个原始卷和缓存池逻辑卷组成。原始卷一般来说就是比较大、比较慢的存储设备,而缓存池就是比较小、比较块的存储设备。通过把原始卷里经常访问的数据放到缓存池里,既可以很好的利用更快的设备的性能。
GRUB从LVM缓存逻辑区启动,也只是从原始的卷中读取数据,在缓存池的脏数据是不使用的。对于“直写”的缓存模式来说,这是没问题的,因为它保证数据会同事保存到缓存和原始LV当中。对于其他模式,比如“回写”,这种方法就是延迟把缓存的数据写到原始LV中,从而提升性能。如果遇上突然停电然后恢复供电时,GRUB就可能无法启动。因为它不能从缓存里读取脏数据。在未来,这点会改进。