嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第六天-Linux文件系统(物联技术666)

链接:https://pan.baidu.com/s/1VUc8cGI7bTtXuGepZZY3Ng?pwd=1688
提取码:1688

上午:文件系统介绍 

下午:文件系统的制作

教学内容:

在linux中文件分为二种:

根文件和普通文件;

Linux以树状结构管理所有目录、文件,其它分区挂载在某个目录上,这个目录被称为挂载点或安装点,然后通过此目录来访问这个分区上的文件

VFS:为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供统一的操作界面和应用编程接口,VFS只存在于内存中,不存在于任何外存空间。

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第六天-Linux文件系统(物联技术666)_第1张图片

根文件系统有基于flash的jffs2、yaffs、yaffs2、cramfs、基于网络的nfs等

文件系统包括ext2、ext3、yaffs、ramfs、tmpfs、devfs、proc等

一、基本文件系统的制作:

第一步制作根系统文件:

1、在home目录下创建/home/rootfs文件夹,用作新构建的根文件系统的根目录

#cd     /home

#mkdir  rootfs

2、创建根文件系统目录,主要包括以下目录

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

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

3、构建 /bin、/sbin、linuxrc:

这三个文件夹非常重要,要使用busybox工具来制作,busybox制作的都是动态链接的链接的中心就是busybox

解压busybox-1.16.1并进入目录,执行

#cd busybox-1.16.1/

# make defconfig

# make menuconfig

Busybox Setting ----->

   Build Options ----->

           [*]Build BusyBox as a static binary (no shared libs)  

          \\静态编译busybox      指定交叉编译器为                     

           (/usr/local/arm/4.3.2/bin/arm-linux-)Cross Compiler prefix

Installation Options ----->

           选择上 Don’t use /usr

Busybox Library Tuning--->

   [*]Username completion

[*]Fancy shell prompts

   [*]Query  cursor  position  from  terminal

            编译出的busybox的shell命令解释器支持显示当前路径及主机信息                保存退出

# make   

# make install

在busybox目录下会看见 _install目录,里面有/bin  /sbin  linuxrc三个文件将这三个目录或文件拷到第一步所建的rootfs文件夹下。

cp bin  sbin  linuxrc -ar /home/roots

其中a是保证是链接文件,不加a会每个bin下文件都复制一份busybox,文件会非常之大

4、构建etc目录:

进入根文件系统rootfs的etc目录,执行如下操作:

#cd /home/rootfs/etc

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

# cp  –r  busybox-1.16.1/examples/bootfloopy/etc/*  rootfs/etc

etc文件夹下的inittab、fstab、profile、init.d/rcS

inittab:    用来作为linuxrc的解释脚本

init.d/rcS: inittab启动的第一个脚本,一般用来挂载系统必需的文件系统、必要的设备连接、设置IP地址、启动其他脚本等,默认仅有mount –a

fstab:  执行mount –a时,按照此文件挂载文件系统

profile:登陆完shell后自动执行此脚本,一般用来设置需要的环境变量

修改inittab

把第二项改为::respawn:-/bin/login  (::respawn:-/bin/sh  启动shell)

把第三行tty2::askfirst:-/bin/sh 屏蔽掉

拷贝虚拟机上的/etc/passwd, /etc/group, /etc/shadow到rootfs/etc下。

# cp /etc/passwd    rootfs/etc

# cp /etc/group     rootfs/etc

# cp /etc/shadow    roofs/etc

对以上三个文件修改(只留一行),只保存与root相关的项,根据具体情况内容会有所不同。

修改passwd为root:x:0:0:root:/root:/bin/sh,即只保存与root相关项,而且最后改成/bin/ash

修改group为root:x:0:root

修改shadow为root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::

(注意这个值不一定一样,各人密码不一样,这个值也不一样)

登陆开发板时需输入用户名密码,同虚拟机相同

可以通过 passwd命令修改密码

或通过adduser增加新用户

