所以我在我的 MAC 书上遇到了“hashicorp/precise64”的 Vagrant 设置问题。
首先,我的配置:
VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) 做 |config| config.vm.box = "hashicorp/precise64" config.vm.network "public_network", 输入: "dhcp", :bridge => 'en4: Thunderbolt Ethernet' config.vm.hostname = "mddirector" 结尾
这是 'vagrant up' 的输出
==> 默认值:尝试正常关闭 VM... ==> 默认值:检查框 'hashicorp/precise64' 是否是最新的... ==> 默认值:清除任何先前设置的转发端口... ==> 默认值:清除任何先前设置的网络接口... ==> 默认:根据配置准备网络接口... 默认值:适配器 1:nat 默认值:适配器 2:桥接 ==> 默认值:转发端口... 默认值:22 => 2222(适配器 1) ==> 默认:启动虚拟机... ==> 默认值:等待机器启动。这可能需要几分钟的时间... 默认:SSH 地址:127.0.0.1:2222 默认值:SSH 用户名:vagrant 默认值:SSH 身份验证方法:私钥 默认值:警告:连接超时。正在重试... ==> 默认值:机器已启动并准备就绪! GuestAdditions 4.3.10 正在运行 --- 好的。 ==> 默认值:正在检查 VM 中的来宾添加... ==> 默认值:设置主机名... ==> 默认:配置和启用网络接口... ==> 默认值:正在安装共享文件夹... 默认值:/vagrant => /Users/garthm/Projects/vagrant ==> 默认值:机器已经配置。运行 `vagrant provision` 或使用 `--provision` ==> 默认值:强制配置。标记为始终运行的供应商仍将运行。
“ifconfig”显示以下内容:
vagrant@mddirector:~$ ifconfig eth0 链接封装:以太网 HWaddr 08:00:27:88:0c:a6 inet 地址:10.0.2.15 Bcast:10.0.2.255 掩码:255.255.255.0 inet6 地址:fe80::a00:27ff:fe88:ca6/64 范围:链接 上行广播运行多播 MTU:1500 公制:1 RX 数据包:725 错误:0 丢弃:0 溢出:0 帧:0 TX 数据包:544 错误:0 丢弃:0 超限:0 载波:0 碰撞:0 txqueuelen:1000 RX 字节:90824 (90.8 KB) TX 字节:63375 (63.3 KB) eth1 链接封装:以太网 HWaddr 08:00:27:2f:bb:6a inet 地址:10.0.24.118 广播:10.0.31.255 掩码:255.255.248.0 上行广播运行多播 MTU:1500 公制:1 RX 数据包:3490 错误:0 丢弃:0 溢出:0 帧:0 TX 数据包:7 错误:0 丢弃:0 超限:0 载波:0 碰撞:0 txqueuelen:1000 RX 字节:345981 (345.9 KB) TX 字节:1102 (1.1 KB) lo 链路封装:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址:::1/128 范围:主机 上环回运行 MTU:16436 公制:1 RX 数据包:0 错误:0 丢弃:0 溢出:0 帧:0 TX 数据包:0 错误:0 丢弃:0 超限:0 载波:0 碰撞:0 txqueuelen:0 RX 字节:0 (0.0 B) TX 字节:0 (0.0 B)
我的问题是,我可以从我的主机 ( IP: 10.0.24.112
) ping VM ,其他人也可以 ping 我的 VM ( 10.0.24.XXX
),我的 VM 可以 ping 我的 devbox ( IP: 10.10.116.254
),我可以从我的 devbox ping 其他开发人员的虚拟机设置 (不是 Vagrant,IP: 10.10.116.254
),但我无法从我的开发箱 ping 我的 VM,其他开发人员也无法从他们的开发箱 ping 我的 VM。
他们拥有的虚拟机设置仅使用桥接 NIC,但由于某种原因,流浪者同时具有 NAT 和桥接,尽管我已经在配置中指定了桥接。如您所见,Vagrant VM 有两个 IP 地址,这似乎不正确。您还可以,当它启动时,它在适配器 1(即 NAT 适配器)上执行端口转发,这意味着它听起来像是默认情况下对所有内容都使用 NAT 适配器。
如何摆脱 NAT 适配器并仅使用桥接?
如果我编辑 VirtualBox 设置并禁用 NAT 适配器,那么只有桥接适配器并通过 VirtualBox 启动盒子(即:不使用 vagrant up),那么它只有 eth0 的 IP 地址可以从我的 devbox ping 通,这就是我要找的。如果我在编辑 VirtualBox 设置并禁用 NAT 适配器后尝试对盒子进行流浪,我会收到以下错误:
执行 VBoxManage(Vagrant 使用的 CLI)时出错 用于控制 VirtualBox。命令和标准错误如下所示。 命令:["modifyvm", "7f1c12f7-74cd-4c6b-aa5a-16d6209cf2b3", "--natpf1", "ssh,tcp,127.0.0.1,2222,,22"] Stderr:VBoxManage:错误:此名称的 NAT 规则已存在 VBoxManage:错误:详细信息:代码NS_ERROR_INVALID_ARG(0x80070057),组件NATEngine,接口INATEngine,被调用者nsISupports VBoxManage: 错误: 上下文: "AddRedirect(Bstr(strName).raw(), proto, Bstr(strHostIp).raw(), RTStrToUInt16(strHostPort), Bstr(strGuestIp).raw(), RTStrToUInt16(strGuestPort))" at文件 VBoxManageModifyVM.cpp 的第 1655 行
如果我立即再次执行 vagrant up,它会再次重新启用 NAT 适配器,我们又会再次遇到同样的问题。
ost*_*ach 27
eth0
因为 NAT 是Vagrant 在当前状态下的基本要求。但是您可以覆盖eth1
.
来自Vagrant 文档:
默认路由器
根据您的设置,您可能希望手动覆盖默认路由器配置。如果您需要通过公共网络从其他网络访问 Vagrant box,则这是必需的。为此,您可以使用 shell 配置程序脚本:
config.vm.network "public_network", ip: "192.168.0.17" # 默认路由器 config.vm.provision “外壳”, 运行:“总是”, 内联:“路由添加默认 gw 192.168.0.1” # 默认路由器 ipv6 config.vm.provision “外壳”, 运行:“总是”, 内联:“路由 -A inet6 添加默认 gw fc00::1 eth1” # 删除 eth0 上的默认网关 config.vm.provision “外壳”, 运行:“总是”, 内联:“eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`”请注意,上述内容相当复杂,可能特定于来宾操作系统,但我们记录了如何执行此操作的粗略想法,因为这是一个常见问题。
JL *_*ret 11
(抱歉,对 vagrant/virtualbox 太天真了,所以请原谅缺乏正确的网络术语)
您选择的桥接器:en4) Thunderbolt很可能是问题所在。
这是我假设您想要/需要的,而不是您要求的:
vagrant 的 SSH 登录功能可以从您的开发箱(主机)控制您的虚拟机。这就是带有端口转发的 NAT 的作用。它不会把其他任何事情搞砸,所以要求它消失并不是那么有用。这显示在 VirtualBox 中的适配器 1 上。
来自您的 LAN 的连接,而不仅仅是您的主机。让我们说一下 192.168.1.xxx 范围内的内容。在适配器 2 上,这很重要。
你只关心你的普通网卡/网卡,没有特别的理由通过你的 Thunderbolt 端口运行以太网。
即几乎可以从带有桥接的 VirtualBox 虚拟机中获得,并且不会看到 Vagrant。
这是来自我局域网上只有 VirtualBox 的机器之一的 SSH ifconfig。它运行一个我可以连接的网络服务器,我的 Mac 可以通过 SSH 连接到它并连接到它上的数据库。我将其称为参考。
[root@fdm ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:9A:85:1A
inet addr:192.168.1.143 Bcast:192.168.1.255 Mask:255.255.255.0
Run Code Online (Sandbox Code Playgroud)
在 VirtualBox 中,该参考虚拟机的网络面板将 Adapter1 显示为桥接。所有其他适配器都被禁用。
好的,所以我现在要尝试从 Vagrant 获得相同的 LAN 连接结果,但我接受我将在适配器 1 上有一个 NAT,这就是 vagrant-VB ssh 通信机制。
起点是一个vagrant init。
然后在 Vagrantfile 中,我只更改了两件事:
config.vm.box = "opscode-ubuntu-14.04"
config.vm.network "public_network"
Run Code Online (Sandbox Code Playgroud)
如果我无所事事,我会收到一个对话框,询问要使用哪个界面:
==> default: Available bridged network interfaces:
1) en1: Wi-Fi (AirPort)
2) en0: Ethernet
3) en3: Thunderbolt 1
4) p2p0
5) bbptp0
6) bridge0
Run Code Online (Sandbox Code Playgroud)
现在,看着它,我首先选择了2)因为我认为我想要以太网,而且1)看起来“太苹果了”。
这有效,但有一个不合适的 IP 10.0.xx.xx 条目,我的 ISP 阻止了 ping,见下文。我猜他们在说公共网络时真的是指公共。
无业游民ssh
vagrant@vagrant:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:0c:41:3e
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe0c:413e/64 Scope:Link
eth1 Link encap:Ethernet HWaddr 08:00:27:ca:f4:64
inet6 addr: fe80::a00:27ff:feca:f464/64 Scope:Link
Run Code Online (Sandbox Code Playgroud)
vagranthalt,然后删除目录,再次创建它并vagrant init。(我发现对网络进行过多处理可能会混淆 vagrant 和/或 virtualbox,完全删除和重新启动可以解决这些问题)
config.vm.box = "opscode-ubuntu-14.04"
config.vm.network "public_network"
Run Code Online (Sandbox Code Playgroud)
但是,这一次,选择 1) en1:Wi-Fi (AirPort)。
无业游民ssh
带有 192.168.1.123 的 eth1 看起来好多了,不是吗?
vagrant@vagrant:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:0c:41:3e
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
eth1 Link encap:Ethernet HWaddr 08:00:27:53:6e:1d
inet addr:192.168.1.123 Bcast:192.168.1.255 Mask:255.255.255.0
Run Code Online (Sandbox Code Playgroud)
而且,确实,我可以从我的参考虚拟机或 LAN 上的另一台物理机 ping 192.168.1.123。
[root@fdm ~]# ping 192.168.1.123
PING 192.168.1.123 (192.168.1.123) 56(84) bytes of data.
64 bytes from 192.168.1.123: icmp_seq=1 ttl=64 time=1039 ms
64 bytes from 192.168.1.123: icmp_seq=2 ttl=64 time=40.4 ms
Run Code Online (Sandbox Code Playgroud)
FWIW,VirtualBox 在适配器 1 上显示了 NAT,在适配器 2 上显示了桥接。
添加了接口的自动选择以及静态 IP(您不需要)。问题解决了,至少对我来说。
config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)', ip: "192.168.1.201"
Run Code Online (Sandbox Code Playgroud)
==> default: Specific bridge 'en1: Wi-Fi (AirPort)' not found. You may be asked to specify
==> default: which network to bridge to.
==> default: Available bridged network interfaces:
1) en0: Ethernet
2) en2: Thunderbolt 1
3) bridge0
Run Code Online (Sandbox Code Playgroud)
把它改成
config.vm.network "public_network", bridge: "bridge0"
如果出现问题,稍后会更新,但我想我会更新有关适配器名称的信息。
简短的回答似乎是不。
您可以覆盖适配器 1,但预计至少会出现问题 vagrant ssh
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "hashicorp/precise64"
config.vm.network "public_network", :adapter=>1 , type: "dhcp", :bridge => 'en4: Thunderbolt Ethernet'
config.vm.hostname = "mddirector"
# In case you get the host wrong...
config.vm.boot_timeout = 30
config.vm.provider "virtualbox" do |vb, override|
vb.gui = true
end
config.ssh.host = '192.168.148.24'
end
Run Code Online (Sandbox Code Playgroud)
产生:
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: bridged
==> default: Forwarding ports...
default: 22 => 2222 (adapter 1)
default: VirtualBox adapter #1 not configured as "NAT". Skipping port
default: forwards on this adapter.
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
Run Code Online (Sandbox Code Playgroud)
不幸的是,它似乎会锁定配置网络适配器,但也许你会比我更幸运。
如果你这样做,你总是可以强制停止并重新加载更正的ssh.host
. 或者我听说过vagrant dns
但从未尝试过。
小智 3
我在 StackOverflow 上找到了这个讨论。
对我来说,打开相关内容Vagrantfile
并取消注释以下行就足够了:
config.vm.network "public_network"
Run Code Online (Sandbox Code Playgroud)
然后运行vagrant reload
归档时间: |
|
查看次数: |
94479 次 |
最近记录: |