閱讀224 返回首頁    go 微軟 go windows


ubuntu11.04啟動 及虛擬文件係統

虛擬文件係統(VFS)是由Sun microsystems公司在定義網絡文件係統(NFS)時創造的。它是一種用於網絡環境的分布式文件係統,是允許和操作係統使用不同的文件係統實現的接口。虛擬文件係統(VFS)是物理文件係統與服務之間的一個接口層,它對Linux的每個文件係統的所有細節進行抽象,使得不同的文件係統在Linux 核心以及係統中運行的其他進程看來,都是相同的。嚴格說來,VFS並不是一種實際的文件係統。它隻存在於內存中,不存在於任何外存空間。VFS在係統啟動時建立,在係統關閉時消亡。

形象地說,Linux的內核好象一個PC機的母板,VFS就是上麵的一個插槽,具體的文件係統 就是一塊塊的接121卡。因此,每一個文件係統之間互不幹擾,而隻是調用相應的程序來實現其功能。

文件係統注冊後便在設備上按一定格式建立文件係統,但是此時設備上的文件和節點都還不是可訪問的,還不能按照一定的路徑名訪問其中特定的節點或文件。隻有把它安裝到文件係統中某個節點上,才能使設備上的文件和節點可被訪問。因此注冊了wej係統隻代表Linux係統支持這種文件係統的應用,要真正使用該文件係統還必須安裝它。 

4 解決問題

4.1 跨文件係統的文件操作的基本原理

到此,我們也就能夠解釋在Linux中為什麼能夠跨文件係統地操作文件了。舉個例子,將vfat格式的磁盤上的一個文件a.txt拷貝到ext3格式的磁盤上,命名為b.txt。這包含兩個過程,對a.txt進行讀操作,對b.txt進行寫操作。讀寫操作前,需要先打開文件。由前麵的分析可知,打開文件時,VFS會知道該文件對應的文件係統格式,以後操作該文件時,VFS會調用其對應的實際文件係統的操作方法。所以,VFS調用vfat的讀文件方法將 a.txt的數據讀入內存;在將a.txt在內存中的數據映射到b.txt對應的內存空間後,VFS調用ext3的寫文件方法將b.txt寫入磁盤;從而實現了最終的跨文件係統的複製操作。

4.2“一切皆是文件的實現根本

不論是普通的文件,還是特殊的目錄、設備等,VFS都將它們同等看待成文件,通過同一套文件操作界麵來對它們進行操作。操作文件時需先打開;打開文件時, VFS會知道該文件對應的文件係統格式;當VFS把控製權傳給實際的文件係統時,實際的文件係統再做出具體區分,對不同的文件類型執行不同的操作。這也就 一切皆是文件的根本所在。

5 總結

VFS即虛擬文件係統是Linux文件係統中的一個抽象軟件層;因為它的支持,眾多不同的實際文件係統才能在Linux中共存,跨文件係統操作才能實現。 VFS借助它四個主要的數據結構即超級塊、索引節點、目錄項和文件對象以及一些輔助的數據結構,向Linux中不管是普通的文件還是目錄、設備、套接字等都提供同樣的操作界麵,如打開、讀寫、關閉等。隻有當把控製權傳給實際的文件係統時,實際的文件係統才會做出區分,對不同的文件類型執行不同的操作。由此可見,正是有了VFS的存在,跨文件係統操作才能執行,Unix/Linux中的一切皆是文件的口號才能夠得以實現


***********************ubuntu啟動過程***********************

加載內核

initrd
init
login

係統啟動和第一階段是所有係統都相同的
係統啟動
1、係統加電
2、BIOS 自檢 → 本地設備枚舉和初始化(概括來說有三個步驟)
   首先檢測外圍設備
   其次檢測啟動設備
   最後讀取與執行啟動設備的第一個扇區
3、POST 代碼從內存中清除,但運行時服務(runtime service)仍然留在內存。
4、BIOS 從 CMOS 的設置中找出第1/2/3 啟動設備(可能有第4個),然後逐個嚐試,
   並在第一個 ”active“狀態的硬盤上讀入其 MBR
 
第一階段引導加載程序
1、MBR 實際上是由3個部分組成 :主引導加載程序(master bootloader code,446 字節)、主分區表  (ppt)、magic nubmer (0xAA55)組成
   主分區表有4個記錄,對應主分區1-主分區4,共64 字節。最後的 magic number 是 2 字節
