所以我在我的 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 次 |
| 最近记录: |