前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows 10 使用 Hyper-V 和 Vagrant 创建虚拟机环境

Windows 10 使用 Hyper-V 和 Vagrant 创建虚拟机环境

作者头像
云云众生s
发布2024-03-27 16:33:33
4300
发布2024-03-27 16:33:33
举报
文章被收录于专栏:云云众生s

Windows 10 使用 Hyper-V 和 Vagrant 创建虚拟机环境

以前我都是用 Vagrant + VirtualBox 快速创建虚拟机环境。通过 Vagrant 配置文件,我们可以快速初始化多个关联的虚拟机,并省去了设置网络和存储的时间。还可以将 Vagrant 项目直接转给别人,让别人快速搭建类似的环境。用了 Kubernetes Desktop 后,需要开启 Windows 的 Hyper-V,这样就无法使用 VirtualBox 了。所以,为了同时使用 Kubernetes 和虚拟化,使用 Hyper-V 代替 VirtualBox会是一个自然的选择。不过目前 Vagrant 还不支持 Hyper-V 网络初始化,所以要有需要自定义的步骤。

本文创建的 vagrant 项目的完整代码在这里,大家直接使用。

启用 Hyper-V 和 SMB 1.0/CIFS 文件共享支持

我们的 Windows 10 默认没有开启 Hyper-V 和 SMB 1.0/CIFS,所以需要手工开启,使用管理员运行 Powershell ,然后执行:

代码语言:javascript
复制
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature -Online -FeatureName "SMB1Protocol" -All

安装完后需要重启计算机。

安装 Vagrant

直接从这里下载安装即可,安装完后需要重启计算机。

因为要用到 reload 插件,所以还需要运行:

代码语言:javascript
复制
vagrant plugin install vagrant-reload

准备 Vagrant 目录

准备一个目录(完成后的项目在这里),作为 vagrant 项目的根目录。添加文件 scripts\create-nat-hyperv-switch.ps1:

代码语言:javascript
复制
# See: https://www.petri.com/using-nat-virtual-switch-hyper-v

If ("NATSwitch" -in (Get-VMSwitch | Select-Object -ExpandProperty Name) -eq $FALSE) {
    'Creating Internal-only switch named "NATSwitch" on Windows Hyper-V host...'

    New-VMSwitch -SwitchName "NATSwitch" -SwitchType Internal

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceAlias "vEthernet (NATSwitch)"

    New-NetNAT -Name "NATNetwork" -InternalIPInterfaceAddressPrefix 192.168.0.0/24
}
else {
    '"NATSwitch" for static IP configuration already exists; skipping'
}

If ("192.168.0.1" -in (Get-NetIPAddress | Select-Object -ExpandProperty IPAddress) -eq $FALSE) {
    'Registering new IP address 192.168.0.1 on Windows Hyper-V host...'

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceAlias "vEthernet (NATSwitch)"
}
else {
    '"192.168.0.1" for static IP configuration already registered; skipping'
}

If ("192.168.0.0/24" -in (Get-NetNAT | Select-Object -ExpandProperty InternalIPInterfaceAddressPrefix) -eq $FALSE) {
    'Registering new NAT adapter for 192.168.0.0/24 on Windows Hyper-V host...'

    New-NetNAT -Name "NATNetwork" -InternalIPInterfaceAddressPrefix 192.168.0.0/24
}
else {
    '"192.168.0.0/24" for static IP configuration already registered; skipping'
}

然后再添加 scripts\set-hyperv-switch.ps1 :

代码语言:javascript
复制
# See: https://www.thomasmaurer.ch/2016/01/change-hyper-v-vm-switch-of-virtual-machines-using-powershell/

Get-VM "homestead" | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName "NATSwitch"

增加修改 IP 的脚本,首先是 CentOS 的脚本 scripts\centos\configure-static-ip.sh :

代码语言:javascript
复制
#!/bin/sh

echo 'Setting static IP address for Hyper-V...'

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
PREFIX=24
IPADDR=192.168.0.2
GATEWAY=192.168.0.1
DNS1=8.8.8.8
EOF

# Be sure NOT to execute "systemctl restart network" here, so the changes take
# effect on reboot instead of immediately, which would disconnect the provisioner.

然后是 Ubuntu

然后准备一个名为 Vagrantfile 的文件:

代码语言:javascript
复制
Vagrant.configure("2") do |config|
    config.trigger.before :up do |trigger|
        trigger.info = "Creating 'NATSwitch' Hyper-V switch if it does not exist..."
    
        trigger.run = {privileged: "true", powershell_elevated_interactive: "true", path: "./scripts/create-nat-hyperv-switch.ps1"}
    end
    
    config.trigger.before :reload do |trigger|
        trigger.info = "Setting Hyper-V switch to 'NATSwitch' to allow for static IP..."
    
        trigger.run = {privileged: "true", powershell_elevated_interactive: "true", path: "./scripts/set-hyperv-switch.ps1"}
    end
    
    config.vm.provision "shell", path: "./scripts/centos/configure-static-ip.sh"
    
    config.vm.provision :reload

    config.vm.provider "hyperv" do |hv|
        hv.vmname = "homestead"
    end
    config.vm.hostname = "hypervhost"
    config.vm.synced_folder '.', '/vagrant', {
      type: 'smb', mount_options: ['vers=3.0'],
      smb_username: ENV['VAGRANT_SMB_USERNAME'],
      smb_password: ENV['VAGRANT_SMB_PASSWORD']
    }
    config.vm.box = "centos/7"
end

初次执行

使用管理员运行 powershell,进入 Vagrantfile 所在目录,运行:

代码语言:javascript
复制
vagrant up

当询问使用哪个 switch ,选择 “1) Default Switch”,然后就可以看到虚拟机启动又重启。然后在 SMB 共享文件部分,会提示你输入用户名密码,用你操作系统用户名和密码即可。如果没有报错,即可通过 ssh 客户端,使用 ..vagrant\machines\default\hyperv 下的 private_key 访问 192.168.0.2 。

如何修改一些配置

如果需要修改 IP,需要修改 "./scripts/centos/configure-static-ip.sh" 中的内容。如果用的是 Ubuntu ,需要修改 “config.vm.provision "shell"” 执行 "./scripts/ubuntu/configure-static-ip.sh"。

如果修改的 IP 不是 192.168.0.* ,则还需要修改 switch 相关的脚本,先将网关配置好。

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-102,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Windows 10 使用 Hyper-V 和 Vagrant 创建虚拟机环境
    • 启用 Hyper-V 和 SMB 1.0/CIFS 文件共享支持
      • 安装 Vagrant
        • 准备 Vagrant 目录
          • 初次执行
            • 如何修改一些配置
              • 参考
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档