摘要:雖然經常安裝操作系統,但你有沒有想過,操作系統安裝的時候都做了哪些工作?系統安裝的本質是什麼?在操作系統安裝之前,系統是怎麼從裸機上起來的?等等問題。本文主要以Centos系列的linux為例,向你詳細解釋操作系統安裝的詳細過程,引導程序,系統內核,livecd,installer等的區別和聯系。本文主要為你解答這些問題
[huangyk@huangyk CentosInstall]$ ls CentOS_BuildTag EULA images Packages repodata RPM-GPG-KEY-CentOS-Debug-6 RPM-GPG-KEY-CentOS-Testing-6 EFI GPL isolinux RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Security-6 TRANS.TBL大部分都是與需要安裝的軟件包有關的信息,其中,在安裝過程中起關鍵作用的主要有兩個目錄:images和isolinux,我們來看一下這兩個目錄中的內容:
isolinux目錄的內容:
-r--r--r--. 1 root root 2048 7月 6 2012 boot.cat -r--r--r--. 2 root root 84 7月 6 2012 boot.msg -r--r--r--. 2 root root 334 7月 6 2012 grub.conf -r--r--r--. 4 root root 31596586 7月 6 2012 initrd.img -r--r--r--. 2 root root 24576 7月 6 2012 isolinux.bin -r--r--r--. 2 root root 936 7月 6 2012 isolinux.cfg -r--r--r--. 2 root root 165080 7月 6 2012 memtest -r--r--r--. 2 root root 151230 7月 6 2012 splash.jpg -r--r--r--. 1 root root 2215 7月 6 2012 TRANS.TBL -r--r--r--. 2 root root 162860 7月 6 2012 vesamenu.c32 -r-xr-xr-x. 4 root root 3986608 7月 6 2012 vmlinuz其中,isolinux.bin引導程序,負責將操作系統內核加載到內存,isolinux.cfg是isolinux.bin將會讀取的配置文件
grub.conf是grub讀取的配置文件,grub也是引導程序
mmtest和vmlinuz等是可以啟動的系統內核,initrd.img是初始化所用的磁盤鏡像,裡面包含一個最小化的系統,包含了/dev,/etc,/bin等很多基本的目錄,還有關鍵的init程序,負責驅動的加載和文件系統的初始化。
images目錄的內容:
-r--r--r--. 2 root root 372736 7月 6 2012 efiboot.img -r--r--r--. 2 root root 35997696 7月 6 2012 efidisk.img -r--r--r--. 2 root root 136585216 7月 6 2012 install.img dr-xr-xr-x. 2 root root 2048 7月 6 2012 pxeboot -r--r--r--. 1 root root 888 7月 6 2012 TRANS.TBL其中,最重要的是引導第二階段安裝需要用到的鏡像文件install.img(rhel 5中是stage2.img),anaconda程序就在這個鏡像文件中。
另外,如果想詳細的了解安裝文件中每個文件的作用,可以參考這裡:http://blog.csdn.net/trochiluses/article/details/11774165
先用file命令查看install.img的文件系統類型,可知是suqashfs,用mount -o loop -t squashfs install.img ./img/的方式掛載出來。內容如下:
etc firmware lib lib64 modules proc usr var由此可見,這也基本上是文件系統中重要文件的磁盤鏡像:
除了主執行體/usr/bin/anaconda,其它安裝腳本模塊均在/usr/lib/anaconda主目錄下。我們看一下整個anaconda主目錄的結構:
/usr/bin/anaconda: 主程序,是python腳本。
/usr/lib/anaconda/installclasses:定義了在安裝過程中用戶可選擇的安裝類型。每個安裝類型描述文件根據相應安裝類型的特點,分別對安裝步驟、分區策略以及安裝包的取捨給出了不同的方案。裡面有兩個文件fedora.py和rhel.py,分別針對fedora和rhel的安裝類型。其他的Linux發行版可以定義它們自己的安裝類型。
/usr/lib/anaconda/iw:圖形安裝模式的模塊。包含所有圖形界面類所在的模塊,每個圖形界面對應一個類,負責相應安裝步驟圖形界面的具體外觀顯示及與用戶的交互,(可能)調用anaconda主目錄下的相關安裝行為模塊完成具體的安裝操作。
/usr/lib/anaconda/storage:存儲配置的響應目錄(如分區,FCOE, iSCSI, RAID, ZFCP的配置等)。
/usr/lib/anaconda/textw:文本安裝模式的模塊。和iw子目錄含義是一致的,只是包含的是文本安裝模式的前端字符用戶界面類所在的模塊,每個字符用戶界面對應一個類,負責與用戶的交互,字符界面的采用了python的snack庫。
/usr/lib/anaconda-runtime: 有init和loader程序。這是兩個靜態編譯的程序,不依賴其他庫,就是編譯anaconda源代碼目錄下的loader目錄下的C代碼得到。這兩個程序會放在最後用來啟動安裝過程的Linux initrd image裡面。
/usr/anaconda主目錄:如果說用戶界面類是處理安裝程序外觀的話,則anaconda主目錄下的各python模塊執行每個安裝界面背後具體的安裝行為,包括那些無用戶界面安裝步驟的安裝操作。
由此可見,主執行體/usr/bin/anaconda調用的大量例程分布在/usr/lib/anaconda目錄下,安裝過程要用到的資源文件(例如背景圖片)則分布在/usr/share/anaconda目錄下。Python的許多內置模塊則在目錄/usr/lib/pythonXX下,其中XX指版本號。
上面分析的是已經編譯好的anaconda目錄結構,現在概覽一下anaconda源代碼包的結構。Anaconda主要用Python編寫,圖形界面前端用pyGtk庫(參考http://www.pygtk.org/)和Glade界面描述文件(參考http://glade.gnome.org/)編寫。用來啟動環境、加載模塊、加載anaconda主體的loader程序用C編寫,一些其他的硬件相關的部分也是用C編寫。另外,bash和python腳本還用在一些管理性的任務中。
需要知道,安裝程序只是一個普通的用戶程序,安裝程序在能夠運行之前,必須要啟動操作系統才行,而這個時候,物理硬盤上尚且沒有操作系統。
所以,一個安裝光盤裡,需要有引導程序(負責將操作系統內核和initrd.img加載到內存),操作系統內核和initrd(負責程序運行環境的構建)。另外,如果是一個安裝光盤,那麼需要有安裝程序;如果是livecd,需要有live磁盤鏡像。也就是說,需要有已經安裝的操作系統磁盤鏡像,這就是img文件。從理論上說,操作系統的安裝過程和啟動過程在前幾步是完全相同的。
系統安裝過程如下:
啟動操作系統內核——加載initrd.img——運行初始化程序——根據初始化initrd中init程序的內容,決定是啟動livecd還是ananconda來運行安裝程序;如果是livecd,那麼裡面如果有installer程序,可以手動開啟installer程序來安裝操作系統,注意,此時調用ananconda等程序來安裝操作系統,是用戶行為,不是系統子自發的行為,已經沒有操作系統的引導過程了(因為操作系統已經起來了)。
POST加電自檢-->BIOS(Boot Sequence)-->加載對應引導上的MBR(bootloader)-->主引導設置加載其BootLoader-->Kernel初始化-->initrd—>/etc/init進程加載/etc/inittab。
由於傳統的安裝過程是ananconda控制的,而ananconda又會執行kickstart的配置文件,所以,我們有必要來了解一下kickstart的配置文件語法和大體框架:
line1~line6:基本配置:
Line 1 lang en_US.UTF-8 2 keyboard us 3 timezone US/Eastern 4 auth --useshadow --enablemd5 5 selinux --enforcing 6 firewall --disabledline8~11軟件源配置:
Line 8 repo --name=a-base --baseurl=http://mirror.centos.org/centos/5/os/$basearch 9 repo --name=a-updates --baseurl=http://mirror.centos.org/centos/5/updates/$basearch 10 #repo --name=a-extras --baseurl=http://mirror.centos.org/centos/5/extras/$basearch 11 repo --name=a-live --baseurl=http://www.nanotechnologies.qc.ca/propos/linux/centos-live/$basearch/live軟件包清單:
%packages syslinux kernel @admin-tools #packages removed from @admin-tools -sabayon -system-config-kdump #@admin-tools <end of package list> @base #package added to @base squashfs-tools #packages removed from @base -amtu -bind-utils注意,其中admin-tools是一些列軟件,“減號”表示在在一些列軟件裡需要除去什麼軟件。
【安裝後需要執行的shell腳本】
241 %post
242
243 #!/bin/bash
244 #
245
246 # FIXME: it'd be better to get this installed from a package
247 cat > /etc/rc.d/init.d/centos-live << EOF_initscript
248 #!/bin/bash
249 #
250 # live: Init script for live image
251 #
252 # chkconfig: 345 00 99
253 # description: Init script for live image.
254
255 . /etc/init.d/functions
kernel初始化所要工作的內容做下簡單總結:
探測硬件->加載驅動(在initrd之中)->掛載根文件系統(initrd鏡像中的init腳本完成)->rootfs(/sbin/init)
vmlinux是很小的,僅僅包含一些最基本的東西,不包含驅動程序,大概只有4M
驅動程序在initrd之中,我們也可以把驅動坐在vmlinuz中,但是由於存放vmlinuz的設備多種多樣,所以需要編入內核的驅動也有很多,會造成內核臃腫,所以產生了initrd文件,引導程序初始化ramdisk,解決驅動多樣問題。
4.2initrd與initramfs有什麼去別?
ramfs是一種非常簡單的文件系統,它直接利用linux內核已有的高速緩存機制(所以其實現代碼很小,也由於這個原因,ramfs特性不能通過內核配置參數屏蔽,它是內核的天然屬性),使用系統的物理內存,做成一個大小可以動態變化的的基於內存的文件系統。大小大概是16M
在早期的linux系統中,一般只有硬盤或者軟盤被用來作為linux根文件系統的存儲設備,因此也就很容易把這些設備的驅動程序集成到內核中。但是現在的嵌入式系統中可能將根文件系統保存到各種存儲設備上,包括scsi、sata,u-disk等等。因此把這些設備的驅動代碼全部編譯到內核中顯然就不是很方便。大小大概是4M
4.3安裝程序中,images目錄下的各種磁盤鏡像文件是如何掛載的?
尚未解決