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 源代码

可以从http://www.busybox.net/downloads/,这里下载的是busybox-1.14.4.tar.bz2

root@bootloader:/home/Tools#ls
arm-2009q3.tar.bz2   
busybox-1.14.4.tar.bz2 genext2fs-1.4.1

root@bootloader:/home/Tools# 

b)最基本的根文件系统目录说明

嵌入式 Linux 中都需要构建根文件系统,构建根文件系统的规则在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。

目录   内容
bin     存放所有用户都可以使用的、基本的命令。
sbin   存放的是基本的系统命令,它们用于启动系统、修复系统等。
usr     用户文件信息。
proc   这是个空目录,常作为proc 文件系统的挂载点(内核与用户的接口)。
dev    该目录存放设备文件和其它特殊文件。
etc     存放系统配置文件,包括启动文件。
lib      存放共享库
mnt   用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创      建空的子目录。

sys   也是对应的一种文件系统、总线、设备、驱动模型。
tmp  
存放临时文件,通常是空目录。
var     存放可变的数据,如日志等。

 

c)使用脚本创建上面目录

 

root@bootloader:/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

 

保存退出并修改权限

 

root@bootloader:/home/#chmod 777 creat_rootfs

root@bootloader:/home# ./creat_rootfs

creatint rootfsdir......

making dir : bindev etc lib proc sbin sys usr

making dir : mnttmp var

root@bootloader:/home# 

d)配置、编译、安装busybox

root@bootloader:/home/Tools#tar zxvfbusybox-1.14.4.tar.bz2

root@bootloader:/home/Tools#cd busybox-1.14.4

root@bootloader:/home/Tools/busybox-1.14.4#vim Makefile

  

第164

CROSS_COMPILE ?= arm-none-Linux-gnueabi-

 

第190

ARCH ?= arm

 

保存退出、在原有的基础上进行配置、列出注意的地方尚未说明的使用默认配置

root@bootloader:/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

root@bootloader:/home/Tools/busybox-1.14.4#make

root@bootloader:/home/Tools/busybox-1.14.4#make install

 

编译安装完成后在rootfs 目录下会生成目录bin、sbin、usr 和文件linuxrc 的内容

 

-----查看所需要的库(因为选择了动态库)

root@bootloader:/home/Tools/busybox-1.14.4# arm-linux-r

arm-linux-ranlib   arm-linux-readelf  

root@bootloader:/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
root@bootloader:/home/Tools/busybox-1.14.4# 

 

拷贝库文件  直接拷贝交叉编译器中的lib库就OK

root@bootloader:/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='\u@\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>  

 

---------增加初始化文件

root@bootloader:/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>  

root@bootloader:/home/rootfs/etc#chmod a+x inittab

--------新建etc/profile用户环境配置文件,

root@bootloader:/home/rootfs/etc#gedit fstab

#device mount-point  type       option      dump  fsck  order  

proc    /proc   proc    defaults    0   0  

none     /tmp    ramfs   defaults    0   0  

sysfs    /sys    sysfs   defaults    0   0  

mdev    /dev    ramfs   defaults    0   0  

---------增加初始化脚本

root@bootloader:/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  

root@bootloader:/home/rootfs/etc/init.d#chmod a+x rcS

---------创建一个mdev.conf文件(/rootfs/etc下),内容可有可无
root@bootloader:/home/rootfs/etc#
touch mdev.conf

 

这样基本的文件系统就这么的搞定的

 

内核加入文件系统的支持

  ││        File systems --->  

  ││    [*] Miscellaneous filesystems  --->    

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

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

 

配置好后保存退出

root@bootloader:/home/Linux/linux-2.6.39#make uImage

root@bootloader:/home/Linux/linux-2.6.39#make modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

 

安装内核模块了

 

root@bootloader:/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。

 

root@bootloader:/home/Tools#tar zxvf cramfs-1.1.tar.gz

root@bootloader:/home/Tools/cramfs-1.1#make

 

编译完成之后,会生成mkcramfscramfsck两个可执行文件,其中mkcramfs工具是用来创建cramfs文件系统的,而cramfsck工具则用来进行cramfs文件系统的释放以及检查。将这两个文件拷贝到/usr/local/bin目录下,方便使用.

root@bootloader:/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

root@bootloader:/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的配置文件来进行的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值