linux rootfs制作


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)
#

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM