《Linux安裝》(五)Images製作原理

2021-06-05 13:37:18 字數 2659 閱讀 5045

重寫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 ...