嵌入式Linux系统基础
在了解Linux相关基础知识基础上,本章将介绍与嵌入式Linux系统开发有关的基础知识,主要包括三部分内容:1)构建嵌入式Linux操作系统开发环境,即了解嵌入式系统开发的相关细节和环境搭建:2)嵌入式系统开发基础和C语言程序设计;3)线程和进程的程序实现。是否熟练掌握嵌入式Linux系统的基础术语会直接影响到使用效果
2.1构建嵌入式Linux系统环境
嵌入式系统一般是以应用为中心,以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式开发板的资源往往比较有限,没有足够的资源来运行开发调试工具。所以,通常嵌入式系统的软件开发需要采用交叉编译的方式。
交叉编译是构建嵌入式Linux系统环境过程中的重要一步。交叉编译的环境建立在宿主机(host)上,而对应的开发板称为目标机(target)。为了使宿主机上开发的程序(应用程序和驱动程序)能够方便的下载到目标机上运行,一般还要还在宿主机上配置好网络,使其支持NFS或tftp等网络服务,从而实现两台机器之间的文件共享。
2.2交叉编译
所谓的交叉编译,就是利用运行在某台计算机(宿主机)上的编译器编译某个程序,生成在另一台机器(目标机)上运行的目标代码的过程。事实上,交叉编译是不得不产生的技术。因为目标机资源有限,无法运行编译和调试工具,因此需要宿主为之代劳。另外,在构建嵌入式系统的过程中也需要交叉编译目标机所需要的引导系统和操作系统内核。因此,在嵌入式系统开发时,往往由宿主机开发程序,而目标机作为最后的执行机。两者在开发时需要交替结合进行。
2.3 交叉编译器
在构建交叉编译环境的过程中,交叉编译器(cross compilation tool chain)无疑是最重要的组成部分。在嵌入式系统开发过程中,由嵌入式开发平台的资源有限:例如常见的ARM开发平台,静态存储空间仅有32MB,CPU主频也仅为203MHz。这样的资源不足以完成本机编译(native compilation),因此交叉编译器应运而生。
NFS 简介
在嵌入式系统开发过程中,由于可执行程序的编译过程和执行过程分别在宿主机和目标机上完成,因此实现宿主机和目标机之间的实时交互能够大幅度提高嵌入式系统开发的效率。由于目标机也带有操作系统,因此可以通过实现不同机器之间的网络共享来完成实时交互。NFS为为网络文件系统(Network File System)的缩写,NFS最早是由Sun公司于1984年开发出来的,其目的就是让不同计算机不同操作系统之间可以彼此共享文件。由于NFS使用起来非常方便,因此很快得到了大多数的UNIX/Linux系统的广泛支持,而且还被IETE(国际互联网工程组)制定为RFC1904、RFC1813和RFC3010标准使用NFS服务,至少需要启动以下3个系统守护进程。
(1)rpc.nfsd
它是基本的NFS守护进程,主要功能是管理客户端是否能够登入服务器。
(2)rpc.mountd
它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利地通过rpc.nfsd登录NFS服务器后,在使用NFS服务器所提供的文件前,还必须通过文件使用权限的验证,rpc.mountd会读取NFS的配置文件/etc/exports来对比客户端的权限。
(3)portmap
portmap的主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口号提供给客户端,从而使客户端可以通过该端口向服务器请求服务。值得注意的是,虽然portmap只用于RPC,但它对NFS服务来说是必不可少的。portmap没有运行,NFS客户端就无法查找从NFS服务器中共享的目录,要检查NFS服务是否正常运行,可使用rpcinfo -p命令。如果NFS服务运行正常,就可在该命令执行结果中看到关于portmapper等守护进程的条目。
NFS安装主要软件包
portmap-4.0-54.i386.rpm//提供port端口软件包
nfs-untils-1.0.1-2.9.i386.rpm//nfs服务包
[root@localhost root]#rpm ?qa|grep portmap
//查看portmap软件包是否安装
[root@localhost root]#rpm ?qa|grep nfs
//查看nfs软件包是否安装
[root@localhost root]#mount /dev/cdrom /mnt/cdrom
//如果没有安装,则将Red Hat Linux 9.0的第一张镜像盘挂载到虚拟机上,两个主安装包都在第一张镜像盘
[root@localhost RPMS]#cd /mnt/cdrom/RedHat/RPMS/
//切换到安装包目录,
[root@localhost RPMS]#ls ?l portmap*
//显示以portmap开头安装包的详细信息
[root@localhost RPMS]#rpm ?ivh portmap-4.0-54.i386.rpm
//安装并用进度条显示安装过程
[root@localhost RPMS]#ls ?l nfs-utils*
//同理,显示nfs安装包
[root@localhost RPMS]#rpm ?ivh nfs-untils-1.0.1-2.9.i386.rpm
//安装nfs
[root@localhost RPMS]#ls ?l redhat-config-nfs-1.0.4-5.noarch.rpm
解压是一样道理的。
[root@localhost root]#service portmap status
//查看portmap端口的运行情况
[root@localhost root]#service nfs status
//查看nfs服务是否启动
[root@localhost root]#service portmap start
//启动portmap服务
[root@localhost root]#service nfs start
//启动nfs服务,如果重启服务用service nfs restart
[root@localhost root]#rpcinfo ?p
//显示nfs程序版本协议端口
DEVICE=eth0 //设备别名
BOOTPROTO=static //静态类型
IPADDR=192.168.1.10 //IP地址
NETMASK=255.255.255.0 //子网掩码
NETWORK=192.168.1.0 //网络地址
BORADCAST=192.168.1.255 //广播地址
在根目录下建立一个arm2410cl主目录,在arm2410cl建立1个子目录temp
基本:
目录:自己定义的
/arm2410cl *(或缺省) 所有主机
/arm2410cl/temp 192.168.1.0/24(或192.168.1.*) 指定子网中的所有主机
/arm2410cl/mail www.chen.com 指定域名的主机
/arm2410cl/samba *.chen.com 指定域中的所有主机
/arm2410cl/ftp 192.168.1.10指定IP地址的主机
基本权限:
ro: 只读
rw: 读写
两个基本权限是单选的,选择ro,rw就不能存在。同理,选择rw就不能选择ro
常规选项:
Insecure:允许来自高于1024的端口的连接
Insecure_locks:允许不安全的文件锁定
no_subtree_check:禁用子树查询
sync:按要求同步写操作
no_wdelay:立即强制同步写操作
用户访问:
no_root_squash:把远程根用户当作本地根用户
all_squash:把所有客户用户当作匿名用户
anOnuid=XXX:为匿名用户指定本地用户ID
anOngid=XXX:为匿名用户指定本地组群ID
维护NFS服务的输出目录列表
每当修改了/etc/exports文件的内容后,实际上不需要重新启动NFS服务,而直接使用命令exportfs就可以使设置立即生效。
exportfs命令就是用来维护NFS服务的输出目录列表的,命令的基本格式如下:
exports [选项]
选项有以下几个。
-a:输出在/etc/exports文件中所设置的所有目录。
-r:重新读取/etc/exports文件中的设置,并使设置立即生效,而不需重新启动NFS服务。
-u:停止输出某一目录。
-v:在输出目录时将目录显示到屏幕上。
1.重新输出共享目录
每当修改了/etc/exports文件的内容后,可使用下面的命令来重新输出共享目录
Exports ?-rv
2.停止输出所有共享目录
要停止输出当前主机中NFS服务器的所有共享目录,可使用下面的命令。
exportfs ?-auv
NFS服务的配置
NFS服务的配置方法相对比较简单,只需在NFS的主配置文件/etc/exports中进行设置,然后启动NFS服务即可。
2.使用showmount命令测试NFS服务器的输出目录状态
showmount命令的基本格式为:
showmount ?-e 192.168.1.10
showmount
showmount命令如下:
# showmount [-ae] hostname
参数说明如下。
(1)-a:以host:dir这样的格式来显示客户主机名和挂载点目录。
(2)-d:仅显示被客户挂载的目录名。
(3)-e:显示NFS服务器的输出清单。
(4)-h:显示帮助信息。
(5)-v:显示版本信息。
(6)--no-headers:禁止输出描述头部的信息。
当要扫描某一主机所提供的NFS共享的目录时,使用showmount -e IP(或主机名称hostname)即可。
观察激活的端口号
# netstat -utln
nfs所开启的端口是2049,其他端口是RPC Server其他程序(例如rpc.mountd、rpc.rquotad及rpc.nfsd.)随机产生的。即端口号不会是固定的,每次restart nfs都会得到不一样的端口号值得注意的是,在使用showmount -e命令查看NFS服务器上的输出目录时,如果出现如图4-14所示的故障,其原因可能是NFS服务器上没有启动portmap或nfs服务,也可能是被防火墙过滤掉了。解决办法是启动NFS服务器上的portmap或nfs服务,并重新设置NFS服务器上的防火墙(包括iptables和TCP_Wrappers)。若是iptables防火墙引起的故障,为了测试NFS服务器功能,可简单地用service iptables stop命令先关掉该防火墙。如果不想关掉防火墙也可以,RPC port端口:111 和NFS启动端口2049,允许对外开放
iptables -A INPUT -p tcp -m multiport --dport 111,2049 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 111,2049 -j ACCEPT
启动时自动连接NFS要想让系统在启动时自动挂载NFS服务器上的输出目录,应编辑文件/etc/fstab,在该文件中加入如下格式的语句
[root@localhost root]#vim /etc/fstab
NFS服务器名或IP地址:输出目录 本地挂载目录 nfs defaults 0 0
192.168.1.10:/arm2410cl /mnt/nfs nfs defaults 0 0
启动超级终端:修改IP和子网掩码
[root@EmbedSky /]#ifconfig eth0 192.168.1.6 netmask 255.255.255.0
[root@EmbeSky /]#ping ?c 4 192.168.1.10
//ping是连通
[root@EmbeSky /]#mount ?t nfs ?o nolock 192.168.1.10:/arm2410cl /mnt/nfs
挂载目录是客户端的/arm2410cl 挂载点是开发板上的/mnt/nfs
卸载NFS服务器
[root@EmbedSky]#umount /mnt/nfs
//不能在挂载目录卸载,否则卸载会显示系统繁忙无法卸载
如果不想再使用已挂载的NFS输出目录,可用umount命令来卸载该目录。例如,要卸载前面挂载的/mnt/nfs目录,可使用下面的命令。
Umount /mnt/nfs
故障排除思路
NFS出现了故障,可以从以下几个方面着手检查。
(1)NFS客户机和服务器的负荷是否太高,服务器和客户端之间的网络是否正常。
(2)/etc/exports文件的正确性。
(3)必要时重新启动NFS或portmap服务。
运行下列命令重新启动portmap和NFS:
service portmap restart
service nfs start
(4)检查客户端中的mount命令或/etc/fstab的语法是否正确。
(5)查看内核是否支持NFS和RPC服务。
Portmap关闭或防火强启屏蔽,或没有启动NFS服务
挂载时命令打错了的
挂载时没有那个目录的状态
原文出处:http://chenboqiang.blog.51cto.com/1068057/285346