《Linux安装》(五)Images制作原理

重写buildinstall脚本后我们知道生成images主要就靠mk-images脚本,它的输入来自upd-instroot——安装一些包到一个根目录(instroot),这些包都是安装过程必须要用到的,至于是哪些包,可以通过调试upd-instroot脚本打印出来。至于为什么是这些包?现阶段这个不重要,以后有空再说;

但是instroot目录太大(>400M),启动时如果将其载入ramfs会很久,因此就从instroot中copy一些关键文件出来到另一个临时建立的根目录(initrdroot),再将其压缩成initrd.img(<30M);而instroot会再被复制一个更大的子集压缩成install.img(<150M)在第二阶段载入,代码中有对应的文件清单;

因此一句话总结就是:install.img是instroot的一个子集压缩而成;initrd.img是从instroot复制的子集,再加入kernel、firmware、login文件等然后压缩而成;


mk-images脚本调用关系如下:

mk-images
        makeBootImages() (mk-images.x86)
                makeinitrd() # make initrd.img
                        makemoduletree()        #copy modules & firmware
                                modlist         #make module-info
                        makeproductfile()       #make .buildstamp
                        setupSshd()             #sshd login相关的passwd,shadow,pam.d/*等
                prepareBootTree() (mk-images.x86) #initrd.img,vmlinuz,splash.jpg,vesamenu.c32,syslinux.cfg等
        makeEfiImages() (mk-images.efi)
        makeSecondStage() # make install.img
                makeproductfile()
        doPostImages() # make boot.iso

先来看看initrd.img的制作过程,除了大多数文件从instroot中复制过来外,还有如下工作:
1. cp */usr/lib/anaconda-runtime/loader/{loader,init} $initrdroot/sbin/
kernel启动后会运行/sbin/init,但是我们并不需要进入系统,而是要启动安装程序,因此原Init Daemon(F13是upstart)的init不能用,而是用anaconda自带的init替换;这个init又调用/sbin/loader,然后由它启动anaconda;

2. 获取指定的内核modules(*.ko)和需要的所有firmware文件
安装内核和所有*firmware*的包到$kernelroot;
获取指定内核模块(一部分直接指定名称,一部分指定分组则从/lib/modules/XXX/modules.*中获取清单)并解决依赖,然后将它们复制到$initrdroot/lib/modules/对应目录下;
将所有需要的模块中的"firmware“域值打印出来(modinfo -F firmware *.ko),将对应文件从$kernelroot/lib/firmware复制到$initrdroot/lib/firmware对应目录下;

3. 生成module-info文件
module-info文件记录了模块的描述(modinfo -F description)信息,这些模块是前面提到的需要用到的,且属于block、networking、eth,scsi的;
先用anaconda的genmodinfo脚本从/lib/module/xxx/module.*文件中获取block、networking、eth,scsi对应的所有模块,然后获取描述信息生成modinfo文件;然后,再用anaconda的modlist程序过滤出需要的模块对应的信息;内容大致如下:

Version 0
3c509
        eth
        "3Com Etherlink III (3c509, 3c509B, 3c529, 3c579) ethernet driver"
3c574_cs
        eth
        "3Com 3c574 series PCMCIA ethernet driver"
......
3w-9xxx
        scsi
        "3ware 9000 Storage Controller Linux Driver"
3w-sas
        scsi
        "LSI 3ware SAS/SATA-RAID Linux Driver"
......

4. 生成.buildstamp文件

201203201054.i386
Fedora
20120319
your distribution provided bug reporting tool.

5. 创建或修改sshd login需要的passwd,shadow,pam.d/*等文件

6. 创建ISO目录树并将initrd.img,vmlinuz,splash.jpg,vesamenu.c32,syslinux.cfg等文件准备好



你可能感兴趣的:(《Linux安装》(五)Images制作原理)