看完本文会得到什么
很多家用 Windows 的开发者如果有过搞机的经验,就会发现 Windows 自带的 Hyper-V 创建的虚拟机 IP 总会你重启了 Windows 之后 IP 会产生不可预知的改变,这对我们操作它十分不便。
不过也有一些快速的方法可以获取到虚拟机的 IP
我们假定你的虚拟机的名字叫做 ubuntu-server
,那么请你以管理员身份打开 Powershell
# (Get-VM -Name "*ubuntu-server*" | Select-Object -ExpandProperty NetworkAdapters)
你会看到
最后一个 IPAddresses 就是 Default Switch 给你的虚拟机本次分配的 IP,你通过这个 IP 是可以直接访问虚拟机的
# ssh [email protected] # 我的虚拟机 IP 就是这个
我们的思路是如下图:
Ethernet 就是我们宿主机 Windows 连接外网的本地以太网,可以是 WIFI 无线网卡所连接的网络,也可以是插着有线的网络。
Virtual-Switch 就是我们要去创建的虚拟交换机。
请忽略我截图中已经创建了一个虚拟机交换机了。
注意
因为你已经修改了网络配置,所以你现在从宿主机是无法通过 ssh 连接进 Ubuntu虚拟机的,因此这一步你必须通过 Hyper-V 提供的连接界面进入虚拟机
进入之后,直接获取 sudo 权限
$ sudo -s
查看当前网络配置
$ cd /etc/netplan/ $ cat 00-installer-config.yaml
你会看到如下配置
network ethernetes: eth0: dhcp4: true version: 2
为了以防万一,我们先备份这个默认的文件
$ cp 00-installer-config.yaml 00-installer-config.yaml.bak
然后我们修改 00-installer-config.yaml
$ vi 00-installer-config.yaml
把它的内容换成
network: version: 2 renderer: networkd ethernets: eth0: addresses: - 192.168.137.2/24 nameservers: addresses: [192.168.137.1] # 这个是 Windows 宿主机在当前虚拟交换机下的 IP routes: - to: default via: 192.168.137.1
紧接着我们需要让 Ubuntu 重新加载网络配置
$ netplan apply
恭喜你,这一步就是成功了。
然后你可以回到的宿主机上通过 ssh 访问了
$ ssh [email protected]
注意
这里会弹出一个窗口让你是否确认,并且确认之后,它会重置你宿主机 Windows 在这个虚拟机交换机上的 IP,所以你还需要重复前面第二步的步骤,把宿主机的 IP 改回 192.168.137.1
测试虚拟机外网的连通性
$ curl https://www.baidu.com
如果不能访问外网,我们还需要修改一下 Ubuntu 的 DNS 配置
第一步成为 root
$ sudo -s
首先查看
$ cat /etc/resolv.conf
# This is /run/systemd/resolve/resolv.conf managed by man:systemd-resolved(8). # Do not edit. # # This file might be symlinked as /etc/resolv.conf. If you're looking at # /etc/resolv.conf and seeing this text, you have followed the symlink. # # This is a dynamic resolv.conf file for connecting local clients directly to # all known uplink DNS servers. This file lists all configured search domains. # # Third party programs should typically not access this file directly, but only # through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a # different way, replace this symlink by a static file or a different symlink. # # See man:systemd-resolved.service(8) for details about the supported modes of # operation for /etc/resolv.conf. nameserver 127.0.0.53 options edns0
我们不能直接修改它,它是被生成出来的,所以我找到最原始的配置文件
$ vi /etc/systemd/resolved.conf
把里面的内容改成
[Resolve] DNS=8.8.8.8 FallbackDNS=1.1.1.1 #Domains= #LLMNR=no #MulticastDNS=no #DNSSEC=no #DNSOverTLS=no #Cache=no-negative #DNSStubListener=yes #ReadEtcHosts=yes
重启服务
$ systemctl daemon-reload $ systemctl restart systemd-resolved.service
生成新的连接文件
$ mv /etc/resolv.conf /etc/resolv.conf.bak $ ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
验证 dns
$ dig www.baidu.com
首先我们宿主机的在这张虚拟交换机上的 IP 也是一直固定的 192.168.137.1,我们将虚拟机的网络请求全都交给宿主机去代理,举个简单的例子
在 Ubuntu 虚拟机里面执行
curl --proxy "http://192.168.137.1:7890" "https://www.google.com" -k
注
我宿主机 Windows 有一个监听端口 7890 的代理可以访问到 Google,而我虚拟机自身没有代理,它是通过虚拟交换机跳转到宿主机的本地网络,进而访问外网的,所以如果不设置 --proxy "http://192.168.137.1:7890" 这个参数的话,虚拟机是访问不了 Google 的。
有了这个思路,你可以为你的虚拟机发挥更多想象。
Q. 我重启了 Windows 之后,Hyper-V 的虚拟机也一起重启了,发现虚拟机无法访问外网?
A. 按照如下顺序排除
你的宿主机上的有线网/WIFI 是否关闭了对虚拟交换机的网络共享。我遇到过重启之后 WIFI 就自动关闭了对虚拟交换机的共享,每次开机我都要谨慎检查一下
查看你虚拟机的 DNS是否再次被重置,比如你安装了某些 Linux 上的 DNS 的 apt 包,他们会修改 /etc/resolv.conf
文件
为了一劳永逸,用管理员身份启动 Powershell 执行如下脚本
New-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\SharedAccess -Name EnableRebootPersistConnection -Value 1 -PropertyType dword
Q. 我想让我的 Hyper-V 里面的 Ubuntu 虚拟机永远不断网,永远不休眠,怎么实现?
A. 按照如下设置
找到你宿主机的 WIFI/有线宽带,点开[配置]
把电源管理里面的 允许计算机关闭此设备以节约电源
勾掉,这样你的电脑只要不休眠就不会断网。
然后就是 Windows 自身要永久保持不休眠的状态
在系统设置找到电源选项,如下设置即可。