|
點擊左上方藍色“一口Linux”,選擇“設為星標”
第一時間看干貨文章
?【干貨】嵌入式驅動工程師學習路線?【干貨】Linux嵌入式知識點-思維導圖-免費獲取?【就業(yè)】一個可以寫到簡歷的基于Linux物聯(lián)網綜合項目?【就業(yè)】找工作簡歷模版
zzkacruuqg5640838120.gif (555.24 KB, 下載次數(shù): 0)
下載附件
保存到相冊
zzkacruuqg5640838120.gif
2024-9-14 18:56 上傳
一、分析1. 文件系統(tǒng)簡介理論上說一個嵌入式設備如果內核能夠運行起來,且不需要運行用戶進程的話,是不需要文件系統(tǒng)的,文件系統(tǒng)簡單的說就是一種目錄結構,由于 linux操作系統(tǒng)的設備在系統(tǒng)中是以文件的形式存在,將這些文件進行分類管理以及提供和內核交互的接口,就形成一定的目錄結構也就是文件系統(tǒng),文件系統(tǒng)是為用戶反映系統(tǒng)的一種形式,為用戶提供一個檢測控制系統(tǒng)的接口。
根文件系統(tǒng),我認為根文件系統(tǒng)就是一種特殊的文件系統(tǒng),那么根文件系統(tǒng)和普通的文件系統(tǒng)有什么區(qū)別呢?
由于根文件系統(tǒng)是內核啟動時掛在的第一個文件系統(tǒng),那么根文件系統(tǒng)就要包括Linux啟動時所必須的目錄和關鍵性的文件;
例如Linux啟動時都需要有init目錄下的相關文件,在 Linux掛載分區(qū)時Linux一定會找/etc/fstab這個掛載文件等,根文件系統(tǒng)中還包括了許多的應用程序bin目錄等,任何包括這些Linux 系統(tǒng)啟動所必須的文件都可以成為根文件系統(tǒng)。
Linux支持多種文件系統(tǒng),包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs等,為了對各類文件系統(tǒng)進行統(tǒng)一管理,Linux引入了虛擬文件系統(tǒng)VFS(Virtual File System),為各類文件系統(tǒng)提供一個統(tǒng)一的操作界面和應用編程接口。
Linux啟動時,第一個必須掛載的是根文件系統(tǒng);若系統(tǒng)不能從指定設備上掛載根文件系統(tǒng),則系統(tǒng)會出錯而退出啟動。之后可以自動或手動掛載其他的文件系統(tǒng)。因此,一個系統(tǒng)中可以同時存在不同的文件系統(tǒng)。
不同的文件系統(tǒng)類型有不同的特點,因而根據(jù)存儲設備的硬件特性、系統(tǒng)需求等有不同的應用場合。在嵌入式Linux應用中,主要的存儲設備為 RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲器),常用的基于存儲設備的文件系統(tǒng)類型包括:jffs2, yaffs, cramfs, romfs,ramdisk, ramfs/tmpfs等。
2. 基于FLASH的文件系統(tǒng)2.1 Cramfs:Compressed ROM File System?它的速度快,效率高,其只讀的特點有利于保護文件系統(tǒng)免受破壞,提高了系統(tǒng)的可靠性。由于以上特性,Cramfs在嵌入式系統(tǒng)中應用廣泛。
但是它的只讀屬性同時又是它的一大缺陷,使得用戶無法對其內容對進行擴充。Cramfs映像通常是放在Flash中。
2.2 jffs2?Jffs2: 日志閃存文件系統(tǒng)版本2 (Journalling Flash FileSystem v2)
?主要用于NOR型閃存,基于MTD驅動層,特點是:可讀寫的、支持數(shù)據(jù)壓縮的、基于哈希表的日志型文件系統(tǒng),并提供了崩潰/掉電安全保護,提供“寫平衡”支持等。
?缺點主要是當文件系統(tǒng)已滿或接近滿時,因為垃圾收集的關系而使jffs2的運行速度大大放慢。jffs不適合用于NAND閃存主要是因為NAND閃存的容量一般較大,這樣導致jffs為維護日志節(jié)點所占用的內存空間迅速增大,另外,jffs 文件系統(tǒng)在掛載時需要掃描整個FLASH的內容,以找出所有的日志節(jié)點,建立文件結構,對于大容量的NAND閃存會耗費大量時間。
2.3.yaffs:Yet Another Flash File System?yaffs/yaffs2是專為嵌入式系統(tǒng)使用NAND型閃存而設計的一種日志型文件系統(tǒng)。與jffs2相比,它減少了一些功能(例如不支持數(shù)據(jù)壓縮),所以速度更快,掛載時間很短,對內存的占用較小。另外,它還是跨平臺的文件系統(tǒng),除了Linux和eCos,還支持WinCE, pSOS和ThreadX等。yaffs/yaffs2自帶NAND芯片的驅動,并且為嵌入式系統(tǒng)提供了直接訪問文件系統(tǒng)的API,用戶可以不使用Linux中的MTD與 VFS,直接對文件系統(tǒng)操作。當然,yaffs也可與MTD驅動程序配合使用。
?yaffs與yaffs2的主要區(qū)別在于,前者僅支持小頁(512 Bytes) NAND閃存,后者則可支持大頁(2KB) NAND閃存。同時,yaffs2在內存空間占用、垃圾回收速度、讀/寫速度等方面均有大幅提升。
2.4. 網絡文件系統(tǒng)NFS (Network File System)NFS是由Sun開發(fā)并發(fā)展起來的一項在不同機器、不同操作系統(tǒng)之間通過網絡共享文件的技術。
在嵌入式Linux系統(tǒng)的開發(fā)調試階段,可以利用該技術在主機上建立基于NFS的根文件系統(tǒng),掛載到嵌入式設備,可以很方便地修改根文件系統(tǒng)的內容。
所采用的工具: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)目錄內容簡介bin :基本的可執(zhí)行文件opt :添加的軟件包boot :啟動時需要的一些文件proc :內核及進程信息的虛擬文件系統(tǒng)dev : 設備文件root:root用戶目錄etc: 系統(tǒng)配置文件sbin:系統(tǒng)管理的程序home : 用戶目錄tmp : 臨時文件lib : 庫文件usr : 應用程序mnt : 掛載文件系統(tǒng)的掛載點var : 存放系統(tǒng)日志或一些服務程序的臨時文件2. 嵌入式環(huán)境需要移植的目錄根文件系統(tǒng)中的每一個頂級目錄都有特定的用途和目的 ,但并不是所有的目錄在嵌入式環(huán)境下都需要,我們只創(chuàng)建需要的一些目錄:
/bin /sbin /etc /proc /tmp /var /dev /mnt
Linux根文件系統(tǒng)至少應包括以下幾項內容。
基本的文件系統(tǒng)結構,包含一些必需的目錄比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。基本程序運行所需的庫函數(shù),如glibc;镜南到y(tǒng)配置文件,比如rc.sysinit,inittab等腳本文件。必要的設備文件支持:/dev/hd*,/dev/tty*,/dev/fd0;镜膽贸绦颍鐂h,ls,cp,mv等。[/ol]3. 移植需要做的工作把全局配置文件放入/etc目錄下。將設備文件信息放入/dev目錄下,設備名可以作為符號鏈接定位在/dev中或/dev子目錄中的其他設備存在。操作系統(tǒng)核心定位在/或/boot,若操作系統(tǒng)核心不是作為文件系統(tǒng)的一個文件存在,不應用它。庫存放的目錄是/lib。存放系統(tǒng)編譯后的可執(zhí)行文件、命令的目錄是/bin,/sbin,/usr。[/ol]三、 默認預置條件1) 交叉編譯工具需要預先安裝好交叉編譯器 ,一口君安裝版本是:arm-none-linux-gnueabi-gcc 默認在ubuntu中安裝目錄是:
/home/peng/toolchain/gcc-4.6.4/
2) tftp服務器開發(fā)板下載內核鏡像和設備樹需要借助tftp服務器,配置信息如下:
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"
服務器根目錄是**/tftpboot**
3) nfs服務器內核啟動后掛載文件系統(tǒng)需要通過nfs服務器,nfs服務器設置如下:
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、 進入源碼目錄$ cd busybox-1.22.1
4、 配置源碼選擇制作靜態(tài)庫,并設置交互編譯工具鏈的前綴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默認安裝路徑為源碼目錄下的_install
$ make install
7、 進入安裝目錄下默認創(chuàng)建以下4個文件或者文件夾
$ cd _install
$ ls
bin linuxrc sbin usr
8、 創(chuàng)建其他需要的目錄$ mkdir dev etc mnt proc var tmp sys root
9、 添加庫我們安裝的交叉工具鏈中有我們所需要的可以在開發(fā)板上使用的庫, 將其拷貝到_install目錄下即可:
$ cp /home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/ . -a
修改文件權限并刪除靜態(tài)庫和共享庫文件中的符號表
$chmod +w lib
$chmod +w lib/*
$ rm lib/*.a
$ arm-none-linux-gnueabi-strip lib/*
刪除不需要的庫,確保所有庫大小不超過8M
$ du -mh lib/
10、 添加系統(tǒng)啟動文件在etc下添加文件inittab,文件內容如下:
#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,文件內容如下:
#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)有三個proc、sysfs和tmpfs。在內核中proc和sysfs默認都支持,而tmpfs是沒有支持的,我們需要確保內核有tmpfs的支持。
修改內核配置:
$ make menuconfig
File systems --->
Pseudo filesystems --->
Virtual memory file system support (former shm fs)
Tmpfs POSIX Access Control Lists
重新編譯內核
在etc下創(chuàng)建init.d目錄,并在init.d下創(chuàng)建rcS文件,rcS文件內容為:
#!/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í)行權限:
$ chmod +x init.d/rcS
在etc下添加profile文件,文件內容為:
#!/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é)點是必須的
重要:新制作的文件系統(tǒng)尺寸若超出8M,刪除不需要的庫文件,比如c++庫等。
11. 測試制作完畢的根文件系統(tǒng)可以讓開發(fā)板啟動后通過nfs掛載到ubuntu中,
刪除原先的/source/rootfs[/ol]$ sudo rm -rf /source/rootfs
將我們新建的根文件系統(tǒng)拷貝到/source/rootfs目錄下[/ol]$sudo mkdir /source/rootfs
$ sudo cp _install/* /source/rootfs –a
設置uboot環(huán)境變量[/ol]# 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
重新啟動開發(fā)板,查看是否能夠正常掛載,功能是否正常 |
|