1. 程式人生 > >cramfs根檔案系統製作啟動總結

cramfs根檔案系統製作啟動總結

cramfs啟動根檔案系統

Cramfs:Compressed ROM File System
  Cramfs是Linux的創始人 Linus Torvalds參與開發的一種只讀的壓縮檔案系統。它也基於MTD驅動程式。
  cramfs擁有以下一些特性: 
採用實時解壓縮方式,但解壓縮的時侯有延遲。 
cramfs的資料都是經過處理、打包的,對其進先寫操作有一定困難。所以cramfs不支援寫操作,這個特性剛好適合嵌入式應用中使用Flash儲存檔案系統的場合。 
在cramfs中,檔案最大不能超過16MB。 
支援組標識(gid),但是mkcramfs只將gid的低8位儲存下來,因此只有這8位是有效的。 
支援硬連結。但是cramfs並沒有完全處理好,硬連結的檔案屬性中,連結數仍然為1. cramfs的目錄中,沒有“.”和“..”這兩項。因此,cramfs中的目錄的連結數通常也僅有一個。 
cramfs中,不會儲存檔案的時間戳(timestamps)資訊。當然,正在使用的檔案由於inode儲存在記憶體中,因此其時間可以暫時地變更為最新時間,但是不會儲存到cramfs檔案系統中去。

1、檔案系統的製作<各種檔案系統通用做法>

a)下載busybox 原始碼

[email protected]:/home/Tools#ls
arm-2009q3.tar.bz2   
busybox-1.14.4.tar.bz2 genext2fs-1.4.1

[email protected]:/home/Tools# 

b)最基本的根檔案系統目錄說明

嵌入式 Linux 中都需要構建根檔案系統,構建根檔案系統的規則在FHS(FilesystemHierarchy Standard)文件中,下面是根檔案系統頂層目錄。

目錄   內容
bin     存放所有使用者都可以使用的、基本的命令。
sbin   存放的是基本的系統命令,它們用於啟動系統、修復系統等。
usr     使用者檔案資訊。
proc   這是個空目錄,常作為proc 檔案系統的掛載點(核心與使用者的介面)。
dev    該目錄存放裝置檔案和其它特殊檔案。
etc     存放系統配置檔案,包括啟動檔案。
lib      存放共享庫
mnt   用於臨時掛接某個檔案系統的掛接點,通常是空目錄。也可以在裡面創      建空的子目錄。

sys   也是對應的一種檔案系統、匯流排、裝置、驅動模型。
tmp  
存放臨時檔案,通常是空目錄。
var     存放可變的資料,如日誌等。

c)使用指令碼建立上面目錄

[email protected]:/home/ # vi creat_rootfs

#! /bin/sh

echo "creatintrootfs dir......"

mkdir /usr/local/rootfs

cd rootfs

echo "makingdir : bin dev etc lib proc sbin sys usr"

mkdir bin dev etc libproc sbin sys usr #

必備的8個目錄

mkdir usr/bin usr/libusr/sbin lib/modules

# Don't use mknod,unless you run this Script as root !

mknod -m 600dev/console c 5 1

mknod -m 666 dev/null c1 3

echo "makingdir : mnt tmp var"

mkdir mnt tmp var

chmod 1777 tmp

mkdir mnt/etc mnt/jffs2mnt/yaffs mnt/data mnt/temp

mkdir var/lib var/lockvar/log var/run var/tmp 

chmod 1777 var/tmp

儲存退出並修改許可權

[email protected]:/home/#chmod 777 creat_rootfs

[email protected]:/home# ./creat_rootfs

creatint rootfsdir......

making dir : bindev etc lib proc sbin sys usr

making dir : mnttmp var

[email protected]:/home# 

d)配置、編譯、安裝busybox

[email protected]:/home/Tools#tar zxvfbusybox-1.14.4.tar.bz2

[email protected]:/home/Tools#cd busybox-1.14.4

[email protected]:/home/Tools/busybox-1.14.4#vim Makefile

第164

CROSS_COMPILE ?= arm-none-Linux-gnueabi-

第190

ARCH ?= arm

儲存退出、在原有的基礎上進行配置、列出注意的地方尚未說明的使用預設配置

