1. 程式人生 > >根檔案系統的原理

根檔案系統的原理

根檔案系統概述

1.為什麼需要根檔案系統

(1)init程序的應用程式在根檔案系統上

(2)根檔案系統提供了根目錄/

(3)核心啟動後的應用層配置(/etc)在根檔案系統上,可以這麼認為:發行版=核心+rootfs

(4)shell命令程式在根檔案系統上,例如ls、cd等

總結:一套linux體系,只有核心本身是不能工作的,必須要rootfs(/etc下的配置檔案、/bin等目錄下的shell命令 、/lib目錄下大的庫檔案等......)相配合才能工作。

2.根檔案系統的實質是什麼

(1)根檔案系統是特殊用途的檔案系統

(2)根檔案系統也必須屬於某種檔案系統格式:rootfstype=

(3)根檔案系統是用來做什麼的?

首先,儲存裝置(塊裝置,像硬碟、flash等)是分塊的(扇區),底層(物理層)去訪問儲存裝置時是按照塊號(扇區號)來訪問的,這就很麻煩。其次,檔案系統是一些程式碼,是一套軟體,這套軟體的功能就是對儲存裝置的扇區進行管理,將這些扇區的訪問變成了對目錄和檔名的訪問。在上層按照特定的目錄和檔名去訪問一個檔案時,檔案系統會將這個目錄+檔名轉換成對扇區號的訪問。最後,不同的檔案系統的差異就在於對這些扇區的管理策略和方法不同,例如壞塊管理、碎片管理等。

根檔案系統的形式

1.映象檔案形式

(1)使用專用工具軟體製作的可供燒錄的映象檔案

(2)映象中包含了根檔案系統中的所有檔案

(3)燒錄此映象類似於對相應分割槽格式化

(4)映象檔案系統具有一定的格式,格式是內化的,跟檔名字尾是無關的。

2.資料夾形式

(1)根檔案系統其實就是一個包含特定內容的資料夾而已。

(2)根檔案系統可由任何一個空資料夾新增必要檔案構成。

(3)根檔案系統的雛形就是在開發主機中構造的資料夾形式的。

3.總結

(1)映象檔案形式的根檔案系統主要目的是用來燒錄到塊裝置上,裝置上的核心啟動後去掛載它。映象檔案形式的根檔案系統是由資料夾形式的根檔案系統使用專用的映象製作工具製作而成的。

(2)在開發主機中使用mkdir建立一個空資料夾,然後向其中新增一些必要的檔案(包括/etc目錄下的執行時配置檔案、/bin等目錄下的可執行程式、/lib目錄下的庫檔案等......)後就形成了一個資料夾形式的rootfs。然後這個資料夾形式的rootfs可以被kernel通過nfs方式來遠端掛載使用,但是不能用來燒錄塊裝置。為了將這個rootfs燒錄到塊裝置中,需要使用一些專用的軟體製作工具將其製作成可供燒錄的一定格式的根檔案系統映象。

(3)資料夾形式的rootfs是沒有格式的,製作成映象後就有了一定的格式。這個格式是由映象製作過程和製作工具來決定的。每一種格式的映象製作工具的用法都不同。

什麼是linuxrc

1./linuxrc是一個可執行的應用程式

(1)/linuxrc是應用層的,和核心原始碼一點關係都沒有

(2)/linuxrc在當前的開發板核心系統下是可執行的,因此在ARM SoC的linux系統下,這個應用程式就是用arm-linux-gcc編譯連結的;如果是在PC機linux系統下,那麼這個程式就是用gcc編譯連結的。

(3)/linuxrc如果是靜態編譯連結的,那麼可以直接執行;如果是動態編譯連結的,那麼還需要提供必要的庫檔案才能執行。但是因為/linuxrc這個程式是由核心直接呼叫執行的,因此使用者沒有機會去匯出庫檔案的路徑,所以/linuxrc沒辦法動態連結,一般都是靜態連結的。

2./linuxrc執行時引出使用者介面

(1)作業系統啟動後在一系列的執行配置後,最終會給使用者一個操作介面(允許時cmdline,也許是GUI),這個使用者操作介面就是由/linuxrc帶出來的。

(2)使用者介面等很多事並不是在/linuxrc中負責的,使用者介面有自己專門的應用程式,但是使用者介面的應用程式是直接或者間接的被/linuxrc呼叫執行的。使用者介面程式和其他應用程式就是程序2、3、4......,這就是在核心的啟動過程分析那一節說的程序1(init程序,也就是/linuxrc)是其他所有應用程式程序的祖宗程序。

3./linuxrc負責系統啟動後的配置

