2022-10-01Linux0
请注意,本文编写于 239 天前,最后修改于 192 天前,其中某些信息可能已经过时。

目录

Hyper-V 默认的 Default Switch 给虚拟机分配的是动态 IP
给 Ubuntu 设置一个静态 IP
新建一个内网虚拟交换机
在新的内网虚拟交换机上为宿主机设置一个静态 IP
为 Ubuntu 虚拟机更换虚拟交换机
进入 Ubuntu 虚拟机,给它指定一个静态 IP
想虚拟机交换机共享外网访问权限
设置 Ubuntu 的 DNS
Ubuntu 反向访问宿主机
常见问题

看完本文会得到什么

  1. 使用 Powershell 脚本快速获取虚拟机 IP
  2. 新建内网交换机让虚拟机 IP 固定成手动指定的静态 IP
  3. 虚拟机访问外网
  4. 虚拟机使用你宿主机的网络代理

Hyper-V 默认的 Default Switch 给虚拟机分配的是动态 IP

很多家用 Windows 的开发者如果有过搞机的经验,就会发现 Windows 自带的 Hyper-V 创建的虚拟机 IP 总会你重启了 Windows 之后 IP 会产生不可预知的改变,这对我们操作它十分不便。

不过也有一些快速的方法可以获取到虚拟机的 IP

我们假定你的虚拟机的名字叫做 ubuntu-server,那么请你以管理员身份打开 Powershell

#  (Get-VM -Name "*ubuntu-server*" | Select-Object -ExpandProperty NetworkAdapters)

你会看到

image.png

最后一个 IPAddresses 就是 Default Switch 给你的虚拟机本次分配的 IP,你通过这个 IP 是可以直接访问虚拟机的

# ssh [email protected] # 我的虚拟机 IP 就是这个

给 Ubuntu 设置一个静态 IP

我们的思路是如下图:

Ethernet 就是我们宿主机 Windows 连接外网的本地以太网,可以是 WIFI 无线网卡所连接的网络,也可以是插着有线的网络。

Virtual-Switch 就是我们要去创建的虚拟交换机。


新建一个内网虚拟交换机

image.png

请忽略我截图中已经创建了一个虚拟机交换机了。

image.png

在新的内网虚拟交换机上为宿主机设置一个静态 IP

image.png

image.png

为 Ubuntu 虚拟机更换虚拟交换机

image.png

image.png

进入 Ubuntu 虚拟机,给它指定一个静态 IP

注意

因为你已经修改了网络配置,所以你现在从宿主机是无法通过 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 访问了

想虚拟机交换机共享外网访问权限

image.png

注意

这里会弹出一个窗口让你是否确认,并且确认之后,它会重置你宿主机 Windows 在这个虚拟机交换机上的 IP,所以你还需要重复前面第二步的步骤,把宿主机的 IP 改回 192.168.137.1

测试虚拟机外网的连通性

$ curl https://www.baidu.com

如果不能访问外网,我们还需要修改一下 Ubuntu 的 DNS 配置

设置 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

Ubuntu 反向访问宿主机

首先我们宿主机的在这张虚拟交换机上的 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. 按照如下顺序排除

  1. 你的宿主机上的有线网/WIFI 是否关闭了对虚拟交换机的网络共享。我遇到过重启之后 WIFI 就自动关闭了对虚拟交换机的共享,每次开机我都要谨慎检查一下

  2. 查看你虚拟机的 DNS是否再次被重置,比如你安装了某些 Linux 上的 DNS 的 apt 包,他们会修改 /etc/resolv.conf 文件

  3. 为了一劳永逸,用管理员身份启动 Powershell 执行如下脚本

     New-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\SharedAccess -Name EnableRebootPersistConnection -Value 1 -PropertyType dword

Q. 我想让我的 Hyper-V 里面的 Ubuntu 虚拟机永远不断网,永远不休眠,怎么实现?
A. 按照如下设置

找到你宿主机的 WIFI/有线宽带,点开[配置]

image.png

把电源管理里面的 允许计算机关闭此设备以节约电源勾掉,这样你的电脑只要不休眠就不会断网。

image.png

然后就是 Windows 自身要永久保持不休眠的状态

在系统设置找到电源选项,如下设置即可。

image.png

image.png