ubuntu-12.10光盘下的所有内容
autorun.inf boot casper dists install isolinux md5sum.txt pics pool preseed README.diskdefines ubuntu wubi.exe
一、isolinux引导
为了演示linux光盘的启动过程,我只复制了ubuntu的两个主要的文件夹:
casper isolinux
casper 目录中我只放了内核 vmlinuz initrd.lz ,isolinux中是全部复制了过来,为了演示启动。
问题一:电脑是怎么找到光盘中的内核文件并启动
电脑启动后,BIOS检测到硬盘没有MBR,则从光盘启动,BIOS根据El Torito格式,查找光盘上的引导程序,若光盘上有引导程序则BIOS会指定一个硬盘代号给光驱。isolinux目录中的boot.cat就是El Torito格式的文件,在mkisofs时,用c参数指定的,isolinux.bin是开机引导映像文件,与isolinux.bin对应的配置文件isolinux.cfg必须一起存在,有了这几个文件电脑就可以从光盘的引导并找到内核了。
这里引用了维基百科的文章: EI Torito 和 ISOLinux
isolinux.cfg 大概配置文件如下:
default vesamenu.c32 prompt 0 timeout 5 DEFAULT myubuntu label myubuntu menu myubuntu kernel /casper/vmlinuz append initrd=/casper/initrd.lz
这只是一些简单的配置,详细配置后面再说。。
系统找到isolinux.cfg文件后,根据里面的配置加载内核(vmlinuz)和初始化内存磁盘(initrd.lz),vmlinuz是事先编译好的,启动过程中是不能随意添加启动模块,而initrd是可以的(下面有详细的inird的解释,这里就不说了)。电脑从内核vmlinuz启动后,接着把启动任务交给initrd。
创建启动光盘的命令
mkisofs -D -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../myubuntu.iso .
引导程序 (来自百度百科)
我们知道,Linux 的驱动程序是内核的一部分,它们提供了硬件向上层的抽象接口,Linux 内核的核心子系统 --- 虚拟文件系统部分的工作强烈依赖于底层硬件驱动程序的支持,在启动过程当中,当某些必备的驱动程序无法使用的时候,比如 EXT2 文件系统、IDE 硬盘适配器等无法工作的时候,系统启动将就此中止,发生所谓的``Kernel Panic'',这也是初学者编译内核最常遇到的困难。
然而,我们当然不能将所有的驱动都编译到内核当中去,因为我们不能无限制地加大内核的尺寸,这对于系统资源,尤其是引导过程中非常有限的可用存储资源是难以承受的 .
具体设置
我们可以把很多驱动程序编译成模块,随用随加载 极少数情况,某些模块是相互冲突的,比如 2.4 内核的某些版本之中,reiserfs 和 ext3 两种驱动不能同时被编译到内核当中。 所以,我们只能在内核中放入必要的驱动程序,其余的不那么需要的部分编译成模块放到 /lib/modules/`uname -r`/ 之中,在需要的时候会被加载。
但是,对于具有通用性的内核,是很难论断出哪几种驱动程序才是真正必须的,究竟是 Intel 的 IDE 磁盘控制器还是 AMD/nVidia 的,抑或是 VIA 的,乃至光纤通道SCSI 磁盘……是阿,这真是个很困扰人的问题,没有一个驱动可以在占用绝对少的空间的前提下应付所有的设备,于是,我们退而求其次,寻求一个中间介质 --- ramdisk
在内核启动前,引导程序首先在内存之中构建一个 ramdisk,成为一个基本文件系统,然后 Linux 内核以此为自己的根文件系统启动,这样的好处是可以不必理会磁盘驱动的问题,只要能驱动 ramdisk 就可以了。
用 ramdisk 启动之后,在 ramdisk 的启动脚本 (一般叫 /linuxrc) 之中,针对硬件尝试 ramdisk 里面的 /lib/modules/`uname -r`/,加载恰当的驱动,这时系统已经具备了切换到硬盘或其他介质上的文件系统的条件了。
机不可失,这时,我们首先加载硬盘或光盘、u 盘等启动介质,然后设该介质为根分区,并运行其 init 进程为 1 进程,之后,在 init 脚本中,释放掉 initrd 的空间,这就是借助 initrd 的引导过程。在这个过程之中 引导程序帮我们多做了一件事 --- 构建 ramdisk, 把 initrd 放入内存。