2、主引導加載程序搜索主分區表,掃描全部4個分區記錄,確保隻有1個是被標為”active“ 的(用 fdisk 可以設置某個分區為 active 分區)。
   然後讀入該分區的引導扇區(前512 字節)。active 分區一般是 C 盤或者 linux 的第一個分區
3、主引導加載程序的作用就是讀入第2階段的引導加載程序
 


第二階段引導加載程序
1、第2階段引導加載程序的目的是加載內核和 initrd 。GRUB 和 LILO 都是把 boot loader 程序分成兩部分,一部分在 MBR ,一部分在”active" 分區的引導扇區
2、第2階段引導加載程序被讀入內存後,它讀取 root() 命令給出的分區下的 /boot/grub/grub.cfg ,顯示一個菜單,供用戶選擇
3、GRUB 可以細分為3個階段,中間的一個是 stage1.5 ,它跟在 stage1 的後麵,目的是讓 grub 能夠識別文件係統的類型
 

1、加載內核,內核自解壓(/boot下的vmlinuz是可引導的、壓縮的內核,“vm”即“Virtual Memory”,2.6.3.8就隻有4M)
**********************vmlinuz概述*********************************************
vmlinuz是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。Linux 支持虛擬內存,不像老的操作係統比如DOS有640KB內存的限製。Linux能夠使用硬盤空間作為虛擬內存,因此得名“vm”。vmlinuz是可執行的 Linux內核,它位於/boot/vmlinuz,它一般是一個軟鏈接
兩種建立方式
   一是編譯內核時通過“make zImage”創建,然後通過:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”產生。zImage適用於小內核的情況,它的存在是為了向後的兼容性。

  二是內核編譯時通過命令make bzImage創建,然後通過:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”產生。bzImage是壓縮的內核映像,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮文件,而且在這兩個文件的開頭部分內嵌有 gzip解壓縮代碼。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

  內核文件中包含一個微型的gzip用於解壓縮內核並引導它。兩者的不同之處在於,老的zImage解壓縮內核到低端內存(第一個640K),bzImage解壓縮內核到高端內存(1M以上)。如果內核比較小,那麼可以采用zImage或bzImage之一,兩種方式引導的係統運行時是相同的。大的內核采用bzImage,不能采用zImage。 vmlinux是未壓縮的內核,vmlinuz是vmlinux的壓縮文件。
************************************************************************************************
2、按照 bootloader 向它提供的 initrd 在內存中的地址,initrd.img加載到內存

***********************************initrd的概述和機製******************************************************************

初始 RAM 磁盤(initrd)是在實際根文件係統可用之前掛載到係統中的一個初始根文件係統。initrd 與內核綁定在一起,並作為內核引導過程的一部分進行加載。內核然後會將這個 initrd 文件作為其兩階段引導過程的一部分來加載模塊,這樣才能稍後使用真正的文件係統,並掛載實際的根文件係統。

initrd 中包含了實現這個目標所需要的目錄和可執行程序的最小集合,例如將內核模塊加載到內核中所使用的 insmod 工具。

在桌麵或服務器 Linux 係統中,initrd 是一個臨時的文件係統。其生存周期很短,隻會用作到真實文件係統的一個橋梁。在沒有存儲設備的嵌入式係統中,initrd 是永久的根文件係統
initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內存盤。在 linux內核啟動前, boot loader 會將存儲介質中的 initrd 文件加載到內存,內核啟動時會在訪問真正的根文件係統前先訪問該內存中的 initrd 文件係統。在 boot loader 配置了 initrd 的情況下,內核啟動被分成了兩個階段,第一階段先執行 initrd 文件係統中的"某個文件",完成加載驅動模塊等任務,第二階段才會執行真正的根文件係統中的 /sbin/init 進程。這裏提到的"某個文件",Linux2.6 內核會同以前版本內核的不同,所以這裏暫時使用了"某個文件"這個稱唿,後麵會詳細講到。第一階段啟動的目的是為第二階段的啟動掃清一切障愛,最主要的是加載根文件係統存儲介質的驅動模塊。我們知道根文件係統可以存儲在包括IDE、SCSI、USB在內的多種介質上,如果將這些設備的驅動都編譯進內核,可以想象內核會多麼龐大、臃腫。

linux2.6 內核支持兩種格式的 initrd,一種是 linux2.4 內核那種傳統格式的文件係統鏡像-image-initrd,它的製作方法同 Linux2.4 內核的 initrd 一樣,其核心文件就是 /linuxrc。另外一種格式的 initrd 是 cpio 格式的,這種格式的 initrd 從 linux2.5 起開始引入,使用 cpio 工具生成,其核心文件不再是 /linuxrc,而是 /init,

11.04用的是cpio格式

cpio-initrd 的處理流程

1. boot loader 把內核以及 initrd 文件加載到內存的特定位置。

2. 內核判斷initrd的文件格式,如果是cpio格式。

3. 將initrd的內容釋放到rootfs中。

4. 執行initrd中的/init文件,執行到這一點,內核的工作全部結束,完全交給/init文件處理。

image-initrd的處理流程

1. boot loader把內核以及initrd文件加載到內存的特定位置。

2. 內核判斷initrd的文件格式,如果不是cpio格式,將其作為image-initrd處理。

3. 內核將initrd的內容保存在rootfs下的/initrd.image文件中。

4. 內核將/initrd.image的內容讀入/dev/ram0設備中,也就是讀入了一個內存盤中。

5. 接著內核以可讀寫的方式把/dev/ram0設備掛載為原始的根文件係統。

6. .如果/dev/ram0被指定為真正的根文件係統,那麼內核跳至最後一步正常啟動。

7. 執行initrd上的/linuxrc文件,linuxrc通常是一個腳本文件,負責加載內核訪問根文件係統必須的驅動, 以及加載根文件係統。

8. /linuxrc執行完畢,常規根文件係統被掛載

9. 如果常規根文件係統存在/initrd目錄,那麼/dev/ram0將從/移動到/initrd。否則如果/initrd目錄不存在, /dev/ram0將被卸載。

10. 在常規根文件係統上進行正常啟動過程 ,執行/sbin/init。

**********************initrd裏頭的/linuxrc 或者/init的執行步驟**************************

3、執行其上麵的 /linuxrc 或者 /init 腳本,目的是加載驅動模塊
4、在 /linuxrc 和 /init 腳本中,會有 pivot_root ()或者 switchroot 把 /sysroot 下的真正根文件係統設備掛載到 / ,把初始根文件係統掛載到 /initrd 下
5、/linuxrc 和 /init 腳本的後麵會 umount /initrd 下的初始根文件係統(即使沒有完全卸載,也會在 /etc/rc.d/rc.sysinit 中把它們全部卸載)

查看 initrd 的內容適用於cpio格式的
# mkdir temp ; cd temp  # cp /boot/initrd-2.6.14.2.img ./  # cpio -i --make-directories < initrd-2.6.14.2.img  然後你就會看到
bin  conf  etc  init  initrd-2.6.38.img  lib  sbin  scripts  usr
所執行的init就在這個文件係統的根目錄下  
製作initrd可見:https://www.ibm.com/developerworks/cn/linux/l-k26initrd/

**************************兩個階段過後init進程*************************
啟動 init 進程。在 2.4 內核中,這個步驟是由內核完成的。但在 2.6 內核中,這個步驟是由 /init 腳本完成的。
Init
1、/etc/rc-sysinit.conf
2、/etc/init.d/rcS
3、/etc/init.d/rc S
4、默認runlevel是2,執行/etc/rc[runlevel].d/下的所有文件,其中S表示啟動,隨後的數字表示啟動的順序,最後一個是/etc/init.d/rc.local,local是S99rc.local
********************************************login******************************************************
登陸界麵login
1 /etc/profile
2 /etc/bash.bashrc
3 ~/.profie
4 ~/.bashrc

/etc/profile和/etc/bash.bashrc設置環境變量和bash shell的設置,對所有用戶生效

~/.bashrc和~/.profile同上,隻對此用戶生效
參考
ubuntu10.04啟動:https://wiki.ubuntu.org.cn/%E5%90%AF%E5%8A%A8
redhat啟動淺談https://my.chinaunix.net/space.php?uid=14439719&do=blog&id=130599#quickcommentform_130599
linux架構和目錄:https://blog.csdn.net/runningya/archive/2010/01/01/5118277.aspx

最後更新:2017-04-03 16:48:37

  上一篇:go 1.1 PCI總線的組成結構
  下一篇:go 2.4 PCI總線的配置