http://blog.sina.com.cn/s/blog_6795385f01011ifg.html
作一個嵌入式Linux rootfs,並且實現 web 服務
1.
文件系統簡介
•
理論上說一個嵌入式設備如果內核能夠運行起來,且不需要運行用戶進程的話,是不需要文件系統的,文件系統簡單的說就是
一種目錄結構,由於
linux
操作系統的設備在系統中是以文件的形式存在,將這些文件進行分類管理以及提供和內核交互的接
口,就形成一定的目錄結構也就是文件系統,文件系統是為用戶反映系統的一種形式,為用戶提供一個檢測控制系統的接口。
•
根文件系統,我認為根文件系統就是一種特殊的文件系統
,
那么根文件系統和普通的文件系統有什么區別呢?由於根文件系統
是內核啟動時掛在的第一個文件系統,那么根文件系統就要包括
Linux
啟動時所必須的目錄和關鍵性的文件,例如
Linux
啟動
時都需要有
init
目錄下的相關文件,在
Linux
掛載分區時
Linux
一定會找
/etc/fstab
這個掛載文件等,根文件系統中還包括了許
多的應用程序
bin
目錄等,任何包括這些
Linux
系統啟動所必須的文件都可以成為根文件系統。
•
Linux
支持多種文件系統,包括
ext2
、
ext3
、
vfat
、
ntfs
、
iso9660
、
jffs
、
yaffs
、
romfs
和
nfs
等,為了對各類文件系統進行
統一管理,
Linux
引入了虛擬文件系統
VFS(Virtual File System)
,為各類文件系統提供一個統一的操作界面和應用編程接口
。
•
Linux
啟動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。之后
可以自動或手動掛載其他的文件系統。因此,一個系統中可以同時存在不同的文件系統。不同的文件系統類型有不同的特點,
因而根據存儲設備的硬件特性、系統需求等有不同的應用場合。在嵌入式
Linux
應用中,主要的存儲設備為
RAM(DRAM, SDRAM)
和
ROM(
常采用
FLASH
存儲器
)
,常用的基於存儲設備的文件系統類型包括:
jffs2, yaffs, cramfs, romfs,
ramdisk, ramfs/tmpfs
等。
2.
基於
FLASH
的文件系統
•
2.1 Cramfs
:
Compressed ROM File System
•
它的速度快,效率高,其只讀的特點有利於保護文件系統免受破壞,提高了系統的可靠性。由於以上特性,
Cramfs
在嵌入式
系統中應用廣泛。但是它的只讀屬性同時又是它的一大缺陷,使得用戶無法對其內容對進擴充。
Cramfs
映像通常是放在
Flash
中。
•
2.2 jffs2
•
Jffs2:
日志閃存文件系統版本
2 (Journalling Flash FileSystem v2)
•主要用於NOR型閃存,基於MTD驅動層,特點是:可讀寫的、支持數據壓縮的、基於哈希表的日
志型文件系統,並提供了崩潰/掉電安全保護,提供“寫平衡”支持等。
•
缺點主要是當文件系統已滿或接近滿時,因為垃圾收集的關系而使
jffs2
的運行速度大大放慢。
jffs
不適合用於
NAND
閃存主要
是因為
NAND
閃存的容量一般較大,這樣導致
jffs
為維護日志節點所占用的內存空間迅速增大,另外,
jffs
文件系統在掛載時
需要掃描整個
FLASH
的內容,以找出所有的日志節點,建立文件結構,對於大容量的
NAND
閃存會耗費大量時間。
2.3.yaffs
:
Yet Another Flash File System
•
yaffs/yaffs2
是專為嵌入式系統使用
NAND
型閃存而設計的一種日志型文件系統。與
jffs2
相比,它減少了一些功能
(
例如不支
持數據壓縮
)
,所以速度更快,掛載時間很短,對內存的占用較小。另外,它還是跨平台的文件系統,除了
Linux
和
eCos
,還
支持
WinCE, pSOS
和
ThreadX
等。
yaffs/yaffs2
自帶
NAND
芯片的驅動,並且為嵌入式系統提供了直接訪問文件系統的
API
,用戶可以不使用
Linux
中的
MTD
與
VFS
,直接對文件系統操作。當然,
yaffs
也可與
MTD
驅動程序配合使用。
•
yaffs
與
yaffs2
的主要區別在於,前者僅支持小頁
(512 Bytes) NAND
閃存,后者則可支持大頁
(2KB) NAND
閃存。同時,
yaffs2
在內存空間占用、垃圾回收速度、讀
/
寫速度等方面均有大幅提升。
•
2.4.
網絡文件系統
NFS (Network File System)
•
NFS
是由
Sun
開發並發展起來的一項在不同機器、不同操作系統之間通過網絡共享文件的技術。
•
在嵌入式
Linux
系統的開發調試階段,可以利用該技術在主機上建立基於
NFS
的根文件系統,掛載到嵌入式設備,可以很方便
地修改根文件系統的內容。
•
所采用的工具:
mkfs.cramfs,mkfs.jffs2,mkfs.yaffs
•
http://sourceforge.net/projects/cramfs/
•
http://sourceforge.net/projects/jffs2os/
•
http://sourceforge.net/projects/yaffs/
3.根文件系統的組成
•
目錄
內容
•
Bin :
基本的可執行文件
•
Opt :
添加的軟件包
•
Boot :
啟動時需要的一些文件
•
Proc :
內核及進程信息的虛擬文件系統
•
Dev :
設備文件
Root:root用戶目錄
•
Etc:
系統配置文件
•
Sbin:
系統管理的程序
•
Home :
用戶目錄
•
Tmp :
臨時文件
•
Lib :
庫文件
•
Usr :
應用程序
•
Mnt :
掛載文件系統的掛載點
•
Var :
存放系統日志或一些服務程序的臨時文件
•
根文件系統中的每一個頂級目錄都有特定的用途和目的
•
但並不是所有的目錄在嵌入式環境下都需要,
•
我們只創建需要的一些目錄
:
•
/bin /sbin /etc /proc /tmp /var /dev /mnt
•
Linux
的根文件系統至少應包括以下幾項內容。
•
1
.基本的文件系統結構,包含一些必需的目錄比如:
/dev
,
/proc
,
/bin
,
/etc
,
/lib
,
/usr
,
/tmp
等。
•
2
.基本程序運行所需的庫函數,如
Glibc/uClibc
。
•
3
.基本的系統配置文件,比如
rc.sysinit
,
inittab
等腳本文件。
•
4
.必要的設備文件支持:
/dev/hd*
,
/dev/tty*
,
/dev/fd0
。
•
5
.基本的應用程序,如
sh
,
ls
,
cp
,
mv
等。
•
1
.把全局配置文件放入
/etc
目錄下。
•
2
.將設備文件信息放入
/dev
目錄下,設備名可以作為符號鏈接定位在
/dev
中或
/dev
子目錄中的其他設備存在。
•
3
.操作系統核心定位在
/
或
/boot
,若操作系統核心不是作為文件系統的一個文件存在,不應用它。
•
4
.庫存放的目錄是
/lib
。
•
5
.存放系統編譯后的可執行文件、命令的目錄是
/bin
,
/sbin
,
/usr
。
•
4.
定制文件系統
,
基於
ELDK
,
busybox
•
安裝
ELDK:
#mount –o loop arm-2008-11-24.iso /mnt
•
#/mnt/install –d /opt/eldk
•
#mkdir rootfs
;假定以下內容都是在
rootfs
目錄下:
•
4.1
自定義文件系統
•
目錄
bin
•
-------->
用
busybox
編譯
,
下面說明
•
目錄
sbin
•
-------->
用
busybox
編譯
,
下面說明
•
目錄
usr
•
-------->
建立
bin sbin
兩個空目錄
•
目錄
var
•
-------->
建立
log
空目錄
•
目錄
etc
•
------->
可以把
/opt /eldk/arm
下或者
s3c2410_recover
•
的
etc
拷貝過來修改
,
怎么修改下面說明,需要包括:
•
inittab
•
rc.local -> rc.d/rc.local
•
rc.sysinit -> rc.d/rc.sysinit
•
目錄
dev
•
------->
這里不能直接從
/opt/eldk/
下
拷貝
•
應當如下制作否則系統啟動是會說明找不到設備文件
console
之類
•
cd / rootfs/dev
•
/mnt/ELDK_MAKEDEV //ELDK_MAKEDEV
從
ELDK ISO
文件里
copy
出來
•
這樣在目錄
dev
節點文件就出現了
•
目錄
lib
•
------->
如果是采用靜態編譯,這里就空着;
•
如果采用動態編譯
,
從s3c2410_recover\lib
•
或
/usr/local/arm/3.4.1/arm-linux/lib
•
或
/opt/eldk/arm/lib copy
過來,再裁減
lib
庫
•
目錄
proc
•
------->
空着但必須有這目錄
•
4.2.etc/
下文件內容修改
•
4.2.1 etc/rc.d/rc.sysinit
•
這里你還可以按自己的要求修改
•
4.2.2 etc/rc.d/rc.local
•
以后要啟動的程序你可以加在這里
•
=============================================================
•
#!/bin/sh
•
#
•
# This script will be executed *after* all the other init scripts.
•
# You can put your own initialization stuff in here if you don't
•
# want to do the full Sys V style init stuff.
•
#touch /var/lock/subsys/local
•
=======================================
•4.2.3 etc/inittab
•
init
啟動后會首先執行這個文件
•
===========================================================
•
#
•
# inittab This file describes how the INIT process should set up
•
# the system in a certain run-level.
•
# Default runlevel. The runlevels used by RHS are:
•
# 0 - halt (Do NOT set initdefault to this)
•
# 1 - Single user mode
•
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
•
# 3 - Full multiuser mode
•
# 4 - unused
•
# 5 - X11
•
# 6 - reboot (Do NOT set initdefault to this)
•
#