修改profile

PATH=/bin:/sbin:/usr/bin:/usr/sbin                 \\可执行程序 环境变量

export LD_LIBRARY_PATH=/lib:/usr/lib            \\动态链接库 环境变量

/bin/hostname sunplusedu

USER="`id -un`"

LOGNAME=$USER

HOSTNAME='/bin/hostname'

PS1='[\u@\h \W]# '

显示主机名、当前路径等信息:

修改 etc/init.d/rc.S文件

(注意mount –a ...这条语句在下面这段程序之后)

/bin/mount -n –t  ramfs  ramfs  /var

/bin/mount -n -t  ramfs  ramfs  /tmp

/bin/mount -n -t  sysfs   none  /sys

/bin/mount -n -t  ramfs  none  /dev

/bin/mkdir /var/tmp

/bin/mkdir /var/modules

/bin/mkdir /var/run

/bin/mkdir /var/log

/bin/mkdir -p /dev/pts

/bin/mkdir -p /dev/shm

/sbin/mdev -s

/bin/mount -a

echo /sbin/mdev > /proc/sys/kernel/hotplug

修改etc/fstab文件,增加以下文件

none        /dev/pts   devpts      mode=0622     0 0

tmpfs       /dev/shm tmpfs       defaults           0 0

5、构建lib目录:

进入 /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib目录

将以下动态库拷贝到rootfs/lib下

把虚拟机下的armv4t/lib文件夹下文件复制一份给要制作的根文件下,并且保持链接

#cp  *so*  roofs/lib  -a

进入以下目录/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib

将以下动态库拷贝到rootfs/lib下,和上面一样

#cp ./libstdc++.so.*  rootfs/lib  -a

6、使用nfs挂载验证

完成上面1-5步之后,基本的根文件系统已经完成,在此可以,直接利用cramfs、yaffs制作文件root了

修改vivi启动参数,从虚拟机上启动根文件系统,然后下载到开发板观察,但是基本文件系统缺少相应的应用软件,对于一个文件系统而言,还必须烧写应用程序,但是如果每次烧写一个应用程序就制作一次文件系统,耗费时间长,而且不灵活,为此我们可以在开发板的bootloader的时候就挂载nfs,引导启动虚拟机下的rootfs为根文件系统,下面的命令就是挂载nfs命令。

param set linux_cmd_line "noinitrd root=/dev/nfs nfsroot=/home/rootfs/(修改为实际的目录),rsize=1024,wsize=1024 ip=192.168.220.11(开发板地址可以随便填):192.168.220.xx(虚拟机的地址):192.168.220.254:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0"

 

或修改u-boot的参数:

setenv bootargs noinitrd root=/dev/nfs nfsroot=/home/rootfs/(修改为实际的目录),rsize=1024,wsize=1024 ip=192.168.220.11(开发板地址可以随便填):192.168.220.xx(虚拟机的地址):192.168.220.254:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0

(例如:setenv bootargs 'noinitrd root=/dev/nfs nfsroot=/home/rootfs/,rsize=1024,wsize=1024 ip=192.168.222.70:192.168.222.66:192.168.222.254:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0')

注意:vivi修改参数使用双引号,u-boot使用单引号

7、制作根文件系统

制作cramfs:

#tar zxvf  cramfs-1.1.tar.gz        //编译cramfs根文件系统制作工具

#cd  cramfs-1.1

#make    会在当前路径下编译得到两个工具:mkcramfs  cramfsck

#cp  mkcramfs  cramfsck  /bin     //将两个工具拷贝到根目录的/bin下

# mkcramfs dirname  outfile

例如:# mkcramfs  rootfs_34/  rootfs_GUI.cramfs    

cramfsck工具用来进行CRAMFS文件系统的释放和检查

# cramfsck  file -x  dir

 

制作yaffs2:

#tar  zxvf yaffs2.tar.gz

#cd  yaffs2/utils

#make                           //会产生mkyaffsimage

#cp mkyaffsimage /bin  //将生成的工具拷贝到bin目录下

#mkyaffsimage usr usr.yaffs

例如:#mkyaffsimage  rootfs_34/   rootfs_GUI.yaffs

文件系统的优化:对于文件系统,只需要动态库,所以.a和.la的文件都可以删除。

/usr/  /home/文件夹下

二、开源程序的移植

应用程序一般是放在/usr/文件夹下

1、触摸屏的移植:

tar  zxvf   tslib-1.0.tar.bz2

生成.configure 文件

./autogen.sh

指定交叉编译器及配置脚本

#CC=arm-linux-gcc    //选择交叉编译器

#./configure --host=arm-linux --prefix=$PWD/../tslib1.0_target  --enable-inputapi=no

//在当前路径的前一级目录建立目标文件夹

#export PLUGIN_DIR=$PWD/plugins

在tslib-1.0\config.h中有一行定义“#define malloc rpl_malloc”,直接注释

//#define malloc rpl_malloc

#make

#make install

#cd ..    //生成了一个tslib_target文件,里面有bin/ etc/ include/ lib几个文件夹

移植到开发板上

在开发板的usr/目录下建立文件夹tslib,将上述四个文件夹拷贝到tslib目录下

#mkdir  /home/rootfs/usr/tslib

 #cp  tslib_target/*  /home/rootfs/usr/tslib  -r

修改 /home/rootfs/usr/tslib/etc/ts.conf将第一句话的屏蔽去掉

    #module_raw input

改为

module_raw input

修改开发板 改 /home/rootfs/usr/tslib/etc/profile 文件,添加以下启动脚本并运行

export T_ROOT=/usr/tslib                               #目录

export PATH=/bin:/sbin:/usr/bin:/usr/sbin:$T_ROOT/bin      #可执行程序目录

export LD_LIBRARY_PATH=/lib:/lib:/usr/lib:$T_ROOT/lib   #库文件目录

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0                      #framebuffer设备文件

export TSLIB_TSDEVICE=/dev/event0                    #触摸屏设备文件

export TSLIB_CALIBFILE=/etc/pointercal      #指定触摸屏校准文件pintercal的存放位置

export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf             #tslib模块配置文件

export TSLIB_PLUGINDIR=$T_ROOT/lib/ts/              #tslib插件库目录

echo "ts init success!"

使用与测试

在bootloader中挂载nfs后,在开发板中输入:

ts_calibrate        

    执行后,屏幕上出现5个点,依次点击进行校准,校准完毕后,在/etc下会产生pointercal文件,供其它程序使用

    ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里

测试完后,会生成poit..文件在/etc/目录下,如果要重新校验,删除poit..文件后在ts_calibrate

2、mplayer的移植

下载源代码

MPlayer - The Movie Player版本:MPlayer-1.0rc3.tar.gz

编译PC版的mplayer

#tar  zxvf  MPlayer-1.0rc3.tar.gz

#cd  MPlayer-1.0rc3

#./configure

#make

#make install

编译ARM版的mplayer

#tar  zxvf  MPlayer-1.0rc3.tar.gz

#cd  MPlayer-1.0rc3

在虚拟机终端中输入配置:

./configure --host-cc=gcc --cc=arm-linux-gcc --target=armv4l --enable-static  --disable-win32dll  --disable-dvdread --disable-dvdread-internal --disable-dvdnav --disable-libdvdcss-internal --enable-fbdev --disable-mencoder --disable-live --disable-mp3lib --enable-mad --enable-libavcodec_a --language=zh_CN

#make  //会在当前文件下生成mplayer可执行程序

其中make会出错,需要更改mplayer_src/libmpeg2/motion_comp_arm_s.S中的代码,

#vim  MPlayer-1.0rc3/libmpeg2/motion_comp_arm_s.S

在最开始的地方添加:

#ifndef HAVE_PLD

.macro pld reg

.endm

