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

《18.根檔案系統的原理》

《18.根檔案系統的原理》

第一部分、章節目錄
2.18.1.根檔案系統概述
2.18.2.根檔案系統的形式
2.18.3.自己製作ext3格式的根檔案系統
2.18.4.nfs方式啟動自制簡易資料夾形式的rootfs
2.18.5.到底什麼是linuxrc
2.18.6.rootfs中還應該有什麼
2.18.7.VFS簡介

第二部分、章節介紹
2.18.1.根檔案系統概述
本節課對根檔案系統進行概述,主要講述了根檔案系統存在的意義和根檔案系統的物理本質。
2.18.2.根檔案系統的形式
本節課探討根檔案系統的兩種形態:燒錄映象形式和資料夾形式,試圖從這個出發點讓大家加深對根檔案系統的本質的理解。
2.18.3.自己製作ext3格式的根檔案系統
本節將自己製作一個最簡易的ext3格式的rootfs,然後fastboot燒寫啟動去掛載執行,通過這個小實驗讓大家消除對rootfs的陌生感。
2.18.4.nfs方式啟動自制簡易資料夾形式的rootfs
本節將配置核心支援nfs啟動掛載rootfs,並且自己做一個簡單的資料夾作為根檔案系統,其中涉及到nfs伺服器搭建等細節問題。
2.18.5.到底什麼是linuxrc
本節對linuxrc檔案的本質進行探索,引出busybox,讓大家對根檔案系統的重點busybox的意義有所瞭解。
2.18.6.rootfs中還應該有什麼
本節繼續對rootfs進行擴充套件,講解了rootfs中還應該有,或者說還可以有的一些內容,譬如執行時配置檔案、開機自啟動程式等。
2.18.7.VFS簡介
本節對linux核心的VFS機制做簡單引入,讓大家瞭解到核心中VFS層的目的和意義,這對後面學習應用和驅動的對應呼叫做了一定鋪墊。

第三部分、隨堂記錄
2.18.1.根檔案系統概述
2.18.1.1、為什麼需要根檔案系統
(1)init程序的應用程式在根檔案系統上
(2)根檔案系統提供了根目錄/
(3)核心啟動後的應用層配置(etc目錄)在根檔案系統上。幾乎可以認為:發行版=核心+rootfs
(4)shell命令程式在根檔案系統上。譬如ls、cd等命令
總結:一套linux體系,只有核心本身是不能工作的,必須要rootfs(上的etc目錄下的配置檔案、/bin /sbin等目錄下的shell命令,還有/lib目錄下的庫檔案等···)相配合才能工作。

2.18.1.2、根檔案系統的實質是什麼
(1)根檔案系統是特殊用途的檔案系統。
(2)根檔案系統也必須屬於某種檔案系統格式。rootfstype=
(3)究竟檔案系統是用來幹嘛的。ZnFAT
首先,儲存裝置(塊裝置,像硬碟、flash等)是分塊(扇區)的,物理上底層去訪問儲存裝置時是按照塊號(扇區號)來訪問的。這就很麻煩。
其次,檔案系統是一些程式碼,是一套軟體,這套軟體的功能就是對儲存裝置的扇區進行管理,將這些扇區的訪問變成了對目錄和檔名的訪問。我們在上層按照特定的目錄和檔名去訪問一個檔案時,檔案系統會將這個目錄+檔名轉換成對扇區號的訪問。
最後,不同的檔案系統的差異就在於對這些扇區的管理策略和方法不同,譬如壞塊管理、碎片管理。

2.18.2.根檔案系統的形式
2.18.2.1、映象檔案形式
(1)使用專用工具軟體製作的可供燒錄的映象檔案
(2)映象中包含了根檔案系統中的所有檔案
(3)燒錄此映象類似於對相應分割槽格式化。
(4)映象檔案系統具有一定的格式,格式是內化的,跟檔名字尾是無關的。
2.18.2.2、資料夾形式
(1)根檔案系統其實就是一個包含特定內容的資料夾而已
(2)根檔案系統可由任何一個空資料夾新增必要檔案構成而成
(3)根檔案系統的雛形就是在開發主機中構造的資料夾形式的
2.18.2.3、總結
(1)映象檔案形式的根檔案系統主要目的是用來燒錄到塊裝置上,裝置上的核心啟動後去掛載它。映象檔案形式的根檔案系統是由資料夾形式的根檔案系統使用專用的映象製作工具製作而成的。
(2)最初在開發主機中隨便mkdir建立了一個空資料夾,然後向其中新增一些必要的檔案(包括etc目錄下的執行時配置檔案、/bin等目錄下的可執行程式、/lib目錄下的庫檔案等···)後就形成了一個資料夾形式的rootfs。然後這個資料夾形式的rootfs可以被kernel通過nfs方式來遠端掛載使用,但是不能用來燒錄塊裝置。我們為了將這個rootfs燒錄到塊裝置中於是用一些專用的軟體工具將其製作成可供燒錄的一定格式的根檔案系統映象。
(3)資料夾形式的rootfs是沒有格式的,製作成映象後就有了一定的rootfs格式了,格式是由我們的映象製作過程和製作工具來決定的。每一種格式的映象製作工具的用法都不同。

