6. 虚拟机及Linux安装

虚拟机及Linux安装

进行嵌入式项目开发,第一步就是要建立嵌入式开发环境,主要包括安装 Bootloader 工具 、不同平台的交叉编译器 (如ARM 平台的arm-linux-gcc)、内核源码树 (在需要编译和配置内核时)、在调试时使用的一些终端软件TFTP 或FTP软件 以及内核和文件系统的烧写工具(一般硬件厂家会提供)。下面逐一讲解。

1. 虚拟机的安装

  • 很多工具都是 Windows 版本的,而要求的开发环境是 Linux 环境。在 Windows 系统中安装虚拟机,然后再虚拟一个 Linux 环境,使 Linux 和 Windows 能够互相通信。这种方案解决了很多软件不兼容两种平台的问题。
  • 虚拟机软件 Vmware 的安装和普通软件的安装过程一样,此处就不详细介绍了。 下面介绍安装 Linux 的主要步骤 :
    1. 准备Linux系统安装镜像(如Ubuntu、fedora等),如 Fedora-Live-Desktop-i686-19-1.iso,可以在网上下载;
    2. 运行 VMware,选择"文件" |"新建虚拟机"命令,或者直接单击"新建虚拟机"图标;
    3. 在"新建虚拟机向导"窗口中选择"自定义"选项;
    4. 虚拟机硬件兼容性窗口按默认选择安装;
    5. 在"安装客户机操作系统"窗口中,选择"我以后再安装操作系统"选项;
    6. 在选择客户机操作系统的时候选择 Linux 选项。在"版本"下拉菜单中选择准备安装的 Linux 版本;
    7. 单击"下一步"按钮,进入主题为虚拟机取名称的对话框,同时确定安装路径。注意选择安装的分区应该有足够的空间安装 Linux系统。因为在后面还要安装 Linux 源码树,所以建议安装在一个至少有 8GB~10GB 空闲空间的分区上;
    8. 单击"下一步"按钮,进入处理器配置对话框,在其中根据你电脑实际情况选择处理器个数;
    9. 在对虚拟机内存进行划分时,可以根据实际主机硬件的配置进行划分,一般可以按默认的配置安装。如果实际主机配置比较高,可以给虚拟机多分配点内存;
    10. 在网络连接类型中可以选择任意一种类型,该设置在后面需要修改的时候可以进行修改,此处可以按默认选项进行安装;
    11. I/O 适配器窗口可以按照默认配置安装;
    12. 在"选择磁盘"对话框中,选择"创建一个新的虚拟磁盘"单选按钮 ;
    13. 在"选择磁盘类型"对话框中,根据电脑实际情况选择 IDE或SCSI按钮;
    14. 在"指定磁盘容量"对话框中,确定磁盘大小,为 Linux 系统预留 20GB 空间,并且选择"立即分配所有磁盘空间"复选框;
    15. 指定磁盘文件对话框按默认名字和路径进行安装,单击"下一步"按钮,确认虚拟机设置。然后单击"完成"按钮,创建虚拟磁盘。
    16. 单击"CD/DVD(IDE) 自动检测"选项,选择"使用 ISO 镜像文件"选项,然后单击"浏览"按钮,选择下载好的Linix系统镜像文件。然后单击"确定"按钮,关闭对话框。
    17. 在VMware工具栏中单击绿色的按钮,或者单击"打开此虚拟机电源"选项进入虚拟机安装界面,此时用户不需要操作,系统会自动加载进入 系统安装 界面;
    18. 在选择语言选项的时候,建议选择"简体中文"选项。然后单击"继续"按钮,依次确认或设置后,单击"开始安装"按钮,进入"配置"界面;
    19. 进入该界面后,系统就默认开始安装。同时,该界面提供 ROOT 密码设置和创建用户功能。依次设置后,等待系统自动安装。安装完成后,系统提示重新启动计算机;
    20. 在 VMware 软件中,选择"虚拟机" |"发送 Ctrl+Alt+Del"命令,重新启动操作系统,进入Linux 启动界面,由于是第一次登录,需要对语言、输入源、在线账号做一个简单设置。设置完成后,进入操作系统桌面。

2. 虚拟机和主机通信设置

  • 很多资料和软件往往都放在主机上,当需要在虚拟机环境下对这些资料进行访问时, 或者将虚拟机编译好的文件传送到主机上时,就需要建立两者之间的通信。

  • 建立虚拟机和主机通信的过程如下:

    1. 选择"虚拟机" |"设置"命令,打开"虚拟机设置"对话框。选择"硬件"选项卡中的 "网络适配器"选项。在"网络连接"选项区域中选择"自定义:指定虚拟网络"单选按钮,在下拉列表框中设置网络连接为 VMnet8 (NAT)。然后单击"确定"按钮。

    2. 选择"编辑" |"虚拟网络编辑器"命令,进入"虚拟网络编辑器"对话框。选择NAT 标签,将 VMnet host 设置为 VMnet8。然后单击"确定"按钮,在该对话框中,显示 NAT 子网的 IP 和子网掩码分别为 192.168.81.0 和255.255.255.0。

    3. 接着设置网卡连接状态。双击虚拟机窗口右下角的网络适配器标志,在"设备状态"选项框中,选择"已连接"和"打开电源时连接"复选框;

    4. 打开一个终端,通过 ifconfig 查看虚拟机的 IP 地址,下图中显示网卡地址为 192.168.81.136。

    5. 确定主机的 VMware net8 网卡为已连接状态,在主机端 ping 虚拟机查看主机 VMware net8 网卡的 IP 地址。一般和虚拟机网关为一个网段,并且其IP 地址为 192.168.81.1。在虚拟机中 ping 该 IP,结果如图 所示。互相都可以 ping 通说明主机和虚拟机通信成功。

