bin 必要的用户命令(二进制文件)
*boot 引导加载程序使用的静态文件
dev 设备文件及其他特殊文件
etc 系统配置文件
*home 用户主目录
lib 必要的链接库,例如:C链接库、内核模块
mnt 临时挂载的文件系统的挂载点
*opt 附加软件的安装目录
proc 提供内核和进程信息的proc文件系统
*root root用户主目录
sbin 必要的系统管理员命令
tmp 临时文件目录
usr 大多数用户使用的应用程序和文件目录
var 监控程序和工具程序存放的可变数据
带“*”的目录在嵌入式Linux上为可选的。
在一个基本的Linux根文件系统中,应包括如下的文件:
Ø 链接库
Ø 设备文件
Ø 系统应用程序
Ø 系统初始化文件
下面介绍以下根文件系统的具体移植步骤:
1、获取所需的源码包
具体包括:busybox-1.12.2.tar.bz2、cramfs-1.1.tar.gz(用来生成cramfs格式的文件系统映像)、yaffs2.tar.gz(用来生成yaffs2格式的文件系统映像)。
2、解压源码包生成映像工具
依次解压三个源码包,然后进入cramfs-1.1目录,执行以下命令:
#make
执行完成后就生成了mkcramfs工具,用来生成cramfs映像。
再进入yaffs2目录,执行以下命令:
#make
执行完成之后就在yaffs2目录下的utils目录生成了mkyaffsimage(最大支持512B页)和mkyaffs2image(最大支持2KB页,并向前兼容)两个工具,这两个工具用来生成yaffs映像。
4、配置busybox
进入busybox解压后的目录,执行以下命令:
#gedit Makefile
找到并修改下面两行:
CROSS_COMPILE ?= arm-linux-
...
ARCH ?= arm
然后执行以下命令:
#make menuconfig
配置修改如下:
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
//编译成静态库。
Cross Compiler prefix
//这里和Makefile里保持一致,写一处就行。
Installation Options --->
[ ] Don't use /usr
//使用usr目录
Busybox Library Tuning --->
[*] Fancy shell prompts
//一定要选上,否则很多转意字符无法识别。
Shells --->
Choose your default shell (ash) --->
//这里选择shell为ash,应该是默认选中的。
--- ash
//把ash这档的选项全部选上。
Miscellaneous Utilities --->
[ ] inotifyd
配置完成,保存退出。
5、编译busybox
执行以下命令:
#make
#make install
以上命令执行完成之后就在_install目录下生成了根文件系统所必须的目录、文件、二进制工具。
6、建立根文件系统的目录结构
首先新建一个脚本,执行以下命令:
#gedit creat_fs.sh
然后在打开的文件中添加以下内容:
#!/bin/sh
echo "makeing rootdir"
mkdir rootfs
cd rootfs
echo "makeing dir: bin dev etc lib proc sbin sys usr"
mkdir bin dev etc lib proc sbin sys usr #8 dirs
mkdir usr/bin usr/lib usr/sbin lib/modules
#Don't use mknod, unless you run this Script as
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/jiffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/log var/run var/tmp
chmod 1777 var/tmp
echo "making dir: home root boot"
mkdir home root boot
echo "done"
保存,退出。
在想要创建根文件系统目录的地方执行这个脚本,就会生成一个rootfs目录,这个目录里面包括一个完整的根文件系统的目录结构。
7、复制配置文件到etc目录下
执行以下命令:
#cd rootfs/etc
#cp /home/root/busybox-1.12.2/examples/bootfloppy/etc/* .
8、依次修改配置文件
执行以下操作:
#gedit fstab
将打开的文件修改为:
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
#gedit inittab
将打开的文件修改为:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a
#gedit profile
将打开的文件修改为:
# /etc/profile: system-wide .profile file for the Bourne shells
echo "Processing /etc/profile"
# no-op
# Set search library path
echo " Set search library path"
export LD_LIBRARY_PATH=/lib:/usr/lib
# Set user path
echo " Set user path"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# Set PS1
echo " Set PS1"
HOSTNAME=`/bin/hostname`
# 此处让shell提示符显示host名称的。是`,不是’,要注意
# 会在进入根系统后显示Jacky
export PS1="\\e[32m[$USER@$HOSTNAME \\w\\a]\\$\\e[00;37m "
# 此处\\e[32m是让后面的“[$USER@$HOSTNAME \\w\\a]”显示为绿色
# \\e[00是关闭效果
# \\e[05是闪烁
# 37m是让后面的显示为白色
# 多个命令可以;号隔开
echo "All done!"
echo
#gedit init.d/rcS
将打开的文件修改为:
#! /bin/sh
echo "Processing etc/init.d/rc.S"
#hostname ${HOSTNAME}
hostname song
echo " Mount all"
/bin/mount -a
echo " Start mdev...."
/bin/echo /sbin/mdev > proc/sys/kernel/hotplug
mdev -s
echo "mount yaffs to /mnt/yaffs"
/bin/mount -t yaffs /dev/mtdblock3 /mnt/yaffs
echo "start eth0....."
ifconfig lo 127.0.0.1
route add -net 127.0.0.0 netmask 255.0.0.0 lo
portmap
ifconfig eth0 192.168.0.121 mtu 500
route add default gw 192.168.0.254 netmask 0.0.0.0
inetd
echo "****************************************************"
echo " s3c2410 "
echo " Created by sjs @ 20011.09.24"
echo " Good Luck"
echo "http://blog.csdn.net/songjinshi"
echo "****************************************************"
echo
9、创建一个空mdev.conf
这个文件在挂载文件系统时会用到,执行以下命令:
#touch mdev.conf
10、从本机拷贝passwd、shadow、group三个文件
执行以下命令:
#cp /etc/passwd .
#cp /etc/shadow .
#cp /etc/group .
然后修改passwd文件,把最后一行的bash修改成ash。
11、拷贝busybox安装目录下的所有文件到根文件系统目录
把busybox默认安装目录中的文件全部复制到这里的rootfs中。会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的。具体命令为:
#cp –rfv /home/root/busybox-1.12.2/_install/* /home/root/rootfs
在这里需要说明一点:如果你是选择的动态编译busybox,需要拷贝相关的glibc库到文件系统的lib目录中。具体方法:
先看看busybox/_install/bin/busybox使用了哪些lib,然后从glibc复制相应的lib到
root@bin]# /usr/local/arm/3.4.6/arm-linux-gnu-readelf -d busybox
……
复制lib 文件到lib目录下:[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/ld* .[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/libc-2.3.2.so .[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/libc.so.6 .[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/libm * .[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/libcrypt* .
12、生成cramfs映像
使用上面生成的mkcramfs工具将rootfs根文件系统目录生成一个cramfs映像,具体命令为:
#./mkcramfs rootfs rootfs.cramfs
执行完上述命令,生成的rootfs.cramfs就是我们的根文件系统映像,这个映像就是我们要下载到开发板上的根文件系统映像。
在这里说明一下,这个cramfs文件系统是只读的,而yaffs文件系统是针对nand flash闪存设备专门制作的一个可读可写文件系统,在我们的启动脚本中将nand flash的第四个分区,也就是用户分区/dev/mtdblock3挂载到了/mnt/yaffs下面,大家可以将自己的应用程序或者其他文件下载到开发板的/mnt/yaffs目录下,这个目录是可读可写的,也是掉电非易失的。