一、一、根文件系統概述linux
1.爲何須要根文件系統shell
(1)init進程的應用程序在根文件系統上ubuntu
(2)根文件系統提供了根目錄/windows
(3)內核啓動後的應用層配置(etc目錄)在根文件系統上服務器
(4)shell命令程序在根文件系統上網絡
總結:一套Linux體系,只有內核自己是不能工做,必需要根文件系統相配合,主要是要根文件系統/etc下的配置文件、/bin、/sbin等目錄下的shell命令相配合等等,還有/lib下的庫文件(靜態連接庫,動態連接庫)等等ide
一、二、根文件系統的實質工具
(1)、根文件系統是特殊用途的根文件系統oop
(2)根文件系統也必須屬於某種文件系統格式測試
(3)究竟文件系統是用來幹嗎的。
文件系統就是對一個存儲設備中的扇區進行管理的,由於一個文件可能在存儲設備的多個扇區中存放的,靠咱們的人的大腦是不能記住和進行操做移動文件到別的扇區的,因此有文件系統,文件系統就是來管理存儲設備中的扇區的,文件系統是一套代碼,一個軟件,這個軟件中列出了一個表格,記錄了每個扇區,來對每個扇區進行操做管理,將這些對扇區的訪問,變成了對目錄和文件名的訪問,在物理層是沒有目錄和文件名的概念的,這些存儲設備只認識扇區,因此咱們在上層用一個目錄和文件名訪問一個文件的時候,文件系統這套軟件就會將目錄和文件名轉換扇區號進行訪問,這個時候對底層來講,仍是用的扇區號來訪問存儲設備的,可是對於上層了來講,就是利用目錄和文件名來訪問的了
不一樣的文件系統差別就是在對扇區的管理策略和方法不一樣,好比壞塊管理,和碎片管理
一、三、根文件系統的形式
一、鏡像文件形式
(1)使用專用工具軟件製做出來的可供燒錄的鏡像文件
(2)鏡像中包含了根文件系統的全部文件
(3)燒錄此鏡像相似於對相應的分區格式化,格式化成按照咱們這種文件系統類型能夠識別的東西
(4)鏡像文件系統得有必定的格式
二、文件夾形式
(1)這種格式的根文件系統其實就是一個包含了特定內容的文件夾而已。特定的內容是指/etc下的那些配置文件,/bin下的那些可執行程序等
(2)這種形式的根文件系統,就是由一個空文件夾添加了一些必要的文件構成的。
(3)根文件系統的雛形就是在開發主機中構造的文件夾造成的,最後由一個專用的軟件工具將這個文件夾弄成一個鏡像文件。
(4)文件夾形式的根文件系統,就是由一個空的文件夾,在這個文件夾裏面添加了一些必要的運行時配置文件etc目錄下的,bin目錄下的可執行程序,lib下的庫文件等等,就造成了一個文件夾形式的根文件系統,這個文件夾根文件系統是在開發主機上的,內核在啓動的時候要經過nfs遠程掛載來將這個文件夾形式的根文件系統掛載到內核上,可是不能用來燒錄塊設備,咱們爲了將rootfs燒錄到咱們的塊設備中,因而就用了一些專用的軟件工具將其製做成可供燒錄的必定格式的根文件系統鏡像文件
(3)文件夾形式的rootfs是沒有格式的,只是Linux系統中的一個文件夾而已,可是製做成鏡像後,就有了必定的rootfs格式,格式是由鏡像製做過程和製做工具來決定的
一、四、本身製做ext3格式的根文件系統
一、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大的
mount -t ext2 /dev/loop1 ./rootfs/
將這個rootfs.ext2掛載到當前目錄下的一個rootfs文件夾下,以便去訪問這個rootfs.ext2格式的文件,這個文件夾至關於一個窗口,也就是掛載的含義
一、五、nfs啓動自做的簡易文件夾形式的rootfs
一、什麼是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的使用
二、配置內核以支持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不適合真正的產品,只是在產品開發調試的階段會用到
一、六、到底什麼是linuxrc
一、/Linuxrc是一個可執行的應用程序
(1)/linuxrc是應用層的,和內核源碼一點關係都沒有
(2)/linuxrc在當前的開發板內核系統下是能夠直接運行的,因此在ARM的SOC體系下,這個linuxrc是arm-Linux-gcc編譯鏈接的,若是是在PC機上運行的就是用gcc編譯鏈接的
(3)/linuxrc通常是靜態連接的,那麼就能夠直接運行
二、linuxrc執行時引出用戶界面
(1)用戶界面是在linuxrc運行時間接或者直接被調用執行的,用戶界面有本身專門的應用程序,用戶界面的應用程序多是進程三、進程四、、、、、、是被linuxrc這個父進程引出來的
三、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中了
一、七、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
一、八、VFS簡介
一、什麼是VFS
(1)VFS簡單來講是Linux內核中的一種設計理念、設計機制,內核的實現方法,VFS是vitrual file system虛擬文件系統
(2)VFS參造了實體文件系統的設計理念,就是對塊設備的訪問扇區的時候,能夠轉化成對目錄和文件的訪問。可是VFS更厲害他將關於對硬件設備的訪問,也虛擬化成了對目錄和文件的訪問。因此有了VFS後,咱們能夠經過設備文件(如:/dev/mmcblk0p2)的目錄和文件名和對系統中硬件設備進行訪問
二、VFS的意義
(1)在Linux中一切皆是文件,訪問普通文件和訪問硬件設備的方式的接口都是同樣的,都是至關於對普通文件的訪問。
(2)將上層應用層對訪問下層不一樣的文件系統類型進行了隔離,就是在上層能夠用一樣的方式,訪問下層的不一樣的文件系統類型,VFS將下層的不一樣文件系統類型統一成一個接口提供給了上層應用層。
(3)咱們根文件系統的掛載,proc、sys等虛擬文件系統和/dev/xxx 這些設備文件都是和VFS有關的。
掛載的意思就是說,這個根文件系統的類型被VFS識別到了,VFS認得他,將他對接上了,就叫掛載