在新虚拟机上调用 createhd 时,vagrant 失败并出现错误 VERR_ALREADY_EXISTS

问题描述 投票:0回答:2

我使用下面的 Vagrantfile 作为许多新虚拟机的基础(我将其复制到新目录),但今天在创建磁盘时,新虚拟机无法正确配置并出现错误 VERR_ALREADY_EXISTS。 磁盘文件(本地 vagrant 'tmp' 目录中的 source_code_disk.vdi)在开始时肯定不存在,并且实际上是在 vagrant 启动期间创建的,但 'createhd' 似乎认为它已经存在,尽管 FileExists 检查这意味着它不存在当“createhd”调用时存在。 有趣的是,如果我“vagrant destroy”新虚拟机,那么磁盘文件也不会被删除。 在基于相同 Vagrantfile 且工作正常的其他安装中,磁盘文件都是在“vagrant up”期间创建的,并通过“vagrant destroy”删除的。 运行“vagrant up --debug”不会产生任何额外的信息,为了简洁起见,我没有在此处包含输出。

# -*- mode: ruby -*-
# vi: set ft=ruby :

file_to_disk = './tmp/source_code_disk.vdi'

Vagrant.configure("2") do |config|

    config.vm.box = "ubuntu/trusty32"
    config.vm.network "private_network", ip: "192.168.33.11"
    config.vm.hostname = "testdisk"
    config.ssh.forward_agent = true
    config.ssh.shell = "/bin/bash -l"

    config.vm.provision :shell do |shell|
        shell.inline = "sudo chsh -s /bin/bash vagrant"
    end

    # create a disk for the source code
    config.vm.provider "virtualbox" do | v |
        unless File.exist?(file_to_disk)
            v.customize ['createhd', '--filename', file_to_disk, '--size', 50 * 1024]
            v.customize ['storageattach', :id, '--storagectl', 'SATAController', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]
        end
    end    

end
vagrant virtualbox
2个回答
6
投票

已修复:通过更改相对路径名来删除前导“./”

file_to_disk = 'tmp/source_code_disk.vdi'

我删除了磁盘文件路径中的“./”,并且可靠地失败的安装现在可以顺利完成 - 我怀疑在使用以无害分隔符(例如“./”)为前缀的相对路径时存在路径检查失败以及一些计时问题。 /'

# -*- mode: ruby -*-
# vi: set ft=ruby :

file_to_disk = 'tmp/source_code_disk.vdi'

Vagrant.configure("2") do |config|

    config.vm.box = "ubuntu/trusty32"
    config.vm.network "private_network", ip: "192.168.33.11"
    config.vm.hostname = "testdisk"
    config.ssh.forward_agent = true
    config.ssh.shell = "/bin/bash -l"

    config.vm.provision :shell do |shell|
        shell.inline = "sudo chsh -s /bin/bash vagrant"
    end

    # create a disk for the source code
    config.vm.provider "virtualbox" do | v |
        unless File.exist?(file_to_disk)
            v.customize ['createhd', '--filename', file_to_disk, '--size', 50 * 1024]
            v.customize ['storageattach', :id, '--storagectl', 'SATAController', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]
        end
    end    

end

注意:原始文件在大多数情况下都有效,但时不时地当我将文件复制到新目录并尝试“vagrant up”时,我无法配置虚拟机。 我知道这听起来不太可能,但这是真的,这里的调试显示了如果我“vagrant destroy”然后仅从文件路径中删除“./”则有效的失败 - 没有其他更改。

==> default: Running 'pre-boot' VM customizations...
INFO subprocess: Starting process: ["/usr/bin/VBoxManage", "createhd", "--filename", "./tmp/source_code_disk.vdi", "--size", "51200"]
INFO subprocess: Command not in installer, restoring original environment...
DEBUG subprocess: Selecting on IO
DEBUG subprocess: stderr: 0%...
DEBUG subprocess: stderr: 10%...20%...30%...40%...50%...60%...70%...80%...90%...
DEBUG subprocess: stderr: 
Progress state: NS_ERROR_INVALID_ARG
DEBUG subprocess: stderr: VBoxManage: error: Failed to create medium
DEBUG subprocess: stderr: VBoxManage: error: Cannot register the hard disk '/home/stg38/vagrant/vstb/./tmp/source_code_disk.vdi' {0c2aa882-a1ef-427e-b7c4-85ef86c0f819} because a hard disk '/home/stg38/vagrant/vstb/./tmp/source_code_disk.vdi' with UUID {17da2b81-dd91-44a3-b60e-6c4921d8e75a} already exists
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component VirtualBoxWrap, interface IVirtualBox
VBoxManage: error: Context: "RTEXITCODE handleCreateMedium(HandlerArg*)" at line 449 of file VBoxManageDisk.cpp
DEBUG subprocess: Waiting for process to exit. Remaining to timeout: 32000
DEBUG subprocess: Exit status: 1
INFO retryable: Retryable exception raised: #<Vagrant::Errors::VBoxManageError: There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["createhd", "--filename", "./tmp/source_code_disk.vdi", "--size", "51200"]

