2023年12月1日发(作者:)

lysysjw QQ29581992

根文件系统制作

FL2440在移植完linux内核后,需要移植根文件系统才能正常的启动开发板上面

Linux系统。下面介绍一下如何制作根文件系统。

首先要明确几个问题,首先,为什么要制作根文件系统?根文件系统是什么?文

件系统又是什么?如何制作根文件系统?这里介绍的是制作方法,所以下面只回

答最后一个问题。至于其他问题,网上的资料以及相关的书籍上都有很详细的介

绍,并且不是一句两句就能回答出来的,这里不多罗嗦。

开发板:FL2440

SDRAM64M NAND FLASH256M

环境:虚拟机vmware7.1.2.14247绿色版(网上到处是)、红帽企业版5

交叉编译链:arm-linux-gcc-4.3.2(这里选择这个,低版本的比如3.4.1的等,在

编译的过程中可能会提示很多错误)

使用的工具:2

这里先改正一下错误,上次的linux-2.6.28.7内核移植到FL2440开发板时的触屏

驱动有问题,需要改正几个错误,否则校正3.5寸的屏幕时可能会出现错误,

FL2440光盘中的linux-2.6.28的触屏驱动也存在此问题。

触屏校正有问题,校正不过去,需要修改源码中的触屏驱动才能解决。

文件:drivers/input/touchscreen/s3c2410_ts.c

static irqreturn_t stylus_updown(int irq, void *dev_id)//172

函数中的data0 = readl(base_addr+S3C2410_ADCDAT0);//178

data1 = readl(base_addr+S3C2410_ADCDAT1);//179

修改为:

data1 = readl(base_addr+S3C2410_ADCDAT0);//lysysjw

data0 = readl(base_addr+S3C2410_ADCDAT1);//lysysjw

1

lysysjw QQ29581992

static irqreturn_t stylus_action(int irq, void *dev_id)//194

函数中的data1 = readl(base_addr+S3C2410_ADCDAT0);//199

data0 = readl(base_addr+S3C2410_ADCDAT1);//200

修改为

data1 = readl(base_addr+S3C2410_ADCDAT0);//lysysjw

data0 = readl(base_addr+S3C2410_ADCDAT1);//lysysjw

下面开始介绍根文件系统制作过程。制作步骤如下:

大体来说,有两大步骤,第一步是移植Busybox,第二步是构建根文件系统。下

面首先说第一步。

1、下载2,并解压

首先,创建目录,用如下命令

mkdir /arm

进入这个目录

cd /arm

下载2,地址是

/downloads/

或者

/downloads/

busybox官网为

/

下载完后,将2复制到arm目录下,然后解压缩,如下命令

jar –jxvf 2

这样在/arm目录下就会出现busybox-1.19.0目录,进入这个目录

cd busybox-1.19.0

2

lysysjw QQ29581992

2、配置Busybox

首先编辑改源码目录中的Makefile文件,

vim Makefile

将下面的两个变量修改

CROSS_COMPILE ?=

ARCH ?=

改后的值为

CROSS_COMPILE ?=arm-linux-

ARCH ?=arm

当然上面的交叉编译链是要创建到环境变量中的。否则添加上绝对地址,不过有

时候添加上绝对地址后可能会有错误。

执行下面命令进行配置

make menuconfig

这里做的修改如下,其他没提到的可以不修改(这里直接以飞凌官方论坛的为例,

地址为/?tid=6292&highlight

=)

Busybox Settings --->

Build Options --->

Build Busybox as a static binary(no shared libs)

Build with Large File Support (for accessing files >

2GB)

Installation Options --->

(./_install) Busybox installation prefix <—进入这个选

项,输入busybox的安装路径,如:../rootfs

Busybox Library Tuning --->

vi-style line editing commands

3

lysysjw QQ29581992

Fancy shell prompts <—要选择这个选项:“Fancy shell

prompts”,否则挂载文件系统后,无法正常显示命令提示符:“[u@h

W]#

这样就基本可以了,不过下面的几个配置选项需要注意一下。

如果只配置到此,那么构建的根文件系统在dnw串口软件上面启动来的Linux

在串口打印中会出现乱码的现象,类似于下图

其实这也不是大问题,用超级终端就可以正常显示了。原因在于dnw是不支持

彩色的。这个是由于在编译busybox时将文件利用颜色来区别这个选项选择上

