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啟動過程***********************
加載內核
init
login
係統啟動和第一階段是所有係統都相同的
係統啟動
首先檢測外圍設備
其次檢測啟動設備
最後讀取與執行啟動設備的第一個扇區
3、POST 代碼從內存中清除,但運行時服務(runtime service)仍然留在內存。
**********************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的壓縮文件。
************************************************************************************************
***********************************initrd的概述和機製******************************************************************
初始 RAM 磁盤(initrd)是在實際根文件係統可用之前掛載到係統中的一個初始根文件係統。initrd 與內核綁定在一起,並作為內核引導過程的一部分進行加載。內核然後會將這個 initrd 文件作為其兩階段引導過程的一部分來加載模塊,這樣才能稍後使用真正的文件係統,並掛載實際的根文件係統。
initrd 中包含了實現這個目標所需要的目錄和可執行程序的最小集合,例如將內核模塊加載到內核中所使用的 insmod
工具。
initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內存盤。在 linux內核啟動前, boot loader 會將存儲介質中的 initrd 文件加載到內存,內核啟動時會在訪問真正的根文件係統前先訪問該內存中的 initrd 文件係統。在 boot loader 配置了 initrd 的情況下,內核啟動被分成了兩個階段,第一階段先執行 initrd 文件係統中的"某個文件",完成加載驅動模塊等任務,第二階段才會執行真正的根文件係統中的 /sbin/init 進程。這裏提到的"某個文件",Linux2.6 內核會同以前版本內核的不同,所以這裏暫時使用了"某個文件"這個稱唿,後麵會詳細講到。第一階段啟動的目的是為第二階段的啟動掃清一切障愛,最主要的是加載根文件係統存儲介質的驅動模塊。我們知道根文件係統可以存儲在包括IDE、SCSI、USB在內的多種介質上,如果將這些設備的驅動都編譯進內核,可以想象內核會多麼龐大、臃腫。
1. boot loader 把內核以及 initrd 文件加載到內存的特定位置。
2. 內核判斷initrd的文件格式,如果是cpio格式。
3. 將initrd的內容釋放到rootfs中。
4. 執行initrd中的/init文件,執行到這一點,內核的工作全部結束,完全交給/init文件處理。
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的執行步驟**************************
查看 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進程*************************
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
最後更新:2017-04-03 16:48:37