天天看點

根檔案系統原理

1、1、根檔案系統概述

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

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

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

(3)核心啟動後的應用層配置(etc目錄)在根檔案系統上

(4)shell指令程式在根檔案系統上

總結:一套Linux體系,隻有核心本身是不能工作,必須要根檔案系統相配合,主要是要根檔案系統/etc下的配置檔案、/bin、/sbin等目錄下的shell指令相配合等等,還有/lib下的庫檔案(靜态連結庫,動态連結庫)等等

1、2、根檔案系統的實質

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

(2)根檔案系統也必須屬于某種檔案系統格式

(3)究竟檔案系統是用來幹嘛的。

檔案系統就是對一個儲存設備中的扇區進行管理的,因為一個檔案可能在儲存設備的多個扇區中存放的,靠我們的人的大腦是不能記住和進行操作移動檔案到别的扇區的,是以有檔案系統,檔案系統就是來管理儲存設備中的扇區的,檔案系統是一套代碼,一個軟體,這個軟體中列出了一個表格,記錄了每一個扇區,來對每一個扇區進行操作管理,将這些對扇區的通路,變成了對目錄和檔案名的通路,在實體層是沒有目錄和檔案名的概念的,這些儲存設備隻認識扇區,是以我們在上層用一個目錄和檔案名通路一個檔案的時候,檔案系統這套軟體就會将目錄和檔案名轉換扇區号進行通路,這個時候對底層來說,還是用的扇區号來通路儲存設備的,但是對于上層了來說,就是利用目錄和檔案名來通路的了

不同的檔案系統差異就是在對扇區的管理政策和方法不同,比如壞塊管理,和碎片管理

1、3、根檔案系統的形式

1、鏡像檔案形式

(1)使用專用工具軟體制作出來的可供燒錄的鏡像檔案

(2)鏡像中包含了根檔案系統的所有檔案

(3)燒錄此鏡像類似于對相應的分區格式化,格式化成按照我們這種檔案系統類型可以識别的東西

(4)鏡像檔案系統得有一定的格式

2、檔案夾形式

(1)這種格式的根檔案系統其實就是一個包含了特定内容的檔案夾而已。特定的内容是指/etc下的那些配置檔案,/bin下的那些可執行程式等

(2)這種形式的根檔案系統,就是由一個空檔案夾添加了一些必要的檔案構成的。

(3)根檔案系統的雛形就是在開發主機中構造的檔案夾形成的,最後由一個專用的軟體工具将這個檔案夾弄成一個鏡像檔案。

(4)檔案夾形式的根檔案系統,就是由一個空的檔案夾,在這個檔案夾裡面添加了一些必要的運作時配置檔案etc目錄下的,bin目錄下的可執行程式,lib下的庫檔案等等,就形成了一個檔案夾形式的根檔案系統,這個檔案夾根檔案系統是在開發主機上的,核心在啟動的時候要通過nfs遠端挂載來将這個檔案夾形式的根檔案系統挂載到核心上,但是不能用來燒錄塊裝置,我們為了将rootfs燒錄到我們的塊裝置中,于是就用了一些專用的軟體工具将其制作成可供燒錄的一定格式的根檔案系統鏡像檔案

(3)檔案夾形式的rootfs是沒有格式的,隻是Linux系統中的一個檔案夾而已,但是制作成鏡像後,就有了一定的rootfs格式,格式是由鏡像制作過程和制作工具來決定的

1、4、自己制作ext3格式的根檔案系統

1、mke2fs介紹

(1)mke2fs是Linux系統中的一個應用程式,在Ubuntu中預設是安裝的,這個應用程式就是用來制作ext2或者ext3格式或者ext4等格式的根檔案系統的

(2)ubuntu14.04中的mkfs.ext2等都是mke2fs的符号連結的

(3)參考老師的這節課中的筆記,他那裡有制作ext2格式的根檔案系統鏡像的步驟,開始時是dd指令建立了一個ext2格式的rootfs,接着執行那幾步後,要在目錄下在建立一個rootfs檔案夾,完了後mount挂載這個ext2倒這個rootfs檔案夾中,因為這個ext2,是一個檔案,我們不能直接在這個檔案中添加東西,但是因為根檔案系統中要有一些特定的檔案内容,是以我們将這個ext2格式的檔案挂載到rootfs檔案夾下後,這個時候這個檔案夾就相當于這個ext2格式的檔案的視窗,可以在這個檔案夾下添加檔案,添加時就相當于在往這個ext2格式的檔案中添加,添加一個linuxrc,這個時候添加的隻是一個普通的檔案,在以後的過程在添加詳細的,完整的,添加完成後,執行老師下面的那兩個解除安裝指令,解除安裝完成後,這個rootfs檔案夾下的内容就沒有了,将這個檔案夾删掉後,在将這個已經有内容的ext2格式的鏡像檔案複制到共享檔案夾下,在uboot指令行下用fastboot指令,在windows中用fastboot軟體将這個根檔案系統鏡像燒錄到iNand中,之後啟動核心,就可以看到挂載成功了,但是核心啟動不起來,因為我們制作的根檔案系統中的那個linuxrc隻是一個普通的空檔案,并不是一個有着特定内容的應用程式,這個根檔案系統中還缺少很多檔案,後續再做,但是目前是挂載成功的

老師筆記:

