挂载失败,错误: 没有这样的设备

我在客户虚拟机上使用 VirtualBox 和 OSX 作为主机和 CentOS。

在 OS X 中,我创建了文件夹 myfolder,把它作为共享文件夹添加到 VM 中,打开 VM,在 CentOS 创建的文件夹 /home/user/myfolder中输入:

sudo mount -t vboxsf myfolder /home/user/myfolder

产出:

/sbin/mount.vboxsf: mounting failed with the error: No such device

我做错了什么?

更新:

已安装 Guest Additions

265960 次浏览

这个问题的解决办法是:

yum install gcc kernel-devel make

解决办法在这里: https://gist.github.com/larsar/1687725

我的共享文件夹/剪贴板由于某种原因停止工作(可能是由于我的虚拟机上安装了补丁程序)。

sudo mount -t vboxsf Shared_Folder ~/SF/

结果如下:

VirtualBox: mount.vboxsf: mounting failed with the error: No such device

我的解决方案是停止 vboxadd,然后进行设置:

cd /opt/VBoxGuestAdditions-*/init
sudo ./vboxadd setup

好吧,大家都忽略了一个基本事实。

在工作目录中建立子目录。

sudo mkdir /test-在根目录中创建目录。

因此,如果您的共享目录名是 shared,并执行以下操作:

mkdir /test
sudo mount -t vboxsf shared /test

它会产生以下错误:

sbin/mount.vboxsf: mounting failed with the error: No such file or directory

因为目录在错误的地方!是的,这就是这个错误所说的。错误不是说重新加载 VBOX 客户机选项。

但如果你这样做:

sudo mkdir ~/test
sudo mount -t vboxsf shared ~/test

那就没问题。

我真的很惊讶有那么多人建议重新加载 Vbox 客户端来解决这个错误,或者编写一个复杂的程序来解决在错误位置创建的目录。

我可以通过运行以下命令来解决这个问题

modprobe -a vboxguest vboxsf vboxvideo

我还有一个工作系统,它突然停止处理所描述的错误。

在我的/lib/模块中翻来覆去之后,似乎 vboxvfs模块已经不复存在了。相反,modprobe vboxsf是重新启动所需的咒语。

不知道什么时候发生的变化,但我发现了。

除了 @ Mats answer,我正在添加一些更多的信息(它帮助我在 Debian8)。

我的共享文件夹/剪贴板由于某种原因停止工作(可能是由于我的虚拟机上安装了补丁程序)。

sudo mount -t vboxsf Shared_Folder ~/SF/

给了我以下结果:

VirtualBox: mount.vboxsf: mounting failed with the error: No such device

我的解决方案是停止 vboxadd,然后进行设置:

cd /opt/VBoxGuestAdditions-*/init
sudo ./vboxadd setup

此时,如果仍然得到以下错误:

没有这样的设备。“来宾添加”安装可能失败。错误已在 /var/log/vboxadd-install.log中记录

你需要安装 linux 头:

apt-get install linux-headers-$(uname -r)

然后你可以安装客户附加:

sh /media/cdrom/VBoxLinuxAdditions.run --nox11

然后重启你的 Linux:

reboot

然后你就可以挂载你的共享文件夹!

mount -t vboxsf Shared_Folder ~/SF/

更多信息(法语) ,请检查此 呼叫

共享文件夹早些时候对我有用,但突然之间它就不工作了(Virualbox 主机是 Windows7,Guest 是 OpenSuSe)

modprobe -a vboxguest vboxsf vboxvideo