[email protected]:/home/Tools/busybox-1.14.4#make menuconfig

  ││    BusyboxSettings  ---> 

  ││   BuildOptions  --->
  │ │[ ] Build BusyBox as a static binary (no sharedlibs)                       //
這裡使用動態庫
  │ │[ ] Force NOMMUbuild                                               
  │ │[*] Buildwith Large File Support (for accessing files > 2GB)       
  │ │(arm-linux-) Cross Compiler prefix 
                                                  //交叉工具編譯鏈 按空格可以進行修改
  │ │()  Additional CFLAGS 

  ││    Installation Options  --->  

  │ │[*] Don'tuse/usr                                                
  │ │    Applets links (as soft-links) --->                            
  │ │(/home/eilian/development/rootfs) BusyBox installation prefix   //
指定busybox的安裝路徑

  ││    Busybox Library Tuning  ---> 
  │ │(6) Minimum passwordlength                                          
  │ │(2) MD5: Trade Bytes forSpeed                                      
  │ │[*] Faster /proc scanning code (+100bytes)                          
  │ │[*] Support for/etc/networks                                    
  │ │[*] Command lineediting                                            
  │ │(1024) Maximum length ofinput                                      
  │ │[*]   vi-style lineeditingcommands                                  │ │(15)  Historysize                                                   │ │[*]   Historysaving                                                
  │ │[*]   Tab completion 
  │ │[*]    Usernamecompletion                                          │ │[*]   Fancy shellprompts                                          
  │ │[ ] Give more precise messages when copy fails (cp, mvetc)          
  │ │(4) Copy buffer size, in kilobytes                               
  │ │[ ] Use clock_gettime(CLOCK_MONOTONIC)syscall                      
  │ │[*] Use ioctl names rather than hex values in errormessages        
  │ │[*] Support infinibandHW                                          

  ││    Linux Module Utilities  --->  

  │ │[*]Simplifiedmodutils                                          
  │ │[*]   Accept module options on modprobe commandline                
  │ │[*]   Skip loading of already loadedmodules     
                    
  │ │--- Options common to multiplemodutils                              
  │ │(/lib/modules) Default directory containingmodules               
  │ │(modules.dep) Default name ofmodules.dep       

  ││    Linux System Utilities  --->   │ │[*]   Support/etc/mdev.conf 
  │ │[*]     Support command execution at deviceaddition/removal   

  ││    Init Utilities --->      

  ││[*]   Support reading an inittab file

注意:

“Support reading an inittab file”應該選中,這樣可以根據自己編寫的inittab檔案初始化;

“Support running commands with a controlling-tty”應該選中,否則會提示非常困擾的“/bin/sh: can't access tty; job control turned off”的提示,儘管可以進入控制檯命令列。

上述配置完成後基本可以,配置完後儲存退出

----編譯busybox

[email protected]:/home/Tools/busybox-1.14.4#make

[email protected]:/home/Tools/busybox-1.14.4#make install

編譯安裝完成後在rootfs 目錄下會生成目錄bin、sbin、usr 和檔案linuxrc 的內容

-----檢視所需要的庫(因為選擇了動態庫)

[email protected]:/home/Tools/busybox-1.14.4# arm-linux-r

arm-linux-ranlib   arm-linux-readelf  

[email protected]:/home/Tools/busybox-1.14.4# arm-linux-readelf-d busybox

Dynamic section at offset 0xce00c contains 25 entries:

  Tag       Type                        Name/Value
 0x00000001(NEEDED)                     Sharedlibrary: [libm.so.6]
 0x00000001(NEEDED)                     Sharedlibrary: [libc.so.6]
 0x0000000c(INIT)                      0xc38c
 0x0000000d(FINI)                      0xb2c8c
 0x00000019(INIT_ARRAY)                0xde000
 0x0000001b(INIT_ARRAYSZ)              4 (bytes)
 0x0000001a(FINI_ARRAY)                0xde004
 0x0000001c(FINI_ARRAYSZ)              4 (bytes)
 0x00000004(HASH)                      0x8128
 0x00000005(STRTAB)                    0xa590
 0x00000006(SYMTAB)                    0x8bc0
 0x0000000a(STRSZ)                     3514 (bytes)
 0x0000000b(SYMENT)                    16 (bytes)
 0x00000015(DEBUG)                     0x0
 0x00000003(PLTGOT)                    0xde0fc
 0x00000002(PLTRELSZ)                  3160 (bytes)
 0x00000014(PLTREL)                    REL
 0x00000017(JMPREL)                    0xb734
 0x00000011(REL)                       0xb6c4
 0x00000012(RELSZ)                     112 (bytes)
 0x00000013(RELENT)                    8 (bytes)
 0x6ffffffe (VERNEED)                   0xb684
 0x6fffffff(VERNEEDNUM)                2
 0x6ffffff0(VERSYM)                    0xb34a
 0x00000000(NULL)                      0x0
