虚拟机及Linux安装
进行嵌入式项目开发,第一步就是要建立嵌入式开发环境,主要包括安装 Bootloader 工具、不同平台的交叉编译器(如ARM 平台的arm-linux-gcc)、内核源码树(在需要编译和配置内核时)、在调试时使用的一些终端软件、TFTP 或FTP软件以及内核和文件系统的烧写工具(一般硬件厂家会提供)。下面逐一讲解。
1. 虚拟机的安装
- 很多工具都是 Windows 版本的,而要求的开发环境是 Linux 环境。在 Windows 系统中安装虚拟机,然后再虚拟一个 Linux 环境,使 Linux 和 Windows 能够互相通信。这种方案解决了很多软件不兼容两种平台的问题。
- 虚拟机软件 Vmware 的安装和普通软件的安装过程一样,此处就不详细介绍了。 下面介绍安装 Linux 的主要步骤 :
- 准备Linux系统安装镜像(如Ubuntu、fedora等),如 Fedora-Live-Desktop-i686-19-1.iso,可以在网上下载;
- 运行 VMware,选择“文件” |“新建虚拟机”命令,或者直接单击“新建虚拟机”图标;
- 在“新建虚拟机向导”窗口中选择“自定义”选项;
- 虚拟机硬件兼容性窗口按默认选择安装;
- 在“安装客户机操作系统”窗口中,选择“我以后再安装操作系统”选项;
- 在选择客户机操作系统的时候选择 Linux 选项。在“版本”下拉菜单中选择准备安装的 Linux 版本;
- 单击“下一步”按钮,进入主题为虚拟机取名称的对话框,同时确定安装路径。注意选择安装的分区应该有足够的空间安装 Linux系统。因为在后面还要安装 Linux 源码树,所以建议安装在一个至少有 8GB~10GB 空闲空间的分区上;
- 单击“下一步”按钮,进入处理器配置对话框,在其中根据你电脑实际情况选择处理器个数;
- 在对虚拟机内存进行划分时,可以根据实际主机硬件的配置进行划分,一般可以按默认的配置安装。如果实际主机配置比较高,可以给虚拟机多分配点内存;
- 在网络连接类型中可以选择任意一种类型,该设置在后面需要修改的时候可以进行修改,此处可以按默认选项进行安装;
- I/O 适配器窗口可以按照默认配置安装;
- 在“选择磁盘”对话框中,选择“创建一个新的虚拟磁盘”单选按钮 ;
- 在“选择磁盘类型”对话框中,根据电脑实际情况选择 IDE或SCSI按钮;
- 在“指定磁盘容量”对话框中,确定磁盘大小,为 Linux 系统预留 20GB 空间,并且选择“立即分配所有磁盘空间”复选框;
- 指定磁盘文件对话框按默认名字和路径进行安装,单击“下一步”按钮,确认虚拟机设置。然后单击“完成”按钮,创建虚拟磁盘。
- 单击“CD/DVD(IDE) 自动检测”选项,选择“使用 ISO 镜像文件”选项,然后单击“浏览”按钮,选择下载好的Linix系统镜像文件。然后单击“确定”按钮,关闭对话框。
- 在VMware工具栏中单击绿色的按钮,或者单击“打开此虚拟机电源”选项进入虚拟机安装界面,此时用户不需要操作,系统会自动加载进入 系统安装 界面;
- 在选择语言选项的时候,建议选择“简体中文”选项。然后单击“继续”按钮,依次确认或设置后,单击“开始安装”按钮,进入“配置”界面;
- 进入该界面后,系统就默认开始安装。同时,该界面提供 ROOT 密码设置和创建用户功能。依次设置后,等待系统自动安装。安装完成后,系统提示重新启动计算机;
- 在 VMware 软件中,选择“虚拟机” |“发送 Ctrl+Alt+Del”命令,重新启动操作系统,进入Linux 启动界面,由于是第一次登录,需要对语言、输入源、在线账号做一个简单设置。设置完成后,进入操作系统桌面。
2. 虚拟机和主机通信设置
-
很多资料和软件往往都放在主机上,当需要在虚拟机环境下对这些资料进行访问时, 或者将虚拟机编译好的文件传送到主机上时,就需要建立两者之间的通信。
-
建立虚拟机和主机通信的过程如下:
-
选择“虚拟机” |“设置”命令,打开“虚拟机设置”对话框。选择“硬件”选项卡中的 “网络适配器”选项。在“网络连接”选项区域中选择“自定义:指定虚拟网络”单选按钮,在下拉列表框中设置网络连接为 VMnet8 (NAT)。然后单击“确定”按钮。
-
选择“编辑” |“虚拟网络编辑器”命令,进入“虚拟网络编辑器”对话框。选择NAT 标签,将 VMnet host 设置为 VMnet8。然后单击“确定”按钮,在该对话框中,显示 NAT 子网的 IP 和子网掩码分别为 192.168.81.0 和255.255.255.0。
-
接着设置网卡连接状态。双击虚拟机窗口右下角的网络适配器标志,在“设备状态”选项框中,选择“已连接”和“打开电源时连接”复选框;
-
打开一个终端,通过 ifconfig 查看虚拟机的 IP 地址,下图中显示网卡地址为 192.168.81.136。
-
确定主机的 VMware net8 网卡为已连接状态,在主机端 ping 虚拟机查看主机 VMware net8 网卡的 IP 地址。一般和虚拟机网关为一个网段,并且其IP 地址为 192.168.81.1。在虚拟机中 ping 该 IP,结果如图 所示。互相都可以 ping 通说明主机和虚拟机通信成功。
-
3. 虚拟机与主机共享文件
-
设置文件共享后,能够在主机和虚拟机之间进行文件传输:
-
打开虚拟机设置对话框,选择“选项”标签,在其中选择“共享文件夹”选项,之后选择“总是启用”单选按钮;
-
单击“添加”按钮,弹出“添加共享文件夹向导”对话框。单击“下一步”按钮,弹出“共享文件夹名称”对话框:
-
设置完成后,单击“下一步”按钮,进入“指定共享文件夹属性”对话框,选择“启用该共享”选项,然后单击“完成”按钮,保存设置。进入/mnt 目录下,会发现多了一个目录 share。进入 share,可以看到在 Windows 系统下的文件。
-
4. 虚拟机与主机文件传输
4.1 FTP方式
-
某些版本的虚拟机或者 Linux 系统对文件共享支持不够完美,此时可以选择 FTP 方式进行文件传输,该方法操作方便,在实际开发中被普遍使用。该方法包括服务器端(虚拟机)和客户端(主机)两部分安装,并且包括服务器端和客户端的配置。下面详细讲述其使用方法:
-
虚拟机安装 vsftp 软件;
-
启动 FTP 服务,
service vsftpd start
。 -
在虚拟机防火墙中设置 FTP 策略,使得实体机可以访问虚拟机中的 FTP 服务。
-
在实体机中使用 IE浏览器等客户端工具访问 FTP 服务器,就可以看到 FTP 所共享的文件,下图中虚拟机IP地址为192.168.81.136。
-
4.2 SFTP( SSH)方式
-
除了使用FTP服务器进行文件传输外,目前使用最广的是采用FileZilla软件进行文件传输,下面介绍其使用方法:
-
查看ssh服务的状态
- 输入命令:
sudo service sshd status
- 如果出现
Loaded: error (Reason: No such file or directory)
提示的话,说名没有安装ssh服务,按照第二步:安装ssh服务。 - 如果出现
Active: inactive (dead)
说明已经安装了ssh服务,但是没有开启。按照第三步:开启ssh服务。
- 如果出现
- 输入命令:
-
安装ssh服务
- 如果你用的是redhat,fedora,centos等系列linux发行版,那么敲入命令
sudo yum install sshd
或者sudo yum install openssh-server
; - 如果你使用的是debian,ubuntu,linux mint等系列的linux发行版,那么敲入
sudo apt-get install sshd
或者sudo apt-get install openssh-server
然后按照提示,安装就好了。
- 如果你用的是redhat,fedora,centos等系列linux发行版,那么敲入命令
-
开启ssh服务
- 在终端敲入命令
sudo service sshd start
; - 执行完命令后,用第一步:查看ssh服务状态的命令,如果出现以下提示说明你的ssh服务已经启动了。如果失败来的话,那试着卸载一下再安装。
ctive: active (running) since Sun 2013-04-07 13:43:11 CST; 15s ago
- 在终端敲入命令
-
FileZilla连接虚拟机
-
文件–>站点管理器 中新建 站点,然后选择SFTP协议即可;
-
点击连接之后,提示:
-
成功连接
-
-
4.3 TFTP方式
- tftp 是一个传输文件的简单协议,它基于 UDP 协议实现。此协议设计时是进行小文件 传输的,因此它不具备通常的 FTP 的许多功能,只能从文件服务器上获得或写入文件,不 能列出目录,不进行认证,只能传输 8 位数据。
- tftp 服务分为客户端服务和服务器端服务两种。
- 首先在宿主机上开启 tftp 服务器端服务,设置好 tftp 的根目录内容(也就是供客户端下载的文件)
- 然后,在目标板上开启 tftp 的客户端程序(tftp 客户端主要在 Bootloader 交互环境下运行,几乎所有 Bootloader 都 提供该服务,用于下载操作系统内核和文件系统)。
- 最后,把目标板和宿主机用直连线相连。之后就可以通过 tftp 协议传输可执行文件。下面分别讲述在 Linux 下和 Windows 下的配 置方法。
4.3.1 Linux 下的 tftp 服务配置
Linux 下 tftp 的服务是由 xinetd(还有 openbsd-inetd 等其他服务)所设定的,默认情况 下是处于关闭状态。
-
首先,要修改 tftp 的配置文件(将“disable=yes”改为“disable=no”),开启 tftp 服务:
$ vim /etc/xinetd.d/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 }
- 通过“server_args”可 以看出,tftp 服务器端的默认根目录为“/tftpboot”,用户可以根据需要更改为其他目录。
-
重启 xinetd 服务,使刚才的更改生效
$ /etc/init.d/xinetd restar
-
确认 tftp 服务是否已经开启
$ netstat –au | grep tftp Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:tftp *:*
-
这时,用户就可以把所需的传输文件放到“/tftpboot”目录下,这样,主机上的 tftp 服务就建立起来。用网络交叉线把目标板和宿主机连起来,并且将其配置成一个网段的地址, 再在目标板上启动 tftp 客户端程序(注意:不同的 Bootloader 所使用的命令会有所不同,读者可以查看帮助来获得确切的命令名及格式,本书以 U-Boot 为例讲解),如下所示:
# tftp 0x30008000 zImage TFTP from server 192.168.1.112; our IP address is 192.168.1.120 Filename 'zImage'. Load address: 0x33000000 Loading:########################################################### ########################################################### ########################################################### done Bytes transferred = 881988 (d7544 hex)
- 可以看到,此处目标板使用的 IP 为“192.168.1.120”,宿主机使用的 IP 为“192.168.1.112”, 下载到目标板的地址为 0x33000000,文件名为“zImage”。
4.3.2 Windows 下的 tftp 服务配置
- 在 Windows 下配置 tftp 服务需要使用 tftp 服务器软件,常见的有 Tftpd32,读者可以自 行从网上下载。要注意的是,该软件是 tftp 的服务器端,而目标板上则是 tftp客户端。
- 在Settings 选项卡中配置服务器端的各个选项,如IP 地址等。
- 在 Browse 中选择 tftp 的服务器端根目录。
- 此时可以用直连线连接目标机和 宿主机,且在目标机上开启 tftp。
4.4 NFS方式
-
NFS 可以让不同的主机通过网络将远端的 NFS 服务器共享出来的文件安装到自己的系 统中,从客户端看来,使用 NFS 的远端文件就像是使用本地文件一样。在嵌入式系统中使 用 NFS 会使应用程序的开发变得十分方便,并且不用反复地烧写镜像文件。
-
NFS 的使用分为服务器端和客户端,其中服务器端提供要共享的文件,而客户端则通 过挂载“mount”这一动作来实现对共享文件的访问操作。在嵌入式开发中,通常 NFS 服务 端在宿主机上运行,而客户端在目标板上运行。
-
NFS 服务器端是通过读入它的配置文件“/etc/ exports”来决定所共享的文件目录的,在 这个配置文件中,每一行都代表一项要共享的文件目录,以及所指定的客户端对其的操作权 限。客户端可以根据相应的权限,对该目录下的所有目录文件进行访问。
-
配置文件中每一行的格式为: [共享的目录] [客户端主机名称或 IP] (参数 1,参数 2…)。主机名或 IP 是可供共享的客户端主机名或 IP,若对所有的 IP 都可以访问,则 可用“*”表示。这里的参数有很多种组合方式,下表列出了常见的参数:
选 项 参 数 含 义 rw 可读写的权限 ro 只读的权限 no_root_squash 客户端分享目录使用者的权限,即如果客户端使用的是 root 用户,那么对于这个共享的目 录而言,该客户端就具有 root 的权限 sync 资料同步写入内存与硬盘中 async 资料会先暂存于内存中,而非直接写入硬盘 -
配置文件“/etc/exports”的一个示例
$ cat /etc/exports /home/david/project *(rw,sync,no_root_squash)
-
-
设定完配置文件之后,需要启动 nfs 服务和 portmap 服务,这里的 portmap 服务允许NFS 客户端查看 NFS 服务所用的端口,在它被激活之后,就会出现一个端口号为 111 的 sun RPC(远端过程调用)的服务,这是 NFS 服务中必须实现的一项,因此,也必须把它开启, 如下所示:
$ /etc/init.d/portmap restart 启动 portmap: [确定] $ /etc/init.d/nfs restart //在 Ubuntu 中应为/etc/init.d/nfs-kernel-server 启动 NFS 服务: [确定] 关掉 NFS 配额: [确定] 启动 NFS 守护进程: [确定] 启动 NFS mountd: [确定]
- 系统在启动 NFS 服务时就已经启动了 mountd 进程,它是 NFS 挂载服务, 用于处理 NFSD 递交过来的客户端请求。
- 另外还会激活至少两个以上的系统守护进程,然后开始监听客户端的请求,用 dmesg 命令(或者 cat /var/log/messages)可以看到操作是否成 功。
-
与 NFS 相关的还有两个命令,可以方便 NFS 的使用:
exportfs
:它可以重新扫描“/etc/exports”,使用户在修改“/etc/exports”配置文 件时不需要每次重启 NFS 服务,其格式为:exportfs [选项]
。其常见选项有:- -a:全部挂载(或卸载)/etc/exports 中的设定文件目录
- -r:重新挂载/etc/exports 中的设定文件目录
- -u:卸载某一目录
- -v :在 export 时,将共享的目录显示到屏幕上
showmount
:显示 nfs 服务器的挂载信息,其常见选项有:- -a:列出客户端主机名或 IP 地址,和挂载在主机的目录
- -e:显示 nfs 服务器的导出列表
-
若希望 NFS 服务在每次系统引导时自动开启,可使用以下命令:
$ /sbin/chkconfig nfs on 在 Ubuntu 中应该输入: $ /sbin/chkconfig nfs-kernel-server on
`:显示 nfs 服务器的挂载信息,其常见选项有:
- -a:列出客户端主机名或 IP 地址,和挂载在主机的目录
- -e:显示 nfs 服务器的导出列表
-
若希望 NFS 服务在每次系统引导时自动开启,可使用以下命令:
$ /sbin/chkconfig nfs on 在 Ubuntu 中应该输入: $ /sbin/chkconfig nfs-kernel-server on