(1)就好像一個房子建好之後不能直接住,還要裝修一樣,作業系統啟動後不能直接用,需要配置下。

(2)作業系統啟動後的應用層配置(一般叫執行時配置,英文簡寫etc)是為了讓我們的作業系統用起來更方便,更適合個人的愛好或者使用性。

4./linuxrc在嵌入式linux中一般就是busybox

(1)busybox是一個C語言寫出來的專案,裡面包含了很多.c檔案和.h檔案。這個專案可以被配置編譯成各個平臺下面可以執行的應用程式。如果用arm-linux-gcc來編譯busybox,就會得到一個可以在我們開發板的核心上執行的應用程式。

(2)busybox這個程式開發出來就是為了在嵌入式環境下構建rootfs使用的,也就是說它是專門開發的init程序應用程式。

(3)busybox為當前系統提供了一整套shell命令程式集,例如vi、cd、mkdir、ls等。在桌面版的linux發行版(例如Ubuntu、redhat、CentOS等)中vi、cd、ls等都是一個一個單獨的應用程式,但是在嵌入式linux中,為了省事把vi、cd、ls等所有常用的shell命令集合到了一起構成了一個shell命令包,起名叫busybox。

rootfs應該有什麼

1./linuxrc

最重要的就是/linuxrc

2.dev目錄

在linux中一切皆檔案,因此一個硬體裝置也被虛擬化成一個裝置檔案來訪問。在linux系統中,/dev/xxx就表示一個硬體裝置,要操作這個硬體時,先使用open開啟這個裝置,然後使用read/write/ioctl操作這個裝置,最後使用close關閉這個裝置。

在最小的rootfs中,/dev目錄也是不可少的。這裡面有一兩個裝置檔案是rootfs必須的。

3.sys和proc目錄

在最小的rootfs中,也是不可省略的,但是這兩個目錄只要建立了空資料夾就可以了,裡面是沒有東西的,也不用有東西。這兩個目錄和驅動有關,屬於linux中的虛擬檔案系統。

4.usr

usr是系統的使用者所屬的一些檔案的存放地,這個目錄在busybox安裝時會自動生成。

5.etc

etc目錄是很關鍵很重要的一個,目錄中的所有檔案全部都是執行時的配置檔案。/etc目錄下的所有配置檔案會直接或者間接的被/linuxrc所呼叫執行,完成作業系統的執行時配置。etc目錄是製作rootfs的關鍵,所以在後面會專門講解etc目錄。

6.lib

lib目錄也是rootfs中很關鍵的一個,不能省略。lib目錄下放的是當前作業系統中的動態和靜態連結庫檔案。

VFS簡介

1.什麼是VFS

(1)VFS是linux核心的一種設計理念、設計機制。VFS就是virtual file system,叫虛擬檔案系統。

(2)具體的一些檔案系統如FAT、NTFS、ext2、ext3、jffs2、yaffs2、ubi等主要設計目的是為了管理塊裝置(硬碟、iNand......)。

(3)VFS是借鑑了檔案系統的設計理念(通過檔案系統,將底層難以管理的物理磁碟扇區式訪問轉換成目錄+檔名訪問),將硬體裝置的訪問也虛擬化成了對目錄+檔案的訪問。所以有了VFS後,可以通過裝置檔案(目錄+檔名,例如/dev/mmcblk0p2)的方式來訪問系統中的硬體裝置。

總結:從以上可以看出VFS的一些厲害之處,但是VFS遠不止於此。

2.VFS的意義

(1)把對硬體裝置的訪問和對普通檔案的訪問的介面統一化了(linux中一切皆檔案)。

(2)將作業系統上層(應用層)對下層不同檔案系統型別的訪問細節給遮蔽掉了,因此如果沒有VFS,那麼寫cp命令(或其他命令)的時候就不得不去考慮cp的這個檔案是在什麼樣的檔案系統型別下。所以cp命令非常複雜,因為要考慮具體的檔案系統型別。有了VFS之後,情況就不同了。VFS成了一個隔離層,隔離了下層的不同檔案系統之間的差異性,對上層應用提供了一個統一的介面。

(3)VFS將不同檔案系統和下層硬體裝置(塊裝置)驅動之間的細節也給遮蔽了。不同型別的檔案系統在本身設計時,是不用考慮各種不同的硬體裝置的具體操作差異的,這裡有一個類似於VFS的設計理念。

3.VFS與學習的關係

(1)VFS機制和rootfs掛載,和其他檔案系統的掛載都是有關聯的。

(2)核心中有一些sys proc這種虛擬檔案系統,也和VFS機制有關。

(3)/dev目錄下的裝置檔案都和VFS有關,所以學習驅動繞不開VFS。