嵌入式开发环境搭建

嵌入式开发需要环境配置,安装TFTP、NFS、samba等服务。下面就来一一总结安装。
参看:ubuntu12.04配置手册

一、vi功能增强 

1.1vi中不能正确使用上下箭头解决方法 
sudo apt-get install vim (安装完整版本的VI)
1.2 ubuntu里面颜色VI的个性设置
新建/etc/vim/vimrc.local,里面添加内容如下(仅供参考):
set nu
set nocp
set ru
set hls
set is
syntax on
set backspace=indent,eol,start
set sw=4
set ts=4
set sm
set cin
colo slate
set guifont=Courier\New\10
map<F3>!g++% -o mainutocmd FileType python setlocal et sta sw=4 sts=4 

Vi对中文的支持:

新建用户目录下的.vimrc
$vi~/.vimrc
添加如下内容: 
let &termencoding=&encoding 
set fileencodings=utf-8,gbk,ucs-bom,cp936 
在vi的命令行模式下输入:wq!保存退出。

二、安装SSH和telnet服务器

参看:ubuntu12.04安装ssh和telnet服务器

 安装ssh服务器
1.安装ssh服务器端
$ sudo apt-get install openssh-server

2.启动ssh-server
$ sudo /etc/init.d/ssh start(或者restart)
出现以下提示表明server sshd已启动:
* Starting OpenBSD Secure Shell server sshd                             [ OK ]

3.在另外一台机器登录服务器
$ ssh -l zslf 172.17.101.187
-l参数是指定登陆用户
会提示输入密码:
[email protected]'s password:
输入登录密码后,登陆成功则会进入登陆电脑的命令行,就可以远程操作登陆机器了。
ubuntu12.04中默认安装了ssh服务器,所以可以直接使用命令ssh来登陆机器。

SSH的英文全称是SecureSHell。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好 处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的"通道"。 SSH客户端与服务器端通讯时,用户名及口令均进行了加密,有效防止了对口令的窃听。

扩展参看:搭架SSH服务器学习笔记


telnet远程控制

参看:Ubuntu系统开启Telnet服务的步骤

ubuntu安装telnet服务
1. sudo apt-get install xinetd telnetd

2. 安装成功后,系统会显示有相应得提示
运行:
sudo vi /etc/inetd.conf  并加入以下一行
telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd

3. sudo vi /etc/xinetd.conf并加入以下内容:
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/

