Author: eilian
Blog: http://blog.csdn.net/eilianlau
Copyright:Original
Date: 2011、12、14
1、Hosting environment:VMare ubuntu10.04
2、Cross-compiling environment:arm-2009q3.tar.bz2
3、Development board:QT6410
4、nanflash:K9F2G08(256M)
5、linux -version:Linux-2.6.39
6、uboot-version:u-boot-2010.06
六、cramfs启动根文件系统
还是前一段时间一直linux2.6.39到s3c2440上的时候构建了nfs文件系统 现在就把他用到s3c6410身上。之前已经做个根文件系统、现在就再做一次笔记
Cramfs:Compressed ROM File System
Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。
在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时 解压缩到RAM中。
另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。
由于以上特性,Cramfs在嵌入式系统中应用广泛。
但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。
Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。
1、文件系统的制作<各种文件系统通用做法>
a)下载busybox 源代码
可以从http://www.busybox.net/downloads/,这里下载的是busybox-1.14.4.tar.bz2
root@bootloader:/home/eilian/development/Tools# ls
arm-2009q3.tar.bz2 busybox-1.14.4.tar.bz2 genext2fs-1.4.1
arm-linux-4.4.1.tar.gz cramfs-1.1 genext2fs-1.4.1.tar.gz
arm-linux-gcc-4.3.2.tgz cramfs-1.1.tar.gz mkyaffs2image.tgz
busybox-1.14.4 creat_rootfs
root@bootloader:/home/eilian/development/Tools#
b)最基本的根文件系统目录说明
嵌入式 Linux 中都需要构建根文件系统,构建根文件系统的规则在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。
目录 内容
bin 存放所有用户都可以使用的、基本的命令。
sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。
usr 用户文件信息。
proc 这是个空目录,常作为proc 文件系统的挂载点(内核与用户的接口)。
dev 该目录存放设备文件和其它特殊文件。
etc 存放系统配置文件,包括启动文件。
lib 存放共享库
mnt 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。
sys 也是对应的一种文件系统、总线、设备、驱动模型。
tmp 存放临时文件,通常是空目录。
var 存放可变的数据,如日志等。
c)使用脚本创建上面目录
#! /bin/sh
echo "creatint rootfs dir......"
mkdir rootfs
cd rootfs
echo "making dir : bin dev etc lib proc sbin sys usr"
mkdir bin dev etc lib proc sbin sys usr #必备的8个目录
mkdir usr/bin usr/lib usr/sbin lib/modules
# Don't use mknod ,unless you run this Script as root !
mknod -m 600 dev/console c 5 1
mknod -m 666 dev/null c 1 3
echo "making dir : mnt tmp var"
mkdir mnt tmp var
chmod 1777 tmp
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/log var/run var/tmp
chmod 1777 var/tmp
保存退出并修改权限
root@bootloader:/home/eilian/development# chmod 777creat_rootfs
root@bootloader:/home/eilian/development# ./creat_rootfs
creatint rootfs dir......
making dir : bin dev etc lib proc sbin sys usr
making dir : mnt tmp var
root@bootloader:/home/eilian/development#
d)配置、编译、安装busybox
root@bootloader:/home/eilian/development/Tools#tar zxvfbusybox-1.14.4.tar.bz2
root@bootloader:/home/eilian/development/Tools#cdbusybox-1.14.4
root@bootloader:/home/eilian/development/Tools/busybox-1.14.4#vi Makefile
CROSS_COMPILE ?= arm-linux-
第190行
SUBARCH := $(shell echo $(SUBARCH) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
ARCH ?= arm
保存退出、在原有的基础上进行配置、列出注意的地方尚未说明的使用默认配置
root@bootloader:/home/eilian/development/Tools/busybox-1.14.4#make menuconfig
│ │ Busybox Settings --->
│ │ Build Options --->
│ │[ ] Build BusyBox as a static binary (no shared libs) //这里使用动态库
│ │[ ] Force NOMMU build
│ │[*] Build with Large File Support (for accessing files > 2 GB)
│ │(arm-linux-) Cross Compiler prefix //交叉工具编译链 按空格可以进行修改
│ │() Additional CFLAGS
│ │ Installation Options --->
│ │[*] Don't use /usr
│ │ Applets links (as soft-links) --->
│ │(/home/eilian/development/rootfs) BusyBox installation prefix //指定busybox的安装路径
│ │ Busybox Library Tuning --->
│ │(6) Minimum password length
│ │(2) MD5: Trade Bytes for Speed
│ │[*] Faster /proc scanning code (+100 bytes)
│ │[*] Support for /etc/networks
│ │[*] Command line editing
│ │(1024) Maximum length of input
│ │[*] vi-style line editing commands
│ │(15) History size
│ │[*] History saving
│ │[*] Tab completion
│ │[*] Username completion
│ │[*] Fancy shell prompts
│ │[ ] Give more precise messages when copy fails (cp, mv etc)
│ │(4) Copy buffer size, in kilobytes
│ │[ ] Use clock_gettime(CLOCK_MONOTONIC) syscall
│ │[*] Use ioctl names rather than hex values in error messages
│ │[*] Support infiniband HW
│ │ Linux Module Utilities --->
│ │[*] Simplified modutils
│ │[*] Accept module options on modprobe command line
│ │[*] Skip loading of already loaded modules
│ │--- Options common to multiple modutils
│ │(/lib/modules) Default directory containing modules
│ │(modules.dep) Default name of modules.dep
│ │ Linux System Utilities --->
│ │[*] Support /etc/mdev.conf
│ │[*] Support command execution at device addition/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/eilian/development/Tools/busybox-1.14.4#make
root@bootloader:/home/eilian/development/Tools/busybox-1.14.4#make install
-----查看所需要的库(因为选择了动态库)
root@bootloader:/home/eilian/development/Tools/busybox-1.14.4# arm-linux-r
arm-linux-ranlib arm-linux-readelf
root@bootloader:/home/eilian/development/Tools/busybox-1.14.4# arm-linux-readelf -d busybox
Dynamic section at offset 0xce00c contains 25 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [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/eilian/development/Tools/busybox-1.14.4#
库从哪里来?直接拷贝交叉编译器中就OK
root@bootloader:/usr/local/arm/4.4.1/arm-none-linux-gnueabi/libc/armv4t/lib# ls
ld-2.10.1.so libgcc_s.so.1 libnss_nisplus-2.10.1.so
ld-linux.so.3 libm-2.10.1.so libnss_nisplus.so.2
libanl-2.10.1.so libmemusage.so libnss_nis.so.2
libanl.so.1 libm.so.6 libpcprofile.so
libBrokenLocale-2.10.1.so libnsl-2.10.1.so libpthread-2.10.1.so
libBrokenLocale.so.1 libnsl.so.1 libpthread.so.0
libc-2.10.1.so libnss_compat-2.10.1.so libresolv-2.10.1.so
libcidn-2.10.1.so libnss_compat.so.2 libresolv.so.2
libcidn.so.1 libnss_dns-2.10.1.so librt-2.10.1.so
libcrypt-2.10.1.so libnss_dns.so.2 librt.so.1
libcrypt.so.1 libnss_files-2.10.1.so libSegFault.so
libc.so.6 libnss_files.so.2 libthread_db-1.0.so
libdl-2.10.1.so libnss_hesiod-2.10.1.so libthread_db.so.1
libdl.so.2 libnss_hesiod.so.2 libutil-2.10.1.so
libgcc_s.so libnss_nis-2.10.1.so libutil.so.1
root@bootloader:/usr/local/arm/4.4.1/arm-none-linux-gnueabi/libc/armv4t/lib#
找到我们需要的直接拷贝到根文件系统目录下的lib目下即可(rootfs/lib),不过为了保险起见 可以将上面这些库文件全部拷贝到rootfs/lib目录下 呵呵
------创建和修改一些必要的配置文件
---------增加为shell导入全局变量的文件/etc/profile
#/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#'
PAT H = $ PAT H
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
----------赶紧的profile中用的HOSTNAME文件 即主机名
----------在etc/目录下面新建sysconfig目录,在该目录下新建HOSTNAME文件,
vi HOSTNAME
bootloader
---------增加初始化文件
root@bootloader:/home/eilian/development/rootfs/etc#geditinittab
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
root@bootloader:/home/eilian/development/rootfs/etc#chmod a+x inittab
--------新建etc/profile用户环境配置文件,
root@bootloader:/home/eilian/development/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/eilian/development/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/eilian/development/rootfs/etc/init.d# chmod a+x rcS
---------创建一个mdev.conf文件,内容可有可无
root@bootloader:/home/eilian/development/rootfs/etc#vi mdev.conf
这样基本的文件系统就这么的搞定的剩下的工作就是安装内核模块了文章不能太长留给下文再写