根文件系统的制作:首先要用busybox编译出文件系统所需要的应用程序,然后再做文件系统
开发平台:ubuntu 8.10
开发工具及软件:cross_compile 4.3.3(EABI) busybox-1.16.0
一.交叉编译busybox
Bosybox是一个遵循GPL v2协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox可以自动生成根文件系统所需的bin、sbin、usr目录和linuxrc文件。
1.解压busybox源码
从http://www.busybox.net/downloads/ 下载busybox-1.16.0.tar.bz2
#cd ~liwenjie/share/ //源码包所在的目录
#tar jxvf busybox-1.16.0.tar.bz2 -C /opt/EmbedSky
2.进入源码包,修改顶层Makefile
#cd /opt/EmbedSky/busybox-1.16.0
修改:
CROSS_COMPILE ?=arm-linux- //第164行
ARCH ?=arm //第190行
3、配置busybox
输入make menuconfig进行配置
1)Busybox Settings--->
General Configuration--->
[*]Show verbose applet usage messages
[*] Store applet usage messages in compressed for
[*]Support –install [-s] to install applet links at runtime
[*]Enable locale support(system needs locale for this to work)
[*]Support for –long-options
[*]Use the devpts filesystem for unix98 PTYs
[*]Support writing pidfiles
[*]Runtime SUID/SGID configuration via /etc/busybox.config
[*]Suppress warning message if /etc/busybox.conf is not
readable
Build Options--->
[*] Build BusyBox as a static binary(no shared libs)
[*] Build with Large File Support(for accessing files>2GB)
Installation Options->
[]Don’t use /usr
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix
Busybox Library Tuning --->
(6)Minimum password legth
(2)MD5:Trade Bytes for Speed
[*]Fsater /proc scanning code(+100bytes)
[*]Command line editing
(1024)Maximum length of input
[*]vi-style line editing commands
(15) History size
[*]History saving
[*]Tab completion
[*]Fancy shell prompts
(4) Copy buffer size ,in kilobytes
[*]Use ioctl names rather than hex values in error messages
[*]Support infiniband HW
2) Linux Module Utilities--->
(/lib/modules)Default directory containing modules
(modules.dep)Default name of modules.dep
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
-----options common to multiple modutils
[ ] support version 2.2/2.4 Linux kernels
[*]Support tainted module checking with new kernels
[*]Support for module .aliases file
[*] support for modules.symbols file
其它配置默认即可
4.编译并安装busybox
#make
#make install
编译安装后,在busybox-1.16.0目录下有个名为“_istall”的目录,目录下有bin,sbin,usr,linuxrc
或 #make CONFIG_PREFIX=dir_path install //安装指定dir_path路径
即 #make CONFIG_PREFIX=/opt/EmbedSky/roofs install
在/opt/EmbedSky/roofs下有bin、sbin、usr目录和linuxrc文件
二.构建根文件系统
1.构建框架
#mkdir -p /opt/EmbedSky/rootfs
#cd /opt/EmbedSky/rootfs
#cp -rf /opt/EmbedSky/busybox-1.16.0/_install/* .
#mkdir -p dev etc lib mnt opt proc root sddisk sys tmp udisk usr/lib
usr/share var
2.构建dev目录
在linux内核源码文件init/main.c中有打开设备文件dev/console的操作如下:
static noinline int init_post(void)
__releases(kernel_lock)
{
………………………………
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
………………………………
}
内核启动执行到这里时mdev还没有构建dev目录,如果没有创建设备文件dev/console就将会打印警告Warning: unable to open an initial console。
在内核启动的过程中要将产生的一些垃圾信息丢弃就需要空设备dev/null。
#cd /opt/EmbedSky/rootfs/dev
#mknod console c 5 1
#mknod null c 1 3
3.构建etc目录
#cd /opt/EmbedSky/rootfs/etc
1) etc/fstab文件:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
ramfs /dev ramfs defaults 0 0
在系统启动初始化文件/etc/init.d/rcS中有执行挂载命令/bin/mount -a ,这便是
将文件etc/fstab中指定的文件系统挂载到对应的挂载点上。这些文件系统的挂在是执行
mdev -s命令建立dev目录的前提。
2)创建帐号及密码文件
拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下
#cp /etc/passwd .
#cp /etc/shadow .
#cp /etc/group .
3)etc/profile文件:
在启动脚本etc/init.d/rcS执行完后将在串口tq2440_serial0启动一个shell。Shell启动过程中会根据文件/etc/profile配置登陆环境。
#Ash profile
#vim:syntax=sh
#No core files by default
#ulimit -S -c 0 > /dev/null 2 >&1
USER="'id -un'"
LOGNAME=$USER
PS1='[\u@\h\W]#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
解析:
USER="id -un" //获取用户名id-un与whoami命令有相同的功能
PS1='[\u@\h \W]#' //PS1指定sh提示符的格式在本环境下将是
[root@cyembed /]#
export USER LOGNAME PS1 PATH 将这些变量导出到环境。
4)etc/mdev.conf文件:(可以让此文件为空)
sd[a-z]*[0-9] 0:0 0660 @(mount -t vfat -o iocharset=utf8 /dev/$MDEV /udisk)
sd[a-z]*[0-9] 0:0 0660 *(umount /udisk)
mmcblk[0-9]*p[0-9] 0:0 0660 @(mount -t vfat -o iocharset=utf8 /dev/$MDEV /sddisk)
mmcblk[0-9]*p[0-9] 0:0 0660 *(umount /sddisk)
5)etc/inittab文件:
在启动过程中bootloader会传递参数init=/linuxrc给内核的main( )函数,所以在文件系统被挂在后,运行的第一个程序是linuxrc,而linuxrc是一个指向/bin/busybox的链接文件,也就是说文件系统被挂在后运行的第一个程序是busybox。Busybox首先会解析文件/etc/inittab,这个文件中存放的是系统的配置信息,这些配置信息指明了接下来将要启动那些程序。
#/etc/inittab
::sysinit:/etc/init.d/rcS
tq2440_serial0::askfirst:-/bin/sh
::ctrlaltdet:/sbin/reboot
::shutdown:/bin/umount -a -r
然后chmod 777 inittab
解析:
/etc/inittab 文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下
<id>:<runlevels>:<action>:<process>
<id>:表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省略,则使用与init进程一样的控制台。
<runlevels>:对于Busybox init程序,这个字段滑意义,可以省略。
<action>:表示init程序如何控制这个子进程,
<process>: 要执行的程序,它可以是可执行程序,也可以是脚本
文件etc/inittab配置条目说明如下:
::sysinit:/etc/init.d/rcS
启动系统初始化文件/etc/init.d/rcS。字段sysinit表明文件/etc/init.d/rcS在系统启动后最先执行,并且只执行一次,init进程等待它结束才继续执行其它动作。
(脚本文件名一般为rc,后缀S代表单用户运行级别脚本)
tq2440_serial0::askfirst:-/bin/sh
在串口tq2440_serial0上启动askfirst动作的shell。S3C2410的串口名在/dev下是s3c2410_serialx。此时还没有移植自己的内核,用天嵌科技的内核所以串口名为tq2440_serial0。askfirst表明init进程先输出“Please press Enter to actvie this console”,等用户输入回车键之后才启动-/bin/sh。
::ctrlaltdel:/sbin/reboot
当按下Ctrl+Alt+Delete组合键时,init重启执行程序。字段ctrlaltdel表明当按下Ctrl+Alt+Delete组合键时,执行相应的进程。
::shutdown:/bin/umount -a -r
告诉init在关机时运行umount命令卸载所有的文件系统,如果卸载失败,试图以只读方式重新挂载。字段shutdown表明在重启关闭系统命令时执行相应进程。
6)resolv.conf文件--用于存放DNS的值
nameserver 202.96.128.86
7)etc/init.d/rcS --开机自动运行某些程序
当解析完文件etc/inittab后就将启动这些进程,首先要执行的是启动脚本etc/init.d/rcS。
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C&c only in this shell so we can interrupt subprocesses
#
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
然后chmod 777 rcS
解析:
#! /bin/sh 用busybox的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin //shell命令的搜索路径
runlevel=S //运行在单用户模式
prevlevel=N //前一个级别为n表示没有前一个级别
umask 022 //权限位掩码
export PATH runlevel prevlevel //将设置的变量导出到环境中
/bin/hostname cyembed //主机名,cyembed将出现在shell提示符中[root@cyembed/]#
/bin/mount -a //将文件etc/fstab中指明的文件系统挂载到对应挂载点上
echo /sbin/mdev>/proc/sys/kernel/hotplug //用mdev来处理内核的热插拔事件。
当有热插拔事件产生时, 内核就会调用位于/sbin目录的 mdev。 这时 mdev通过环境变量中的 ACTION 和 DEVPATH, (这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
mdev -s //建立dev目录。以‘-s’为参数调用位于/sbin 目录写的 mdev(其实是个链接,作用是传递参数给/bin目录下的busybox 程序并调用它) ,mdev扫描 /sys/class 和/sys/block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则 mdev 就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次 “mdev -s” 。
8)etc/sysconfig/HOSTNAME
#mkdir sysconfig
#cd sysconfig;vim HOSTNAME
其内容为liwenjie
4."home"目录
建一个名为liwenjie的目录,并设置其权限为777
#cd home
#mkdir liwenjie;chmod 777 home/liwenjie
5."lib"目录
存放常用的库文件,从EABI-4.3.3的编译器中提取库
#cd /opt/EmbedSky/rootfs
#cp -f /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* lib -a
#rm -f lib/libwv* lib/libuniconf*
6."mnt"目录
新建两个目录:udisk和sd
7."usr/bin/"目录
复制用于开发板文件系统和LINUX串口传输文件的命令
#rm -f /opt/EmbedSky/rootfs/usr/bin/rx
#cd /opt/EmbedSky/root_2.6.30.4_TQ2440/usr/bin
#cp -f rb rx rz sb sx sz /opt/EmbedSky/roofs/usr/bin
8.根文件系统的制作
安装好yaffs文件系统制作工具:
#tar –zxvf mkyaffs2image.tgz –C /
#cd /opt/EmbedSky/
#mkyaffs2image rootfs rootfs.bin
把rootfs.bin烧到开发板中即可
PS:最后还要进行看门狗驱动的移植,否则会出现开发板不断重启的情况