系統
根檔案系統首先是一種檔案系統,但是相對于普通的檔案系統,它的特殊之處在于,它是核心啟動時所mount的第一個檔案系統,核心代碼映像檔案儲存在根檔案系統中,而系統引導啟動程式會在根檔案系統挂載之後從中把一些基本的初始化腳本和服務等加載到記憶體中去運作。
我們首先從主機上所安裝的Linux作業系統中了解一些根檔案系統的資訊。比如在筆者工作的Linux桌面系統中可以得到下面的結果:
# mount
/dev/hda2 on / type ext3 (rw)
none on /proc type proc (rw)
/dev/hda1 on /boot type ext3 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
none on /dev/shm type tmpfs (rw)
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 16216016 5667* 9724600 37% /
/dev/hda1 101089 9321 8*9 10% /boot
none 63028 0 63028 0% /dev/shm
從上面的mount指令我們可以看到,在桌面Linux中,根檔案系統”/”被mount到/dev/hda2裝置上,檔案系統類型為ext3,屬性為rw即可讀寫。從df指令則可以得到更多根檔案系統使用空間的相關資訊。
根檔案系統一直以來都是所有類Unix作業系統的一個重要組成部分,也可以認為是嵌入式Linux系統差別于其他一些傳統嵌入式作業系統的重要特征,它給Linux帶來了許多強大和靈活的功能,同時也帶來了一些複雜性。我們需要清楚的了解根檔案系統的基本結構,以及細心的選擇所需要的系統庫、核心子產品和應用程式等,并配置好各種初始化腳本檔案,以及選擇合适的檔案系統類型并把它放到實際的儲存設備的合适位置。
根檔案系統的基本目錄結構
Linux的根檔案系統以樹型結構組織,包含核心和系統管理所需要的各種檔案和程式,一般說來根目錄”/”下的頂層目錄都有一些比較固定命名和用途。
下面列出了一個Linux根檔案系統中的比較常見的目錄結構:
/bin 存放二進制可執行指令的目錄
/dev 存放裝置檔案的目錄
/etc 存放系統管理和配置檔案的目錄
/home 使用者主目錄,比如使用者user的主目錄就是/home/user,可以用~user表示
/lib 存放動态連結共享庫的目錄
/sbin存放系統管理者使用的管理程式的目錄
/tmp 公用的臨時檔案存儲點
/root 系統管理者的主目錄
/mnt 系統提供這個目錄是讓使用者臨時挂載其他的檔案系統。
/proc 虛拟檔案系統,可直接通路這個目錄來擷取系統資訊。
/var 某些大檔案的溢出區
/usr 最龐大的目錄,要用到的應用程式和檔案幾乎都在這個目錄。
對于經常使用Linux系統的讀者來說,這些目錄大部分應該很熟悉了。不過有幾個目錄對初學者來說容易混淆,如/bin,/sbin,/usr/bin和/usr/sbin。這裡簡單介紹一下它們的差別:/bin目錄一般存放對于使用者和系統來說都是必須的二進制檔案,而/sbin目錄要存放的是隻針對系統管理的二進制檔案,該目錄的檔案将不會被普通使用者使用。相反,那些不是必要的使用者二進制檔案存放在/usr/bin下面,那些不是非常必要的系統管理工具放在/usr/sbin下。此外,對于一些本地的庫也非常類似,對于那些要求啟動系統和運作的必須指令要存放在/lib目錄下,而對于其他不是必須的庫存放在/usr/lib目錄就可以。
對于嵌入式Linux系統的根檔案系統來說,一般可能沒有上面所列出的那麼複雜,比如嵌入式系統通常都不是針對多使用者的,是以/home這個目錄在一般嵌入式Linux中可能就很少用到,而/boot這個目錄則取決于你所使用的BootLoader是否能夠重新獲得核心映象從你的根檔案系統在核心啟動之前。一般說來,隻有/bin,/dev,/etc,/lib,/proc,/var,/usr這些需要的,而其他都是可選的。
簡單的來說,根檔案系統包括虛拟根檔案系統和真實根檔案系統。在Kernel啟動的初始階段,首先去建立虛拟的根檔案系統,接下來再去調用do_mount來加載真正的檔案系統,并将根檔案系統切換到真正的檔案系統,也即真實的檔案系統。
在傳統的Windows機器上目錄結構中,可能會包括C:或者D:盤,而他們一般就稱之為特定邏輯磁盤的根目錄。從檔案系統的層面來說,每一個分區都包含了一個根目錄區,也即系統中存在多個根目錄。
但是,在Linux系統中,目錄結構與Windows上有較大的不同。系統中隻有一個根目錄,路徑是“/”,而其它的分區隻是挂載在根目錄中的一個檔案夾,如“/proc”和“system”等,這裡的“/”就是Linux中的根目錄。
對應根目錄也就存在一個根目錄檔案系統的概念,我們可以将某一個分區挂載為根目錄檔案系統,如6410公版中就将mtdblk2挂載為根目錄檔案系統。程式中可以通過U-Boot給Kernel指定參數或者編譯選項來指定,如目前的開發闆中就通過如下的編譯選項來制定根目錄檔案系統:
CONFIG_CMDLINE="console=ttyS0,115200 mem=108M rdinit=/linuxrc root=/dev/mtdblock2"
簡單的來說,根目錄檔案系統就是一種目錄結構,包括了Linux啟動的時候所必須的一些目錄結構和重要檔案。
根檔案系統有兩種,一種是虛拟根檔案系統,另外一種是真實的根檔案系統。一般情況下,會首先在虛拟的根檔案系統中做一部分工作,然後切換到真實的根檔案系統下面。
籠統的來說,虛拟的根檔案系統包括三種類型,即Initramfs、cpio-initrd和image-initrd。