(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/

之後進入到這個rootfs中,在這個檔案夾下添加一些根檔案系統必要的東西,比如linuxrc應用程式和其他的一些。這裡隻是普通的建立了一個linuxrc檔案,單純的隻是想在核心挂載時能挂載成功

(2)解除安裝掉,然後鏡像就做好了。

umount /dev/loop1

losetup -d /dev/loop1

(3)if=/dev/zero  if表示輸入,一個zero空的檔案

of=rootfs.ext2 of表示輸出到,輸出一個rootfs.ext2的檔案

bs=1024扇區大小也就是block大小,塊大小是1024B

count=2048一共2048個塊,是以是1KB*2048 = 2M,是以我們做的根檔案系統鏡像是2MB大的

将這個rootfs.ext2挂載到目前目錄下的一個rootfs檔案夾下,以便去通路這個rootfs.ext2格式的檔案,這個檔案夾相當于一個視窗,也就是挂載的含義

1、5、nfs啟動自作的簡易檔案夾形式的rootfs

1、什麼是nfs(net file system 網絡檔案系統)

(1)nfs是一種網絡通訊協定,由伺服器和用戶端構成,伺服器呢就是提供nfs一套服務的軟體,用戶端就是通過nfs這個協定來和伺服器進行通信和工作的一套軟體,是以伺服器運作在一個電腦裝置裡面,用戶端運作在另一個電腦裡面

(2)nfs的作用就是可以讓用戶端和伺服器之間進行網絡通信,利用nfs這種協定可以做出很多直接性的應用,我們這裡使用nfs主要是用來實作根檔案系統的挂載,檔案夾形式的根檔案系統,我們是開發闆中運作Linux kernel來做nfs用戶端,主機Ubuntu中搭建nfs伺服器。在主機Ubuntu中将檔案夾形式的根檔案系統放到nfs伺服器中進行導出,這樣我們用戶端中就可以通過這套通信協定去伺服器中挂載這個檔案夾形式的根檔案系統到我們的核心中,啟動系統。

(3)是以我們要确定我們開發闆中運作的那個kernel,是支援nfs用戶端的,确定我們是配置好的,其次要在主機Ubuntu中搭建nfs伺服器,并且将實作制作好的檔案夾形式的roots放到nfs伺服器中進行導出。最後我們在用戶端去挂載伺服器中的那個檔案夾形式的rootfs就行了

(4)參考老師的搭建nfs伺服器的文檔進行搭建

ufw disable這在Ubuntu14.04中是關閉防火牆的

如果按照文檔中的步驟做到這一步的時候show mount localhost -e 發現有RPC的不正确的情況,那是因為沒有更新好,重新開機下Ubuntu就好了,在重新開機nfs四個OK就會全部出現了。

mount -t nfs -o nolock 192.168.1.141: /root/rootfs/rootfs /opt 将rootfs通過nfs挂載到opt上測試

不用了以後要umount /opt/ 去解除安裝,不然會影響opt的使用

2、配置核心以支援nfs作為rootfs

(1)uboot傳參的時候可以告訴核心根檔案系統是nfs格式的檔案系統的話,uboot中的bootargs參數就是這個了

setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/root/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off  init=/linuxrc console=ttySAC2,115200

(2)解析,設定uboot的bootargs參數,root=等于是告訴核心檔案系統是通過nfs的,就是網絡檔案系統,nfsroot=是告訴核心nfs伺服器的IP位址的,我們用的Ubuntu的,我的Ubuntu的IP位址是192.168.1.141

接着後面的:後面的東西是告訴核心nfs的那個檔案夾是在哪的,我的是在/root/rootfs/rootfs,這個檔案夾,後面的iP是分别是我們開發闆的IP位址(核心的,如果核心中沒有設定,就會用這個)、主機Ubuntu的IP位址、網絡網關的位址、子網路遮罩,接着的兩個冒号是因為省略了一個東西,然後是主機的網卡eth0:off就是關閉dhcp配置設定位址的,反正就是格式。

(3)将uboot中的bootargs設定成這個後,啟動核心發現核心并沒有挂載上根檔案系統,原因是因為我們的核心中關于nfs的配置沒有配置好,是以要用make menuconfig對核心進行配置,配置的東西參考老師提供的那個x210nfs啟動的配置參數

總結:

(1)nfs啟動相當于開發闆上的核心遠端挂載到主機上的rootfs檔案夾,因為這個時候rootfd并不在開發闆行,而在主機上了,是通過網線進行挂載的,如果網線斷了,那麼核心就尴尬了,找不到rootfs了。

(2)nfs啟動不用制作rootfs鏡像檔案

(3)nfs不适合真正的産品,隻是在産品開發調試的階段會用到

1、6、到底什麼是linuxrc

1、/Linuxrc是一個可執行的應用程式

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

(2)/linuxrc在目前的開發闆核心系統下是可以直接運作的,是以在ARM的SOC體系下,這個linuxrc是arm-Linux-gcc編譯連接配接的,如果是在PC機上運作的就是用gcc編譯連接配接的

(3)/linuxrc一般是靜态連結的,那麼就可以直接運作

2、linuxrc執行時引出使用者界面

(1)使用者界面是在linuxrc運作時間接或者直接被調用執行的,使用者界面有自己專門的應用程式,使用者界面的應用程式可能是程序3、程序4、、、、、、是被linuxrc這個父程序引出來的

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

(1)作業系統啟動以後不能直接用,要配置一下後才能用。

(2)作業系統啟動後的應用配置etc,一般叫運作時配置是為了讓作業系統用起來後更友善,更具有實用性

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

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

(2)busybox這個程式開發出來就是為了在嵌入式的環境下,建構根檔案系統使用的,也就是說他是為嵌入式專門開發的init程序應用程式

(3)這個busybox還為我們目前系統提供了一套shell指令集,

(4)busybox在嵌入式中就是linuxrc,那麼linuxrc的任務,就是busybox的任務,這個busybox中涵蓋了很多作業系統下用的指令,比如ls vi 等,這麼多指令的應用程式全在busybox中了

1、7、rootfs中好應該有什麼?

(1)rootfs中的/linuxrc這個是很重要的,這個應用程式引出了後面的很多東西,包括使用者界面,包括配置的東西,其中這個應用程式很大一部分是shell的指令集

(2)研究一下Ubuntu14.04的作業系統上的,根目錄,看下rootfs都有哪些東西,

其中bin和sbin目錄是放shell指令集的,sbin目錄一般是作業系統管理者使用者用的,bin目錄一般是普通使用者用的,lost+found就是資源回收筒,cdrom是挂載cd用的,opt目錄是一個雜的目錄,可以随便用的,home目錄是使用者對應的那個目錄,相當于windows中的那個使用者我的檔案之類的,tmp,mnt都是可以随便用的,vmlinuxz是核心,沒有經過壓縮的核心,board目錄也不是非必須的。media也是跟挂載有關的,是和那些影音相關的。output是放輸出一個類的東西的,也是非必須的,sys和proc這兩個目錄是必須的。usr目錄頁是應該要有的,是和使用者有關的,裡面放的應該是使用者可以裝的東西,使用者可以有的東西。boot目錄也不去管它。etc是也是非常重要的目錄

(3)dev目錄下放的裝置檔案,是一個非常重要的目錄,在根檔案系統中不可以缺少,這個目錄下放的是一個裝置對應的裝置檔案的,在Linux中,有一個理念就是一切裝置皆是檔案,是以以個硬體裝置就被虛拟化成一個裝置檔案來按照檔案的通路方式來通路,在Linux系統中一個/dev/xxx的檔案,就表示一個硬體裝置,我們要操作一個硬體裝置的時候,就用open去打開這個裝置檔案,然後read/write/ioctl來操作者個裝置,最後close關閉這個裝置。

(4)在最小的rootfs中,這個/dev目錄是非常重要的,不可少的,因為這裡面有一兩個裝置檔案是我們根檔案系統必須要有的。

(5)在最小的rootfs中,sys和proc這兩個目錄也是不可以缺少的,隻要在rootfs中建立了這兩個空檔案夾就行,這兩個目錄是和驅動有關的,這兩個在Linux中叫虛拟檔案系統,在作業系統Linux運作的時候這兩個檔案中會被軟體虛拟出來東西,是用來看我們作業系統在運作的時候看到核心的運作狀态的,相當于核心的一個窗戶,在運作時,在這個檔案中看到的是核心的運作狀态。usr目錄也是應該要有的,是和使用者有關的,裡面放的應該是使用者可以裝的東西,使用者可以有的東西。但是這個東西不用我們去建立,busbox在安裝時會自動生成

(6)etc也是非常重要的目錄,這個目錄中的檔案全是我們運作時的配置檔案,這些配置檔案會直接或者間接的被/linuxrc調用,完成作業系統的運作時配置

(7)lib這個目錄也重要的,放的是目前的作業系統中的靜态和動态連結庫檔案,我們主要要的是動态連結庫

總結:一個最小的根檔案系統中應該有的目錄是dev etc usr(安裝busybox自動生成的) sys proc lib linuxrc

1、8、VFS簡介

1、什麼是VFS

(1)VFS簡單來說是Linux核心中的一種設計理念、設計機制,核心的實作方法,VFS是vitrual file system虛拟檔案系統

(2)VFS參造了實體檔案系統的設計理念,就是對塊裝置的通路扇區的時候,可以轉化成對目錄和檔案的通路。但是VFS更厲害他将關于對硬體裝置的通路,也虛拟化成了對目錄和檔案的通路。是以有了VFS後,我們可以通過裝置檔案(如:/dev/mmcblk0p2)的目錄和檔案名和對系統中硬體裝置進行通路

2、VFS的意義

(1)在Linux中一切皆是檔案,通路普通檔案和通路硬體裝置的方式的接口都是一樣的,都是相當于對普通檔案的通路。

(2)将上層應用層對通路下層不同的檔案系統類型進行了隔離,就是在上層可以用同樣的方式,通路下層的不同的檔案系統類型,VFS将下層的不同檔案系統類型統一成一個接口提供給了上層應用層。

(3)我們根檔案系統的挂載,proc、sys等虛拟檔案系統和/dev/xxx 這些裝置檔案都是和VFS有關的。

挂載的意思就是說,這個根檔案系統的類型被VFS識别到了,VFS認得他,将他對接上了,就叫挂載

繼續閱讀