You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hyper-V内部交换机下Vagrant SMB共享文件夹挂载失败求助

解决Vagrant + Hyper-V内部交换机下SMB共享挂载失败的问题

我之前也碰到过一模一样的Hyper-V + Vagrant SMB共享问题,折腾了好一阵,总结了几个靠谱的解决方法,你可以试试:

方法一:手动延迟SMB挂载(最稳妥)

核心思路是禁用Vagrant自动挂载SMB共享,把挂载步骤放到静态IP配置完成后的provision阶段执行,完美避开“挂载时机早于IP配置”的问题。

步骤:

  1. 在Vagrantfile里关闭自动SMB挂载,同时配置Hyper-V内部交换机:

    Vagrant.configure("2") do |config|
      config.vm.box = "你的镜像名称(比如ubuntu/focal64)"
      config.vm.provider "hyperv" do |hv|
        hv.vmname = "你的虚拟机名称"
        hv.switch_name = "你的内部交换机名称" # 要和Hyper-V里创建的内部交换机名字一致
      end
    
      # 禁用自动SMB挂载
      config.vm.smb = false
    
  2. 添加provision脚本,先配置静态IP:

    # 配置静态IPv4(根据你的操作系统调整,这里以Ubuntu为例)
      config.vm.provision :shell, inline: <<-SHELL
        # 先关闭DHCP(可选,避免冲突)
        sudo dhclient -r eth0
        # 设置静态IP和子网掩码,要和主机的内部交换机IP同网段
        sudo ip addr add 192.168.10.10/24 dev eth0
        sudo ip link set eth0 up
        # 如果需要DNS,也可以加上
        echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
      SHELL
    
  3. 接着添加挂载SMB共享的provision脚本:

    # 挂载SMB共享
      config.vm.provision :shell, inline: <<-SHELL
        # 安装cifs工具(Ubuntu/Debian需要,其他系统比如CentOS用cifs-utils)
        sudo apt-get update && sudo apt-get install -y cifs-utils
        # 创建挂载目录(和默认的/vagrant保持一致,方便习惯)
        sudo mkdir -p /vagrant
        # 替换成你的主机IP、共享名称、Windows用户名和密码
        sudo mount -t cifs //192.168.10.1/你的共享文件夹名 /vagrant -o username=你的Windows用户名,password=你的Windows密码,vers=3.0,iocharset=utf8
      SHELL
    end
    

关键注意事项:

  • 主机的内部交换机需要手动设置IP:打开Windows的「网络连接」,找到Hyper-V内部交换机,设置IPv4为192.168.10.1,子网掩码255.255.255.0,不需要网关。
  • 确保主机的SMB共享权限允许虚拟机访问:右键共享文件夹→「属性」→「共享」→添加「Everyone」并赋予读写权限,或者直接指定虚拟机的IP范围。
  • 如果密码里有特殊字符,建议用环境变量传递,避免脚本里明文写密码(比如password=$SMB_PASSWORD,然后在启动Vagrant前设置export SMB_PASSWORD=你的密码)。

方法二:用Vagrant Trigger调整挂载时机

如果不想完全放弃自动挂载,可以用Vagrant的trigger插件,在SMB挂载前强制先配置静态IP。

步骤:

  1. 先安装trigger插件:

    vagrant plugin install vagrant-triggers
    
  2. 修改Vagrantfile,添加trigger和SMB配置:

    Vagrant.configure("2") do |config|
      config.vm.box = "你的镜像名称"
      config.vm.provider "hyperv" do |hv|
        hv.vmname = "你的虚拟机名称"
        hv.switch_name = "你的内部交换机名称"
      end
    
      # 开启SMB自动挂载
      config.vm.smb = true
      config.vm.smb_username = "你的Windows用户名"
      config.vm.smb_password = "你的Windows密码"
    
      # 添加trigger,在挂载共享前执行静态IP配置
      config.trigger.before :mount do |trigger|
        trigger.run = {
          inline: <<-SHELL
            sudo dhclient -r eth0
            sudo ip addr add 192.168.10.10/24 dev eth0
            sudo ip link set eth0 up
          SHELL
        }
        # 如果虚拟机需要sudo密码,这里要提前配置无密码sudo,或者在脚本里加密码
      end
    end
    

注意:

这个方法依赖Vagrant的阶段顺序,部分版本可能存在trigger执行时机不准的情况,建议先测试。如果挂载还是失败,优先用方法一。

备选方案:改用外部交换机(如果场景允许)

如果你的虚拟机不需要完全隔离的内部网络,可以改用Hyper-V的外部交换机,这样Vagrant能自动获取和主机同网段的IP,SMB共享挂载也能正常工作,不需要手动配置静态IP。不过这个方案只适用于允许虚拟机访问外部网络的场景。


内容的提问来源于stack exchange,提问作者Casper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:29:53