Stderr: 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...
Progress state: NS_ERROR_INVALID_ARG
VBoxManage: error: Failed to create medium
VBoxManage: error: Cannot register the hard disk '/home/stg38/vagrant/vstb/./tmp/source_code_disk.vdi' {0c2aa882-a1ef-427e-b7c4-85ef86c0f819} because a hard disk '/home/stg38/vagrant/vstb/./tmp/source_code_disk.vdi' with UUID {17da2b81-dd91-44a3-b60e-6c4921d8e75a} already exists
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component VirtualBoxWrap, interface IVirtualBox
VBoxManage: error: Context: "RTEXITCODE handleCreateMedium(HandlerArg*)" at line 449 of file VBoxManageDisk.cpp
>
INFO subprocess: Starting process: ["/usr/bin/VBoxManage", "createhd", "--filename", "./tmp/source_code_disk.vdi", "--size", "51200"]
INFO subprocess: Command not in installer, restoring original environment...


Please fix this customization and try again.
A customization command failed:

["createhd", "--filename", "./tmp/source_code_disk.vdi", "--size", 51200]

The following error was experienced:

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

Command: ["createhd", "--filename", "./tmp/source_code_disk.vdi", "--size", "51200"]

Stderr: 0%...
Progress state: VBOX_E_FILE_ERROR
VBoxManage: error: Failed to create medium
VBoxManage: error: Could not create the medium storage unit '/home/stg38/vagrant/vstb/./tmp/source_code_disk.vdi'.
VBoxManage: error: VDI: cannot create image '/home/stg38/vagrant/vstb/./tmp/source_code_disk.vdi' (VERR_ALREADY_EXISTS)
VBoxManage: error: Details: code VBOX_E_FILE_ERROR (0x80bb0004), component MediumWrap, interface IMedium
VBoxManage: error: Context: "RTEXITCODE handleCreateMedium(HandlerArg*)" at line 449 of file VBoxManageDisk.cpp
>

Please fix this customization and try again.

0
投票

我面临类似情况的不同问题。

仅使用 createhd 的 Vagrantfile 可以正常工作并创建虚拟机。 使用 storageattach 时,相同的 Vagrantfile 会超时。

仅具有 createhd 的 Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"  # Ubuntu 18.04

  disk_file = "vagrant-disk.vdi"

  config.vm.define "linux-vm-01" do |vm|
    vm.vm.provider "virtualbox" do |vb|
      vb.name = "linux-vm-01"
      vb.memory = "2048"
      unless File.exist?(disk_file)
        vb.customize ["createhd", "--filename", disk_file, "--size", 1024]
      end
    end
  end

end

带有 createhd 和 storageattach 的 Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"  # Ubuntu 18.04

  disk_file = "vagrant-disk.vdi"

  config.vm.define "linux-vm-01" do |vm|
    vm.vm.provider "virtualbox" do |vb|
      vb.name = "linux-vm-01"
      vb.memory = "2048"
      unless File.exist?(disk_file)
        vb.customize ["createhd", "--filename", disk_file, "--size", 1024]
        vb.customize ["storageattach", :id, "--storagectl", "IDE", "--port", "1", "--device", "0", "--type", "hdd", "--medium", disk_file]
      end
    end
  end

end

如前所述,在 vagrant up 中使用第二个 Vagrantfile 会超时。 我什至尝试运行第一个 Vagrantfile (仅 createhd) 之后停止虚拟机。 尝试使用 vboxmanage storageattach 连接磁盘,然后 vagrant up。 即使这样也会导致超时。

© www.soinside.com 2019 - 2024. All rights reserved.