ubuntu定期更新他们的iso,iso引导系统后会有Try/Install Ubuntu两个选项。特别是选择了livecd,仅仅一张盘子就能运行一个图形化的linux,总觉得挺神奇的。在好奇心的推动下我打算拆开iso分析它是怎样引导到系统的。
按常识,完整引导linux系统需要bootloader/kernel/(initrd)/fs这4个组件紧密配合(要不就叫启动4要素吧),光盘引导linux也一定是遵循这个过程,因此下文也按这个顺序展开。第一步当然得挂载iso,很可惜iso是只读的,因此要做修改还得把内容拷出来并修改权限。(注意,后面的命令都是用root帐户运行的)
root@ubuntu:~# rsync /media/Ubuntu\ 14.10\ amd64/ -a ~/Desktop/iso/
root@ubuntu:~# chmod -R 744 ~/Desktop/iso/
嗯,这里安装盘已经被分尸了,后面就可以一块块拿出来看看改改。首先看下bootloader的入口点,网上查了一把安装盘以isolinux.bin作为bootloader,位于isolinux/isolinux.bin。一般bootloader会读取用户配置文件从中取出引导参数。isolinux读取的配置文件位于同层目录isolinux/isolinux.cfg:
path
include menu.cfg
default vesamenu.c32
prompt 0
timeout 50
ui gfxboot bootlogo
打开后并没有见到/proc/cmdline中常见的kernel=xxx initrd=xxx之类的内容,不过仔细一看居然有include menu.cfg语句(具体参考islinux语法),想想就知道肯定是去包含其他配置文件。经过对include语句层层跟进,最终在isolinux/txt.cfg这个文件中找到熟悉的kernel引导项:
default live
label live
menu label ^Try Ubuntu without installing
kernel /casper/vmlinuz
append file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.lz quiet splash --
label live-install
menu label ^Install Ubuntu
kernel /casper/vmlinuz
append file=/cdrom/preseed/ubuntu.seed boot=casper only-ubiquity initrd=/casper/initrd.lz quiet splas