Linux系統中根文件系統構建基本方式|視焦點訊

2023-05-09 10:04:27 來源:嵌入式開發愛好者

1. 根文件系統布局 嵌入式Linux根文件系統布局,建議還是按照FHS標準來安排,事實上大多數嵌入式Linux都是這樣做的。但是,嵌入式系統可能并不需要桌面/服務器那樣龐大系統的全部目錄,可以酌情對系統進行精簡,以簡化Linux的使用。如嵌入式Linux文件系統中通常不會放置內核源碼,因而存的 常不會放置內核源碼,因而存的 常不會放置內核源碼,因而存放源碼的/usr/src目錄是不必要的, 甚至連頭文件也不需要,即/usr/include目錄也不必要;但是/bin、/dev 、/etc、/lib 、/proc 、/sbin、/usr幾個目錄是不可或缺的。

所以,允許嵌入式 Linux 對系統目錄結構進行精簡,以適應具體用場合的需求,一個典型的嵌入式Linux根文件系統目錄如下所示:

要構建一個可用的Linux根文件系統,需要的二進制和庫都不少,完全從零開始也是不現實的,推薦參考其它現有可用的文件系統,在原基礎上按需修改;或者使用文件系統制作工具如 BusyBox 來實現文件系統的生成。


(資料圖片)

2. 使用BusyBox生成二進制工具

2.1. 獲取BusyBox源碼

Busybox的官方源碼下載路徑為:https://busybox.net/downloads/。這里以下載busybox-1.29.3.tar.bz2為例。

2.2. 配置BusyBox

解壓源碼,進入根目錄

$tarjxvfbusybox-1.29.3.tar.bz2$cdbusybox-1.29.3/

首先,執行:

$makemenuconfig

進入圖形化配置界面:

2.2.1.選擇編譯靜態庫

進入Settings --->使用空格鍵選擇編譯靜態庫

---BuildOptions[*]Buildstaticbinary(nosharedlibs)

如圖:

2.2.2.選擇交叉編譯工具鏈

在Settings ---> 設置項下,填寫交叉編譯工具鏈前綴

2-2-3. 選擇安裝目錄

在Settings --->設置項下,找到

---InstallationOptions("makeinstall"behavior)Whatkindofappletlinkstoinstall(assoft-links)--->(./_install)Destinationpathfor"makeinstall"(NEW)

默認為當前目錄下目錄,這里我使用默認_install目錄:

2-2-4. 編譯安裝

退出保存后,執行編譯make,大概幾分鐘后編譯完成,執行make install,很快就會安裝完成:

入_install目錄,查看生成的文件

新建一個目錄用來存放制作的根文件系統,可以命名為rootfs。將利用BusyBox生成的二進制文件及目錄,即_install目錄下的所有文件及目錄復制到rootfs目錄下。

3. 構建根文件系統

使用BusyBox編譯后,僅有 bin、sbin、usr這 3個目錄和軟鏈接linuxrc,目錄里都是二進制命令工具,這還不足以構成 一個可用的根文件系統,必須進行其它完善工作,才能構建一個可用的根文件系統。

3-1. 完善目錄結構

根據典型嵌入式Linux根文件系統目錄,在rootfs目錄中創建其他目錄

$mkdirdevetclibprocsystmpvar

3-2. 添加C運行庫文件

庫文件可直接從交叉工具鏈獲取,一般在工具鏈的libc/lib/目錄下。我這里是在ubuntu下安裝的Linaro的交叉工具鏈:

庫文件是在/usr/arm-linux-gnueabihf/lib/目錄下,拷貝動態鏈接庫文件(.so文件)到新制作的根文件系統根目錄下/lib目錄里:

$cp-a/usr/arm-linux-gnueabihf/lib/*so*./lib/

這里只是拷貝動態鏈接庫。一般開發程序使用動態編譯需要板子上動態庫的支持才能運行,所以拷貝動態庫。而靜態庫一般在靜態編譯的時候用到,由于交叉編譯的工作放在了PC上所以板子上不需要靜態庫,所以沒有必要拷貝,這樣還可以減小根文件系統的體積。

一般使用gcc編譯后的可執行文件、目標文件和動態庫都帶有調試信息和符號信息,這些在調試的時候用到,但是卻增大了文件的大小。通常在PC上調試,或者調試時使用這些帶有調試信息和符號信息的庫文件,程序發布后使用去掉這些信息的庫文件,可以大大縮小根文件系統的體積。這里我們去掉這些信息,方法是使用strip工具:

$arm-linux-gnueabihf-strip./*

3-3. 添加初始化配置腳本

初始化配置腳本放在在/etc目錄下,用于系統啟動所需的初始化配置腳本。BusyBox提供了一些初始化范例腳本,在examples/bootfloppy/etc/目錄下。將這些配置文件復制到 ”目錄下。將這些配置文件復制到 ”目錄下。將這些配置文件復制到新制作的根文件系統etc目錄下

cp-a../busybox/busybox-1.29.3/examples/bootfloppy/etc/*etc/

添加后如圖所示:

3-3-1. 修改/etc/inittab文件

/etc/inittab文件是init進程解析的配置文件,通過這個配置文件決定執行哪個進程,何時執行。將文件修改為:

#系統啟動時:/etc/init.d/rcS#系統啟動按下Enter鍵時:-/bin/sh#按下Ctrl+Alt+Del鍵時:/sbin/reboot#系統關機時:/sbin/swapoff-a:/bin/umount-a-r#系統重啟時:/sbin/init

以上內容定義了系統啟動時,關機時,重啟時,按下Ctrl+Alt+Del鍵時執行的進程。

3-3-2. 修改/etc/init.d/rcS文件

#!/bin/sh#掛載/etc/fstab中定義的所有文件系統/bin/mount-a#掛載虛擬的devpts文件系統用于用于偽終端設備/bin/mkdir-p/dev/pts/bin/mount-tdevptsdevpts/dev/pts#使用mdev動態管理u盤和鼠標等熱插拔設備/bin/echo/sbin/mdev>/proc/sys/kernel/hotplug#掃描并創建節點/sbin/mdev-s

3-3-3. 修改/etc/fstab文件

/etc/fstab文件存放的是文件系統信息。在系統啟動后執行/etc/init.d/rcS文件里/bin/mount -a命令時,自動掛載這些文件系統。內容如下:

#proc/procprocdefaults00sysfs/syssysfsdefaults00tmpfs/tmptmpfsdefaults00tmpfs/devtmpfsdefaults00

注:這里我們掛載的文件系統有三個proc、sysfs和tmpfs,在內核中proc和sysfs默認都支持,而tmpfs是沒有支持的,我們需要添加tmpfs的支持。

3-3-4. 修改/etc/profile文件

/etc/profile文件作用是設置環境變量,每個用戶登錄時都會運行它。將文件內容修改為:

#主機名exportHOSTNAME=zyz#用戶名exportUSER=root#用戶目錄exportHOME=/root#終端默認提示符exportPS1="[$USER@$HOSTNAME:$PWD]#"#環境變量exportPATH=/bin:/sbin:/usr/bin:/usr/sbin#動態庫路徑exportLD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

因為指定了root用戶的家目錄為/root,所以需要創建該目錄,否則執行cd ~時會失敗

$mkdirroot

登錄系統后效果為:

...PleasepressEntertoactivatethisconsole.[root@zyz:/]#[root@zyz:/]#cd~[root@zyz:/root]#[root@zyz:/root]#echo$PATH/bin:/sbin:/usr/bin:/usr/sbin

至此,根文件系統就基本構建好了。

4. 制作根文件系統鏡像

4-1. 根文件系統類型

如果文件系統已經布局完成, 則可以發到目標中了。通常會制作一個鏡像然后通過某種方式固化到目標系統中,具體采用什么樣的形發布需要根據資源狀況、內核情況和系統需求等方面進行裁決:

(1)硬件方面,至少需要考慮主存儲介質的類型和大小如Flash是NOR Flash還是NAND Flash,RAM的大小等。

(2)內核方面, 則需考慮所裁剪后的支持哪些文件系統采用中最合適, 能滿足性、速度等要求。

(3)系統需求方面,要考慮運行速度、是否可寫壓縮等因素。常見的可用于根文件系統類型有ramdisk 、cramfs、jffs2 、yaffs/yaffs2和ubifs等,各類型的特性如表所列。

盡管文件系統固件以某一種文件系統的鏡像發布,但是整個文件系統實際上還是并存多種邏輯文件系統的。例如,一個系統根文件系統以ubifs掛載,但是/dev目錄卻是以tmpfs掛載的、/sys目錄掛載的是sysfs文件系統?,F在,似乎ubifs是一種趨勢。

4-2. 制作UBIFS根文件系統鏡像

Linux下制作UBIFS的命令有兩個,mkfs.ubifs和ubinize。mkfs.ubifs,將一個目錄制作為UBIFS文件系統。使用范例:

$mkfs.ubifs-m2048-e128KiB-c4096-r./rootfs-orootfs.ubifs

其中:

-r,-d,--root=DIRbuildfilesystemfromdirectoryDIR(目錄)-m,--min-io-size=SIZEminimumI/Ounitsize(最小輸入輸出單元大?。?e,--leb-size=SIZElogicaleraseblocksize(邏輯擦除塊大?。?c,--max-leb-cnt=COUNTmaximumlogicaleraseblockcount(最大邏輯擦除塊數目)-o,--output=FILEoutputtoFILE(輸出文件)

所以制作ubifs鏡像文件,需要知道3個關鍵參數,即最小輸入輸出單元大小,邏輯擦除塊大小,最大邏輯擦除塊數目,其中最大邏輯擦除塊數目可由Flash分區大小和邏輯擦除塊大小計算出來,這些信息可以通過u-boot命令查看:

=>mtdpartsdefault=>ubipartrootfs

ubinize,將mkfs.ubifs制作的UBIFS文件系統制作成含有卷標的可以直接燒寫在Flash上的鏡像。使用范例:

$ubinize-m2048-p128KiBubinize.cfg-orootfs_ubifs.img

其中:

-o,--output=outputfilename(輸出文件)-p,--peb-size=sizeofthephysicaleraseblockoftheflash(物理擦除塊大小)thisUBIimageiscreatedforinbytes,kilobytes(KiB),ormegabytes(MiB)(mandatoryparameter)-m,--min-io-size=minimuminput/outputunitsizeoftheflashinbytes

這里需要兩個參數物理擦除塊大小和最小輸入輸出單元大小。ubinize.cfg是配置文件,內容如下:

[ubifs]mode=ubiimage=rootfs.ubifsvol_id=0vol_size=1024MiBvol_type=dynamicvol_name=rootfsvol_flags=autoresize

說明:

[ubifs]mode=ubiimage=rootfs.ubifs#mkfs.ubi生成的源鏡像vol_id=0#卷號vol_size=1024MiB#卷大小,一般要設置的比分區大,防止有壞塊vol_type=dynamic#卷類型,動態卷vol_name=rootfs#卷名,rootfsvol_flags=autoresize#自動大小

審核編輯:湯梓紅

標簽:

上一篇:Linux C語言時間相關知識總結
下一篇:最后一頁