defaults
{

# Please note that you need a log_type line to be able to use
log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info

instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

includedir /etc/xinetd.d

4. sudo vi /etc/xinetd.d/telnet并加入以下内容:
# default: on
# description: The telnet server serves telnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
 
5. 重启机器或重启网络服务sudo /etc/init.d/xinetd restart

然后看下图登录:

三、启用root密码

为了启用root帐号(也就是设置一个口令)使用:
sudo passwd root 
如何在终端机模式下切换到root身份?
sudo -s -H 
Password: <在这注明您的密码>
【小知识】 
缺省禁止root的好处包括了以下内容 :

起初Ubuntu团队希望安装尽可能的简单.不使用root,在安装期间的两个用户交互步骤可以省略.(科林·沃森) 更进一步,如果在安装中使用root,用户将被要求永远记住他们选择的密码--即使他们很少使用到它.Root密码经常被对Unix安全模型不熟悉的用户忘记.(马特·齐默曼) 它防止了缺省登录时"我能做任何事情"--在较大的变化发生之前,你将被提示输入口令,这可以使你考虑你这样做的结果.如果你作为root登录,你可以删除一些"没用的文件夹"并且不会意识到你正处于错误的目录,那时已经太晚了.它是在Unix下长时间使用"su-command-^D"练习的情况下,代替一直呆在rootshell--除非你做严重的系统维护(那时你仍然可以使用"sudosu").(吉姆·奇塔姆和安德鲁·索巴拉)Sudo增加了运行命令的日志记录(在/var/log/auth.log).如果你陷入困境,你总是可以返回并看见那些运行的命令.(安德鲁·Zbikowski)

四、安装FTP服务 

sudo apt-get install vsftpd
编辑/etc/vsftpd.conf,将anonymous_enable, local_enable,write_enable改成如下形式(如果前面有#号,需要将#号去掉):
anonymous_enable=NO
local_enable=YES

write_enable=YES


查看是否安装:dpkg -l vsftpd


启动vsftpd服务:sudo service vsftpd start    
停止vsftpd服务:sudo service vsftpd stop  
重新启动vsftpd服务:sudo service vsftpd restart 

扩展参看:4步win7下简单FTP服务器搭建

五、Ubuntu 网络环境静态 IP 的设置和 SAMBA 的设置

Ubuntu 网络环境静态 IP 的设置

由于 Ubuntu 的默认安装状态的 IP 是 DHCP,而我们 TFTP SERVER, NFS SERVER, SAMBASERVER 这些网络环境都要求是固定的静态 IP 模式,所以我们先设置静态 IP,编辑/etc/network/interfaces 的文件。
#gedit /etc/network/interfaces
在 auto lo
iface lo inet loopback
的后面加上:
auto eth0
iface eth0 inet static
address 192.168.1.252
netmask 255.255.255.0
gateway 192.168.1.1
broadcast 192.168.1.255
然后保存退出,重启 networking:
#/etc/init.d/networking restart

broadcast广播的意思,在IP地址中,如果最后一个数字是255,则一定是一个广播地址。

设置 DNS
在终端里输入下面的命令:
sudo vi /etc/resolv.conf

打开文档后,找到现有的 DNS 记录,使用“#”注释掉,然后添加新的 DNS 记录:
nameserver x.x.x.x 按照该格式
如:使用谷歌的 DNS 8.8.8.8 8.8.4.4 
nameserver 8.8.8.8 
nameserver 8.8.4.4 

如果重启虚拟机会自动修改DNS 服务器,我们把这些文件进行锁定。

自动修改DNS服务器会出现:

如果ping域名的时候出现ping:unknown host  xxx.xxx的错误。

参看:ping:unknown host xxx.xxx

使用如下的代码进行锁定操作:
sudo chattr +i /etc/resolv.conf
如果需要解锁,使用如下的代码:
sudo chattr -i /etc/resolv.conf

进行文件锁定的时会遇到如下问题:
[email protected]:~# chattr +i /etc/resolv.conf
chattr: Operation not supported while reading flags on /etc/resolv.conf
解决步骤如下:
[email protected]:~# dpkg -l | grep resolv
[email protected]:~# apt-get remove resolvconf
[email protected]:~# reboot
[email protected]:~# vim /etc/resolv.conf
[email protected]:~# chattr +i /etc/resolv.conf
问题解决。


ubuntu12.04下配置samba,实现windows xp访问Ubuntu

参看:Ubuntu 14.04 文件服务器--samba的安装和配置

5.1. .实验准备

首先更新software sources,找到最快的源执行: 
$sudo apt-get update

5.2.samba的安装 

#sudo apt-get install samba
#sudo apt-get install cifs-utils
#sudo apt-get install system-config-samba

5.3.创建Samba配置文件 

1.保存现有的配置文件 
$sudo cp /etc/samba/smb.conf  /etc/samba/smb.conf.bak 
2.打开现有的文件 
$sudo vim /etc/samba/smb.conf 
在smb.conf最后添加
[username] 
path = /home/username
available = yes
browseable = yes
public = yes

writeable = yes 


(注意:上面的设置中,username换成你的用户名,如果在前面有“#”,需要先把它去掉) 
如果还想添加其他目录作为共享目录,相同原理,如下:
前提:ubuntu12.04没有tftpboot目录,如果想共享tftpboot 目录,需要先新建tftpboot目录。
[tftpboot]
path=/tftpboot
available=yes
browseable=yes
public=yes
writable=yes
[opt]
path=/opt
available=yes
browseable=yes
public=yes
writable=yes

5.4.创建samba帐户 

$sudo smbpasswd -a USERNAME  (USERNAME换成你的用户名)会要求你输入samba帐户的密码
New SMB password:
Retype new SMB password: 
[如果没有第四步,当你登录时会提示session setup failed:NT_STATUS_LOGON_FAILURE]

5.5.重启samba服务器 

$sudo /etc/init.d/smbd reload(修改过smb.conf的话要执行一次)

$sudo /etc/init.d/smbd restart 

5.6.关闭虚拟机防火墙,否则无法通过。

# ufw disable

5.7.测试 

可以到windows下输入ubuntu ip试一下了,在“我的电脑”或者在“运行”处输入"\\+Ubuntu机器 的ip" 如:\\192.168.7.100

需要注意的是:

六、安装NFS服务器

6.1 安装NFS server端口映射和服务 

$sudo apt-get install nfs-kernel-server
先重启rpcbind服务:

$sudo /etc/init.d/rpcbind restart

注意,选取 rpcbind 而非 portmap 

编辑/etc/exports,添加目标系统的根文件系统映射目录,假如目标系统的根文件系统最后映射到/opt/filesytem,则/etc/exports内容如下:

/opt/filesystem *(subtree_check,rw,no_root_squash,async) 

*:指定IP,*代表所有客户端无论IP是多少都可以访问该目录
rw, 读写权限
sync, 同步
no_root_squash:权限

$sudo /etc/init.d/nfs-kernel-server restart 
$sudo exportfs -a (最好每修改过/etc/exports后需要执行一次)


扩展: # exportfs [-aruv]
参数说明如下。
1)-a:全部挂载(或卸载)/etc/exports文件内的设定。
2)-r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports及/var/lib/nfs/xtab中的内容。
3)-u:卸载某一目录。
4)-v:在export时将共享的目录显示在屏幕上。


