1.开始的话
友善之臂没有给出详细的mini6410和tiny6410开发板的根文件系统的制作方法及步骤,于是自己根据《mini2440 Linux移植开发实战指南》做了一遍MINI6410的根文件系统。本次制作过程中使用的工具及源码包均来自于友善的官方光盘,其中有:
(1)内核:linux2.6.38-20111116.tgz
(2)根文件系统:rootfs_qtopia_qt4-20111103.tgz
(3)busybox:busybox-1.17.2-20101120.tgz
(4)交叉编译器:arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz
(5)文件系统镜像制作工具:mktools-20110720.tar.gz
2.搭建开发环境
开发环境(主要指linux、虚拟机的安装和交叉编译环境的搭建)完全按照mini6410用户手册4.3节操作,在此不再赘述。
3.根文件系统的目录说明
根文件系统是Linux启动的时候使用的第一个文件系统,没有它系统将无法正常的启动,然而在这个根文件系统中又包含了一系列的目录,接下来对这些目录做一个简单的介绍。
4.建立根文件系统的目录
进入到自己要放置文件系统的目录,采用《mini2440 Linux移植开发实战指南》,新根文件系统目录的脚本文件create_rootfs_bash,使用命令chmod +x create_rootfs_bash ,改变文件的可执行权限,执行“./create_rootfs_bash ”运行脚本,就完成了根文件系统目录的创建。脚本create_rootfs_bash文件的内容为:
#!/bin/sh
echo "------Create rootfs directons start...--------"
mkdir rootfs
cd rootfs
echo "--------Create root,dev....----------"
mkdir root dev etc boot tmp var sys proc lib usr mnt home
mkdir etc/init.d etc/rc.d etc/sysconfig
mkdir usr/sbin usr/bin usr/lib usr/modules
echo "make node in dev/console dev/null"
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 1777 tmp
chmod 1777 var/tmp
echo "-------make direction done---------"
在脚本中改变了tmp 目录的使用权,让它开启sticky 位,为tmp 目录的使用权开启此位,可确保tmp 目录底下建立的文件,只有建立它的用户有权删除。尽管嵌入式系统多半是单用户,不过有些嵌入式应用不一定用root 的权限来执行,因此需要遵照根文件系统权限位的基本规定来设计。
5.建立动态链接库(即lib目录)
动态链接库直接用友善之臂的,先解压友善之臂的根文件包,拷贝lib的内容到新建的根文件目录lib内。
cp -rfd /opt/FriendlyARM/mini6410/rootfs_qtopia_qt4 /opt/FriendlyARM/mini6410/rootfs/lib
6.交叉编译busybox(即根文件系统内bin,sbin等目录)
Busybox 是一个遵循GPL v2 协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和linuxrc 文件。具体介绍可以参考韦东山完全手册的346页。
(1)、解压busybox
cd /opt/FriendlyARM
tar –zxvf busybox-1.17.2-20101120.tgz
(2)、进入源码,修改Makefile 文件:(这个地方是很重要的一步,必须做,有的教程或者文章参考内核的配置与编译,即在make menuconfig和make后面添加ARCH、CROSS_COMPILE等,而对此不做修改,将可能会导致“request_module: runaway loop modprobe binfmt-464c”等错误出现)
cd /opt/studyarm/busybox-1.17.2
修改:
CROSS_COMPILE ?=arm-linux- //第164 行
ARCH ?=arm //第189 行
(3)、配置busybox
提示:友善之臂已经在光盘中提供了busybox 的源代码包,在光盘\linux 目录中,busybox-1.17.2-20101120.tgz解压后里面包含了友善之臂提供的缺省配置文件:fa_config (输入命令“cp fa.config .config”可以调用该配置),一般用户直接使用缺省文件就可以了,这样生成的busybox 和root_qtopia_qt4 中的是完全一致的。但为了对它的配置了解 更多一些,可以参考 《mini2440 Linux移植开发实战指南》 的如下步骤:
输入 make menuconfig进行配置
下面的配置和busybox1.17.2的配置基本一样,部分地方不太一样。
Busybox Settings--->
General Configuration--->
[*] Show verbose applet usage messages //这个是现实程序的详细信息吧
[*] Store applet usage messages in compressed form
[*] 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//这个配置是如果/etc/busybox.conf is是不可读的话则会给用户提示警告信息
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 //选上它防止把编译进系统中的/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
Linux Module Utilities---> //这个就是lib/modules的设置
(/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
7.dev设备文件的制作
设备文件较多,而且比较繁杂,因此其制作一般包括两个部分:静态创建设备文件和使用mdev创建设备文件
(1).静态创建设备文件
其实在刚开始制作文件系统的目录里已经静态制作创建了两个必须的设备的设备文件:console和null,内核在引导时这两个设备节点必须存在。
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
(2).用mdev创建设备文件
udev:它是个用户程序,能根据系统中硬件设备的状态动态的更新设备文件,包括设备文件的创建、删除等。它的操作相对复杂,但灵活性很高。
mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动 程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。在busybox的配置中,下面的选项将增加对mdev的支持。
Linux System Utilities --->
[*]Support /etc/mdev.conf
[*]Support command execution at device addition/removal
8.编译、安装busybox
在6,7两步的配置结束后,就可以编译并安装busybox。
编译:make ARCH=arm CROSS_COMPILE=arm-linux,其实仅执行make即可,我在这里添加了ARCH和CROSS_COMPILE,其实没什么作用,只是为了保险。因为如果编译的不是ARM版的busybox,系统时无法运行的。
安装:make install CONFIG_PREFIX=/opt/FriendlyARM/mini6410/rootfs/。CONFIG_PREFIX中安装的位置也可以在配置的时候设置,具体位置为:
Busybox Settings->
Installation Options->
(/***/***)Busybox Installation Prefix
9.编译、安装内核模块。
在第5步中,安装动态链接库后,lib/modules目录下已经有内核模块了,但是这个内核模块和我采用的内核不是一个版本,因此重新编译安装。
进入内核的目录,在编译安装内核模块之前必须保证内核已经正确无误的配置及编译过一次。在这里假设还没有编译过。
(1)我们要使得Linux-2.6.38的缺省目标平台成为ARM 的平台。
修改总目录下的Makefile
原
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
其中,ARCH 是指定目标平台为arm,CROSS_COMPILE 是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。
(2)配置、编译内核模块
在此不具体说明怎么配置,可以将内核里友善自带的配置文件拷贝。然后执行:
make menuconfig
make zImage
(3)编译内核模块
make modules ARCH=arm CROSS_COMPILE=arm-linux-
(4)安装内核模块
make modules_install ARCH=arm INSTALL_MOD_PATH=/opt/FriendlyARM/mini6410/rootfs
10.建立etc目录下的配置文件<这些配置信息都是一些基本不需要改动的东西所以直接从主机或者友善自带文件系统拷贝>
a、新建etc/mdev.conf文件,内容为空。
b、拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下。
c、etc/sysconfig目录下新建文件HOSTNAME,内容写自己喜欢的名字。
d、etc/inittab文件:
#etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
e、etc/init.d/rcS文件:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
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 "****************Studying ARM*********************"
echo "Kernel version:linux-2.6.38"
echo "Student"
echo "Date:2012.05.08"
echo "***********************************************"
/bin/hostname -F /etc/sysconfig/HOSTNAME
使用以下命令改变rcS的执行权限:
Chmod +x rcS
f、etc/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
g、 etc/profile文件:
#Ash profile
#vim:syntax=sh
#No core file by defaults
#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
到此,根文件系统的构建就完成了,下面将其制作成ubi镜像文件并烧写。
11.制作根文件系统镜像
执行以下命令:
tar zxvf mktools-20110720.tar.gz -C /
注意:C为大写,C后面有个空格,C是改变解压安装目录的意思。
这将会在/usr/sbin目录下创建生成相应的工具集
然后执行
mkubimage-slc rootfs rootfs.ubi
将ubi镜像文件烧写至开发板运行即可。