那么 mount -t vboxsf testsf /opt/tsf(testsf是 Windows c 驱动器中的文件夹,它添加到 Virtualbox 共享文件夹中——而 /opt/tsf是 OpenSuse 中的文件夹

在 Ubuntu 上,这种方法奏效了:

sudo apt-get install build-essential linux-headers-`uname -r` dkms

在两种情况下可能存在错误/不正确的方法

情景1:

在运行 VBoxLinuxAdditions.run 或 VBoxSolarisAdditions.pkg 或 VBoxWindowsAdditions.exe 之后,检查所有模块是否正确安装。< br/> < br/> 1.1. a. 在 VBoxLinux 添加的情况下,如果 < br/> 构建 VirtualBox 客户添加内核模块失败,< br/> 检查 /var/log/vboxadd-install. log中的日志文件。如果 错误是由于 内核版本更新您的内核并重新启动 vm。如果是 软呢帽,
1.1 b Yum 更新内核 *
1.1.c
1.2. 如果没有失败,那么一切都很好。您已经拥有了预期的内核版本

情景2:

如果安装了 VBoxGuestAdtions (检查文件夹/opt/VBoxGuestAdtions-* 是否存在... . * 表示版本) ,则需要在安装之前启动它。< br/> < br/> 2.1. Cd/opt/VBoxGuestAdd-*/init & & ./vboxadd start < br/> < br/> 您需要将 vm 用户的用户 id 和组 id 指定为 mount 命令的选项。< br/> < br/> 2.2. a. 获取用户的 uid 和 gid:
Id-u < ‘ user’>
Id-g < ‘ user’>
2.2. b 在 mount 命令的选项中设置 uid 和 gid:
Mount-t vboxsf-o uid = x,gid = x share _ file _ name guest _ file

您正在使用共享文件夹,因此需要在虚拟机中安装 访客添加来支持该特性。

流浪汉

如果您正在使用 流浪汉(OS X: brew cask install vagrant) ,请运行:

vagrant plugin install vagrant-vbguest
vagrant vbguest

万一失败,检查日志,例如。

vagrant ssh -c "cat /var/log/vboxadd-install.log"

也许您只是遗漏了内核头文件。

VM

在虚拟机内部,你应该安装来宾添加,内核头和启动服务,并仔细检查内核扩展是否正在运行。

这取决于来宾操作系统,因此这里有一些简短的步骤:

  1. 安装内核包括头(VBoxLinuxAddings 需要)。

    • sudo apt-get update && sudo apt-get install kernel-devel
    • 电台: sudo yum update && sudo yum -y install kernel-headers kernel-devel
  2. 安装来宾添加程序(这取决于操作系统)。

    • Ubuntu: sudo apt-get -y install dkms build-essential linux-headers-$(uname -r) virtualbox-guest-additions-iso

      如果你找不到它,通过 aptitude search virtualbox检查。

    • Debian : sudo apt-get -y install build-essential module-assistant virtualbox-ose-guest-utils

      如果你找不到它,通过 dpkg -l | grep virtualbox检查。

    • 手动下载虚拟机内的 ISO 文件(例如 wget)并安装。

      1. wget http://download.virtualbox.org/virtualbox/5.0.16/VBoxGuestAdditions_5.0.16.iso -P /tmp
      2. sudo mount -o loop /tmp/VBoxGuestAdditions_5.0.16.iso /mnt
      3. sudo sh -x /mnt/VBoxLinuxAdditions.run # --keep

        额外调试: cd ~/install && sh -x ./install.sh /mnt/VBoxLinuxAdditions.run

  3. 再次检查内核扩展是否已经启动并运行:

    • sudo modprobe vboxsf
  4. 启动/重新启动服务:

    • 手动: sudo /opt/VBoxGuestAdditions*/init/vboxadd setup(将 sudo sh -x添加到调试)
    • sudo /etc/init.d/vboxadd-service start
    • 软呢帽: sudo /etc/init.d/vboxdrv setup
    • 电台: sudo service VBoxService start

Building the main Guest Additions module

如果上面的方法不起作用,这里有更复杂的步骤来修复它。这假设您已经安装了 VBoxGuestAdtions (如上所示)。

挂载共享文件夹无法工作的最常见原因可能与构建来宾添加模块失败有关。如果在 /var/log/vboxadd-install.log中出现以下错误:

找不到当前正在运行的内核的头。

这意味着您要么没有安装内核源代码,要么找不到它们。

如果您已经按照上面的指示安装了它们,请运行以下命令:

$ sudo sh -x /opt/VBoxGuestAdditions-5.0.16/init/vboxadd setup 2>&1 | grep KERN
+ KERN_VER=2.6.32-573.18.1.el6.x86_64
+ KERN_DIR=/lib/modules/2.6.32-573.18.1.el6.x86_64/build

因此,基本上 vboxadd脚本期望您的内核源代码在以下目录中可用:

ls -la /lib/modules/$(uname -r)/build

检查内核目录是否存在(符号链接指向现有文件夹)。如果不是,请将它们安装到正确的文件夹(例如,在 /usr/src/kernels中)。

因此,vboxadd脚本可以输入您的内核源代码目录并运行 make kernelrelease,获取值并与您当前的内核版本进行比较。

逻辑是这样的:

KERN_VER=`uname -r`
KERN_DIR="/lib/modules/$KERN_VER/build"
if [ -d "$KERN_DIR" ]; then
KERN_REL=`make -sC $KERN_DIR --no-print-directory kernelrelease 2>/dev/null || true`
if [ -z "$KERN_REL" -o "x$KERN_REL" = "x$KERN_VER" ]; then
return 0
fi
fi

如果内核版本与源代码不匹配,也许您必须升级您的 Linux 内核(以防源代码比您的内核更新)。

森托斯

试试:

vagrant plugin install vagrant-vbguest vagrant vbgues

如果不起作用,请尝试针对 CentOS 的以下手动步骤:

$ sudo yum update
$ sudo yum install kernel-$(uname -r) kernel-devel kernel-headers # or: reinstall
$ rpm -qf /lib/modules/$(uname -r)/build
kernel-2.6.32-573.18.1.el6.x86_64
$ ls -la /lib/modules/$(uname -r)/build
$ sudo reboot # and re-login
$ sudo ln -sv /usr/src/kernels/$(uname -r) /lib/modules/$(uname -r)/build
$ sudo /opt/VBoxGuestAdditions-*/init/vboxadd setup

这是唯一对我有效的解决办法:

安装流浪者插件: 流浪汉,它可以让你的 VirtualBox 客户添加更新。

vagrant plugin install vagrant-vbguest

资料来源: https://github.com/aidanns/vagrant-reload/issues/4#issuecomment-230134083

我的主机是 Windows10我的虚拟机客户端是由流浪者构建的 ubuntu:

vagrant plugin install vagrant-winnfsd

VirtualBox 5.0.16/rXXX 也有同样的问题

安装了最新的 VirtualBox 5.0.18并安装了最新的 Vagrant 1.9.3,问题已经解决了。

我作为 root 用户添加的

/etc/rc.d/rc.local
/root/mount-vboxsf.sh

那么

chmod +x /etc/rc.d/rc.local

和示例脚本 /root/mount-vboxsf.sh(设置您自己的 uid 和 gid 选项)

modprobe -a vboxguest vboxsf vboxvideo
mount -t vboxsf NAME_SHARED_DIRECTORY /media/sf_NAME_SHARED_DIRECTORY -o rw,uid=0,gid=0

你需要加入

chmod + /root/mount-vboxsf.sh

我正在运行 VirtualBox5.1.20,遇到了类似的问题。下面是我找到这个修复程序的地址,以及我实现的修复程序:

# https://dsin.wordpress.com/2016/08/17/ubuntu-wrong-fs-type-bad-option-bad-superblock/
if [ "5.1.20" == "${VBOXVER}" ]; then
rm /sbin/mount.vboxsf
ln -s /usr/lib/VBoxGuestAdditions/mount.vboxsf /sbin/mount.vboxsf
fi

这个链接与/usr/lib/VBoxGuestAdtions/other/mount. vboxsf 类似,而不是我在脚本摘录中看到的那样。

对于一个构建脚本,我使用的是为了添加:

Https://github.com/rburkholder/vagrant/blob/master/scripts/additions.sh

看来是 https://www.virtualbox.org/ticket/16670的问题

我有类似的问题,检查标题,如果它不匹配,然后运行下面的命令

CentOS: sudo yum update & & sudo yum-y install kernel-headers kernel-devel

如果你在使用 Debian:

1)删除所有已安装的软件包通过 Virtualbox 客户添加 ISO 文件:

sh /media/cdrom/VBoxLinuxAdditions.run uninstall

2)安装 Virtualbox 软件包:

apt-get install build-essential module-assistant virtualbox-guest-dkms virtualbox-guest-utils

请注意,即使 modprobe vboxsf不返回任何内容(因此模块被正确加载) ,vboxsf.so仍将调用由 virtualbox-guest-utils提供的名为 mount.vboxsf的可执行文件。忽略这一点将使您无法理解错误的真正原因。

strace mount /your-directory是一个很大的帮助(在 /sbin/mount.vboxsf上没有这样的文件或目录)。

对我来说 解决方案就是 更新客人补充资料

(按「设备」-> 插入客户新增光碟影像)

对我来说,在 Mac 上,我的机器上存储了一个没有元数据的旧 VirtualBox 映像,所以它没有被更新到最新版本。

那个旧映像中安装了一个旧版本的 vbguest 插件,我机器上的新版本的 vbguest 插件无法使用它。

所以为了解决这个问题,我只是删除了我的流浪汉所基于的图像,然后流浪汉下载了新版本,它工作得很好。

# Remove an old version of the virtual box image that my vagrant was using
$ vagrant box remove centos/7

你可以通过运行以下程序找到你缓存在机器上的盒子:

$ vagrant box list

我还使用以下过程升级了我的 vbguest 插件,但我认为这没有帮助。仅供参考!

# Get rid of old plugins
vagrant plugin expunge


# Globally install the latest version of the vbguest plugin`
vagrant plugin install vagrant-vbguest

如果您发现带来的框失败的客户添加,您可以尝试做以下工作,以确保插件安装正确。这将为您的系统(对我来说是 CentOS)和 可以解决这个问题(对我来说是这样!)下载最新的基于映像

$ vagrant box update

更新对我来说很管用!

$ vagrant box update
$ vagrant plugin install vagrant-vbguest

以下两个命令对我有效。

vagrant ssh
sudo mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant