Uboot和系統移植(18)-------- 根文件系統的原理


一,根文件系統概述

1、爲什麼需要根文件系統
(1)init進程的應用程序在根文件系統上
(2)根文件系統提供了根目錄/
(3)內核啓動後的**應用層配置(etc目錄)**在根文件系統上。幾乎可以認爲:發行版=內核+rootfs
(4)shell命令程序在根文件系統上。譬如ls、cd等命令

總結:一套linux體系,**只有內核本身是不能工作的,必須要rootfs(**上的etc目錄下的配置文件、/bin /sbin等目錄下的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是沒有格式的,製作成鏡像後就有了一定的rootfs格式了,格式是由我們的鏡像製作過程和製作工具來決定的。每一種格式的鏡像製作工具的用法都不同。


三,自己製作ext3格式的根文件系統

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、動手製作ext3格式的根文件系統

(1)創建rootfs.ext2文件並且將之掛載到一個目錄下方便訪問它

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

第三步
在這裏插入圖片描述

3、燒錄製作的rootfs.ext3
(1)燒錄過程參考裸機中第三部分的刷機過程。注意bootargs傳參設置
第四步
在這裏插入圖片描述

4、啓動現象分析
在這裏插入圖片描述


四,nfs方式啓動自制簡易文件夾形式的rootfs

1、什麼是nfs
(1)nfs是一種網絡通訊協議,由服務器和客戶端構成。
(2)nfs的作用。利用nfs協議可以做出很多直接性應用,我們這裏使用nfs主要是做rootfs掛載。開發板中運行kernel做nfs客戶端主機ubuntu中搭建nfs服務器。在主機ubuntu的nfs服務器中導出我們製作的文件夾形式的rootfs目錄,則在客戶端中就可以去掛載這個文件夾形式的rootfs進而去啓動系統。

在這裏插入圖片描述
(3)搭建nfs服務器
第一步:下載nfs

sudo apt-get install nfs-kernel-server --fix-missing
sudo apt-get install nfs-common --fix-missing

第二步:配置/etc/exports

sudo vi /etc/exports

文本末添加/x210_porting/rootfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)

然後在終端執行

chmod 777 -R /root/rootfs
 sudo showmount -e
//顯示 clnt-create : RPC : Program not registered
sudo exportfs -r 更新
sudo showmount localhost -e

在這裏插入圖片描述第三步:重啓nfs服務
sudo /etc/init.d/nfs-kernel-server restart 重啓 nfs 服務
在這裏插入圖片描述
第四步:掛載測試
mount -t nfs -o nolock localhost:/x210_porting/rootfs/rootfs /opt 執行後,進入/opt目錄中,如果可以看到/x210_porting/rootfs/rootfs 中的內容,則說明 nfs 搭建成功!

在這裏插入圖片描述

2、配置內核以支持nfs作爲rootfs
(1)設置nfs啓動方式的bootargs

setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/x210_porting/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)在menuconfig中配置支持nfs啓動方式

在這裏插入圖片描述
menuconfig配置內核,然後make編譯,生成的鏡像zImage,在arch/arm/boot/中,將它複製到/tftpboot目錄下,進入uboot環境中,tftp 0x30000000 zImage,下載鏡像去啓動,(tftp下載成功的前提是開發板能ping通我們的Ubuntu)如果打印出來的信息中VFS:顯示掛載成功,執行linuxrc失敗,則說明實驗成功,因爲linuxrc是我們創建的空文件,並不能真正執行。

3、總結
(1)nfs方式啓動相當於開發板上的內核遠程掛載到主機上的rootfs

在這裏插入圖片描述

(2)nfs方式啓動不用製作rootfs鏡像
(3)nfs方式不適合真正的產品,一般作爲產品開發階段調試使用


五,到底什麼是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就會得到一個可以在我們開發板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。


六,最小的文件系統有什麼

  • 1、最重要的就是上節課講過的/linuxrc

  • 2、dev目錄下的設備文件。在linux中一切皆是文件,因此一個硬件設備也被虛擬化成一個設備文件來訪問,在linux系統中/dev/xxx就表示一個硬件設備,我們要操作這個硬件時就是open打開這個設備文件,然後read/write/ioctl操作這個設備,最後close關閉這個設備。在最小rootfs中/dev目錄也是不可少的,這裏面有一兩個設備文件是rootfs必須的。

  • 3、sys和proc目錄。在最小rootfs中也是不可省略的,但是這兩個只要創建了空文件夾即可,裏面是沒東西的,也不用有東西。這兩個目錄也是和驅動有關的。屬於linux中的虛擬文件系統

  • 4、usr是系統的用戶所有的一些文件的存放地,這個東西將來busybox安裝時會自動生成

  • 5、etc目錄是很關鍵很重要的一個,目錄中的所有文件全部都是運行時配置文件/etc目錄下的所有配置文件會直接或者間接的被/linuxrc所調用執行,完成操作系統的運行時配置。etc目錄是製作rootfs的關鍵,所以後面下一個課程專門講這個etc目錄。

  • 6、lib目錄也是rootfs中很關鍵的一個,不能省略的一個。lib目錄下放的是當前操作系統中的動態和靜態鏈接庫文件。我們主要是爲了其中的動態鏈接庫。


七,VFS簡介

1、什麼是VFS
(1)VFS是linux內核的一種設計理念、設計機制。VFS就是vitrual file system,叫虛擬文件系統
(2)具體的一些文件系統FAT、NTFS、ext2、ext3、jffs2、yaffs2、ubi等主要設計目的是爲了管理塊設備(硬盤、Nand···)
(3)VFS是借鑑了文件系統的設計理念(通過文件系統將底層難以管理的物理磁盤扇區式訪問,轉換成目錄+文件名的方式來訪問),將硬件設備的訪問也虛擬化成了對目錄+文件的訪問。所以有了VFS後我們可以通過設備文件(目錄+文件名,譬如/dev/mmcblk0p2)的方式來訪問系統中的硬件設備。

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章