读书人

6410根文件系统的打造

发布时间: 2013-03-19 17:22:05 作者: rapoo

6410根文件系统的制作

1.搭建开发环境

开发环境(主要指linux、虚拟机的安装和交叉编译环境的搭建)完全按照mini6410用户手册4.3节操作,在此不再赘述。

2.根文件系统的目录说明

根文件系统是Linux启动的时候使用的第一个文件系统,没有它系统将无法正常的启动,然而在这个根文件系统中又包含了一系列的目录,接下来对这些目录做一个简单的介绍。

bin 存放所有用户都可以使用的、基本的命令。
sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。
Usr 里面存放的是共享、只读的程序和数据。
proc 这是个空目录,常作为proc 文件系统的挂载点。
dev 该目录存放设备文件和其它特殊文件。
etc 存放系统配置文件,包括启动文件。
lib 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序
boot 引导加载程序使用的静态文件。
home 用户主目录,包括供服务账号锁使用的主目录,如FTP。
mnt 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。
opt 给主机额外安装软件所摆放的目录。
root root 用户的主目录
tmp 存放临时文件,通常是空目录。
var 存放可变的数据,如日志等。

3 建立根文件系统的目录

进入到自己要放置文件系统的目录,采用《mini2440 Linux移植开发实战指南》,新根文件系统目录的脚本文件create_rootfs_bash,使用命令chmod +x create_rootfs_bash ,改变文件的可执行权限,执行“./create_rootfs_bash ”运行脚本,就完成了根文件系统目录的创建。脚本create_rootfs_bash文件的内容为:

[cpp] view plaincopy
  1. #!/bin/sh
  2. echo "------Create rootfs directons start...--------"
  3. mkdir rootfs
  4. cd rootfs
  5. echo "--------Create root,dev....----------"
  6. mkdir root dev etc boot tmp var sys proc lib usr mnt home
  7. mkdir etc/init.d etc/rc.d etc/sysconfig
  8. mkdir usr/sbin usr/bin usr/lib usr/modules
  9. echo "make node in dev/console dev/null"
  10. mknod -m 600 dev/console c 5 1
  11. mknod -m 600 dev/null c 1 3
  12. mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
  13. mkdir var/lib var/lock var/run var/tmp
  14. chmod 1777 tmp
  15. chmod 1777 var/tmp
  16. echo "-------make direction done---------"

在脚本中改变了tmp 目录的使用权,让它开启sticky 位,为tmp 目录的使用权开启此位,可确保tmp 目录底下建立的文件,只有建立它的用户有权删除。尽管嵌入式系统多半是单用户,不过有些嵌入式应用不一定用root 的权限来执行,因此需要遵照根文件系统权限位的基本规定来设计。

4.建立动态链接库(即lib目录)

动态链接库直接用友善之臂的,先解压友善之臂的根文件包,拷贝lib的内容到新建的根文件目录lib内。

[cpp] view plaincopy
  1. 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的配置基本一样,部分地方不太一样。

[cpp] view plaincopy
  1. Busybox Settings--->
  2. General Configuration--->
  3. [*] Show verbose applet usage messages //这个是现实程序的详细信息吧
  4. [*] Store applet usage messages in compressed form
  5. [*] Support install [-s] to install applet links at runtime
  6. [*] Enable locale support(system needs locale for this to work)
  7. [*] Support for long-options
  8. [*] Use the devpts filesystem for unix98 PTYs
  9. [*] Support writing pidfiles
  10. [*] Runtime SUID/SGID configuration via /etc/busybox.config
  11. [*] Suppress warning message if /etc/busybox.conf is not readable//这个配置是如果/etc/busybox.conf is是不可读的话则会给用户提示警告信息
  12. Build Options--->//我主要关注这个就是编译选项
  13. [*] Build BusyBox as a static binary(no shared libs) //静态链接,如果你要使用静态链接库的话那么这个选项一定要选上了 一定<这里的话随意反正我用动态库>
  14. [*] Build with Large File Support(for accessing files>2GB)
  15. Installation Options->//安装配置
  16. [*]Don’t use /usr //选上它防止把编译进系统中的/usr下以便破坏宿主系统
  17. Applets links (as soft-links) ---> //安装配置 使用软链接
  18. (./_install) BusyBox installation prefix
  19. Busybox Library Tuning ---> //调用那些库呢?这个真不知道怎么解释。。。
  20. (6)Minimum password legth
  21. (2)MD5:Trade Bytes for Speed
  22. [*]Fsater /proc scanning code(+100bytes)
  23. [*]Command line editing
  24. (1024)Maximum length of input
  25. [*] vi-style line editing commands
  26. (15) History size
  27. [*] History saving
  28. [*] Tab completion
  29. [*]Fancy shell prompts
  30. (4) Copy buffer size ,in kilobytes
  31. [*]Use ioctl names rather than hex values in error messages
  32. [*]Support infiniband HW
[cpp] view plaincopy
  1. Linux Module Utilities---> //这个就是lib/modules的设置
  2. (/lib/modules)Default directory containing modules //默认内核模块安装到该目录下
  3. (modules.dep)Default name of modules.dep
  4. [*] insmod //这些都是支持的命令
  5. [*] rmmod
  6. [*] lsmod
  7. [*] modprobe
  8. -----options common to multiple modutils
  9. [ ] support version 2.2/2.4 Linux kernels
  10. [*]Support tainted module checking with new kernels
  11. [*]Support for module .aliases file
  12. [*] support for modules.symbols file

5.dev设备文件的制作

设备文件较多,而且比较繁杂,因此其制作一般包括两个部分:静态创建设备文件和使用mdev创建设备文件

(1).静态创建设备文件

其实在刚开始制作文件系统的目录里已经静态制作创建了两个必须的设备的设备文件:console和null,内核在引导时这两个设备节点必须存在。

[cpp] view plaincopy
  1. mknod -m 600 dev/console c 5 1
  2. mknod -m 600 dev/null c 1 3
(2).用mdev创建设备文件

udev:它是个用户程序,能根据系统中硬件设备的状态动态的更新设备文件,包括设备文件的创建、删除等。它的操作相对复杂,但灵活性很高。

mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动 程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。在busybox的配置中,下面的选项将增加对mdev的支持。

[cpp] view plaincopy
  1. Linux System Utilities --->
  2. [*]Support /etc/mdev.conf
  3. [*]Support command execution at device addition/removal
6.编译、安装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中安装的位置也可以在配置的时候设置,具体位置为:

[cpp] view plaincopy
  1. Busybox Settings->
  2. Installation Options->
  3. (/***/***)Busybox Installation Prefix
7.编译、安装内核模块。

在第5步中,安装动态链接库后,lib/modules目录下已经有内核模块了,但是这个内核模块和我采用的内核不是一个版本,因此重新编译安装。

进入内核的目录,在编译安装内核模块之前必须保证内核已经正确无误的配置及编译过一次。在这里假设还没有编译过。

(1)我们要使得Linux-2.6.38的缺省目标平台成为ARM 的平台。
修改总目录下的Makefile

[cpp] view plaincopy
  1. export KBUILD_BUILDHOST := $(SUBARCH)
  2. ARCH ?= $(SUBARCH)
  3. CROSS_COMPILE ?=
改为[cpp] view plaincopy
  1. export KBUILD_BUILDHOST := $(SUBARCH)
  2. ARCH ?= arm
  3. CROSS_COMPILE ?= arm-linux-
其中,ARCH 是指定目标平台为arm,CROSS_COMPILE 是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。

(2)配置、编译内核模块

在此不具体说明怎么配置,可以将内核里友善自带的配置文件拷贝。然后执行:

[cpp] view plaincopy
  1. make menuconfig
  2. make zImage
(3)编译内核模块

[cpp] view plaincopy
  1. make modules ARCH=arm CROSS_COMPILE=arm-linux-
(4)安装内核模块[cpp] view plaincopy
  1. make modules_install ARCH=arm INSTALL_MOD_PATH=/opt/FriendlyARM/mini6410/rootfs
8.建立etc目录下的配置文件<这些配置信息都是一些基本不需要改动的东西所以直接从主机或者友善自带文件系统拷贝>
a、新建etc/mdev.conf文件,内容为空。
b、拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下。
c、etc/sysconfig目录下新建文件HOSTNAME,内容写自己喜欢的名字。
d、etc/inittab文件:[cpp] view plaincopy
  1. #etc/inittab
  2. ::sysinit:/etc/init.d/rcS
  3. ::askfirst:-/bin/sh
  4. ::ctrlaltdel:/sbin/reboot
  5. ::shutdown:/bin/umount -a r
e、etc/init.d/rcS文件:[cpp] view plaincopy
  1. #!/bin/sh
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3. runlevel=S
  4. prevlevel=N
  5. umask 022
  6. export PATH runlevel prevlevel
  7. echo "----------munt all----------------"
  8. mount -a
  9. echo /sbin/mdev>/proc/sys/kernel/hotplug
  10. mdev -s
  11. echo "***********************************************
  12. echo "****************Studying ARM*********************"
  13. echo "Kernel version:linux-2.6.38"
  14. echo "Student"
  15. echo "Date:2012.05.08"
  16. echo "***********************************************"
  17. /bin/hostname -F /etc/sysconfig/HOSTNAME
使用以下命令改变rcS的执行权限:[cpp] view plaincopy
  1. Chmod +x rcS
f、etc/fstab文件:[cpp] view plaincopy
  1. #device mount-point type option dump fsck order
  2. proc /proc proc defaults 0 0
  3. none /tmp ramfs defaults 0 0
  4. sysfs /sys sysfs defaults 0 0
  5. mdev /dev ramfs defaults 0 0
g、 etc/profile文件:[cpp] view plaincopy
  1. #Ash profile
  2. #vim:syntax=sh
  3. #No core file by defaults
  4. #ulimit -S -c 0>/dev/null 2>&1
  5. USER="id -un"
  6. LOGNAME=$USER
  7. PS1='[\u@\h=W]#'
  8. PATH=$PATH
  9. HOSTNAME='/bin/hostname'
  10. export USER LOGNAME PS1 PATH
到此,根文件系统的构建就完成了,下面将其制作成ubi镜像文件并烧写。

9.制作根文件系统镜像
执行以下命令:

[cpp] view plaincopy
  1. tar zxvf mktools-20110720.tar.gz -C /
注意:C为大写,C后面有个空格,C是改变解压安装目录的意思。
这将会在/usr/sbin目录下创建生成相应的工具集

然后执行

[cpp] view plaincopy
  1. mkubimage-slc rootfs rootfs.ubi
将ubi镜像文件烧写至开发板运行即可。


读书人网 >移动开发

热点推荐