标签归档:virtualization

在Android-x86虚拟机中使用4G无线路由器的步骤(图形化操作)

一、环境描述

宿主机型号:Dell 3020MT
宿主机OS:CentOS 6.6 x86_64
宿主机IP:192.168.100.1
虚拟机OS:Android-x86 4.4-r2
虚拟机IP(Private Network):192.168.100.146
虚拟机IP(USB Passthrough):192.168.1.113
网络方式:Private Network + USB Passthrough
Android SDK版本:android-sdk_r24.2-linux
KVM版本:QEMU PC emulator version 0.12.1 (qemu-kvm-0.12.1.2-2.448.el6_6.3)
4G无线路由器:TP-LINK TL-TR961 5200L 4G无线路由器 全网全制式(移动/联通/电信)

二、设置KVM的Private Network虚拟网桥

1. 打开virt-manager

在CentOS的桌面菜单中点击:Applications → System Tools → Virtual Machine Manager

2. 打开KVM的网络设置窗口

在virt-manager的图形界面中,点击:Edit → Connection Details,如下图所示:

上述操作会打开“localhost Connection Details”窗口,如下图所示:

3. 添加虚拟网络

切换至上述窗口的“Virtual Networks”标签页,点击“Add Network”按钮,如下图所示:

点击“Add Network”按钮之后,弹出“Create a new virtual network”窗口,点击“Forward”按钮,如下图所示:

在接下来界面中,输入网络名称,例如hostonly,然后点击“Forward”按钮,如下图所示:

在接下来的界面中,输入网段IP和掩码长度,例如192.168.100.0/24,然后点击“Forward”按钮,如下图所示:

在接下来的界面中,勾选“Enable DHCP”,然后设置DHCP的起止地址,例如192.168.100.128和192.168.100.254,然后点击“Forward”按钮,如下图所示:

在接下来的界面中,选择“Isolated virtual network”,然后点击“Forward”按钮,如下图所示:

在最后的界面中,确认新建的虚拟网络信息,然后点击“Finish”按钮,如下图所示:

上述几个步骤操作完毕之后,便能在“localhost Connection Details”窗口中看到新建的虚拟网络,如下图所示:

通过这种方式新建的虚拟网络和VMware、Virtual Box中的Host-Only网络类似,宿主机具有一个192.168.100.1的IP地址,KVM在启动虚拟机时会通过DHCP服务为虚拟机分配192.168.100.0/24网段的IP地址,虚拟机通过这个IP地址只能与宿主机通信,不能够访问其他网络资源。

三、配置虚拟机的Private Network网卡

在virt-manager的窗口中,双击虚拟机,如下图所示:

上述操作会打开这个虚拟机的详情窗口,点击“Show virtual hardware details”按钮,如下图所示:

上述操作会打开虚拟机的虚拟硬件配置窗口,在其中选中虚拟机的虚拟网卡,然后在“Source Device”下拉框中选择之前创建的虚拟机网络,例如hostonly,如下图所示:

最后,点击“Apply”按钮,完成Private Network虚拟网卡的设置。

四、配置虚拟机的USB Passthrough网卡

将尚未开机的4G无线路由器插入宿主机,请务必确保此时这个4G无线路由器尚未开机,否则后面在虚拟机中为这块网卡DHCP时将找不到其中的DHCP Server,导致DHCP Discover尝试失败。

在shell中运行 lsusb 命令,找到4G无线路由器的USB设备信息,如下图所示:

其中,总线ID为002,设备ID为007,厂商ID为2357,产品ID为000b。总线ID和设备ID会随着插入宿主机不同的USB接口而改变,厂商ID和产品ID是烧写在4G无线路由器的固件中的,只要不修改固件,一般不会改变。

在shell中运行 ifconfig -a 命令,若找到一个名为usb0的网卡,则表明宿主机系统已经识别出4G无线路由器中的USB网卡,如下图所示:

在虚拟机的虚拟硬件配置窗口中,点击“Add Hardware”按钮,如下图所示:

上述操作会弹出“Add New Virtual Hardware”窗口,在其中选择“USB Host Device”,然后再根据上述lsusb命令所取得的信息,选择4G无线路由器的总线ID和设备ID(例如,002:007),然后点击“Finish”按钮,如下图所示:

五、在虚拟机中设置网络环境

在virt-manager的窗口中,点击“Show the graphical console”按钮,切换至虚拟机的显示控制台,然后点击“Power on the virtual machine”按钮,启动虚拟机,如下图所示:

虚拟机启动完毕之后,打开Android-x86自带的终端模拟器工具,如下图所示:

在虚拟机的终端中,运行su命令,切换至root账户,如下图所示:

在虚拟机的终端中,运行netcfg命令,可以看到虚拟机中的两块网卡,如下图所示:

