如何在 Windows 终端中的 debian wsl 中运行 vagrant up

如何在 Windows 终端中的 debian wsl 中运行 vagrant up

我想vagrant up从 Windows 终端运行 Debian WSL。我已经安装了流浪者:

/mnt/c/HS_DEV/Homestead$ vagrant --version

我明白了

流浪者2.2.6

当我跑步时vagrant up,我得到:

The executable 'cmd.exe' Vagrant is trying to run was not
found in the PATH variable. This is an error. Please verify
this software is installed and on the path.

所以我尝试使用 debian.exe 而不是 Windows 终端配置中的默认 cmd.exe,但它仍然无法正常工作。我怎样才能跑vagrant up?这个问题从何而来?

我注意到如果我使用 powershell、cmd.exe 和 gitbash,它就可以工作,但我想在我的 Debian WSL 中执行此操作。

答案1

完全披露 - 我不使用 Vagrant,但过去在 WSL 上遇到过类似的 PATH 问题,我仍然希望这将是您问题的解决方案。

首先,我假设您正在使用WSL 说明对于流浪者来说。如果是这样,那么您安装了两个版本的 Vagrant。第一个是 Windows 版本(因为您提到在 PowerShell 和 cmd 下运行它),正如文档所说,“虽然可以从 WSL 中访问 Vagrant Windows 安装提供的 vagrant.exe 可执行文件,但它不会按预期运行。”

因此,如果您遵循了这些说明,那么您已经通过 .deb 文件将 Debian 版本安装到您​​的 WSL 实例中。

但 WSL 实际上使用的是 Debian 版本吗?很可能不会。由于您还安装了 Windows 版本,并且 WSL“有效”地将您的 Windows 路径添加到 WSL 路径之前,因此vagrant up从 WSL/Debian 内部运行可能仍会找到vagrant路径上的第一个,这可能是 Windows 版本。这实际上是 WSL 以及安装了 Windows 和 Linux 版本工具的一个非常常见的问题。

您可以通过which vagrant从 Debian 内部运行并查看找到哪个可执行文件来检查这一点。如果是 Windows 版本,那么希望这就是罪魁祸首。

据我所知,有一些可能的解决方法:

  1. 创建一个启动脚本(例如 bashrc 或您选择的 shell 的等效脚本),该脚本从路径中删除 Windows 节点,或者至少给予 Linux 版本更高的优先级。

  2. 创建一个/etc/wsl.conf和 ...

    [interop]
    appendWindowsPath = false
    

    这将删除全部WSL 会话中的 Windows 路径。缺点是一些有用的 Windows 实用程序将不再位于 WSL 路径中,但您始终可以在启动脚本中手动将它们添加回来。至少从脚本编写的角度来看,这可能比手动删除路径更容易。

  3. 如果您不再需要它,并且将专门使用 Linux/WSL 版本,您可以卸载 Windows Vagrant。

答案2

请确保您使用的是最新版本的 Vagrant,或至少为 2.2.15,否则可能无法从 Linux 正确运行 Windows 可执行文件。

cmd.exe只需在 Linux 中添加路径:

export PATH="$PATH:/mnt/c/Windows/System32"

否则,您将收到以下错误,正如您所描述的:

The executable 'cmd.exe' Vagrant is trying to run was not
found in the PATH variable. This is an error. Please verify
this software is installed and on the path.

您可以将以上行添加到~/.profile文件中并使用以下命令重新加载它:

nano ~/.profile
source ~/.profile

这样,Vagrant 将能够找到cmd.exe.

通过环境变量VAGRANT_WSL_ENABLE_WINDOWS_ACCESS,Vagrant了解到它可能会访问Windows系统来运行可执行文件并使用同步文件夹等功能。你可以找到关于该变量的更多信息请参见 Vagrant 官方网站相应页面

export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"

使用此变量,Vagrant 将从 Linux 启动 Windows 可执行文件,包括 Windowscmd.exe命令行解释器。

有一个关于如何在 Windows 10 和 VirtualBox 的 WSL1 中的 Ubuntu 18 下安装 Vagrant 的 YouTube 视频。但是,由于该视频演示了旧软件的使用,因此较新的软件可能无法按照视频中的描述运行。除此之外,该视频没有明确解决cmd.exe您所描述的问题。

无论如何,从 Linux 运行 Vagrant 在 Windows VirtualBox 中创建虚拟机并不总是能顺利运行。您可能会遇到类似以下错误:

There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "a1d5c124-261b-4e4b-a11a-88f7bfdda6df", "--type", "headless"]

Stderr: VBoxManage.exe: error: Failed to get device handle and/or partition ID for 
0000000001cf34e0 (hPartitionDevice=0000000000000a39, Last=0xc0000002/1) 
(VERR_NEM_VM_CREATE_FAILED)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

为了避免这些错误并使 Vagrant 可靠地工作,您需要在物理硬件上运行 Linux,而不是从 Windows WSL 或 Docker 容器运行。如果你在物理硬件上运行 Linux,VirtualBox 也将在 Linux 上运行,而 Vagrant 不需要通过在 Linux 上运行 Windows 可执行文件来在 Linux 和 Windows 之间进行通信。

相关内容