扩展:嵌入式nfs的安装配置和启动

下面是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_squash           root用户具有根目录的完全管理访问权限
anonuid=xxx             指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx             指定NFS服务器/etc/passwd文件中匿名用户的GID
no_root_squash:登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限,此参数很不安全,建议不要使用。我在使用nfs的时候发现即使rw权限仍然不能在nfs根目录下创建文件,这个就需要这个参数
root_squash:在登入NFS主機使用分享之目录的使用者如果是root时,那么这个使用者的权限將被压缩成为匿名使用者,通常他的UID与GID都会变成nobody那个身份; 
all_squash:不管登陆NFS主机的用户是什么都会被重新设定为nobody。 
anonuid:将登入NFS主机的用户都设定成指定的user id,此ID必须存在于/etc/passwd中。 
anongid:同anonuid ,但是变成group ID就是了! 
sync:资料同步写入存储器中。 
async:资料会先暂时存放在内存中,不会直接写入硬盘。 
insecure 允许从这台机器过来的非授权访问。


接下来就是要在开发板上启动挂载nfs了,首先要配置一下内核。
make menuconfig
File Systerm ---> Network File Systerm 下选中NFS file systerm support 更重要的是要选中 Root file systerm support。
这样内核就支持nfs启动了。
接下来最重要的就是内核参数了。
关于nfs的内核启动参数如下
root=/dev/nfs nfsroot=PC-ip:nfspath ip=local-ip:PC-ip:gateway:netmask:alias:net-port:off
gateway写成和PC-ip一样就可以。
比如我的参数如下:
root=/dev/nfs rw nfsroot=172.17.101.18:/home/work/nfsroot ip=172.17.101.190:172.17.101.18:172.17.101.18:255.255.255.0:ubuntu:eth0:off
这样启动nfs就自动挂载为根文件系统了。


6.2测试NFS

首先建立一个nfs测试的挂载点(目录):
$sudo mkdir /mnt/nfs 
$mount ubuntuIP:nfsdir /mnt/nfs -t nfs 
比如我的机器: $mount -t nfs 192.168.7.98:/opt/filesystem /mnt/nfs 
如果挂载成功,则表示NFS配置成功。

卸载:sudo umount /mnt/nfs 


mount指令说明:

参看:linux mount (挂载命令)详解

1. 要Mount对象的文件系统类型
2. 要Mount对象的设备名称
3. 要将设备Mount到哪个目录去

七、安装TFTP服务,有多种方法:

第一种方法:

7.1 TFTP服务的设置 

$sudo mkdir /tftpboot
$cp zImage /tftpboot [注:zImage是我用于测试的一个文件, 你可用别的随意文件替代] 
$sudo chmod 777 /tftpboot -R
$sudo apt-get install tftp tftpd
$sudo apt-get install openbsd-inetd
$sudo vi /etc/inetd.conf 
在里面填入如下一行: 
tftp dgram udp wait nobody   /usr/sbin/tcpd   /usr/sbin/in.tftpd   /tftpboot
新建/etc/default/tftpd-hpa 
#Defaults for tftpd-hpa
RUN_DAEMON="yes"
OPTIONS=-OPTIONS=-"l -s /tftpboot"
$sudo /etc/init.d/openbsd-inetd reload
$sudo /etc/init.d/openbsd-inetd restart

7.2 TFTP服务测试 

在用户自己目录下建议一个目录,将/tftpboot下存在的文件下载到此目录下 
$tftp ubuntu_IP (VMWARE虚拟机IP地址,比如我的是 192.168.7.98) 
tftp>getuImage (如果TFTP正常配置,这个能比较快就下载完毕)(uImage是一个在/tftpboot下面的任意一个拿来做测试用的数据,我这里用的是内核镜像uImage)
tftp>quit  可以看到,在当前目录下有我们通过TFTP下载的文件uImage了。
以后每次启动系统的时候,要执行一下:
$sudo /etc/init.d/openbsd-inetd restart

第二种方法:常用

安装、配置tftp服务

1.安装TFTP软件

sudo  apt-get  install tftpd-hpa

sudo  apt-get  install tftpd-hpa

sudo  apt-get    install  tftp

tftp-hpa是客户端,tftpd-hpa是服务器端

2.建立tftpboot目录,作为服务器的目录
sudo mkdir  /tftpboot
释放权限:(服务器目录,需要设置权限为777,chomd 777)
sudo chmod  777  /tftpboot

3.配置TFTP服务器

sudo gedit /etc/default/tftpd-hpa

将原来的内容为:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
#TFTP_DIRECTORY="/tftpboot"  #修改为自己需要的路径,与上面创建的目录一致
TFTP_ADDRESS="0.0.0.0:69"
#TFTP_OPTIONS="--secure"  #可以通过查看mantftpd,看各种参数的意义

#修改为

TFTP_DIRECTORY="/home/shenhao/tftpboot"

TFTP_OPTIONS="-l -c -s"

3.重新启动TFTP服务

sudo service tftpd-hpa restart

4.测试下

$ cd ~/tftpboot echo "hello tftp service">>a.txt

$ echo "hello tftp service,put to tftp serive">>b.txt

$ tftp localhost

tftp> get a.txt

tftp> put b.txt

tftp> quit 

其中get是取得文件,put是将文件上传到TFTP服务器上。

第三种方法:

xinetd版本

配置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 -c

disable = no

per_source = 11

cps = 100 2

flags = IPv4

}

保存退出

3、建立tftp服务文件目录(上传文件与下载文件的位置),并且更改其权限

sudomkdir /tftpboot

sudochmod 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

通过get命令,可以把当前目录下的test.txt文件,通过tftp上传到它的服务文件目录。这时,在/tftpboot下面会出现test.txt文件。通过put命令,可以从/tftpboot下,下载test.txt文件。这样就验证了tftp服务配置的正确性。当文件上传与下载结束后,可以通过quit命令退出。

严格按照以上步骤配置tftp服务,一般都可以成功。如果出现无法get或者put的时候,可以查看一下防火墙是否关闭。

 

注意关闭防火墙: service iptables stop


tftp命令参看Busybox下tftp命令使用详解

上面tftp讲了好多种,然并卵,我一般不使用上面的任何一种,而是使用Windows下的tftpd32:


使用方法:



操作方法:
从PC 上传文件hello.c 到 开发板
tftp -g -r hello.c 192.168.2.192    (ps: 192.168.2.192 为PC 的IP地址)
从开发板 上传文件 hello.c 到 PC
Tftp -p -r hello.c 192.168.2.192   (ps: 192.168.2.192 为PC 的IP地址)

八、安装工具链 

执行 $sudo apt-get install cvs build-essential automake autoconf libtool bison flex 
$sudo apt-get install libncurses5-dev

九、添加库函数手册 

ubuntu默认是没有安装c语言的库函数man手册的,所以你在manperror和sendto之类的函数时会显示没有相关文档的问题,这个问题让我郁闷了我好久。解决方法: 

$sudo apt-get install binutils-doc cpp-doc gcc-4.4-doc gcc-doc glibc-doc libstdc++6-4.4-doc stl-manual cpp-4.4-doc manpages manpages-dev

十、安装gftp服务

安装gftp:   sudo apt-get install gftp
然后 [email protected]:~$ gftp  出现如下界面.


十一、安装kermit服务 
以上的方法基于虚拟机上的Ubuntu来操作的
如果是 Ubuntu操作系统和开发板数据传输的话建议使用kermit
[功能] 
一个串口传工具。可以传送文件。 用于pc串口通信。
[描述] 
C-kermit是一款集成了网络通信、串口通信的工具,它有如下多种功能: 
1.支持kermit文件传输协议 
2.自定义了一种脚本语言,它强大而易于使用,可用于自动化工作 
3.无论是网络通信,还是串口通信,操作是一致的,并支持多种硬件、软件平台 
4.有安全认证、加密功能 
5.内建FTP、HTTP客户端功能及ssh接口 
6.支持字符集转换 

[举例] 
*安装 
$sudo apt-get install ckermit 
这样就安装了c-kermit 

*配置 
$vi $HOME/.kermrc 
... 
这里,是在$HOME主目录下,建立.kermrc配置文件,文件内容是: 
set line /dev/ttyS0 
set speed 115200 
set carrier-watch off 
set handshake none 
set flow-control none 
robust 
set file type bin 
set file name lit 
set rec  pack 1000 
set send pack 1000 
set window 5 
这里,kermit在启动时会查找~/.kermrc文件,调用里面的命令来初始化kermit。只要将你所需的命令写到~/.kermrc文件里,启动后就不用手动敲这些命令配置了。 

*运行的时候直接进入命令模式: 
$kermit 
这里没-c就进入默认的命令模式了。 
kermit在启动时会查找~/.kermrc文件,调用里面的命令来初始化kermit。只要将你所需的命令写到~/.kermrc文件里,启动后就不用手动敲入命令配置了。 

*运行的时候,直接进入非命令模式: 
$kermit -c 
这里,加上-c表示进入非命令模式,相当于在命令模式下面运行了connect或者c.在连接好了板子之后,这样就可以连接到串口上面了,当然不要忘记将设备打开,否则你敲入东西的时候是没有反应的。 

*进入命令模式,步骤如下: 
1)输入"[Ctrl]\". 
2)输入"c". 
这样进入kermit的命令模式可以进行各种命令(支持TAB补全),例如HELP可以查看帮助,输入"?"列出所有命令。 

*从命令模式退回com终端: 
输入"connect". 
或输入"c". 
这样又切换会了串口界面(例如在uboot下面)。 

*在命令模式下查看当前主机目录文件: 
输入"ls". 

*在命令模式下查看当前路径: 
输入"pwd". 

*在命令模式下进入指定的主机目录/home/test: 
输入"cd /home/test". 

*传输文件file到板子的flash上面: 
输入"send file". 
这里,在命令行下的发送命令就是send。如果之前在Uboot下使用了loadb 0xc0008000进入的命令模式,那么发送的文件将会被放在了这个地址上面。 

*退出串口程序: 
输入"exit". 
当然,这里指的是在命令行下面。 

[其他] 
*一个简单的完整例子: 
启动板子uboot之后,我想传一个文件/root/test.sh到地址0xc0008000 
步骤如下: 
1)$kermit -c 
这样,就连接到串口上面了。 
2)输入"loadb 0xc0008000" 
3)输入"[Ctrl]\" 
4)输入"c" 
这样进入命令模式. 
5)输入"send /root/test.sh" 
6)输入"connect". 
这样就传完了。ckermit好像只支持kermit协议。 

*注意,在网上,据说: 
mincom和ckermit均不带xmodem和zmodem之类的协议,所以需要安装lrzsz这个软件,否则就会遇到传输不了文件或者timeout之类的错误。 
下载和解压lrzsz后,进入目录执行 ./configure --prefix=/usr/local/lrzsz ,然后make,make install 最后建立软链接。 
这个说法使用的配置文件是: 
set line /dev/ttyS0 //COM1 
set speed 115200 
set carrier-watch off 
set handshake none 
set flow-control none 
robust 
set file type bin 
set file name lit 
set rec pack 1000 
set send pack 100000 //这里可以改大一点,方便下载内核 
set window 5 
set protocol xmodem //vivi use xmodem 
set protocol zmodem //board Linux usually use rz/sz 

其他linux的串口工具有minicom,cutecom等.

十二、使用 SecureCRT 可在SecureCRT上登录 Ubuntu

配置SecureCRT

1.点击快速连接

2.配置如下:

    协议采用SSH2

    主机名:192.168.1.8

    用户名:tarena

    其他用默认即可

3.提示输入密码,保存密码

4.点击SCRT菜单栏:

    选项->会话选项->仿真->终端:ANSI

    并且将使用颜色方案的勾打上;

    选项->会话选项->外观->字符编码:UTF-8

    字体大小自己可以按照喜好来设置

5.关闭SCRT,重新打开SCRT,选择上一次配置的 


设置完成。 再次进入SecureCRT如弹出如下提示:

点击  接收并保存。


然后又会弹出如下提示: 填写你的Ubuntu密码


最后 提示成功进入Ubuntu: