Merge pull request #9800 from chrisroberts/e-vbox-builtin

Support VirtualBox shared folders using builtin kernel module
This commit is contained in:
Chris Roberts 2018-05-07 13:24:50 -07:00 committed by GitHub
commit 3bcdd2901b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 10 deletions

View File

@ -11,6 +11,9 @@ module VagrantPlugins
@@logger.debug("Mounting #{name} (#{options[:hostpath]} to #{guestpath})")
builtin_mount_type = "-cit vboxsf"
addon_mount_type = "-t vboxsf"
mount_options = options.fetch(:mount_options, [])
detected_ids = detect_owner_group_ids(machine, guest_path, mount_options, options)
mount_uid = detected_ids[:uid]
@ -19,21 +22,33 @@ module VagrantPlugins
mount_options << "uid=#{mount_uid}"
mount_options << "gid=#{mount_gid}"
mount_options = mount_options.join(',')
mount_command = "mount -t vboxsf -o #{mount_options} #{name} #{guest_path}"
mount_command = "mount #{addon_mount_type} -o #{mount_options} #{name} #{guest_path}"
# Create the guest path if it doesn't exist
machine.communicate.sudo("mkdir -p #{guest_path}")
# Attempt to mount the folder. We retry here a few times because
# it can fail early on.
stderr = ""
retryable(on: Vagrant::Errors::VirtualBoxMountFailed, tries: 3, sleep: 5) do
machine.communicate.sudo(mount_command,
error_class: Vagrant::Errors::VirtualBoxMountFailed,
error_key: :virtualbox_mount_failed,
command: mount_command,
output: stderr,
) { |type, data| stderr = data if type == :stderr }
result = machine.communicate.sudo(mount_command, error_check: false) do |type, data|
stderr << data if type == :stderr
end
if result != 0
if stderr.include?("-cit")
@@logger.info("Detected builtin vboxsf module, modifying mount command")
mount_command.sub!(addon_mount_type, builtin_mount_type)
end
# Attempt to mount the folder. We retry here a few times because
# it can fail early on.
stderr = ""
retryable(on: Vagrant::Errors::VirtualBoxMountFailed, tries: 3, sleep: 5) do
machine.communicate.sudo(mount_command,
error_class: Vagrant::Errors::VirtualBoxMountFailed,
error_key: :virtualbox_mount_failed,
command: mount_command,
output: stderr,
) { |type, data| stderr = data if type == :stderr }
end
end
# Chown the directory to the proper user. We skip this if the

View File

@ -192,6 +192,20 @@ describe "VagrantPlugins::GuestLinux::Cap::MountVirtualBoxSharedFolder" do
end
end
end
context "with guest builtin vboxsf module" do
let(:vbox_stderr){ <<-EOF
mount.vboxsf cannot be used with mainline vboxsf; instead use:
mount -cit vboxsf NAME MOUNTPOINT
EOF
}
it "should perform guest mount using builtin module" do
expect(comm).to receive(:sudo).with(/mount -t vboxsf/, any_args).and_yield(:stderr, vbox_stderr).and_return(1)
expect(comm).to receive(:sudo).with(/mount -cit/, any_args)
cap.mount_virtualbox_shared_folder(machine, mount_name, mount_guest_path, folder_options)
end
end
end
describe ".unmount_virtualbox_shared_folder" do