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
编译完成之后,会生成mkcramfs和cramfsck两个可执行文件,其中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的配置文件来进行的.