嵌入式Linux中的根文件系统
以下內(nèi)容轉(zhuǎn)載于http://mp.weixin.qq.com/s/O6MklgKekSc9gbM7zQSMEQ,有刪改。
一、
首先要明白的是“什么是文件系統(tǒng)?”,文件系統(tǒng)是對一個存儲設(shè)備上的數(shù)據(jù)和元數(shù)據(jù)進(jìn)行組織的機(jī)制。這種機(jī)制有利于用戶和操作系統(tǒng)的交互。
在一篇oracle的技術(shù)文章中看到這樣一句話“盡管內(nèi)核是 Linux 的核心,但文件卻是用戶與操作系統(tǒng)交互所采用的主要工具。這對Linux來說尤其如此,這是因為在UNIX傳統(tǒng)中,它使用文件I/O 機(jī)制管理硬件設(shè)備和數(shù)據(jù)文件”。
這句話可以這樣理解,在Linux沒有文件系統(tǒng)的話,用戶和操作系統(tǒng)的交互也就斷開了,例如我們使用最多的交互shell,包括其它的一些用戶程序,都沒有辦法運(yùn)行。在這里可以看到文件系統(tǒng)相對于Linux操作系統(tǒng)的重要性。
二、
下面是Linux文件系統(tǒng)組件的體系結(jié)構(gòu)。
(1)用戶空間包含一些應(yīng)用程序(例如,文件系統(tǒng)的使用者)和 GNU C 庫(glibc),它們?yōu)槲募到y(tǒng)調(diào)用(文件的打開、讀取、寫和關(guān)閉)提供用戶接口。
(2)系統(tǒng)調(diào)用接口的作用就像是交換器,它將系統(tǒng)調(diào)用從用戶空間發(fā)送到內(nèi)核空間中的適當(dāng)端點(diǎn)。
(3)VFS 是底層文件系統(tǒng)的主要接口。
- 這個組件導(dǎo)出一組接口,然后將它們抽象到各個文件系統(tǒng),各個文件系統(tǒng)的行為可能差異很大。
- 有兩個針對文件系統(tǒng)對象的緩存(inode 和 dentry)。它們緩存最近使用過的文件系統(tǒng)對象。
- 每個文件系統(tǒng)實現(xiàn)(比如 ext2、JFS 等等)導(dǎo)出一組通用接口,供 VFS 使用。
- 緩沖區(qū)緩存會緩存文件系統(tǒng)和相關(guān)塊設(shè)備之間的請求。例如,對底層設(shè)備驅(qū)動程序的讀寫請求會通過緩沖區(qū)緩存來傳遞。這就允許在其中緩存請求,減少訪問物理設(shè)備的次數(shù),加快訪問速度。以最近使用(LRU)列表的形式管理緩沖區(qū)緩存。注意,可以使用 sync 命令將緩沖區(qū)緩存中的請求發(fā)送到存儲媒體(迫使所有未寫的數(shù)據(jù)發(fā)送到設(shè)備驅(qū)動程序,進(jìn)而發(fā)送到存儲設(shè)備)。
三、
(1)
當(dāng)我們在Windows下,提到文件系統(tǒng)時,你的第一反應(yīng)是想到的是什么?是不是Windows下的一些Fat32、NTFS等的文件系統(tǒng)的類型?
而在Linux中,你可能會想到Ext2、Ext3,但你還必須要有一個根文件系統(tǒng)的概念。
根文件系統(tǒng)首先是一種文件系統(tǒng),該文件系統(tǒng)不僅具有普通文件系統(tǒng)的存儲數(shù)據(jù)文件的功能,而且相對于普通的文件系統(tǒng),它的特殊之處在于,它是內(nèi)核啟動時所mount的第一個文件系統(tǒng),內(nèi)核代碼的映像文件保存在根文件系統(tǒng)中,系統(tǒng)引導(dǎo)啟動程序會在根文件系統(tǒng)掛載之后從中把一些初始化腳本(如rcS,inittab)和服務(wù)加載到內(nèi)存中去運(yùn)行。
(2)
那么根文件系統(tǒng)在系統(tǒng)啟動中到底是什么時候掛載的呢?
先將/dev/ram0掛載,而后執(zhí)行/linuxrc。
等其執(zhí)行完后,切換根目錄,再掛載具體的根文件系統(tǒng)。
根文件系統(tǒng)執(zhí)行完之后,也就是到了Start_kernel()函數(shù)的最后,執(zhí)行init的進(jìn)程,也就第一個用戶進(jìn)程。對系統(tǒng)進(jìn)行各種初始化的操作。
(3)
根文件系統(tǒng)之所以在前面加一個”根“,說明它是加載其它文件系統(tǒng)的”根“,既然是根的話,那么如果沒有這個根,其它的文件系統(tǒng)也就沒有辦法進(jìn)行加載的。
它包含系統(tǒng)引導(dǎo)和使其他文件系統(tǒng)得以mount所必要的文件。根文件系統(tǒng)包括Linux啟動時所必須的目錄和關(guān)鍵性的文件,例如Linux啟動時都需要有init目錄下的相關(guān)文件,在 Linux掛載分區(qū)時Linux一定會找/etc/fstab這個掛載文件等,根文件系統(tǒng)中還包括了許多的應(yīng)用程序bin目錄等,任何包括這些Linux 系統(tǒng)啟動所必須的文件都可以成為根文件系統(tǒng)。
(4)
Linux啟動時,第一個必須掛載的是根文件系統(tǒng)。若系統(tǒng)不能從指定設(shè)備上掛載根文件系統(tǒng),則系統(tǒng)會出錯而退出啟動。成功之后可以自動或手動掛載其他的文件系統(tǒng)。因此,一個系統(tǒng)中可以同時存在不同的文件系統(tǒng)。
(5)
在 Linux 中將一個文件系統(tǒng)與一個存儲設(shè)備關(guān)聯(lián)起來的過程稱為掛裝(mount)。
使用 mount 命令將一個文件系統(tǒng)附著到當(dāng)前文件系統(tǒng)層次結(jié)構(gòu)中(根)。
在執(zhí)行掛裝時,要提供文件系統(tǒng)類型、文件系統(tǒng)和一個掛裝點(diǎn)。
根文件系統(tǒng)被掛載到根目錄下“/”上后,在根目錄下就有根文件系統(tǒng)的各個目錄,文件:/bin /sbin /mnt等,再將其他分區(qū)掛接到/mnt目錄上,/mnt目錄下就有這個分區(qū)的各個目錄,文件。
(6)
Linux根文件系統(tǒng)中一般有如下的幾個目錄:
1./bin目錄
該目錄下存放所有用戶都可以使用的、基本的命令,這些命令在掛接其它文件系統(tǒng)之前就可以使用,所以/bin目錄必須和根文件系統(tǒng)在同一個分區(qū)中。
/bin目錄下常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,[,test等。“[”命令其實就是test命令,我們在利用Busybox制作根文件系統(tǒng)時,在生成的bin目錄下,可以看到一些可執(zhí)行的文件,也就是可用的一些命令。
2./sbin 目錄
該目錄下存放系統(tǒng)命令,即只有管理員能夠使用的命令,系統(tǒng)命令還可以存放在/usr/sbin,/usr/local/sbin目錄下,/sbin目錄中存放的是基本的系統(tǒng)命令,它們用于啟動系統(tǒng),修復(fù)系統(tǒng)等,與/bin目錄相似,在掛接其他文件系統(tǒng)之前就可以使用/sbin,所以/sbin目錄必須和根文件系統(tǒng)在同一個分區(qū)中。
/sbin目錄下常用的命令有:shutdown reboot fdisk fsck等,本地用戶自己安裝的系統(tǒng)命令放在/usr/local/sbin目錄下。
3、/dev目錄
該目錄下存放的是設(shè)備文件,設(shè)備文件是Linux中特有的文件類型,在Linux系統(tǒng)下,以文件的方式訪問各種設(shè)備,即通過讀寫某個設(shè)備文件操作某個具體硬件。比如通過"dev/ttySAC0"文件可以操作串口0,通過"/dev/mtdblock1"可以訪問MTD設(shè)備的第2個分區(qū)。
4./etc目錄
該目錄下存放著各種配置文件,對于PC上的Linux系統(tǒng),/etc目錄下的文件和目錄非常多,這些目錄文件是可選的,它們依賴于系統(tǒng)中所擁有的應(yīng)用程序,依賴于這些程序是否需要配置文件。在嵌入式系統(tǒng)中,這些內(nèi)容可以大為精減。
5./lib目錄
該目錄下存放共享庫和可加載(驅(qū)動程序),共享庫用于啟動系統(tǒng)。運(yùn)行根文件系統(tǒng)中的可執(zhí)行程序,比如:/bin /sbin 目錄下的程序。
6、/home目錄
用戶目錄,它是可選的,對于每個普通用戶,在/home目錄下都有一個以用戶名命名的子目錄,里面存放用戶相關(guān)的配置文件。
7./root目錄
根用戶的目錄,與此對應(yīng),普通用戶的目錄是/home下的某個子目錄。
8./usr目錄
/usr目錄的內(nèi)容可以存在另一個分區(qū)中,在系統(tǒng)啟動后再掛接到根文件系統(tǒng)中的/usr目錄下。里面存放的是共享、只讀的程序和數(shù)據(jù),這表明/usr目錄下的內(nèi)容可以在多個主機(jī)間共享,這些主要也符合FHS標(biāo)準(zhǔn)的。/usr中的文件應(yīng)該是只讀的,其他主機(jī)相關(guān)的,可變的文件應(yīng)該保存在其他目錄下,比如/var。/usr目錄在嵌入式中可以精減。
9、 /var目錄
與/usr目錄相反,/var目錄中存放可變的數(shù)據(jù),比如spool目錄(mail,news),log文件,臨時文件。
10、/proc目錄
這是一個空目錄,常作為proc文件系統(tǒng)的掛接點(diǎn),proc文件系統(tǒng)是個虛擬的文件系統(tǒng),它沒有實際的存儲設(shè)備,里面的目錄,文件都是由內(nèi)核臨時生成的,用來表示系統(tǒng)的運(yùn)行狀態(tài),也可以操作其中的文件控制系統(tǒng)。
11、 /mnt目錄
用于臨時掛載某個文件系統(tǒng)的掛接點(diǎn),通常是空目錄,也可以在里面創(chuàng)建一引起空的子目錄,比如/mnt/cdram /mnt/hda1 。用來臨時掛載光盤,硬盤。
12. /tmp目錄
用于存放臨時文件,通常是空目錄,一些需要生成臨時文件的程序用到的/tmp目錄下,所以/tmp目錄必須存在并可以訪問。
那我們利用Busybox制作根文件系統(tǒng)就是創(chuàng)建這上面的這些目錄,和這些目錄下面的各種文件。
四、
對于嵌入式Linux系統(tǒng)的根文件系統(tǒng)來說,一般可能沒有上面所列出的那么復(fù)雜,比如嵌入式系統(tǒng)通常都不是針對多用戶的,所以/home這個目錄在一般嵌入式Linux中可能就很少用到,而/boot這個目錄則取決于你所使用的BootLoader是否能夠重新獲得內(nèi)核映象從你的根文件系統(tǒng)在內(nèi)核啟動之前。一般/bin,/dev,/etc,/lib,/proc,/var,/usr這些需要的,而其他都是可選的。
根文件系統(tǒng)一直以來都是所有類Unix操作系統(tǒng)的一個重要組成部分,也可以認(rèn)為是嵌入式Linux系統(tǒng)區(qū)別于其他一些傳統(tǒng)嵌入式操作系統(tǒng)的重要特征,它給 Linux帶來了許多強(qiáng)大和靈活的功能,同時也帶來了一些復(fù)雜性。我們需要清楚的了解根文件系統(tǒng)的基本結(jié)構(gòu),以及細(xì)心的選擇所需要的系統(tǒng)庫、內(nèi)核模塊和應(yīng)用程序等,并配置好各種初始化腳本文件,以及選擇合適的文件系統(tǒng)類型并把它放到實際的存儲設(shè)備的合適位置。
下面是幾中比較常用的文件系統(tǒng)。
- jffs2
JFFS2是RedHat公司基于JFFS開發(fā)的閃存文件系統(tǒng),最初是針對RedHat公司的嵌入式產(chǎn)品eCos開發(fā)的嵌入式文件系統(tǒng),所以JFFS2也可以用在Linux, uCLinux中。Jffs2: 日志閃存嵌入式系統(tǒng)文件系統(tǒng)版本2 (Journalling Flash FileSystem v2)主要用于NOR型閃存,基于MTD驅(qū)動層,特點(diǎn)是:可讀寫的、支持?jǐn)?shù)據(jù)壓縮的、基于哈希表的日志型文件系統(tǒng),并提供了崩潰/掉電安全保護(hù),提供“寫平衡”支持等。缺點(diǎn)主要是當(dāng)文件系統(tǒng)已滿或接近滿時,因為垃圾收集的關(guān)系而使jffs2的運(yùn)行速度大大放慢。關(guān)于jffs系列文件系統(tǒng)的使用詳細(xì)文檔,可參考MTD補(bǔ)丁包中mtd-jffs-HOWTO.txt。
- yaffs:Yet Another Flash File System
yaffs/yaffs2是專為嵌入式系統(tǒng)使用 NAND型閃存而設(shè)計的一種日志型文件系統(tǒng)。與jffs2相比,它減少了一些功能(例如不支持?jǐn)?shù)據(jù)壓縮),所以速度更快,掛載時間很短,對內(nèi)存的占用較小。另外,它還是跨平臺的文件系統(tǒng),除了Linux和eCos,還支持WinCE, pSOS和ThreadX等。
yaffs/yaffs2自帶NAND芯片的驅(qū)動,并且為嵌入式系統(tǒng)提供了直接訪問文件系統(tǒng)的API,用戶可以不使用Linux中的MTD與VFS,直接對文件系統(tǒng)操作。當(dāng)然,yaffs也可與MTD驅(qū)動程序配合使用。
yaffs與 yaffs2的主要區(qū)別在于,前者僅支持小頁(512 Bytes) NAND閃存,后者則可支持大頁(2KB) NAND閃存。同時,yaffs2在內(nèi)存空間占用、垃圾回收速度、讀/寫速度等方面均有大幅提升。
- Cramfs:Compressed ROM File System
Cramfs文件系統(tǒng)以壓縮方式存儲,在運(yùn)行時解壓縮,所以不支持應(yīng)用程序以XIP方式運(yùn)行,所有的應(yīng)用程序要求被拷到RAM里去運(yùn)行,但這并不代表比 Ramfs需求的RAM空間要大一點(diǎn),因為Cramfs是采用分頁壓縮的方式存放檔案,在讀取檔案時,不會一下子就耗用過多的內(nèi)存空間,只針對目前實際讀取的部分分配內(nèi)存,尚沒有讀取的部分不分配內(nèi)存空間,當(dāng)我們讀取的檔案不在內(nèi)存時,Cramfs文件系統(tǒng)自動計算壓縮后的資料所存的位置,再即時解壓縮到 RAM中。另外,它的速度快,效率高,其只讀的特點(diǎn)有利于保護(hù)文件系統(tǒng)免受破壞,提高了系統(tǒng)的可靠性。
由于以上特性,Cramfs在嵌入式系統(tǒng)中應(yīng)用廣泛。但是它的只讀屬性同時又是它的一大缺陷,使得用戶無法對其內(nèi)容對進(jìn)擴(kuò)充。Cramfs映像通常是放在Flash中,但是也能放在別的文件系統(tǒng)里,使用 loopback 設(shè)備可以把它安裝別的文件系統(tǒng)里。
- 網(wǎng)絡(luò)文件系統(tǒng)NFS (Network File System)
NFS是由Sun開發(fā)并發(fā)展起來的一項在不同機(jī)器、不同操作系統(tǒng)之間通過網(wǎng)絡(luò)共享文件的技術(shù)。在嵌入式Linux系統(tǒng)的開發(fā)調(diào)試階段,可以利用該技術(shù)在主機(jī)上建立基于NFS 的根文件系統(tǒng),掛載到嵌入式設(shè)備,可以很方便地修改根文件系統(tǒng)的內(nèi)容。
以上討論的都是基于存儲設(shè)備的文件系統(tǒng)(memory-based file system),它們都可用作Linux的根文件系統(tǒng)。實際上,Linux還支持邏輯的或偽文件系統(tǒng)(logical or pseudo file system),例如procfs(proc文件系統(tǒng)),用于獲取系統(tǒng)信息,以及devfs(設(shè)備文件系統(tǒng))和sysfs,用于維護(hù)設(shè)備文件。
總結(jié)
以上是生活随笔為你收集整理的嵌入式Linux中的根文件系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易语言5.4一键破解工具
- 下一篇: Linux进程全解2——进程环境(环境变