3. 虚拟机与主机共享文件

  • 设置文件共享后,能够在主机和虚拟机之间进行文件传输:

    1. 打开虚拟机设置对话框,选择"选项"标签,在其中选择"共享文件夹 "选项,之后选择"总是启用"单选按钮;

    2. 单击"添加"按钮,弹出"添加共享文件夹向导"对话框。单击"下一步"按钮,弹出"共享文件夹名称"对话框:

    3. 设置完成后,单击"下一步"按钮,进入"指定共享文件夹属性"对话框,选择"启用该共享"选项,然后单击"完成"按钮,保存设置。进入/mnt 目录下,会发现多了一个目录 share。进入 share,可以看到在 Windows 系统下的文件。

4. 虚拟机与主机文件传输

4.1 FTP方式

  • 某些版本的虚拟机或者 Linux 系统对文件共享支持不够完美,此时可以选择 FTP 方式进行文件传输,该方法操作方便,在实际开发中被普遍使用。该方法包括服务器端(虚拟机)和客户端(主机)两部分安装,并且包括服务器端和客户端的配置。下面详细讲述其使用方法:

    1. 虚拟机安装 vsftp 软件

    2. 启动 FTP 服务service vsftpd start

    3. 在虚拟机防火墙中设置 FTP 策略,使得实体机可以访问虚拟机中的 FTP 服务。

    4. 在实体机中使用 IE浏览器等客户端工具访问 FTP 服务器,就可以看到 FTP 所共享的文件,下图中虚拟机IP地址为192.168.81.136。

4.2 SFTP( SSH)方式

  • 除了使用FTP服务器进行文件传输外,目前使用最广的是采用FileZilla软件进行文件传输,下面介绍其使用方法:

    1. 查看ssh服务的状态

      • 输入命令:sudo service sshd status
        • 如果出现Loaded: error (Reason: No such file or directory)提示的话,说名没有安装ssh服务,按照第二步:安装ssh服务。
        • 如果出现Active: inactive (dead)说明已经安装了ssh服务,但是没有开启。按照第三步:开启ssh服务。
    2. 安装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然后按照提示,安装就好了。
    3. 开启ssh服务

      • 在终端敲入命令sudo service sshd start
      • 执行完命令后,用第一步:查看ssh服务状态的命令,如果出现以下提示说明你的ssh服务已经启动了。如果失败来的话,那试着卸载一下再安装。
        • ctive: active (running) since Sun 2013-04-07 13:43:11 CST; 15s ago
    4. 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 等其他服务)所设定的,默认情况 下是处于关闭状态。

  1. 首先,要修改 tftp 的配置文件(将"disable=yes"改为"disable=no"),开启 tftp 服务:

    bash 复制代码
    $ 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",用户可以根据需要更改为其他目录。
  2. 重启 xinetd 服务,使刚才的更改生效

    bash 复制代码
    $ /etc/init.d/xinetd restar
  3. 确认 tftp 服务是否已经开启

    bash 复制代码
    $ netstat --au | grep tftp
    Proto 	Recv-Q 	Send-Q 	Local 	Address 	Foreign Address 	State
    udp 	0 		0 				*:tftp 			*:*
  • 这时,用户就可以把所需的传输文件放到"/tftpboot"目录下,这样,主机上的 tftp 服务就建立起来。用网络交叉线把目标板和宿主机连起来,并且将其配置成一个网段的地址, 再在目标板上启动 tftp 客户端程序(注意:不同的 Bootloader 所使用的命令会有所不同,读者可以查看帮助来获得确切的命令名及格式,本书以 U-Boot 为例讲解),如下所示:

    bash 复制代码
    # 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"的一个示例

      bash 复制代码
      $ cat /etc/exports
      /home/david/project *(rw,sync,no_root_squash)
  • 设定完配置文件之后,需要启动 nfs 服务和 portmap 服务,这里的 portmap 服务允许NFS 客户端查看 NFS 服务所用的端口,在它被激活之后,就会出现一个端口号为 111 的 sun RPC(远端过程调用)的服务,这是 NFS 服务中必须实现的一项,因此,也必须把它开启, 如下所示:

    bash 复制代码
    $ /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 服务在每次系统引导时自动开启,可使用以下命令:

    bash 复制代码
    $ /sbin/chkconfig nfs on 
    
    在 Ubuntu 中应该输入:
    $ /sbin/chkconfig nfs-kernel-server on

`:显示 nfs 服务器的挂载信息,其常见选项有:

  • -a:列出客户端主机名或 IP 地址,和挂载在主机的目录

  • -e:显示 nfs 服务器的导出列表

  • 若希望 NFS 服务在每次系统引导时自动开启,可使用以下命令:

    bash 复制代码
    $ /sbin/chkconfig nfs on 
    
    在 Ubuntu 中应该输入:
    $ /sbin/chkconfig nfs-kernel-server on
相关推荐
Komorebi.py1 小时前
【Linux】-学习笔记05
linux·笔记·学习
Mr_Xuhhh1 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
内核程序员kevin4 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
朝九晚五ฺ9 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream9 小时前
Linux的桌面
linux
xiaozhiwise9 小时前
Makefile 之 自动化变量
linux
Kkooe10 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒10 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
意疏11 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker