Jaz*_*rix 8 networking hyper-v vagrant
我正在将 Laravel Homestead 与 Vagrant 一起使用,我认为使用 Hyper-V 而不是 Virtual Box 会更有意义,因为它与 Windows 集成在一起。
这是我的问题。我的 Hyper-v 虚拟机时不时会获得一个新 IP,通常是 172.20.83.X。当我分配 ips 来测试域时,这会弄乱我的主机文件。因此,每次我的 hyper-v 服务器获得新 ip 时,我都必须重新输入新 ip,这很快变得非常乏味。
我想知道是否有办法将 ip 设置为在我的机器上始终相同。
我尝试修改服务器的虚拟交换机管理器,但最终失去了完整的互联网。
Asker 和任何具有类似用例的人,很可能在工作站(不是 Windows Server 版本)上运行,用于本地开发目的,并且宁愿不运行 DHCP 服务器,只是为了防止 Hyper-V更改 IP 地址分配每台主机重启。
在配置之后,需要在 VM 的网络配置中“手动”硬编码静态 IP 地址是麻烦的并且阻碍了自动化。按照“一次性”开发虚拟机和免提配置工作流的精神,将整个过程自动化不是更可取吗?为什么,是的!
所有这些跳跃都是必要的,因为 Vagrant 不能(还)为 Hyper-V 机器设置静态 IP 地址。看:
简而言之,完成这项工作的事件顺序如下:
vagrant-reload
before-reload 事件中的插件按需更改给定 VM 的网络交换机。vagrant up
,但在初始提供时选择Default Switch
(不是新的NATSwitch
)。NATSwitch
的范围内(此步骤特定于操作系统)。config.vm.provision :reload
,这将 a) 触发步骤 2 中定义的触发器,从而将 VM 的网络交换机更改为新的NATSwitch
;b)vagrant reload
在 VM 重新启动后发出并继续配置过程。NATSwitch
并无限期地使用它。虽然此步骤当然可以手动完成一次,但将命令烘焙到可以从配置Vagrantfile
期间调用的脚本中更加强大。这样的脚本可能如下所示:
./scripts/create-nat-hyperv-switch.ps1
:
# 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'
}
Run Code Online (Sandbox Code Playgroud)
然后,在Vagrantfile
配置部分的顶部添加一个适当的触发器,这将确保配置始终正确vagrant up
:
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
Run Code Online (Sandbox Code Playgroud)
在配置过程中重新启动(重新加载)VM,为了切换到静态 IP 地址,需要https://github.com/aidanns/vagrant-reload插件,因此请先安装:
vagrant plugin install vagrant-reload
Run Code Online (Sandbox Code Playgroud)
触发器将调用的脚本非常简单:
./scripts/set-hyperv-switch.ps1
:
# 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"
Run Code Online (Sandbox Code Playgroud)
接下来,在Vagrantfile
配置部分添加一个合适的触发器(即,就在上一步添加的触发器下方):
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
Run Code Online (Sandbox Code Playgroud)
配置静态 IP 是特定于操作系统的任务,因此应调整此过程以适合特定的来宾操作系统。下面是两个例子。
注意:如果在公司网络上,请务必使用公司的 DNS 服务器,因为可能无法访问 Google 的(如这些示例中所示)。
在 Ubuntu 18.04 LTS 上,这很有效:
./scripts/configure-static-ip.sh
:
# 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'
}
Run Code Online (Sandbox Code Playgroud)
./scripts/configure-static-ip.sh
:
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
Run Code Online (Sandbox Code Playgroud)
有了上面的脚本,在我们之前添加的触发器定义下面添加如下内容:
config.vm.provision "shell", path: "./scripts/configure-static-ip.sh"
config.vm.provision :reload
Run Code Online (Sandbox Code Playgroud)
vagrant up
并Default Switch
在提示时选择;这会导致 VM 获得一个动态 IPv4 地址,该地址足以让 Vagrant 通过 SSH 连接到 VM、挂载共享文件夹并开始配置。
现在,将设置静态 IP 地址并在继续配置之前重新加载 VM。
示例输出:
homestead: Setting static IP address for Hyper-V...
==> homestead: Running provisioner: reload...
==> homestead: Running action triggers before reload ...
==> homestead: Running trigger...
==> homestead: Setting Hyper-V switch to 'NATSwitch' to allow for static IP...
homestead: Running local script: ./scripts/set-hyperv-switch.ps1
==> homestead: Attempting graceful shutdown of VM...
==> homestead: Stopping the machine...
homestead: Configuring the VM...
==> homestead: Starting the machine...
==> homestead: Waiting for the machine to report its IP address...
homestead: Timeout: 120 seconds
homestead: IP: 192.168.0.2
==> homestead: Waiting for machine to boot. This may take a few minutes...
==> homestead: Machine booted and ready!
Run Code Online (Sandbox Code Playgroud)
Default Switch
,在初始后选择vagrant up
;找到解决此问题的方法将是理想的。Default Switch
到NATSwitch
必须在之前重装事件,这是在效果上类似于拉以太网线从一个物理接口,并把它连接到不同的交换机中进行. 归档时间: |
|
查看次数: |
6602 次 |
最近记录: |