首页 > 代码库 > 构建基本的嵌入式Linux根文件系统
构建基本的嵌入式Linux根文件系统
配置tftp
配置tftp服务的步骤:
1、安装相关软件包:tftpd(服务端),tftp(客户端),xinetd sudo apt-get install tftpd tftp xinetd
2、建立配置文件
在/etc/xinetd.d/下建立一个配置文件tftp sudo vi tftp
在文件中输入以下内容:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
保存退出
3、建立tftp服务文件目录(上传文件与下载文件的位置),并且更改其权限
sudo mkdir /tftpboot
sudo chmod 777 /tftpboot -R
4、重新启动服务
sudo /etc/init.d/xinetd restart
至此tftp服务已经安装完成了,下面可以对其进行一下测试。(假设在当前目录下有一个测试文件test.txt)
$tftp 127.0.0.1
tftp> put test.txt
Sent 1018 bytes in 0.0 seconds
tftp> get test.txt
Received 1018 bytes in 0.1 seconds
tftp> quit
$
通过put命令,可以把当前目录下的test.txt文件,通过tftp上传到它的服务文件目录。这时,在/tftpboot下面会出现test.txt文件。通过get命令,可以从/tftpboot下,下载test.txt文件。这样就验证了tftp服务配置的正确性。当文件上传与下载结束后,可以通过quit命令退出。
严格按照以上步骤配置tftp服务,一般都可以成功。如果出现无法get或者put的时候,可以查看一下防火墙是否关闭。
安装配置nfs服务器
在ubuntu下安装、配置nfs服务的步骤如下:
1、安装nfs
Ubuntu上默认是没有安装nfs服务器的,因此我们首先安装nfs服务器端:
$sudo apt-get install nfs-kernel-server
在一些文档中,提出还需要使用apt-get来手动安装nfs的客户端nfs-common,以及端口映射器portmap,但其实这是没有必要的,因为在安装nfs-kernel-server时,apt会自动为我们把它们安装好。
2、配置/etc/exports
nfs允许挂载的目录及权限在文件/etc/exports中进行了定义。例如,我们要将根目录下的rootfs目录共享出来,那么我们需要在/etc/exports文件末尾添加如下一行:/rootfs(rw,sync,no_root_squash)
其中:/rootfs是要共享的目录,*代表允许所有的网络段访问,rw是可读写权限,sync是资料同步写入内存和硬盘,no_root_squash是nfs客户端分享目录使用者的权限,如果客户端使用的是root用户,那么对于该共享目录而言,该客户端就具有root权限。
其它nfs常用的参数有:
ro 只读访问
rw 读写访问sync 所有数据在请求时写入共享
async nfs在写入数据前可以响应请求
secure nfs通过1024以下的安全TCP/IP端口发送
insecure nfs通过1024以上的端口发送
wdelay 如果多个用户要写入nfs目录,则归组写入(默认)
no_wdelay 如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置。
hide 在nfs共享目录中不共享其子目录
no_hide 共享nfs目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的GID
3、重启服务
$sudo /etc/init.d/portmap restart
$sudo /etc/init.d/nfs-kernel-server restart
4、测试nfs
此时可以运行以下命令来显示一下共享出来的目录:
$showmount -e
或者可以使用以下命令把它挂载在本地磁盘上,例如将/rootfs挂载到/mnt下:
$ sudo mount -t nfs localhost:/rootfs /mnt
可以运行df命令查看是否挂载成功。查看后可以使用以下命令卸载:
$ sudo umount /mnt
QT4向s3c2410平台移植
1.开发平台:ubuntu 8.10,交叉编译器版本3.4.5(arm-linux-gcc),qt-embedded-linux-
opensource-src-4.4.3.tar.gz。
2.目标平台:s3c2410,320*240触摸屏 ,linux-2.6.26.5,u-boot-1.3.4
3.移植步骤如下:
(1)首先配置linux内核,支持LCD驱动,然后点亮你的屏,并且支持framebuffer,具体的内核配置如下:
Device Drivers ---> Graphics support ---> Support for frame
buffer devices --->
S3C2410 LCD
framebuffer support
当然里面还涉及一些细节。
(2)如果你想支持USB鼠标和USB键盘,只需配置内核既可:
Device Drivers ---> HID Devices ---> USB Human Interface
Device (full HID) support
(3)编译内核进行测试。
(4)接下来在以上工作的基础上开始移植QT4。首先下载源码:
放在你普通用户的一个目录,比如/home/xxx/qt4_port,解压。
(5)进入解压好的目录。
(6)然后就是很关键的配置,QT4的移植是通过配置来是否支持某种特性,比如openssl等等。那么根据你自己的需求呢进行相应的配置就可以了,这里参考网站的一篇文章进行,具体如下:
./configure \
-prefix /home/yoyoili/qt4_port/qt/build \
//指定安装的目录,与开发板上运行的目录一致
-release -shared \
-fast \
-pch \
-no-qt3support \
-qt-sql-sqlite \
-no-libtiff -no-libmng \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-qt-freetype \
-no-openssl \
-nomake examples -nomake demos -nomake tools\
-optimized-qmake \
-no-phonon \
-no-nis \
-no-opengl \
-no-cups \
-no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm\
-no-xinerama -no-xshape \
-no-separate-debug-info \
-xplatform qws/linux-arm-g++ \
-embedded arm \
-depths 16 \
-no-qvfb \
-qt-gfx-linuxfb \
-no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb\
-qt-kbd-usb \
-confirm-license \
-no-armfpa
这里没有去实现触摸屏的校准,如果支持触摸屏,再加一个:
qt-mouse-tslib。
这个过程如果涉及很多问题,一般都是你的系统缺少了某些库的问题,我的ubuntu 8.10相应的库都安装的比较齐全,没有错误,如果你是fedroa,只需要完全安装。
(7)然后就是make && make install,编译和安装了,如果好的话,就会在你的安装目录,也就是 /home/xxx/qt4_port/qt/build 有相应的如下目录:bin include lib mkspecs plugins translations,大家可以看看里面的内容。这里我们关心的是一个lib,就是库文件,以后交叉编译好的程序在板子上跑起来以后都需要这些库。把所需要的库cp /home/xxx/qt4_port/qt/build/lib/libQt* /home/xxx/w/rootfs/home/qt/build/lib,当然有的库你可以不需要拷贝的。注:这里/home/xxx/w/rootfs是目标机nfs挂载点
(8)然后拷贝显示中文的文泉驿字体,这里比如:cp /home/xxx/qt4_port/qt/build/lib/fonts/wenquanyi_160_75.qpf /home/xxx/w/rootfs/home/qt/build/fonts (前面的路径就是编译并安装以后的目录,这个字体就是这个目录的lib/fonts下面 ,当然后面就是我们开发板根文件系统的目录)
(9)测试,我们用源码自带的程序来进行测试,比如在源码的example里有很多,只需qmake && make就可以了,然后把可执行文件拷贝开发板上用的根文件系统。
(10)设置相应的环境变量,这个环境变量是给开发板使用的,不是给你的PC机!具体如下:
export QTDIR=/home/qt/build
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH //(否则找不到库)
export PATH=$QTDIR/bin:$PATH
export QT_QWS_FONTDIR=/home/qt/build/fonts // (否则字体无法显示)
当然如果你用触摸屏还有相关的设置,你也需要在这里添加!
(11)运行我们的程序:
./test -qws -fn /home/qt/build/fonts/wenquanyi_160_75.qpf
然后你的屏上就有了显示。
(12)然后你可以在开发板上插上你的USB鼠标就可以来操作这个小QT程序了。
(13)如果你想玩键盘:
设置你的console=tty0既可以操作你的开发板了,你就可以玩命令了,那么这个console的参数的指定有两种方法,一个可以通过u-boot传递,这里比如:setenv bootargs root=/dev/nfs nfsroot=192.168.1.110:/home/yoyoili/source/rootfs ip=192.168.1.120 init=/linuxrc console=tty0,
另一个就是通过内核,你只需配置内核既可以:具体如下:
Boot options ---> (root=/dev/nfs nfsroot=192.168.1.2:/home/yoyoili/source/rootfs ip=192.168.1.3 init=/linuxrc console=tty0)!
(14)这里说一下可能出现的问题:
1.在编译你的QT程序的时候会有一个collect错误,应该是连接的qt4的库不是arm交叉编译工具编译的,两者连接有冲突。在file.pro中去掉对qt4库的连接即可,增加一行CONFIG -= qt,即可去掉。
2.如果出现这个问题:/lib/libQtCore.so: undefined reference to `clock_gettim 解决的办法就是在Makefile里的LFAGS后添加一个 -lrt就可以。
3.有的人用的交叉编译器是用的arm-softfloat-linux-gnu-gcc,所以在make编译的时候老是提示arm-linux-gcc找不到,解决这个问题的办法很多,一个方法就是重新制作你的交叉编译器,修改arm-softfloat.dat(好像是这个)将里面的TARGET修改为arm-linux就可以了,另一个方法就是修改QT4源码的mkspecs/qws/linux-arm-g++目录下修改qmake.config将arm-linux-gcc修改为arm-softfloat-linux-gcc,然后再make就行了。
4.当然你可以用很多工具来编译你的程序,比如qtcreator,kdevelop
构建基本的嵌入式Linux根文件系统