2.18.3.自己製作ext3格式的根檔案系統
2.18.3.1、mke2fs介紹
(1)mke2fs是一個應用程式,在ubuntu中預設是安裝了的。這個應用程式就是用來製作ext2、ext3、ext4等格式的根檔案系統的。
(2)一般用來製作各種不同格式的rootfs的應用程式的名字都很相似,類似於mkfs.xxx(譬如用來製作ext2格式的rootfs的工具叫mkfs.ext2、用來製作jffs2格式的rootfs的工具就叫mkfs.jffs2)
(3)ubuntu14.04中的mkfs.ext2等都是mke2fs的符號連結而已。

2.18.3.2、動手製作ext3格式的根檔案系統
(1)建立rootfs.ext2檔案並且將之掛載到一個目錄下方便訪問它
《參考資料:http://blog.csdn.net/zhengmeifu/article/details/24174513》
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=2048
losetup /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 2048
mount -t ext2 /dev/loop1 ./rootfs/
(2)我們向映象中寫入一個普通檔案linuxrc。這個檔案就會成為我們製作的映象中的/linuxrc。核心掛載了這個映象後就會嘗試去執行/linuxrc。然後執行時必然會失敗。我們將來實驗看到的現象就應該是:掛載成功,執行/linuxrc失敗。
(3)將來真正去做有用的rootfs時,就要在這一步新增真正可以執行的linuxrc程式,然後還要新增別的/lib目錄下的庫檔案,/etc目錄下的配置檔案等。
(4)解除安裝掉,然後映象就做好了。
umount /dev/loop1
losetup -d /dev/loop1

2.18.3.3、燒錄製作的rootfs.ext3
(1)燒錄過程參考裸機中第三部分的刷機過程。注意bootargs傳參設定
2.18.3.4、分析和總結

2.18.4.nfs方式啟動自制簡易資料夾形式的rootfs
2.18.4.1、什麼是nfs
(1)nfs是一種網路通訊協議,由伺服器和客戶端構成。
(2)nfs的作用。利用nfs協議可以做出很多直接性應用,我們這裡使用nfs主要是做rootfs掛載。開發板中執行kernel做nfs客戶端,主機ubuntu中搭建nfs伺服器。在主機ubuntu的nfs伺服器中匯出我們製作的資料夾形式的rootfs目錄,則在客戶端中就可以去掛載這個資料夾形式的rootfs進而去啟動系統。
(3)搭建nfs伺服器。
2.18.4.2、配置核心以支援nfs作為rootfs
(1)設定nfs啟動方式的bootargs
(2)在menuconfig中配置支援nfs啟動方式

2.18.4.3、總結
(1)nfs方式啟動相當於開發板上的核心遠端掛載到主機上的rootfs
(2)nfs方式啟動不用製作rootfs映象
(3)nfs方式不適合真正的產品,一般作為產品開發階段除錯使用

2.18.5.到底什麼是linuxrc
2.18.5.1、/linuxrc是一個可執行的應用程式
(1)/linuxrc是應用層的,和核心原始碼一點關係都沒有
(2)/linuxrc在開發板當前核心系統下是可執行的。因此在ARM SoC的linux系統下,這個應用程式就是用arm-linux-gcc編譯連結的;如果是在PC機linux系統下,那麼這個程式就是用gcc編譯連線的。
(3)/linuxrc如果是靜態編譯連線的那麼直接可以執行;如果是動態編譯連線的那麼我們還必須給他提供必要的庫檔案才能執行。但是因為我們/linuxrc這個程式是由核心直接呼叫執行的,因此使用者沒有機會去匯出庫檔案的路徑,因此實際上這個/linuxrc沒法動態連線,一般都是靜態連線的。

2.18.5.2、/linuxrc執行時引出使用者介面
(1)作業系統啟動後在一系列的自己執行配置之後,最終會給使用者一個操作介面(也許是cmdline,也許是GUI),這個使用者操作介面就是由/linuxrc帶出來的。
(2)使用者介面等很多事並不是在/linuxrc程式中負責的,使用者介面有自己專門的應用程式,但是使用者介面的應用程式是直接或者間接的被/linuxrc呼叫執行的。使用者介面程式和其他的應用程式就是程序2、3、4·····,這就是我們說的程序1(init程序,也就是/linuxrc)是其他所有應用程式程序的祖宗程序。

2.18.5.3、/linuxrc負責系統啟動後的配置
(1)就好像一個房子建好之後不能直接住,還要裝修一樣;作業系統啟動起來後也不能直接用,要配置下。
(2)作業系統啟動後的應用層的配置(一般叫執行時配置,英文簡寫etc)是為了讓我們的作業系統用起來更方便,更適合我個人的愛好或者實用性。

2.18.5.4、/linuxrc在嵌入式linux中一般就是busybox
(1)busybox是一個C語言寫出來的專案,裡面包含了很多.c檔案和.h檔案。這個專案可以被配置編譯成各個平臺下面可以執行的應用程式。我們如果用arm-linux-gcc來編譯busybox就會得到一個可以在我們開發板linux核心上執行的應用程式。
(2)busybox這個程式開發出來就是為了在嵌入式環境下構建rootfs使用的,也就是說他就是專門開發的init程序應用程式。
(3)busybox為當前系統提供了一整套的shell命令程式集。譬如vi、cd、mkdir、ls等。在桌面版的linux發行版(譬如ubuntu、redhat、centOS等)中vi、cd、ls等都是一個一個的單獨的應用程式。但是在嵌入式linux中,為了省事我們把vi、cd等所有常用的shell命令集合到一起構成了一個shell命令包,起名叫busybox。

2.18.6.rootfs中還應該有什麼
2.18.6.1、最重要的就是上節課講過的/linuxrc
2.18.6.2、dev目錄下的裝置檔案。在linux中一切皆是檔案,因此一個硬體裝置也被虛擬化成一個裝置檔案來訪問,在linux系統中/dev/xxx就表示一個硬體裝置,我們要操作這個硬體時就是open開啟這個裝置檔案,然後read/write/ioctl操作這個裝置,最後close關閉這個裝置。
在最小rootfs中/dev目錄也是不可少的,這裡面有一兩個裝置檔案是rootfs必須的。
2.18.6.3、sys和proc目錄。在最小rootfs中也是不可省略的,但是這兩個只要建立了空資料夾即可,裡面是沒東西的,也不用有東西。這兩個目錄也是和驅動有關的。屬於linux中的虛擬檔案系統。
2.18.6.4、usr是系統的使用者所有的一些檔案的存放地,這個東西將來busybox安裝時會自動生成。
2.18.6.5、etc目錄是很關鍵很重要的一個,目錄中的所有檔案全部都是執行時配置檔案。/etc目錄下的所有配置檔案會直接或者間接的被/linuxrc所呼叫執行,完成作業系統的執行時配置。etc目錄是製作rootfs的關鍵,所以後面下一個課程專門講這個etc目錄。
2.18.6.6、lib目錄也是rootfs中很關鍵的一個,不能省略的一個。lib目錄下放的是當前作業系統中的動態和靜態連結庫檔案。我們主要是為了其中的動態連結庫。

2.18.7.VFS簡介
2.18.7.1、什麼是VFS
(1)VFS是linux核心的一種設計理念、設計機制。VFS就是vitrual file system,叫虛擬檔案系統。
(2)具體的一些檔案系統如FAT、NTFS、ext2、ext3、jffs2、yaffs2、ubi等主要設計目的是為了管理塊裝置(硬碟、Nand···)
(3)VFS是借鑑了檔案系統的設計理念(通過檔案系統將底層難以管理的物理磁碟扇區式訪問,轉換成目錄+檔名的方式來訪問),將硬體裝置的訪問也虛擬化成了對目錄+檔案的訪問。所以有了VFS後我們可以通過裝置檔案(目錄+檔名,譬如/dev/mmcblk0p2)的方式來訪問系統中的硬體裝置。
(4)以上可以初步看出VFS的一些厲害之處,但是VFS不止於此。

2.18.7.2、VFS的意義
(1)上面說過的對硬體裝置的訪問,將對硬體裝置的訪問和對普通檔案的訪問給介面統一化了(linux中一切屆是檔案)。
(2)將作業系統上層(應用層)對下層不同檔案系統型別的訪問細節給遮蔽掉了。因此如果沒有VFS那我們寫cp命令(其他命令也一樣)的時候就不得不去考慮你cp的這個檔案在什麼檔案系統型別下。所以cp命令非常複雜,因此要考慮具體的檔案系統型別。有了VFS後情況就不同了。VFS成了一個隔離層,隔離了下層的不同檔案系統的差異性,對上層應用提供一個統一的介面。
(3)VFS將不同檔案系統和下層硬體裝置(塊裝置)驅動之間的細節也給遮蔽了。不同型別的檔案系統在本身設計時是不用考慮各種不同的硬體裝置的具體操作差異的,這裡有一個類似於VFS的設計理念。

2.18.7.3、VFS和我們學習的關係
(1)VFS機制和rootfs掛載,和其他檔案系統的掛載都是有關聯的。
(2)核心中有一些sys proc這種虛擬檔案系統,這東西也是和VFS機制有關。
(3)/dev/目錄下的裝置檔案都和VFS有關,所以學習驅動繞不開VFS。