重寫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/ $initrdroot/sbin/
kernel啟動後會執行/sbin/init,但是我們並不需要進入系統,而是要啟動安裝程式,因此原init daemon(f13是upstart)的init不能用,而是用anaconda自帶的init替換;這個init又呼叫/sbin/loader,然後由它啟動anaconda;
2. 獲取指定的核心modules(*.ko)和需要的所有firmware檔案
安裝核心和所有*firmware*的包到$kernelroot;
獲取指定核心模組(一部分直接指定名稱,一部分指定分組則從/lib/modules/***/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/***/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-9***
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 二進位制安裝mysql
mysql安裝為什麼大部分使用二進位制安裝。而不是原始碼手動去編譯?mysql使用的glibc進行開發的。glibc庫是乙個底層api,所以只要是linux,都會有glibc庫。所以,mysql安裝不需要考慮環境是否符合要求。移植性很方便。直接將編譯好的二進位制 複製到另外乙個機器上,也是可以用的。...
安裝LINUX的五種方法
安裝時候選擇 http設定 名 192.168.1.75 red hat 目錄 redhat 它會自動找到目錄並安裝,注意我用這種方式安裝有幾個包會壞掉,也不能跳過安裝,而且我的iso檢查了md5sum是好的,包名稱好象是 openoffice 86m大小,xmms方面的包還有幾個不記得了,所以不建...
Linux上安裝MySQL二進位制
yum install lrzsz y 移動到 usr local目錄 cd usr local 上傳linux版mysql二進位制檔案 rz 解壓安裝包 tar zxvf 壓縮包名 更改mysql檔名 mv 檔名 mysql 建組 root centos local groupadd mysql ...