链接:https://pan.baidu.com/s/1VUc8cGI7bTtXuGepZZY3Ng?pwd=1688
提取码:1688
上午:文件系统介绍
下午:文件系统的制作
教学内容:
在linux中文件分为二种:
根文件和普通文件;
Linux以树状结构管理所有目录、文件,其它分区挂载在某个目录上,这个目录被称为挂载点或安装点,然后通过此目录来访问这个分区上的文件
VFS:为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供统一的操作界面和应用编程接口,VFS只存在于内存中,不存在于任何外存空间。
根文件系统有基于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缓存