Genymotion 模拟器每次启动时都会收到不同的 IP

Genymotion emulators receive different IPs every time I start them

我最近注意到 Genymotion 模拟器virtual box 配置存在问题。到目前为止,我只使用了一个 genymotion 模拟器,一旦我开始,它就一直有一个静态 IP 地址,我的 Java 脚本自动化测试没有给我任何问题,因为它被配置为准确地调用这个 IP 和 运行 在模拟器上测试。最近我决定将其他几个模拟器添加到我的列表中,现在那些 IP 搞砸了。有时来自一个设备(如果它关闭)的 IP 被分配给另一个模拟器,或者来自最后创建的模拟器的 IP 被分配给第一个等等。假设列表中有 4 个设备;我注意到 IP 分配的优先顺序。如果我启动虚拟框,打开 genymotion 并启动例如第一个设备,它会得到 192.168.155.101 ;第二台设备 192.168.155.102 ;第三个设备 192.168.155.103 ;分别依此类推。但是如果我关闭然后再次打开 genymotion 和虚拟框,决定首先启动第四个设备,它从第一个 192.168.155.101 获取 IP 地址,这给我带来了 Appium / Selenium 脚本的配置问题。是否可以将某些 IP 分配给 genymotion 中的特定设备,以便在重新启动 virtual box 和 genymotion 后它们将相同?

根据您的 post,我不确定您使用的是哪种主机操作系统。我在 Linux (Ubuntu 16.04)。如果你在别的地方,细节可能与下面的不同,但概念是一样的。

Genymotion 依赖于 VirtualBox 仅主机适配器(例如,vboxnet0 和子网 192.168.56.0,如果您 运行 使用典型的 Linux 主机)adb 连接到 Android Studio 之类的东西。当您部署 Genymotion VM 时,将创建此适配器并在其上启用 VirtualBox 内置的 DHCP 服务器。因此,启动后,您会看到类似这样的多个 VM 启动:

$ adb devices
List of devices attached
192.168.56.101:5555 device
192.168.56.102:5555 device

只要你不重启VirtualBox,你可以关闭并重启这些虚拟机,它们每次都会得到相同的地址。但是,正如您所观察到的,如果您重新启动 VirtualBox,则不会记忆它们以前的地址,寻址将取决于引导顺序。

大多数功能齐全的 DHCP 服务器(即使是廉价家用路由器中的服务器)都允许 MAC 注册固定 IP 租约。不幸的是,就目前而言,内置的 VirtualBox DHCP 服务器不支持此功能。

我的一个解决方法是在连接到 VM 的仅主机网络上禁用 VirtualBox DHCP 服务器,运行 我自己监听主机的 vboxnet0 适配器,然后配置它根据各自的 MAC 地址为 Genymotion 虚拟机提供固定 IP。您可以在 File->Preferences->Network->Host-only Networks 下为 VirtualBox host-only 适配器禁用 DHCP。我主机上 DHCP 服务器配置文件的片段如下所示:

subnet 192.168.56.0 netmask 255.255.255.0 {
  range 192.168.56.101 192.168.56.200;
}

host n5_2 {
  hardware ethernet 08:00:27:1F:F2:7E;
  fixed-address 192.168.56.123;
}

其中192.168.56.0指的是vboxnet0子网分配,hardware ethernet地址是设置->网络->高级部分显示的地址适配器 1 用于您希望为其分配固定 IP 的每个 VM。

这基本上可以工作,除了一个严重的问题:Genymotion Launcher 会在每次启动 VM 时检查网络配置。当它看到 VM 使用禁用 DHCP 的仅主机适配器时,如果 none 存在(例如,vboxnet1、子网 192.168.57.0)并启用 DHCP,它将创建一个新适配器,并更改VM 的网络配置指向此适配器。因此在启动后,您将拥有这个(注意与以前相比新的子网 .57):

$ adb devices
List of devices attached
192.168.57.101:5555 device
192.168.57.102:5555 device

在我试验的短时间内,我发现防止 Genymotion 启动器在启动时更改网络设置的唯一方法是打开相应的 VirtualBox 设置 面板同时从 Genymotion 启动器启动每个虚拟机。我想打开它会对配置文件进行某种锁定,使 Launcher 无法更改任何内容。当我这样做时,VM 设置为使用非 DHCP 适配器并且我的主机 DHCP 服务器配置如上,一台设备根据 DHCP 配置获取固定 IP,而其他设备根据启动顺序获取地址:

$ adb devices
List of devices attached
192.168.56.101:5555 device
192.168.56.123:5555 device

如果您可以在您的主机上设置 DHCP 服务器,并且不介意每次启动每个 VM 时打开 设置 面板,我想您可以考虑这是一个解决方法。对我来说,这不是很实用,更好的选择包括:

  1. VirtualBox 在其内置 DHCP 中添加了对 MAC 注册的支持 服务器。
  2. Genymotion 在引导期间删除(或可选)配置检查。
  3. 找出 how/why 打开 设置 锁定 VM 配置,然后永久锁定它。