加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、分析
    • 二、根文件系統(tǒng)的組成
    • 三、 默認(rèn)預(yù)置條件
    • 四、文件系統(tǒng)制作步驟
    • 五、制作ramdisk文件系統(tǒng)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

移植Linux:如何制作rootfs?詳細(xì)教程

08/29 11:00
1494
閱讀需 27 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

一、分析

1. 文件系統(tǒng)簡(jiǎn)介

理論上說一個(gè)嵌入式設(shè)備如果內(nèi)核能夠運(yùn)行起來,且不需要運(yùn)行用戶進(jìn)程的話,是不需要文件系統(tǒng)的,文件系統(tǒng)簡(jiǎn)單的說就是一種目錄結(jié)構(gòu),由于 linux操作系統(tǒng)的設(shè)備在系統(tǒng)中是以文件的形式存在,將這些文件進(jìn)行分類管理以及提供和內(nèi)核交互的接口,就形成一定的目錄結(jié)構(gòu)也就是文件系統(tǒng),文件系統(tǒng)是為用戶反映系統(tǒng)的一種形式,為用戶提供一個(gè)檢測(cè)控制系統(tǒng)的接口。

根文件系統(tǒng),我認(rèn)為根文件系統(tǒng)就是一種特殊的文件系統(tǒng),那么根文件系統(tǒng)和普通的文件系統(tǒng)有什么區(qū)別呢?

由于根文件系統(tǒng)是內(nèi)核啟動(dòng)時(shí)掛在的第一個(gè)文件系統(tǒng),那么根文件系統(tǒng)就要包括Linux啟動(dòng)時(shí)所必須的目錄和關(guān)鍵性的文件;

例如Linux啟動(dòng)時(shí)都需要有init目錄下的相關(guān)文件,在 Linux掛載分區(qū)時(shí)Linux一定會(huì)找/etc/fstab這個(gè)掛載文件等,根文件系統(tǒng)中還包括了許多的應(yīng)用程序bin目錄等,任何包括這些Linux 系統(tǒng)啟動(dòng)所必須的文件都可以成為根文件系統(tǒng)。

Linux支持多種文件系統(tǒng),包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs等,為了對(duì)各類文件系統(tǒng)進(jìn)行統(tǒng)一管理,Linux引入了虛擬文件系統(tǒng)VFS(Virtual File System),為各類文件系統(tǒng)提供一個(gè)統(tǒng)一的操作界面和應(yīng)用編程接口。

Linux啟動(dòng)時(shí),第一個(gè)必須掛載的是根文件系統(tǒng);若系統(tǒng)不能從指定設(shè)備上掛載根文件系統(tǒng),則系統(tǒng)會(huì)出錯(cuò)而退出啟動(dòng)。之后可以自動(dòng)或手動(dòng)掛載其他的文件系統(tǒng)。因此,一個(gè)系統(tǒng)中可以同時(shí)存在不同的文件系統(tǒng)。

不同的文件系統(tǒng)類型有不同的特點(diǎn),因而根據(jù)存儲(chǔ)設(shè)備的硬件特性、系統(tǒng)需求等有不同的應(yīng)用場(chǎng)合。在嵌入式Linux應(yīng)用中,主要的存儲(chǔ)設(shè)備為 RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲(chǔ)器),常用的基于存儲(chǔ)設(shè)備的文件系統(tǒng)類型包括:jffs2, yaffs, cramfs, romfs,ramdisk, ramfs/tmpfs等。

2. ? ?基于FLASH的文件系統(tǒng)

2.1 Cramfs:Compressed ROM File System

?它的速度快,效率高,其只讀的特點(diǎn)有利于保護(hù)文件系統(tǒng)免受破壞,提高了系統(tǒng)的可靠性。由于以上特性,Cramfs在嵌入式系統(tǒng)中應(yīng)用廣泛。

但是它的只讀屬性同時(shí)又是它的一大缺陷,使得用戶無法對(duì)其內(nèi)容對(duì)進(jìn)行擴(kuò)充。Cramfs映像通常是放在Flash中。

2.2 jffs2

?Jffs2: 日志閃存文件系統(tǒng)版本2 (Journalling Flash FileSystem v2)

