歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

linux系統安裝文件&&安裝過程分析&&kickstart文件分析

摘要:雖然經常安裝操作系統,但你有沒有想過,操作系統安裝的時候都做了哪些工作?系統安裝的本質是什麼?在操作系統安裝之前,系統是怎麼從裸機上起來的?等等問題。本文主要以Centos系列的linux為例,向你詳細解釋操作系統安裝的詳細過程,引導程序,系統內核,livecd,installer等的區別和聯系。本文主要為你解答這些問題

1.發行版本中包含的文件

首先,我們來看一下一個傳統的發行版本linux中會包含哪些文件(一個linux發行版CD,本文是centos):
[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

2.install.img內容分析

先用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腳本還用在一些管理性的任務中。

3.linux系統安裝過程分析:

需要知道,安裝程序只是一個普通的用戶程序,安裝程序在能夠運行之前,必須要啟動操作系統才行,而這個時候,物理硬盤上尚且沒有操作系統。

所以,一個安裝光盤裡,需要有引導程序(負責將操作系統內核和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 --disabled
line8~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

注明: 你可以在/root/post-install找到該腳本. 這個腳本執行後的日志放在/root/post-install.log.當你從livecd啟動之後,你能夠重新審視這些腳本文件。

4.關於系統引導的疑問:

我們 4.1關於kernel,也就是vmlinuz:

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目錄下的各種磁盤鏡像文件是如何掛載的?

尚未解決

Copyright © Linux教程網 All Rights Reserved