How to build embedded developing environment (PC side)
时间:2010-08-29 来源:姚伟峰
“Man is a tool-making animal.”
- Benjamin Franklin (1706-1790)
How to build embedded developing environment (PC side)
—Generic Linux Case
1. Ubuntu的安装
2010年4月,Ubuntu发布了Ubuntu10.04版,这个版本提供了更为流畅的安装体验和使用体验。这里,我们安装的是Ubuntu10.04 LTS的CD版,安装过程非常简单,把光盘插进去,只需要选择几个选项后,Ubuntu就可以自动完成安装了。一个非常详尽的Ubuntu 10.04安装指南是getting started with ubuntu 10.04,可以从这里(http://ubuntu-manual.org/downloads)得到,这是一个非常适合新手的step-by-step教程。
小知识[1-2]
小知识[1-2]饮水思源,我们有必要回顾一下Ubuntu的内涵:
2004年南非人Mark创建了Ubuntu社区。在南非语中,“Ubuntu”(读作oo-BOON-too-乌班图),就是“Humanity to others”(善待他人)之意,Ubuntu把这种自由、分享的精神带入软件产业,表达了对自由软件美好理想的追求。
Ubuntu的另一层意思 — I am because we are(我们是同源一体)。它强调的是集体的重要性。彰显的是分享精神与整体意识。这词所体现的也正是我们对自由软件和开源运动价值观的认同。
Ubuntu所追求的是共享、共同进步的思想,正是科学、社会不断进步的源泉。
2. TFTP服务的安装[3-7]
TFTP(Trivial File Transfer Protocol), 简单文件传输协议。从它的名称上看出,它适合传送“简单”的文件(小于1 TB,且不能罗列目录内容)。与FTP不同的是,它使用的是UDP的69端口,因此它可以穿越许多防火墙。不过它也有缺点,比如传送不可靠、没有密码验证等。也正是由于这些简单的设计,使得TFTP只需占用很少的内存,因此很适合嵌入式系统中的文件传送。我们经常使用TFTP协议来从PC机向开发板download一些Image等文件。
因此,这就需要在PC机上安装TFTP服务端[3-4]。
我们安装的是tftpd-hpa, 它是一个功能增强的TFTP服务器,提供了很多TFTP的增强功能,而且已被移植到大多数的现代UNIX系统。下面列出TFTP的安装步骤[5-7]:
step 1.安装
$ sudo apt-get install tftpd-hpa tftp-hpa
step 2.配置
编辑tftp-hpa的配置文件/etc/default/tftpd-hpa
$ sudo gedit /etc/default/tftpd-hpa
tftpd-hpa文件的内容如下:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot" // 这里填你的tftpd-hpa的服务目录
TFTP_ADDRESS="0.0.0.0:69" // 可以看出,是69号端口
TFTP_OPTIONS="-l -c -s" // 这里是选项
注意:如果是在10.04以下的版本配置项略有不同,应为:
TFTP_USERNAME="tftp"
TFTP_ADDRESS="0.0.0.0:69" // 可以看出,是69号端口
RUN_DAEMON="yes"
OPTIONS="-l -c -s /tftpboot"
step 3.修改服务目录的属性
TFTP的服务目录需要具有读写属性,而新建目录默认是没有这个属性的。因此,在启用TFTP服务前,首先需要修改目录属性,否则可能会导致使用失败。
$ sudo chmod –R 777 /tftpboot
step 4.启动服务
$ sudo service tftpd-hpa restart
step 5. 重启Linux
要使服务启动,需重启linux。
step 6. 测试服务是否已启动
方法1.
$ netstat -au | grep tftp
如果显示udp 0 0 *:tftp *:*,说明tftp服务已经启动
方法2.
在TFTP服务目录新建一个文件(下例中为1.txt);然后再转换到任意另外一个目录(下例中为/home), 把这个目录作为客户端,服务目录作为服务端。因此,在当前目录下使用tftp localhost命令,这是因为客户端和服务端在同一台机器上,所以TFTP的地址为本机,否则应为服务端的IP地址。(从/etc/hosts中,我们看出localhost是环回地址127.0.0.1的别名)。进入TFTP模式后,使用get命令来获取服务端的指定文件(下例中为1.txt)。如若发现,改文件在本目录出现,即传送成功,说明tftp服务已启动。同理, 把当前目录下的一个文件put <文件名>,再查看/tftpboot目录是否接收到该文件,可以判断tftp客户端是否已启动。
$ cd /tftpboot
$ touch 1.txt
$ cd /home
$ tftp localhost
tftp>> get 1.txt
tftp>> put ***
3.NFS server的安装[8-9]
NFS(Network File System),网络文件系统,允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。在嵌入式系统开发中,target board经常通过挂载PC机NFS共享目录的方式来共享PC机的内容,从而实现在PC机上修改的文件能够快速同步并在target board上运行的目的。
step 1. 安装NFS服务器程序
$ sudo apt-get install nfs-kernel-server
$ sudo apt-get install nfs-common
step 2. 编辑共享目录配置文件exports,指定共享目录及其权限
$ sudo vim /etc/exports
在打开的文件中添加中添加共享目录名。举例来说,我要添加/nfs/rootfs成为共享目录,就可在文件中添加如下行:
/nfs/rootfs *(rw,sync,no_root_squash)
下面我们尝试着解释一下上面这句话的意思,它表示允许所有IP(*)的计算机以读写的权限和root的特权(rw,sync,no_root_squash)来访问共享目录/nfs/rootfs。
可见,这句话的语法如下:
<share directory> <permitted IP>(authorized right)
再举个例子,如果我要允许192.148.1.*地址的用户以最高权限访问我的共享文件夹/nfs/rootfs的话,就应该在/etc/exports文件中添加如下一行:
/nfs/rootfs 192.168.1.*(rw,sync,no_root_squash)
代码 小知识[9]
权限参数说明如下:
rw - 读/写权限。如果设定只读权限,则设为ro。但是一般情况下,为了方便交互,要设置为rw。
Sync - 数据同步写入内存和硬盘。
no_root_squash - 此参数用来要求服务器允许远程系统以它自己的root特权存取该目录。就是说,如果用户是root,那么他就对这个共享目录有root的权限。很明显,该参数授予了target board很大的权利。安全性是首先要考虑的,可以采取一定的保护机制。但是,如果使用默认的root_squash,target board自己的根文件系统可能有很多无法写入,运行会受到极大的限制。因此在安全性有所保障的前提下,一般都使用no_root_squash参数。
step 3. 启用保护机制
我们可以通过设定/etc/hosts.deny和/etc/hosts.allow文件来限制网络服务的存取权限。我们可以如下修改这两个文件:
# /etc/hosts.deny
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
# /etc/hosts.allow
portmap:192.168.1.101
lockd:192.168.1.101
mountd:192.168.1.101
rquotad:192.168.1.101
statd:192.168.1.101
使用这两个文件就会使得只有IP为192.168.1.101的机器使用NFS服务,而一般target board的IP地址也设定为192.168.1.101,因此只有你的target board可以使用你的NFS服务。
当然,你也完全可以不去修改这两个文件,不用管它,这时任何机子都可以access到你的共享目录,在安全有保障的前提下,这也是可行的。
step 4. 启动
和TFTP一样,在使用前,你必须先启动NFS服务。启动分为两个步骤:
1. 启动portmapper(端口映射)服务,这是NFS本身需要的。
$ sudo service portmap start
或
$ sudo start portmap
在Ubuntu 10.04之前的版本,命令为:
$ sudo /etc/init.d/portmap start
2. 启动NFS Server。
$ /etc/init.d/nfs-kernel-server start
NFS Server启动成功后,NFS会激活守护进程,然后开始监听客户端的请求。
step 5. 测试
最后要检查一下本机的iptables等,确定没有屏蔽NFS使用的端口和允许通信的主机。测试方法还是环回测试。
1. 修改/etc/hosts.allow,把IP改为本机IP地址。
2. 执行命令:
$ mount -t nfs localhost:/nfs/rootfs /mnt
$ ls /mnt
如果NFS Server正常工作,应该在/mnt下面看到共享目录/nfs/rootfs的内容。
代码 小知识[9]
一般target board 都会支持NFS客户端来实现NFS挂载,但是很可能你需要挂载的目录与zImage内核编译者的不尽相同,因此有时需要重新挂载新的目录到target board上,这时需要如下命令:
$ mount -o nolock -t nfs <your-server-ip>:/nfs/rootfs /mnt/nfs
这句命令的意思是将IP地址为<your-server-ip>上的/nfs/rootfs目录挂载到板子上的/mnt/nfs上。当然了,目录你是可以自由选择的。
由于很多嵌入式设备的根文件系统中不带portmap,所以一般都使用-o nolock参数,即不使用NFS文件锁,这样就可以避免使用portmap。如果顺利,在/mnt/nfs下,就可以看到Linux server(PC端)的共享文件夹下的内容了,而且两个文件夹内的修改是同步的。
4. SSH的安装[13]
SSH(Secure SHell ), 安全外壳协议。所有使用SSH协议传输的数据都会首先被压缩和加密,然后再传输。这种做法有两个好处:首先数据加密后,减少了窃听、篡改和攻击的风险,从而更加安全;其次由于数据是经过压缩传输的,所以增加了带宽的利用率,降低了传输时间。由于以上两个优点,SSH被广泛应用于远程登录,成为Telnet的安全替代品。
在我们的开发过程中,常常需要登录其他开发人员的机器或者是让其他开发人员登录自己的机器,从而达到远程Debug或是资源共享的目的,因此SSH的客户端和服务端在我们的开发机上都是必不可少的工具。
Ubuntu默认安装了SSH的客户端,因此我们不需要安装客户端就可以使用下面的语句来访问别人的机器。成功访问之前,有两个必不可少的步骤:一,必须知道所要访问的主机的IP地址;二,必须向你所要访问的机器的主人要一个用户名<usrname>和密码。
$ ssh <usrname>@<IP address>
同时,为了让别人也能登录到我们的机器上,需要安装SSH server,常用的是OpenSSH-server, 如下:
$ sudo apt-get install openssh-server
安装完成后,SSH server就自动启动了。
代码 小知识
PuTTY:一个优秀的Windows/Linux SSH客户端
如果你现在只有Windows机器,而开发需要在Linux机器上进行,那么你就需要远程登录到开发机上去,然后用Linux的style去操作。PuTTY这个小工具就提供了这个渠道。
PuTTY是一个小巧方便的SSH/Telnet远程登录程序,有了它你就可以远程登录和控制Linux开发机了。它的使用方法非常简单。下面分享了两个非常好的教程,相信你一看便知:
(1) 精彩PuTTY中文教程:http://dzh001.blog.51cto.com/2767/40624
(2) PuTTY入门教学:http://www.ascc.sinica.edu.tw/putty
5. Samba的安装与共享文件夹的设置[10-12]
自从出现NetBIOS协议,Microsoft用它实现了网络文件/打印服务,即大家熟知的打印与共享服务,它是基于SMB(Server Message Block)协议,实现不同计算机之间共享打印机、串行口和通讯抽象(如命名管道、邮件插槽等)。
随着Internet的流行,Microsoft希望将这个协议扩展到Internet上去,成为Internet上计算机之间相互共享数据的一种标准。因此它将原有的几乎没有多少技术文档的SMB协议进行整理,重新命名为 CIFS(Common Internet File System),并打算将它与NetBIOS相脱离,试图使它成为Internet上的一个标准协议。
为了让Windows和UNIX主机实现资源共享,可行的一种方法就是在UNIX计算机中安装支持SMB/CIFS协议的软件,这样Windows客户就不需要更改设置,同对待Windows主机一样,能用UNIX计算机上的资源了。Samba是用来实现SMB的一种软件,它的工作原理是让NetBIOS (Network Basic Input/Output System)和SMB这两个协议运行于TCP/IP协议之上,并且使用Windows的NetBEUI(Net BIOS Enhanced User Interface)协议,让类UNIX主机可以在网络邻居上被Windows主机看到。它的功能有:
1. 实现Linux主机之间和Linux主机与Windows主机之间的文件共享
2. 实现Linux主机之间和Linux主机与Windows主机之间的打印机共享
可以看到,Samba服务的主要作用就是让Windows用户像处理Windows文件夹一样去处理Linux文件夹。因为在我们的工作环境中,操作系统并不是单一的,有人使用Windows,有人使用Linux,因此,这一点对于共享显得尤为重要。
step 1. 安装
$ sudo apt-get insall samba
$ sudo apt-get install smbfs
step 2. 创建共享目录
$ mkdir /home/<usr name>/share
$ sudo chmod -R 777 /home/<usr name>/share
共享目录一般建在你的用户目录下。如果你的共享目录不在你的用户目录下,samba默认是不支持的,这时候就需要我们去修改Samba的配置文件,我们在step3会谈到。
step 3. 创建Samba配置文件
1. 保存现有的配置文件
$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
备份是不变的主题。
2. 修改现配置文件
$ sudo gedit /etc/samba/smb.conf
在smb.conf的最后添加:
[share]
path = /home/<usr name>/share
available = yes
browsealbe = yes
public = yes
writable = yes
如果你想要共享不在你的用户目录下的文件夹,你需要在smb.conf中添加下面一行:
usershare owner only = false
这句话表明,不是文件的拥有者,也有权限去设置文件的共享属性。
step 4. 创建samba帐户
$ sudo touch /etc/samba/smbpasswd
$ sudo smbpasswd -a <usr name>
这一步就是为Windows用户在access你的文件夹时设置用户名和密码,这句话执行后,系统会要求你输入新的密码,以后Windows用户就可以用这个用户名和密码来访问你的共享文件夹了。如果这一步不做的话,Windows用户登录时会提示 session setup failed: NT_STATUS_LOGON_FAILURE。
step 5. 重启samba服务器
$ sudo /etc/init.d/samba restart
step6. 测试
$ smbclient -L //localhost/share
代码
小知识[12] smb.conf 共享参数的意义 path //分享资源的完整路径名称,除了路径要正确外,目录的权限也要设对 browseable //是yes/否no在浏览资源中显示共享目录,若为否则必须指定共享路径才能存取 printable //是yes/否no允许打印 hide dot files //是yes/否no隐藏隐藏文件 public //是yes/否no公开共享,若为否则进行身份验证(只有当security = share 时此项才起作用) guest ok //是yes/否no公开共享,若为否则进行身份验证(只有当security = share 时此项才起作用) read only //是yes/否no以只读方式共享当与writable发生冲突时也writable为准 writable //是yes/否no不以只读方式共享当与read only发生冲突时,无视read onlyvaild users //设定只有此名单内的用户才能访问共享资源(拒绝优先)(用户名/@组名) invalid users //设定只有此名单内的用户不能访问共享资源(拒绝优先)(用户名/@组名 read list //设定此名单内的成员为只读(用户名/@组名) write list //若设定为只读时,则只有此设定的名单内的成员才可作写入动作(用户名/@组名) create mask //建立文件时所给的权限 directory mask //建立目录时所给的权限 force group //指定存取资源时须以此设定的群组使用者进入才能存取(用户名/@组名) force user //指定存取资源时须以此设定的使用者进入才能存取(用户名/@组名) allow hosts //设定只有此网段/IP的用户才能访问共享资源 deny hosts //设定只有此网段/IP的用户不能访问共享资源 |
好吧,我承认step 3的第二个步骤并不是必要的,你完全可以像Windows系统中那样,右击需要共享的文件夹,选择共享选项来完成。
6. GIT & SVN的安装
GIT和SVN是软件项目中两个重要的版本控制工具。如果你是一个项目开发小组的成员,那么大家共同写作在一个repository上,就需要GIT和SVN来管理。GIT和SVN有互补的效果。SVN更适用于内部开发,他能够实现项目快速更新的目的,但是如果一个项目需要面对各种不同的用户的话,对于大体相同的项目,就会需要很多份硬拷贝,这既不利于管理,也不利于项目的同步,而GIT利用branch的手段解决了这个问题。因此,一般在前期开发阶段使用SVN,在项目Release阶段使用GIT。安装GIT和SVN的过程如下:
$ sudo apt-get install git-core gitk
$ sudo apt-get install subversion subversion-tools
至于如何使用这两个工具,那就需要另外的文档来讲清楚了。
7. make工具与编译器的安装
对于一个Linux下的程序员,一套完整好用的编译工具是必要的。我们可以按照自己的需要来安装相应的工具。比如过我主要用C/C++编程,那我就需要装一个g++的编译套件。
$ sudo apt-get install g++
Marvell拥有针对Marvell平台专门优化的,可用于编译C/C++、汇编和wMMX的编译套件arm-marvell-linux-gnueabi,目前最新的版本为4.4.4。使用它你首先需要找到一个套件文件(向你的同事询问吧);然后将这个文件拷到PC的/usr/local文件夹下。一般我们自己编写的make文件都会用arm-marvell-linux-gnueabi来编译。但是编译器版本更新快,而且同一台机器可能需要共存几个版本的编译器。所以下面这个命令显得比较方便:
$ ln -s arm-marvell-linux-gnueabi-4.*.* arm-marvell-linux-gnueabi
这条命令的意思是说,新建一个符号链接arm-marvell-linux-gnueabi指向arm-marvell-linux-gnueabi-4.*.*。也就是说如果有make文件要找arm-marvell-linux-gnueabi的话,我们就把它引到arm-marvell-linux-gnueabi-4.*.*哪里去。这样如果我想换一个版本的编译器编译的话,就不需要该makefile或是编译器的文件夹名字,只要把这个符号链接重新定义一下就行了。
8. Tricks & Tips
到这里我已经尽量详细地叙述了我搭建Linux开发机的过程。在这个过程中,肯定会遇到各种各样未知甚至有些神奇的问题,在这个文档中并没有提及。根据我的经验,我会向你提以下四点建议:
1. Maybe you need reboot. 我碰到过很多很多的问题,用别人提供的各种方法尝试都没有结果,最后重启电脑后都神奇的解决了。记住,有些设置是需要在重启后才生效的,因此,在你遇到设置不生效等奇怪问题久无出路时,不妨尝试重启电脑。所谓“山重水复疑无路,柳暗花明又一村”。
2.prompt很重要。Ubuntu是一个很成功的系统,其一大原因是它拥有一个很具可操作性的提示系统。当你执行错误时,不妨去看看提示,在很多情况下它会给你相应的建议,照着这个去做,问题一般都会解决。
3. sudo以及文件操作权限。很多操作不成功,其原因大多在两种:第一,当前用户不具有命令权限,在命令前加上sudo吧,它会给你力量的;第二,文件的权限不足,比如说你对一个具有只读权限的文件执行写操作,肯定不行。所以用chmod去提升文件的权限吧。
4. google很重要。错误都是类似的,你发现的问题,十之九九是别人也碰到过的,所以google一下吧,只需要把你的错误贴上,你就会发现成千上万的同道中人也曾经跌倒在这个臭水沟里,去看看它们是怎样爬上来的吧。另外还有一个小小技巧就是,如何最大限度地利用搜索引擎。毫无疑问,google搜索的效率是远在baidu之上的,但是由于受到封锁,所以从google出去的很多网站的链接是被封掉的。因此,你可能需要,首先用google搜索,找到需要的网站地址,再把它贴到baidu上去,通过baidu连出去。这种方法,十有八九是奏效的。悲剧!
【Reference】
1. ubuntu是什么意思?
http://wenwen.soso.com/z/q137867822.htm
2. ubuntu是什么意思?
http://ks.cn.yahoo.com/question/1406022801348.html
3. TFTP协议
http://www.hudong.com/wiki/TFTP%E5%8D%8F%E8%AE%AE-
4. Trivial File Transfer Protocol
http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol#Disadvantages_of_TFTP
5. ubuntu10.04 安装配置tftp服务
http://hi.baidu.com/571209683/blog/item/77b8a91ddaba71c4a6866911.html/cmtid/5a6386799cdfc0f90bd187ba
6. FTP服务器tftpd-hpa
http://www.oschina.com/p/115/tftpd-hpa.html
7. ubuntu10.04 TFTP设置
http://hi.baidu.com/wudaovip/blog/item/55a46a66720b2329ab184ce0.html
8. 虚拟机ubuntu10.04挂载nfs
http://hi.baidu.com/zhupan19851230/blog/item/ffff8a0295ba16db267fb541.html
9. 嵌入式linux的NFS开发环境的建立
http://blog.sina.com.cn/s/blog_43bce9bb0100kx6i.html
10 Samba介绍和使用
http://blog.csdn.net/yangbomy/archive/2007/04/29/1591533.aspx
http://www.cnblogs.com/phinecos/archive/2009/06/06/1497717.html
12. Samba(SMB)共享设置及参数
http://blog.yz33.com/post/62/
13. 程序员安装ubuntu10.04后还需要做的事情
http://blog.csdn.net/jack0106/archive/2010/03/09/5358783.aspx