#endif

保存之后,再次make,就OK了

#make

把mplayer拷贝到usr/bin/  或者/bin/下

#cp mplayer /home/rootfs/usr/bin/

3、Qtopia-Core-4.7.0在ARM平台上的移植

step 1:配置

./configure -release -fast -embedded arm -depths 8,16,32 -no-stl -no-qt3support -no-nis -no-cups -no-iconv -no-qdbus -no-freetype -qt-sql-sqlite -qt-kbd-tty -qt-libjpeg -qt-gif -qt-libpng -continue -silent -no-mouse-linuxtp -qt-mouse-tslib -I/home/opensource/QtEmbedded-4.7.0-arm/include -L/home/opensource/QtEmbedded-4.7.0-arm/lib

注意:-I /-L 指定前面编译出的tslib的路径,这里的路径为“/home/opensource/QtEmbedded-4.7.0-arm/”

注意:编译之前使用 unset CC 取消CC变量的定义,否则编译会出错

#unset CC

//#make

//#make install

#make;make install

/*会安装库、字体等文件到/usr/local/Trolltech/QtEmbedded-4.7.0-arm目录。*/

step 2:

拷贝/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib目录下的以下文件到根文件系统/usr/lib目录下:即

cp  -a  /usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib/*so*  /home/rootfs/usr/lib

(也可以不用全部拷贝,可以根据需要进行拷贝,这里为了方便我们全拷贝过去)

step 3:

在根文件系统下建立目录(local,Trolltech,QtEmbedded-4.7.0-arm,lib,fonts)

#mkdir /home/rootfs/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib/fonts -p

将QtEmbedded-4.7.0-arm /lib/fonts目录下的字体unifont_160_50.qpf拷到开发板对应的目录

cp QtEmbedded-4.7.0-arm/lib/fonts/unifont_160_50.qpf  /home/rootfs/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib/fonts

step 4:修改环境变量及LCD驱动连接

修改 /etc/profile文件,增加以下声明:

export QWS_MOUSE_PROTO="Tslib:/dev/event0"

export QWS_SIZE=320x240

export QWS_DISPLAY="LinuxFb:mmWidth35:mmHeight45:0"

step 5:

拷贝一个应用程序到根文件系统的/home目录下,这里拷贝QtEmbedded-4.7.0-arm/examples/animation/appchooser

cp QtEmbedded-4.7.0-arm/lib/fonts/unifont_160_50.qpf  /home/rootfs/usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib/fonts

在开发板上挂载nfs根文件系统,输入命令:

#./ appchooser  –qws

程序在显示屏上显示helloworld窗口。

4、tslib的移植(触摸屏)

    嵌入式设备中触摸屏使用非常广泛,但触摸屏的坐标和屏的坐标是不对称的,需要校准。广泛使用的是开源的tslib,我们选用tslib1.0进行配置。

解压tslib-1.0.tar.bz2

tar  zxvf   tslib-1.0.tar.bz2

生成.configure 文件

./autogen.sh

指定交叉编译器及配置脚本

#CC=arm-linux-gcc    //选择交叉编译器

#./configure --host=arm-linux --prefix=$PWD/../tslib1.0_target  --enable-inputapi=no

//在当前路径的前一级目录建立目标文件夹

#export PLUGIN_DIR=$PWD/plugins

在tslib-1.0\config.h中有一行定义“#define malloc rpl_malloc”,直接注释

#define malloc rpl_malloc 改为 define malloc rpl_malloc

#make

#make install

则会在与当前目录平级的文件夹下建立tslib_target文件夹,里面包含

bin/ etc/ include/ lib 等几个文件夹

移植到开发板上:

在开发板的usr/目录下建立文件夹tslib,将上述四个文件夹拷贝到tslib目录下

#cd     /home/rootfs/usr/

#mkdir  /usr/tslib

#cp     tslib_target/*  /usr/tslib  -r

修改 /usr/tslib/etc/ts.conf将第一句话的屏蔽去掉

    #module_raw input

改为

   module_raw input

修改开发板 /etc目录下/profile 文件,添加以下启动脚本并运行

vi /home/rootfs/etc/profile

export T_ROOT=/usr/tslib                               #目录

export PATH=/bin:/sbin:/usr/bin:/usr/sbin:$T_ROOT/bin      #可执行程序目录

export LD_LIBRARY_PATH=/lib:/lib:/usr/lib:$T_ROOT/lib   #库文件目录

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0                      #framebuffer设备文件

export TSLIB_TSDEVICE=/dev/event0                    #触摸屏设备文件

export TSLIB_CALIBFILE=/etc/pointercal      #指定触摸屏校准文件pintercal的存放位置

export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf             #tslib模块配置文件

export TSLIB_PLUGINDIR=$T_ROOT/lib/ts/              #tslib插件库目录

echo "ts init success!"

使用与测试:

在开发板输入命令:

./ts_calibrate         

执行后,屏幕上出现5个点,依次点击进行校准,校准完毕后,在/etc下会产生pointercal文件,供其它程序使用

ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里

ts_print        将屏幕坐标打印出来

                         横坐标 纵坐标  

1796351007.320859:    156    116    500   按下

1796351007.355145:    156    116      0   抬起

ts_print_raw    将屏幕坐标的原始数据打印出来

1796350964.530867:    216    865      1  按下

1796350989.946831:      0      0      0  抬起

ts_test      检测一下校正结果,如果touch的时候,十字光标随着手指移动。

5、boa移植(boa为一个web服务器,主要应用于嵌入式系统)

www.boa.org下载boa-0.94.13.tar.gz

解压tar zxvf boa-0.94.13.tar.gz

cd src/

运行configure 修改Makefile文件:

将:

vi Makefile

CC = gcc       CPP = gcc -E     该为:CC = arm-linux-gcc       CPP = arm-linux-gcc -E

修改src/boa.c 注释掉下面语句:

#if 0

if (setuid(0) != -1)

{

      DIE(”icky Linux kernel bug!”);

}

#endif

运行make

util.c: 100: 1: pasting “t” and “->” does not give a valid preprocessing token make: [util.o] Error1

解决方法:

修改compat.h中的

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

为:

#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff

设置建立相关文件夹:

建立../rootfs/usr/boa

mkdir /home/rootfs/usr/boa      (存放设备文件boa相关文件)

建立www  cgi-bin  log三个文件夹,

cd /home/rootfs/usr/boa/

mkdir www  cgi-bin  log

(www文件夹存放web相关文件)(cgi-bin存放cgi文件)(log存放日志,必须可写)

修改配置文件boa.conf

把复制../boa-0.94.13/src/boa.conf到../rootfs/usr/boa目录下

    cp boa.conf /home/rootfs/usr/boa/

在boa.conf修改相关信息

    vi /home/rootfs/usr/boa/boa.conf

    修改User nobody 为 User 0

    修改Group nogroup 为 Group 0

        修改为:ErrorLog    /usr/boa/log/error_log

        修改为:AccessLog   /usr/boa/log/access_log

    修改为:DocumentRoot /usr/boa/www

    修改为:ScriptAlias /cgi-bin/  /usr/boa/cgi-bin

    修改为:MimeTypes /usr/boa/mime.types

    去掉注释boa.conf大约第94行

    ServerName www.your.org.here

把文件放入文件夹中:假设在boa-0.94.13/src/

    cp boa /home/rootfs/usr/boa/

        把相关的www文件放入/home/rootfs/usr/boa/www/中

OK,在开发板上./usr/boa/boa程序

./usr/boa/boa

还有把IE的代理服务器取消

在windows下通过http://172.20.223.151这种形式访问,进行测试,如果换了主页要清下IE缓存

你可能感兴趣的:(嵌入式培训课程笔记,linux,笔记,arm开发)