我在笔记本电脑上运行 Centos 虚拟机,使用桥接网络连接以避免双重 NAT 问题,并通过 DHCP 分配地址。在我将笔记本电脑移至另一个网络之前,此方法工作正常,此时虚拟机不会注意到它位于不同的网络上,并继续使用旧的 IP 地址,从而导致连接丢失。
目前,我通过手动运行ifdown
和ifup
重置网络连接来管理此操作,但我更喜欢自动方式来执行此操作。建议?
笔记:
- 所有网络都有 DHCP 服务器。
- 启动接口时,VM 会正确获取每个网络上的 IP 地址租用。
- 我无法更改 DHCP 服务器上的设置。
- 这些网络位于不同的 IP 地址范围。
答案1
编辑您的主机/etc/network/interfaces
:
auto eth0
post-up VBoxManage controlvm nameofyourboxhere setlinkstate1 on
post-down VBoxManage controlvm nameofyourboxhere setlinkstate1 off
应该做你想做的事!当然,可以改进,但我想我已经向您展示了方法。
答案2
这是建议的解决方法,可能适合您。
尝试在客户端使用 DHCP 服务器提供的租约时间DHCP 评估(例子就在那里)。将值设置为低于网络之间的时间变化。
例如,如果您从办公室到家通常需要 30 分钟,那么将其设置为 20 分钟应该会使您的虚拟机的租约在您到家后立即失效。
答案3
如果您与主机设置了第二个“仅主机”网络连接,则可以监视其主要网络连接以了解 IP 地址何时发生变化。就像是...
while sleep 60 ; do
new_ip="`ssh host_ip ifconfig en1 | grep 'inet ' | awk '{print $2}'`"
if [ "$new_ip" != "$old_ip" ] ; then
ifdown eth0 ; ifup eth0
fi
old_ip="$new_ip"
done
或者,如果您比我更熟悉 OS X,您可能可以将网络子系统连接到从主机到来宾的 ssh,并避免每分钟一次的轮询。
不过,这确实要求您能够在主机和来宾之间进行 ssh 且无需密码。您可以使用无密码密钥,该密钥仅允许运行运行ifconfig en1
.
答案4
这是一个适用于 CentOS VM 的(可能过于)简单的脚本,它可以满足您的需求。我建议将此脚本放在 /usr/local/sbin 中,因为它不是系统脚本,并且由 root 运行。
#!/bin/bash
# nettest.sh
# Get the gateway address from the routing table
gateway=$(netstat -rn | awk '/^0.0.0.0/ {print $2}')
# Try and ping the gateway
ping -c 1 ${gateway}
# If the ping succeeds, exit.
if [ $? == 0 ]; then
exit
# Otherwise take down and bring up the network interface
else
ifdown eth0
ifup eth0
exit
fi
完成后,将此条目放入 root crontab 文件或 中/etc/cron.d/nettest.cron
,然后一切就完成了:
# Call nettest.sh every 5 minutes
*/5 * * * * /usr/local/sbin/nettest.sh 2>&1> /dev/null