了。为了在dnw也能正常显示,可以将按下面修改(默认是选择上的,这里我

们不选择)

Coreutils --->下找到ls相关的

Allow use of color to identify file types Produce colored ls output by default

如下图

Allow use of color to identify file types这一项不选择就可以了。不过这里推荐

选择,因为在开发时比较直观。

FL2440开发板官方给的文件系统是不能用Tab键补齐的,而其他的板子比如

mini2440TQ2440都是可以利用TAB键补齐的,刚开始接触时可能会纳闷,其

4

lysysjw QQ29581992

实原因就在飞凌配置busybox时有一项给去掉了的原因。这一项是

Busybox Settings--------------à

Busybox Library Tuning------à

Tab completion

如下图

还有很多参数,这里不再多介绍。下面给出一个示例,部分内容有出入

5

lysysjw QQ29581992

3、编译

用如下命令进行编译

make

6

lysysjw QQ29581992

用如下命令进行安装

make install

命令执行完毕,就会在在/arm目录下多出一个rootfs目录,里面存放了如下文件

第二步,制作根文件系统。制作根文件系统,到底制作了什么?制作了那些东西?

其实说白了,就是制作了目录,目录里面制作一些文件,这些文件有的与启动有

关,有的是各种命令等等。

0、制作必要的目录

进入/arm目录,创建目录root-2.6目录,进入该目录,创建如下目录

binetcdevhomelibmntoptprocrootsbinsystmpusrvar

这里介绍一下主要的几个目录的功能:

bin:保存busybox制作出来的可执行的文件以及自己所创建的各种可执行文件或

shell程序。

etc这里面放置了各种启动过程中所用到的配置文件,主要的有inittab文件init

进程的配置文件)fstab文件(用于指明需要挂载的文件系统)profile文件(用

于配置用户环境变量)init.d目录下的rcS文件(启动时用到的配置以及自启动

的进程等在这里要写入到这个文件下)sysconfig目录下的HOSTNAME文件(与

终端显示信息有关系)group文件(用户组文件)passwd文件(密码文件)

shadow文件(与创建密码有关系)。其他的诸如文件(与设备文件系

统有关)文件(与DNS有关)rc.d文件(与自启动有关)boa

录(与web服务器的配置相关)这里不多介绍,可以查阅相关资料。

lib:放置了各种库文件(这一目录下需要根据实际需要进行删减的,要不然制作

的文件系统会很大)

sbin:bin目录差不多

usr

7

lysysjw QQ29581992

下面详细介绍一下制作过程。

命令如下

cd /arm

mkdir root-2.6

cd root-2.6

mkdir bin etc dev home lib mnt opt proc root sbin sys tmp usr var

创建完毕,将第一步生成的rootfs目录中的所有文件复制到root-2.6目录下。命

令如下

cp –rf ../rootfs/* ./

注意:以下提到的所有的shell脚本文件的权限最少是可执行的。否则启动会不

正常。

1linuxrc的作用

bootloader交接给内核的一些参数中,有一个是init=/linuxrc这个是内核启动

的过程中第一个启动的程序,我们可以使用默认的,既busybox编译出来的,也

可以自己创建的shell脚本文件,其中fl2440所配的官方根文件系统就是用的脚

本文件。

脚本的内容可以自己编写

下面给出示例

#!/bin/sh

/bin/mount -t proc proc /proc

/bin/mount -t sysfs sysfs /sys

/sbin/mdev -s

exec /sbin/init

不过推荐使用默认的linuxrc

2、制作必要的文件

这里的工作目录是/arm/root-2.6

2.1首先,进入dev目录下,创建两个设备节点

8

lysysjw QQ29581992

cd dev

#mknod console c 5 1

#mknod null c 1 3

这里简要介绍一下原因。虽然这两个设备文件在内核挂载完文件系统后,系统会

利用mdev自动创建,可是在此之前,即在内核挂载文件系统之前,init进程会

用到这两个设备文件。如果没有这两个设备文件 ,会提示如下一些信息

Warning: unable to open an initial console.

2.2然后进入etc目录中,按下面进行操作

cd etc

2.2.1制作必要的文件。

拷贝Busybox-1.15.2/examples/bootfloopy/etc/* 到当前目录下

[root@localhost etc]# cp -r /arm/busybox-1.19.0/examples/bootfloppy/etc/* ./

包括的文件:fstabinit.dinittabprofile

2.2.2制作密码、用户相关的文件。

拷贝/etc/passwd/etc/group/etc/shadow到当前目录下。

# cp /etc/passwd ./

# cp /etc/group ./

# cp /etc/shadow ./

passwd文件中的第一行:root:x:0:0:root:/root:/bin/bash中的/bin/bash,改成

/bin/ash,因为文件系统的bin目录下没有bash这个命令,而是用ash代替bash

所以在用用户名密码登录的时候(telnet),会出现“cannot run /bin/bash: No such

fileor directory”的错误。

2.2.3修改inittab文件(该文件可以不用创建,使用默认值即可)

Linuxinit进程是根据/etc/inittab文件来创建其他子进程的。所以我们要修改

inittab文件, 内容如下:

console::sysinit:/etc/init.d/rcS

ttyS0::respawn:-/bin/sh

9

lysysjw QQ29581992

s3c2410_serial0::askfirst:-/bin/sh

:: once:/usr/sbin/telnetd -l /bin/login

上面内容的意思根据我的理解加上资料中的介绍,上面总共是四个进程,第一个

进程是用到了在dev目录下创建的console这个设备,系统启动后最先执行,并

且只执行一次,执行的是/etc/init.d/rcS这个脚本文件,至于做了什么,下面介绍。

第二个进程是启动shell,以串口/dev/ttyS0作为控制台。在启动的过程中,我们

可以在最后阶段看到一句话Please press Enter to activate this console.这个就是

由于第三句的原因,而这里是以s3c2410_serial0串口作为控制台,启动shell

至于为什么这么改,根据是什么,如果英文好,可以参考busybox源码中的

example目录下的inittab文件,如果不够好,参考韦东山的嵌入式Linux应用开

发完全手册把,第17章就是讲这个的,页数为345。这里简单的介绍一下

版权问题这里不摘录,可以自己去查看

2.2.4修改fstab文件。改文件是用于控制所要挂载的文件系统。

内容如下:

#device mount-point type options dump fsck order

proc /proc 0 proc defaults 0

0 tmpfs /tmp tmpfs defaults 0

0 sysfs /sys sysfs defaults 0

tmpfs /dev 0 tmpfs defaults 0

var 0 tmpfs defaults 0 /dev

以上内容的写法,这里引自韦东山的《嵌入式Linux应用开发完全手册》中相关

内容

版权问题这里不摘录,可以自己去查看

2.2.5修改init.d/rcS文件。这是一个脚本文件,在这里我们可以添加自动执行的

命令,常用于配置ip地址,挂载文件系统等

内容如下:

10

lysysjw QQ29581992

#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

mount -a #挂载fstab文件指定的文件系统

mkdir /dev/pts #

mount -t devpts devpts /dev/pts #devpts用于支持外部网络连接(telnet)的虚拟

终端

echo /sbin/mdev > /proc/sys/kernel/hotplug #设置内核,当有设备插拔时调用

/sbin/mdev程序

mdev -s #/dev目录下生成内核支持的所有设备的结点

mkdir -p /var/lock

qtopia & #启动qtopia脚本

ifconfig eth0 192.168.0.15 up #配置ip地址

/bin/hostname -F /etc/sysconfig/HOSTNAME

2.2.6修改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]# ' #用于显示[root@FL2440 /]#

PATH=$PATH

HOSTNAME=`/bin/hostname`

11

lysysjw QQ29581992

echo " Processing / "

echo "Done"

export USER LOGNAME PS1 PATH

2.2.7新建sysconfig文件夹,在里面新建HOSTNAME文件,内容为:FL2440

这里之所以创建该文件和相关内容,是为了在开机启动后,在控制台中可以看到

类似的信息

图中“root@FL2440”中FL2440就是这个文件中的内容。

2.2.8复制文件到etc目录下,并修改部分内容

修改的办法是根据实际应用的触屏驱动来改写。若修改不正确,会提示如下面的

错误

selected device is not a touchscreen I understand

如果是fl2440的内核可以参考如下图所示

12

lysysjw QQ29581992

2.3拷贝库文件: (完成)

进入lib目录,拷贝交叉编译器的库文件到lib目录下

#cp -f -a /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/*.so* ./

由于交叉编译器的库文件比较多,体积较大,所以需要裁剪一下库文件,只保留

常用的库文

件。

rm –f libwv* libuniconf*

这两个库文件一般很少用到,并且占用的大约8M的空间,为了节省内存,所以

删掉。

由于这里用到了图形界面和触屏,所以要添加一些库文件到这里。

qtopia-2.2.0/tslib-1.4.1/__install/lib/下拷贝ts/目录到 这里的lib/目录下,

cp –r –a /usr/qtopia-2.2.0/ tslib-1.4.1/__install/lib/ts ./

2.4usr/目录的修改(完成)

由于这里要制作含有qtopia的根文件系统,qtopia在第一次启动的时候需要设

置一下参数,其中时区的设置就要用到开发板中的/usr/share/zoneinfo/下的一些文

13

lysysjw QQ29581992

件,这些文件是在交叉编译好的qtopia-2.2.0/qtopia/etc目录下拷贝过来,文件在

qtopia-2.2.0/qtopia/etc下的zoneinfo文件夹下,这里要将整个文件下拷贝到

usr/share下面。命令如下

cp –r –a /usr/qtopia-2.2.0/qtopia/etc/zoneinfo usr/share/

上面的工作目录是在root-2.6

如果没有上面的目录的话,或者路径不对的话,是不能设置时区的。

2.5 sbin目录的修改(完成)

由于用到了触屏和图形界面,所以这里需要将触屏校正程序ts_calibrate拷贝到

sbin目录下。

ts_calibrate文件在qtopia-2.2.0/qtopia/tslib-1.4.1/__install/bin/下。

cp –r –a /usr/qtopia-2.2.0/qtopia/tslib-1.4.1/__install/bin/ts_calibrate sbin/

2.6 bin目录的修改(完成)

在该目录下新建一个qtopia文件,用于启动图形界面。内容如下

#!/bin/sh

echo Start Qtopia-2.2.0 > /dev/s3c2410_serial0 #打印提示信息

export HOME=/root #这里设置的HOME用于触屏的配置完的文件存放的位

置,第一次启动配置完后,该目录下面会多出相应的一些目录,每个目录用于存

放相关的配置文件。如果想重新配置,那么删除该目录下所以的文件,然后重启

就可以进行重新设置。

export QTDIR=/opt/Qtopia #Qtopia所在的目录,该行必须

export QPEDIR=/opt/Qtopia #Qtopia所在的目录,该行必须

export KDEDIR=/opt/kde #kde所在的目录,不过可以忽略本行

export QWS_KEYBOARD="TTY:/dev/tty1" #该行的作用还不明确,不过在这

里可以忽略本行

export LD_LIBRARY_PATH=/lib

14

lysysjw QQ29581992

export TSLIB_TSDEVICE=/dev/ts0 #触屏设备节点,该行必须

export TSLIB_TSEVENTTYPE=H3600

export TSLIB_CONFFILE=/etc/ #触屏的配置文件所在处,这个文件要根

据实际的触屏驱动进行修改。修改放到下面。该行必须

export TSLIB_PLUGINDIR=/lib/ts #触屏的库文件所在处,该行必须

export TSLIB_CALIBFILE=/etc/pointercal #触屏校正后产生的文件,这里可以不

用设置该处

export set QWS_MOUSE_PROTO="TPanel:/dev/ts0" # USB:/dev/mouse0" #该行必

须,加上后面的USB……,就会在触屏上面出现一个鼠标箭头,不加则没有,

该行必须

export PATH=$QPEDIR/bin:$PATH #该行必须,因为触屏中的可执行文件在这

export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib #该行必须,触屏用到的库

文件

if [ -f /etc/pointercal ] ; then

qpe 1>/dev/null 2>/dev/null

else

echo "Now adjust the TouchScreen"

ts_calibrate

qpe 1>/dev/null 2>/dev/null

fi

最后这个if-else-fi用于判断是否存在etc/pointercal文件,如果存在,则直接进入

图像界面,如果不存在,则进行校正后再进入。

qpe 1>/dev/null 2>/dev/null 这句中后面的是用于将启动信息不打印到串口,如果

直接用下面

qpe &,则会有一些信息打印出来。后面的“&”用于后台运行。

这里还需要改变qtopia的属性,权限至少是全部可执行

15

lysysjw QQ29581992

chmod 777 qtopia

2.2.9其他目录,默认为空即可

3、制作根文件系统镜像

这里利用飞凌给的官方的制作yaff的程序来制作根文件系统,mkyaffs2image

命令如下

./mkyaffs2image root-2.6

这样烧写到开发板中就可以启动带有qtopia界面的linux系统。

若发现问题,可以qq联系

16