[email protected]:/home/Tools/busybox-1.14.4# 

拷貝庫檔案  直接拷貝交叉編譯器中的lib庫就OK

[email protected]:/usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib# ls

1.   ld-2.10.1.so               libgcc_s.so.1            libnss_nisplus-2.10.1.so  

2.   ld-linux.so.3              libm-2.10.1.so           libnss_nisplus.so.2

3.   libanl-2.10.1.so           libmemusage.so           libnss_nis.so.2

4.   libanl.so.1                libm.so.6                libpcprofile.so  

5.   libBrokenLocale-2.10.1.so  libnsl-2.10.1.so         libpthread-2.10.1.so  

6.   libBrokenLocale.so.1       libnsl.so.1              libpthread.so.0

7.   libc-2.10.1.so             libnss_compat-2.10.1.so  libresolv-2.10.1.so  

8.   libcidn-2.10.1.so          libnss_compat.so.2       libresolv.so.2

9.   libcidn.so.1               libnss_dns-2.10.1.so     librt-2.10.1.so  

10.  libcrypt-2.10.1.so         libnss_dns.so.2          librt.so.1

11.  libcrypt.so.1              libnss_files-2.10.1.so   libSegFault.so  

12.  libc.so.6                  libnss_files.so.2        libthread_db-1.0.so  

13.  libdl-2.10.1.so            libnss_hesiod-2.10.1.so  libthread_db.so.1

14.  libdl.so.2                 libnss_hesiod.so.2       libutil-2.10.1.so  

15.  libgcc_s.so                libnss_nis-2.10.1.so     libutil.so.1

找到我們需要的直接拷貝到根檔案系統目錄下的lib目錄下即可(rootfs/lib),不過為了保險起見可以將上面這些庫檔案全部拷貝到rootfs/lib目錄下

cp /usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib/*/usr/local/rootfs/lib

------建立和修改一些必要的配置檔案

---------增加為shell匯入全域性變數的檔案/etc/profile

<span style="font-size:13px;">

#/etc/profile: system-wide .profile file for the Bourne shells  

echo "Processing /etc/profile... "

#set search library path  

echo "Set search library path in /etc/profile"

export LD_LIBRARY_PATH=/lib:/usr/lib  

#set user path  

echo "Set user path in /etc/profile"

PATH=/bin:/sbin:/usr/bin:/usr/sbin  

export PATH  

USER="id -un"

LOGNAME=$USER    

PS1='\[email protected]\h#'

PATH = $PATH     

HOSTNAME='/bin/hostname'

export USER LOGNAME PS1 PATH </span>  

----------趕緊的profile中用的HOSTNAME檔案即主機名

----------在etc/目錄下面新建sysconfig目錄,在該目錄下新建HOSTNAME檔案,

<span style="font-size:13px;">

vi HOSTNAME   

bootloader</span> 

---------增加初始化檔案

[email protected]:/home/rootfs/etc#gedit inittab

<span style="font-size:13px;">#etc/inittab  

::sysinit:/etc/init.d/rcS  

console::askfirst:-/bin/sh  

::ctrlaltdel:/sbin/reboot  

::shutdown:/bin/umount -a –r  

</span>  

[email protected]:/home/rootfs/etc#chmod a+x inittab

--------新建etc/profile使用者環境配置檔案,

[email protected]:/home/rootfs/etc#gedit fstab

#device mount-point  type       option      dump  fsck  order  

proc    /proc   proc    defaults    00

none     /tmp    ramfs   defaults    00

sysfs    /sys    sysfs   defaults    00

mdev    /dev    ramfs   defaults    00

---------增加初始化指令碼

[email protected]:/home/rootfs/etc/init.d#gedit rcS

#!/bin/sh  

runlevel=S   

prevlevel=N  

umask 022

export PATH runlevel prevlevel  

echo "**************munt all************************"

mount -a    

echo /sbin/mdev>/proc/sys/kernel/hotplug  

mdev -s  

echo "***********************************************"

echo "**********booting for QT6410    ***************"

echo "Kernel version:linux-2.6.39"

echo "Author:eilian"

echo "Date:2011.12.13"

echo "***********************************************"

/bin/hostname -F /etc/sysconfig/HOSTNAME  

[email protected]:/home/rootfs/etc/init.d#chmod a+x rcS

---------建立一個mdev.conf檔案(/rootfs/etc下),內容可有可無
[email protected]:/home/rootfs/etc#
touch mdev.conf

這樣基本的檔案系統就這麼的搞定的

核心加入檔案系統的支援

││        File systems --->  

  ││    [*] Miscellaneous filesystems  --->    

  ││    <*>   Compressed ROM file system support(cramfs)    #支援cramfs   

 <*>   yaffs2 file systemsupport                                             #支援yaffs2
  │ │    -*-     512 byte / pagedevices   

配置好後儲存退出

[email protected]:/home/Linux/linux-2.6.39#make uImage

[email protected]:/home/Linux/linux-2.6.39#make modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

安裝核心模組了

[email protected]:/home/Linux/linux-2.6.39#make modules_install ARCH=arm INSTALL_MOD_PATH=/home/rootfs

至此檔案系統已完善

2、將roots壓縮成cramfs

-------- 編譯cramfs製作工具

http://sourceforge.Net/projects/cramfs/下載cramfs-1.1.tar.gz。

[email protected]loader:/home/Tools#tar zxvf cramfs-1.1.tar.gz

[email protected]:/home/Tools/cramfs-1.1#make

編譯完成之後,會生成mkcramfscramfsck兩個可執行檔案,其中mkcramfs工具是用來建立cramfs檔案系統的,而cramfsck工具則用來進行cramfs檔案系統的釋放以及檢查。將這兩個檔案拷貝到/usr/local/bin目錄下,方便使用.

[email protected]:/home/Tools/cramfs-1.1#cp mkcramfs cramfsck /usr/local/bin

---------mkcramfs的命令格式
mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile
mkcramfs的各個引數解釋如下:
-h:           顯示幫助資訊
-e edition:設定生成的檔案系統中的版本號
-i file:        將一個檔案映像插入這個檔案系統之中(只能在Linux2.4.0以後的核心版本中使用)
-n name:  設定cramfs檔案系統的名字
dirname:  指明需要被壓縮的整個目錄樹
outfile:     最終輸出的檔案

cramfsck的命令格式:
cramfsck [-hv] [-x dir] file
cramfsck的各個引數解釋如下:
-h:          顯示幫助資訊
-x dir:      釋放檔案到dir所指出的目錄中
-v:          輸出資訊更加詳細
file:         希望測試的目標檔案

--------壓縮rootfs根檔案系統生成cramfs

[email protected]:/home#mkcramfs ./rootfs ./cramfs

3、將cramfs燒寫到NANDFLASH中

當前,NandFlash分割槽情況如下:

-------------------------------------------------------------------------------------------------------------

NAND device: Manufacturer ID: 0xec, Chip ID: 0xda(Samsung NAND 256MiB 3,3V 8-bit)

Creating 4 MTD partitions on "NAND 256MiB 3,3V8-bit":

0x000000000000-0x000000100000 : "Bootloader"

0x000000100000-0x000000600000 : "Kernel"

0x000000600000-0x000007e00000 : "User"

0x000007e00000-0x000010000000 : "File System"

-------------------------------------------------------------------------------------------------------------

值得注意的事:修改uboot中啟動引數

setenv bootargs'root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200'
注意:啟動引數裡沒有寫上init=/linuxrc,所以啟動預設是按照busybox的配置檔案來進行的.