其中,eth0就是上面配置的Private Network网卡,KVM为其分配的IP地址为192.168.100.146;eth1就是上面配置的USB Passthrough网卡,是将4G无线路由器中的USB网卡映射至虚拟机,由这个虚拟机独占使用的。Android-x86默认不会启动第二块网卡(eth1),所以看到的状态是Down。

在宿主机的shell中运行adb connect 192.168.100.146命令,通过adb连接至虚拟机,如下图所示:

在宿主机的shell中运行adb logcat DHCP:D *:S命令,这样便能在宿主机中查看虚拟机的日志,这个命令只会输出虚拟机的标签为DHCP,且优先级为Debug或以上的日志,除此之外都不输出,如下图所示:

打开4G无线路由器的电源,待4G无线路由器的小屏幕上出现运营商名称和上下行网络速度等信息时,表示设备启动完成。

在虚拟机的终端模拟器中,运行netcfg eth1 dhcp命令,4G无线路由器会为虚拟机的eth1网卡(实际上就是4G无线路由器内置的USB网卡)分配IP地址,如下图所示:

此时,应当能在宿主机上看到相应的DHCP日志信息,若输出结果和下图相似,则表明DHCP分配IP地址成功:

若日志中出现超时相关的信息,则表明在DHCP discover广播阶段没有找到4G无线路由器中的DHCP Server,很有可能是上面的操作失误或者步骤不正确。

在虚拟机的终端模拟器中,运行netcfg命令,此时能看到eth1网卡已经有IP地址了,如下图所示:

给eth1网卡分配的IP地址为192.168.1.113,但此时还是不能访问外网,因为默认的网络流量还是从eth0走。

在虚拟机的终端模拟器中,运行下图中的命令:

此时,虚拟机便能通过映射的USB网卡访问外网资源了,如下图所示:

六、总结

  1. 本文目的仅仅是验证系统框架是否可行,所以全部采用图形化的配置方式,本文中的所有操作都可以转化为命令行操作,以便于未来的自动化配置。

  2. 3G/4G无线路由器绝大多数都内置若干种USB设备,例如,USB Modem、USB网卡、USB无线路由器,USB读卡器等等,所以单一设备可能会有多种工作模式,今后若能在虚拟机中实现使用usb_modeswitch工具切换设备模式,使其工作在USB Modem模式下,再使用wvdial等PPP拨号工具进行拨号上网,那么虚拟机的上网环境就和真实手机更加相似了。

  3. 若能够找广州或深圳的嵌入式厂家定制我们自己的3G/4G无线路由器,那么还可以要求将设备设计成能够通过命令来控制设备的开关机,以及获得设备各项状态信息等等,这样能够更进一步地提高底层系统的自动化配置和管理。

修改CentOS网卡接口eth1改成eth0

在虚拟化中,从模板克隆出来的虚拟机网卡都会被命名为eth1(这是由于克隆得到的虚拟机网卡的MAC地址和原始模板的虚拟机网卡的MAC地址不同),而有些程序或者脚本,涉及到网卡的,默认写的是eth0,这时就存在要将eth1改为eth0的问题,方法如下:

Step-1. 在shell中运行以下命令,修改网络规则文件:

  1. vi /etc/udev/rules.d/70-persistent-net.rules

70-persistent-net.rules中仍然保留了老网卡的配置内容,新网卡则被识别为eth1。将表示老网卡的行注释或删掉,然后将表示新网卡的行中eth1改成eth0。将上述配置文件中的如下内容注释或删除:

  1. # PCI device 0x8086:0x100f (e1000)
  2. SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:58:c3:ec", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

注意,00:0c:29:58:c3:ec是原始模板虚拟机的网卡MAC地址,在每个人的虚拟机中都有可能不同。注释行以#符号开始。

将上述配置文件中的如下内容:

  1. # PCI device 0x8086:0x100f (e1000)
  2. SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:3d:2b:f0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

替换为:

  1. # PCI device 0x8086:0x100f (e1000)
  2. SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:3d:2b:f0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

注意,其实只是将网卡名eth1改为eth0,此处要将新网卡的MAC地址拷贝出来,后续配置将会用到。此处新网卡的MAC地址为00:50:56:3d:2b:f0,在每个人的虚拟机中都有可能不同。

Step-2. 在shell中运行以下命令,修改网卡配置文件:

  1. vi /etc/sysconfig/network-scripts/ifcfg-eth0

将上述配置文件中的如下内容:

  1. HWADDR=00:0C:29:58:C3:EC

替换为:

  1. HWADDR=00:50:56:3d:2b:f0

Step-3. 在shell中运行以下命令,重新启动虚拟机:

  1. reboot

Step-4. 在shell中运行以下命令,验证配置是否成功:

  1. ifconfig

若命令返回输出如下图所示,则表明新网卡配置成功:

本文中的方法适用于CentOS 6.4/5/6/7版本。