?主要用于NOR型閃存,基于MTD驅(qū)動(dòng)層,特點(diǎn)是:可讀寫的、支持?jǐn)?shù)據(jù)壓縮的、基于哈希表的日志型文件系統(tǒng),并提供了崩潰/掉電安全保護(hù),提供“寫平衡”支持等。

?缺點(diǎn)主要是當(dāng)文件系統(tǒng)已滿或接近滿時(shí),因?yàn)槔占年P(guān)系而使jffs2的運(yùn)行速度大大放慢。jffs不適合用于NAND閃存主要是因?yàn)镹AND閃存的容量一般較大,這樣導(dǎo)致jffs為維護(hù)日志節(jié)點(diǎn)所占用的內(nèi)存空間迅速增大,另外,jffs 文件系統(tǒng)在掛載時(shí)需要掃描整個(gè)FLASH的內(nèi)容,以找出所有的日志節(jié)點(diǎn),建立文件結(jié)構(gòu),對(duì)于大容量的NAND閃存會(huì)耗費(fèi)大量時(shí)間。

2.3.yaffs:Yet Another Flash File System

?yaffs/yaffs2是專為嵌入式系統(tǒng)使用NAND型閃存而設(shè)計(jì)的一種日志型文件系統(tǒng)。與jffs2相比,它減少了一些功能(例如不支持?jǐn)?shù)據(jù)壓縮),所以速度更快,掛載時(shí)間很短,對(duì)內(nèi)存的占用較小。另外,它還是跨平臺(tái)的文件系統(tǒng),除了Linux和eCos,還支持WinCE, pSOS和ThreadX等。yaffs/yaffs2自帶NAND芯片的驅(qū)動(dòng),并且為嵌入式系統(tǒng)提供了直接訪問文件系統(tǒng)的API,用戶可以不使用Linux中的MTD與 VFS,直接對(duì)文件系統(tǒng)操作。當(dāng)然,yaffs也可與MTD驅(qū)動(dòng)程序配合使用。

?yaffs與yaffs2的主要區(qū)別在于,前者僅支持小頁(yè)(512 Bytes) NAND閃存,后者則可支持大頁(yè)(2KB) NAND閃存。同時(shí),yaffs2在內(nèi)存空間占用、垃圾回收速度、讀/寫速度等方面均有大幅提升。

2.4. 網(wǎng)絡(luò)文件系統(tǒng)NFS (Network File System)

NFS是由Sun開發(fā)并發(fā)展起來的一項(xiàng)在不同機(jī)器、不同操作系統(tǒng)之間通過網(wǎng)絡(luò)共享文件的技術(shù)。

在嵌入式Linux系統(tǒng)的開發(fā)調(diào)試階段,可以利用該技術(shù)在主機(jī)上建立基于NFS的根文件系統(tǒng),掛載到嵌入式設(shè)備,可以很方便地修改根文件系統(tǒng)的內(nèi)容。

所采用的工具:mkfs.cramfs,mkfs.jffs2,mkfs.yaffs

http://sourceforge.net/projects/cramfs/
http://sourceforge.net/projects/jffs2os/
http://sourceforge.net/projects/yaffs/

二、根文件系統(tǒng)的組成

1. 根文件系統(tǒng)目錄內(nèi)容簡(jiǎn)介

    bin ?:基本的可執(zhí)行文件opt ?:添加的軟件包boot :啟動(dòng)時(shí)需要的一些文件proc :內(nèi)核及進(jìn)程信息的虛擬文件系統(tǒng)dev : 設(shè)備文件root:root用戶目錄etc: 系統(tǒng)配置文件sbin:系統(tǒng)管理的程序home : 用戶目錄tmp : 臨時(shí)文件lib : 庫(kù)文件usr : 應(yīng)用程序mnt : 掛載文件系統(tǒng)的掛載點(diǎn)var : 存放系統(tǒng)日志或一些服務(wù)程序的臨時(shí)文件

2. 嵌入式環(huán)境需要移植的目錄

根文件系統(tǒng)中的每一個(gè)頂級(jí)目錄都有特定的用途和目的 ,但并不是所有的目錄在嵌入式環(huán)境下都需要,我們只創(chuàng)建需要的一些目錄:

?/bin?/sbin??/etc?/proc??/tmp??/var?/dev??/mnt

Linux根文件系統(tǒng)至少應(yīng)包括以下幾項(xiàng)內(nèi)容。

    基本的文件系統(tǒng)結(jié)構(gòu),包含一些必需的目錄比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等?;境绦蜻\(yùn)行所需的庫(kù)函數(shù),如glibc?;镜南到y(tǒng)配置文件,比如rc.sysinit,inittab等腳本文件。必要的設(shè)備文件支持:/dev/hd*,/dev/tty*,/dev/fd0?;镜膽?yīng)用程序,如sh,ls,cp,mv等。

3. 移植需要做的工作

    把全局配置文件放入/etc目錄下。將設(shè)備文件信息放入/dev目錄下,設(shè)備名可以作為符號(hào)鏈接定位在/dev中或/dev子目錄中的其他設(shè)備存在。操作系統(tǒng)核心定位在/或/boot,若操作系統(tǒng)核心不是作為文件系統(tǒng)的一個(gè)文件存在,不應(yīng)用它。庫(kù)存放的目錄是/lib。存放系統(tǒng)編譯后的可執(zhí)行文件、命令的目錄是/bin,/sbin,/usr。

三、 默認(rèn)預(yù)置條件

1) 交叉編譯工具

需要預(yù)先安裝好交叉編譯器 ,一口君安裝版本是:arm-none-linux-gnueabi-gcc 默認(rèn)在ubuntu中安裝目錄是:

/home/peng/toolchain/gcc-4.6.4/
2) tftp服務(wù)器

開發(fā)板下載內(nèi)核鏡像和設(shè)備樹需要借助tftp服務(wù)器,配置信息如下:

peng@ubuntu:~$?cat?/etc/default/tftpd-hpa?
#?/etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

服務(wù)器根目錄是**/tftpboot**

3) nfs服務(wù)器

內(nèi)核啟動(dòng)后掛載文件系統(tǒng)需要通過nfs服務(wù)器,nfs服務(wù)器設(shè)置如下:

peng@ubuntu:~$?cat?/etc/exports?
#?/etc/exports:?the?access?control?list?for?filesystems?which?may?be?exported
#??to?NFS?clients.??See?exports(5).
#
#?Example?for?NFSv2?and?NFSv3:
#?/srv/homes???????hostname1(rw,sync,no_subtree_check)?hostname2(ro,sync,no_subtree_check)
#
#?Example?for?NFSv4:
#?/srv/nfs4????????gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
#?/srv/nfs4/homes??gss/krb5i(rw,sync,no_subtree_check)
#
/source/rootfs?*(rw,sync,no_subtree_check)

四、文件系統(tǒng)制作步驟

1、 源碼下載

我們選擇的版本是busybox-1.22.1.tar.bz2下載路徑為:

http://busybox.net/downloads/

2、 解壓源碼

$?tar??xvf??busybox-1.22.1.tar.bz2

3、 進(jìn)入源碼目錄

$?cd??busybox-1.22.1

4、 配置源碼

選擇制作靜態(tài)庫(kù),并設(shè)置交互編譯工具鏈的前綴arm-none-linux-gnueabi-如果是其他工具鏈,按照例子填寫即可。

$?make?menuconfig
Busybox?Settings?--->?
??Build?Options?--->
???[*]?Build?BusyBox?as?a?static?binary?(no?shared?libs)
???[?]?Force?NOMMU?build
???[?]?Build?with?Large?File?Support?(for?accessing?files?>?2?GB)
???(arm-none-linux-gnueabi-)?Cross?Compiler?prefix
???()?Additional?CFLAGS

5、 編譯

$?make

6、 安裝

busybox默認(rèn)安裝路徑為源碼目錄下的_install

$?make??install?

7、 進(jìn)入安裝目錄下

默認(rèn)創(chuàng)建以下4個(gè)文件或者文件夾

$?cd??_install
$?ls
bin??linuxrc??sbin??usr

8、 創(chuàng)建其他需要的目錄

$?mkdir??dev??etc??mnt??proc??var??tmp??sys??root?

9、 添加庫(kù)

我們安裝的交叉工具鏈中有我們所需要的可以在開發(fā)板上使用的庫(kù), 將其拷貝到_install目錄下即可:

$?cp??/home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/??.??-a

修改文件權(quán)限并刪除靜態(tài)庫(kù)和共享庫(kù)文件中的符號(hào)表

$chmod??+w??lib
$chmod??+w??lib/*
$?rm??lib/*.a
$?arm-none-linux-gnueabi-strip??lib/*

刪除不需要的庫(kù),確保所有庫(kù)大小不超過8M

$?du??-mh???lib/

10、 添加系統(tǒng)啟動(dòng)文件

在etc下添加文件inittab,文件內(nèi)容如下:

#this?is?run?first?except?when?booting?in?single-user?mode.
::sysinit:/etc/init.d/rcS
#?/bin/sh?invocations?on?selected?ttys
#?start?an?"askfirst"?shell?on?the?console?(whatever?that?may?be)
::askfirst:-/bin/sh
#?stuff?to?do?when?restarting?the?init?process
::restart:/sbin/init
#?stuff?to?do?before?rebooting
::ctrlaltdel:/sbin/reboot

在etc下添加文件fstab,文件內(nèi)容如下:

#device?????mount-point???type??????options?????????dump?????fsck?order
proc?????? /proc?????????proc??????defaults???????0???????0
tmpfs??    /tmp?????????tmpfs?????defaults??????????0???????????0
sysfs??????/sys??????????sysfs?????defaults?????????0???????????0
tmpfs??   ?/dev?????????tmpfs?????defaults??????????0???????????0

【注意】這里我們掛載的文件系統(tǒng)有三個(gè)proc、sysfs和tmpfs。在內(nèi)核中proc和sysfs默認(rèn)都支持,而tmpfs是沒有支持的,我們需要確保內(nèi)核有tmpfs的支持。

修改內(nèi)核配置:

$?make?menuconfig
File?systems?--->
??Pseudo?filesystems?--->?
???[*]?Virtual?memory?file?system?support?(former?shm?fs)
???[*]?Tmpfs?POSIX?Access?Control?Lists

重新編譯內(nèi)核

在etc下創(chuàng)建init.d目錄,并在init.d下創(chuàng)建rcS文件,rcS文件內(nèi)容為:

#!/bin/sh
#?This?is?the?first?script?called?by?init?process
/bin/mount??-a??掛載fstab制定的所有文件系統(tǒng)
echo??/sbin/mdev??>??/proc/sys/kernel/hotplug
/sbin/mdev??-s

為rcS添加可執(zhí)行權(quán)限:

$?chmod???+x??init.d/rcS

在etc下添加profile文件,文件內(nèi)容為:

#!/bin/sh
export?HOSTNAME=farsight
export?USER=root
export?HOME=root
export?PS1="[$USER@$HOSTNAME?W]#?"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export?PATH??LD_LIBRARY_PATH
mknod?dev/console?c??5??1????該文件節(jié)點(diǎn)是必須的

重要:新制作的文件系統(tǒng)尺寸若超出8M,刪除不需要的庫(kù)文件,比如c++庫(kù)等。

11. 測(cè)試

制作完畢的根文件系統(tǒng)可以讓開發(fā)板啟動(dòng)后通過nfs掛載到ubuntu中,

    刪除原先的/source/rootfs
$?sudo??rm??-rf??/source/rootfs?
    將我們新建的根文件系統(tǒng)拷貝到/source/rootfs目錄下
$sudo??mkdir??/source/rootfs
$?sudo??cp??_install/*???/source/rootfs???–a
    設(shè)置uboot環(huán)境變量
#?setenv?serverip?192.168.9.120
#?setenv?ipaddr?192.168.9.233
#?setenv?bootcmd?tftp?41000000?uImage;tftp?42000000?exynos4412-fs4412.dtb;bootm?41000000??–??42000000
#setenv?bootargs?root=/dev/nfs?nfsroot=192.168.9.120:/source/rootfs?rw?console=ttySAC2,115200??init=/linuxrc??ip=192.168.9.233
#?saveenv

重新啟動(dòng)開發(fā)板,查看是否能夠正常掛載,功能是否正常

五、制作ramdisk文件系統(tǒng)

通過NFS測(cè)試以后,就可以制作ramdisk文件系統(tǒng)了,具體如下:

1、制作一個(gè)大小為8M的鏡像文件

?$?cd??~
$?dd??if=/dev/zero??of=ramdisk??bs=1k??count=8192?(ramdsik為8M)
?If:?input?file
?Of:?output?file

2、格式化這個(gè)鏡像文件為ext2

$?mkfs.ext2??-F??ramdisk

3、在mount下面創(chuàng)建initrd目錄作為掛載點(diǎn)

$?sudo??mkdir??/mnt/initrd

4、將這個(gè)磁盤鏡像文件掛載到/mnt/initrd下

注意這里的ramdisk不能存放在rootfs目錄中

$?sudo??mount??-t??ext2???ramdisk??/mnt/initrd

5、將測(cè)試好的文件系統(tǒng)里的內(nèi)容全部拷貝到 /mnt/initrd目錄下面

$?sudo??cp??/source/rootfs/*???/mnt/initrd??–a

如果拷貝遇到錯(cuò)誤,需要再次刪除不需要的庫(kù),比如c++庫(kù)

6、卸載/mnt/initrd

$?sudo??umount??/mnt/initrd

7、壓縮ramdisk為ramdisk.gz

$?gzip??--best??-c??ramdisk??>??ramdisk.gz

8、格式化為uboot識(shí)別的格式并拷貝到/tftpboot下

$?mkimage?-n?"ramdisk"?-A?arm?-O?linux?-T?ramdisk?-C?gzip??-d?ramdisk.gz??ramdisk.img
$?cp??ramdisk.img??/tftpboot

9、配置內(nèi)核支持RAMDISK

制作完 initrd.img.gz后,需要配置內(nèi)核支持RAMDISK作為啟動(dòng)文件系統(tǒng)

make?menuconfig
File?systems??--->
??<*>?Second?extended?fs?support
Device?Drivers
??SCSI?device?support??--->
???<*>?SCSI?disk?support
??Block?devices??--->
???<*>RAM??block??device??support???
???(16)Default?number?of?RAM?disks??
???(8192)?Default?RAM?disk?size?(kbytes)???(修改為8M)?
General?setup??--->
??[*]?Initial?RAM?filesystem?and?RAM?disk?(initramfs/initrd)?support

重新編譯內(nèi)核,復(fù)制到/tftpboot

10、在U-BOOT命令行重新設(shè)置啟動(dòng)參數(shù):

#?setenv?bootcmd?tftp?41000000?uImage;tftp?42000000?exynos4412-fs4412.dtb;tftp?43000000??ramdisk.img;bootm?41000000?43000000?42000000
#?saveenv

重新啟動(dòng)開發(fā)板查看能否正常啟動(dòng)

【注意】 因?yàn)楦鱾€(gè)開發(fā)板命令會(huì)有所差異,uboot命令的設(shè)置要廠家出廠的手冊(cè)操作

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
SN65HVD232D 1 Texas Instruments 3.3 V CAN Transceiver 8-SOIC -40 to 85

ECAD模型

下載ECAD模型
$2.72 查看
HFBR-2412TCZ 1 Foxconn Receiver, ST Connector, Through Hole Mount, ROHS COMPLIANT, PLASTIC, 8 PIN
$9.85 查看
LTST-C191KRKT 1 Lite-On Semiconductor Corporation Single Color LED, Red, Water Clear, 1.1mm, GREEN, PLASTIC PACKAGE-2

ECAD模型

下載ECAD模型
$0.08 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號(hào)『一口Linux』號(hào)主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗(yàn)和培訓(xùn)經(jīng)驗(yàn)。曾任職ZTE,某研究所,華清遠(yuǎn)見教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計(jì)算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動(dòng)、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實(shí)際項(xiàng)目出發(fā),保持原理+實(shí)踐風(fēng)格,適合Linux驅(qū)動(dòng)新手入門和技術(shù)進(jìn)階。