1. 程式人生 > >Linux根檔案系統製作與各種掛載方式的實現

Linux根檔案系統製作與各種掛載方式的實現

Linux根檔案系統的製作


什麼是檔案系統

計算機的檔案系統是一種儲存和組織計算機資料的方法,它使得對其訪問和查詢變得容易,檔案系統使用檔案和樹形目錄的抽象邏輯概念代替了硬碟和光碟等物理裝置使用資料塊的概念,使用者使用檔案系統來儲存資料不必關心資料實際儲存在硬碟(或者光碟)的地址為多少的資料塊上,只需要記住這個檔案的所屬目錄和檔名。在寫入新資料之前,使用者不必關心硬碟上的那個塊地址沒有被使用,硬碟上的儲存空間管理(分配和釋放)功能由檔案系統自動完成,使用者只需要記住資料被寫入到了哪個檔案中。 
檔案系統通常使用硬碟和光碟這樣的儲存裝置,並維護檔案在裝置中的物理位置。但是,實際上檔案系統也可能僅僅是一種訪問資料的介面而已,實際的資料是通過網路協議(如NFS、SMB、9P等)提供的或者記憶體上,甚至可能根本沒有對應的檔案(如proc檔案系統)。 
嚴格地說,檔案系統是一套實現了資料的儲存、分級組織、訪問和獲取等操作的抽象資料型別(Abstract data type)。摘自<<維基百科>> 
磁碟需要首先分割槽,然後再在格式化成指定檔案系統。Linux作業系統支援的檔案系統有ext2,ext3,ext4,nfs,yaffs2等等,這些檔案系統都可以在核心原始碼中找到其定義和實現。 
這裡寫圖片描述

什麼是根檔案系統

和Windows的C,D,E等碟符相似,Linux作業系統也可以將磁碟,Flash等儲存裝置劃分為若干個區,在不同分割槽下存放不同型別的檔案。比如Windows的C盤中就存放著啟動系統所必須的一系列檔案,而在Linux系統中,核心映像檔案(在嵌入式系統眾,核心一般單獨存放在一個分割槽中),核心啟動後執行的第一個程式(init),給使用者提供操作介面的shell程式,應用程式所依賴的庫等。這些必需的基本的檔案集合就被稱為根檔案系統。它們都放在一個分割槽中,在系統啟動後就會首先掛載這個分割槽,也就是掛載根檔案系統。

為什麼需要根檔案系統

要回答這個問題,我們需要了解Linux作業系統的啟動流程。Linux作業系統由三部分組成,分別是Bootloader,Linux kernel,File system.系統上電時首先執行的是Bootloader程式,主要做的任務是對硬體的初始化,並載入linux核心,linux核心啟動後,就必須要掛載根檔案系統,根檔案系統的作用在上個小標題可以看到。沒有檔案系統的支援,即使linux核心執行起來了,我們也不能對核心進行操作。

如何製作根檔案系統


準備階段:需要用到的安裝包有

Linux核心原始碼包 
根檔案系統需要用到的配置檔案包 
用來移植根檔案系統的常用命令的busybox安裝包 
通過samba伺服器將所有要用到的安裝包都拷貝到虛擬機器中 
我所使用的作業系統是紅帽企業版6,也就是RHEL 6。

1.建立根檔案系統與目錄


1.1建立目錄

mkdir /home/rootfs
cd /home/rootfs
mkdir bin dev sbin proc sys usr var tmp mnt etc
mkdir usr/bin usr/sbin usr/lib lib/modules
  • 1
  • 2
  • 3
  • 4

建立根目錄下的各種子目錄以及使用者目錄下的命令,庫,模組等目錄。

1.2建立裝置檔案

cd /home/rootfs/dev
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
  • 1
  • 2
  • 3

在devices目錄下建立兩個必備的裝置檔案

1.3新增配置檔案

將拷貝到linux下的配置檔案安裝包解壓並講解壓後etc目錄下的檔案都複製到建立的根檔案系統下的etc目錄中

tar -xvzf etc.tar.gz
cp ./etc/* /home/rootfs/etc -rf 
  • 1
  • 2

1.4新增核心模組

進入解壓後的linux原始碼目錄,執行第一條命令,指定架構和交叉編譯工具鏈,編譯生成的.ko檔案就是我們需要用到的核心模組,但是它們是散落在linux核心程式碼目錄下的各個子目錄中的,所以需要執行第一條命令,將所有的核心模組都聚集起來並指定安裝的目錄,路徑自然是要指定為我們所建立的根檔案系統下了。這裡指的根檔案系統是所有檔案和目錄的集合。

cd /home/linux
make modules ARCH=arm CROSS_COMPILE=arm-linux-
make modules_install ARCH=arm INSTALL_MOD_PATH=/home/rootfs
  • 1
  • 2
  • 3

1.5配置並編譯busybox

所謂的製作根檔案系統,就是建立各種目錄,並且在裡面建立各種檔案。比如在/bin,/sbin目錄下存放著各種可執行程式,在/etc目錄下面存放配置檔案,在/lib目錄下面存放庫檔案。而busybox就是用來建立這些目錄下的可執行檔案,不包括配置檔案和庫檔案。busybox為各種小型的或者嵌入式系統提供了一個比較完整的工具集。busybox是一個遵循GPL協議的開源專案,原始碼可以在網上免費下載。

tar -xvzf /home/busybox1.13.3.tar.gz
cd /home/busybox1.13.3
make menuconfig
Build Options ---> [*]Build BusyBox as a static binary
(arm-linux-)Corss Compiler prefix
Installation Options ---> [*]Don't use /usr
(/home/rootfs)BusyBox installation prefix
make
make install
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

上面這段程式碼包括瞭解壓以及通過圖形介面來配置busybox。選擇編譯時靜態連結庫,交叉編譯工具鏈的字首,不安裝到系統的/usr目錄下,以及編譯後安裝到/home/rootfs,即我們製作的根檔案系統下。退出後儲存配置,然後就可以編譯,安裝了。安裝完成後,可以在根檔案系統比如/bin目錄下看到很多可執行的檔案。如果沒有看到,那麼請仔細檢查在配置busybox時的指定路徑名是否正確。到這裡,整個根檔案系統就製作好了。

2.掛載根檔案系統到核心

2.1initramfs掛載

2.1.1搭建TFTP伺服器

這裡涉及到如何搭建TFTP伺服器,以及如何通過TFTP伺服器將製作好的核心映像下載到開發板。 
RHEL紅帽作業系統安裝軟體方式有兩種,一種是RPM機制,一種是yum機制。RPM安裝軟體不是很方便,因為可能安裝完一個後還要後續再安裝它的依賴,所以採用yum安裝,yum可以自動安裝軟體需要的依賴,非常方便,Yum機制類似於Ubuntu的apt-get install。首先在倉庫中找到tftp伺服器軟體,安裝以後在根檔案系統建立一個tftpboot目錄,將開發板要下載的核心映象檔案放入其中,同時在tftp伺服器的配置檔案中指定連結的目錄路徑,以及將失能失效。最後重啟伺服器,這樣tftp伺服器就搭建完畢。

yum list|grep tftp
yum install tftp-server.i686
mkdir /tftpboot
chmod 777 /tftpboot
vim /etc/xinetd.d/tftp
disbale=no
server_args= -s /tftpboot

/etc/init.d/tftp restart
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

配置linux核心,選擇使用initramfs方式來掛載檔案系統。編譯後將生成的uImage複製到建立/tftpboot目錄下

cd /home/rootfs
ln -s ./bin/busybox init
cd /home/linux
make menuconfig ARCH=arm
General setup --->[*]Initial RAM filesystem and RAMdisk(initramfs/initrd) support
(/home/rootfs)Initramfs source file(s)
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
cp /home/linux/arch/arm/boot/uImage /tftpboot
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

最後還需要設定一下開發板uboot的環境變數,設定載入核心後uboot傳遞給核心的啟動引數。

printenv
setenv bootargs noinitrd console=ttySAC0,115200  
saveenv
tftp c0008000 uImage 
bootm c0008000
  • 1
  • 2
  • 3
  • 4
  • 5

2.2NFS掛載

使用NFS來掛載的好處是顯而易見的, 如果通過initramfs方式將檔案系統掛載到記憶體,速度是很快,但是如果當你需要改動根檔案系統下的檔案或者目錄時,你就需要每次都重新編譯一次核心,編譯核心是很慢的。 所以在開發階段,使用NFS來掛載根檔案系統,當需要改動時,通過網路實時生效,非常便捷省事。切換到Linux核心目錄,啟動圖形配置介面,選擇不使用initramfs方式來掛載檔案系統,選擇以NFS方式來掛載檔案系統,儲存退出後編譯核心生成uImage映象檔案。

cd  /home/linux
make menuconfig ARCH=arm
General setup --->[]Initial RAM filesystem and RAMdisk(initramfs/initrd) support
File sysytem --->[*]Network filesystem--->[*]root filesystem on NFS
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
  • 1
  • 2
  • 3
  • 4
  • 5

設定開發板的啟動引數 
1.root=/dev/nfs:並非真的裝置,而是一個告訴核心經由網路取得根檔案系統的旗標 
2.nfsroot 引數nfsroot這個引數告訴核心以哪一臺機器,哪個目錄以及哪個網路檔案系統選項作為根檔案系統使用,命令格式: nfsroot=[:]–指定網路檔案系統服務端的網際網路地址(IPaddress)。如果沒有給定此欄位,則使用由nfsaddrs變數(見下面)所決定的值。此引數的用途之一是允許使用不同機器作為反向地址解析協議(RARP)及網路檔案系統服務端。通常你可以不管它(設為空白)。 2)–服務端上要作為根掛入的目錄名稱。如果字串中有個‘%s’符記(token),此符記將代換為客戶端網際網路地址之ASCII表示法。 
3.nfsaddrs 命令格式nfsaddrs=:::::: 
1)–客戶端的名稱。如果空白,則使用客戶端網際網路地址之ASCII-標記法,或由啟動協議接收的值;2)–要使用的網路裝置名稱。如果為空白,所有裝置都會用來發出反向地址解析請求,啟動協議請求由最先找到的裝置發出。網路檔案系統使用接收到反向地址解析協議或啟動協議迴應的裝置。如果你只有一個裝置那你可以不管它。 
3)–用以作為自動配置的方法。如果是rarp或是bootp則使用所指示的協議;如果此值為`both’或空白,若配置核心時有開啟這兩種協議則都使用;none表示不使用自動配置,這種情況下你必須指定前述欄位中所有必要的值。 此引數可以作為nfsaddrs的引數單獨使用(前面沒有任何字元),這種情況下會使用自動配置。然而,此種情況不能使用none作為值。

setenv bootargs noinitrd console=ttySAC0,115200 init=/init 
root=/dev/nfs rw nfsroot=192.168.199.115:/home/rootfs ip=192.168.199.120:192.168.199.115:192.168.199.1:255.255.255.0::eth0:off
saveenv
  • 1
  • 2
  • 3

2.2.1搭建NFS伺服器

想要讓核心通過網路掛載檔案系統,就需要搭建NFS伺服器。NFS伺服器軟體的安裝方式和上面的tftp伺服器的方式一致,這裡就不再贅述。

yum list | grep nfs
yum install nfs-utils
  • 1
  • 2

2.2.2啟動NFS服務

NFS 依賴 rpcbind 服務,設定為其自動啟動 
由於nfs服務依賴於rpc(遠端過程呼叫)服務,所以在啟動nfs服務之前,需要先啟動rpc服務

chkconfig rpcbind on
service rpcbind start
service nfs start
tail /var/log/message
chkconfig nfs on
  • 1
  • 2
  • 3
  • 4
  • 5

2.2.3配置NFS伺服器

配置檔案的意思是指定共享目錄,也就是說我們將虛擬機器中的根檔案系統通過網路共享給開發板的linux核心使用。*代表所有IP都可以訪問這個目錄,許可權包括可讀可寫,儲存到磁碟等。配置完要重啟NFS伺服器生效。

vim /etc/exports
/home/rootfs *(rw,sync,no_root_squash)

/etc/init.d/nfs restart
  • 1
  • 2
  • 3
  • 4

下載核心後使用bootm命令啟動核心,核心啟動後便會通過網路來掛載根檔案系統

tftp c0008000 uImage;bootm c0008000
  • 1

最後附上整個過程的思維導圖

這裡寫圖片描述