如何在启动时挂载VirtualBox共享文件夹?


87

我在Virtualbox中安装了Ubuntu。我想在登录Ubuntu时自动在Ubuntu中挂载VirtualBox共享文件夹。我将以下行放入〜。/ bashrc和〜/ .bash_profile中:

sudo mount -t vboxsf windows_share /media/windows_share

其中,windows_share是我使用Virtualbox创建的名称。但是每次我启动Ubuntu时,它都会要求我提供passwd,因为它需要sudo。是否有自动登录Windows共享而无需每次登录都自动输入密码的信息?

Answers:


109

为了在启动Ubuntu客户机时始终挂载Virtual Box“共享文件夹”,我们有两个选择。根据个人喜好,哪种选择最适合我们的环境。

1.使用fstab挂载

要使用Guest Additionsvboxsf随附的文件系统挂载共享文件夹,我们首先需要确保满足先决条件。然后,我们可以将以下行放入文件中:etc/fstab

<name_of_share>   /path/to/mountpoint   vboxsf   <options>  0   0

替换name_of_share/path/to/mountpoint使用您自己的设置(必须先创建安装点的目录)。有关mount的信息,请参见手册<options>。一种可能性是使用挂载defaults,或提供特定的挂载选项(例如rw, suid, exec, auto, users)。

在某些系统上,在引导vboxsffstab读取内核模块时尚未加载。然后,可能有助于将vboxsf内核模块附加到/etc/modules

某些系统comment=systemd.automount的fstab条目()中可能需要选择。

2.使用Virtual Box“自动安装”进行安装:

在最新版本的Virtual Box中,我们还可以在创建时自动挂载共享文件夹:

在此处输入图片说明

来宾重新启动后,此共享文件夹将被安装到来宾目录中/media/<username>/sf_<name_of_share>,所有已成为该组成员的用户都可以访问该目录vboxsf


1
如何更改安装目录和安装前缀?您是在HOST OS还是GUEST OS中运行某些终端命令?
CMCDragonkai 2014年

12
此功能要求“ virtualbox-guest-utils”服务已启动,并且在Ubuntu 14.04上,该服务的启动时间晚于文件系统的安装时间。这是通过fstab挂载共享时出现“找不到设备”错误的原因
kolypto 2014年

1
@garromark,我唯一的想法是创建一个暴发户脚本,这很简单。另一个选择是放置相同的fstab条目,但添加“ noauto”,以便您手动进行安装。
kolypto

4
@kolypto,感谢您再次与我联系。实际上,我发现了两个相互竞争的解决方案,如您所说,其中只有一个对我有用:选项1)(对我有用)是放入noautofstab选项,然后通常在启动脚本中安装(例如)。配置文件),选项2)的主要问题是vboxsf在fstab运行之前未加载,请追加vboxsf到文件中/etc/modules,要求内核在fstab运行之前加载模块。也许这会帮助别人。
加罗马克2014年

6
请记住将您的用户添加到vboxsf组。您可以参考askubuntu.com/questions/79565/add-user-to-existing-group
chinloong 2015年

26
  1. 编辑 /etc/rc.local

    sudo -H gedit /etc/rc.local
    
  2. exit 0键入前:

    mount.vboxsf windows_share /media/windows_share vboxsf
    
  3. (可选)创建桌面或主文件夹的快捷方式:

    ln -s /media/windows_share /home/freddy/Desktop
    

为了启动时没有出现错误,例如按S跳过安装或按M进行手动修复,您可能必须删除其中的条目。fstab


4
这是我发现工作的唯一方法,使用常规的mount命令尝试了RC.Local,尝试了FSTAB,尝试了带有脚本的Crontab。非常感谢!
FreeSoftwareServers 2015年

2
这也对我有用(与公认的答案相反,不太清楚为什么)。非常感谢我!:)
显示名称缺失

4
为我工作。我/etc/rc.local对此进行了编辑mount -t vboxsf [-o OPTIONS] sharename mountpoint
2015年

1
为了论证和反映virtualbox的情况:我曾经在开始时这样做sudo mount -t vboxsf -o uid=$UID,gid=$(id -g) windows_share ~/shared/mount_point,最终在/etc/rc.local中放置以下内容以使其起作用:mount -t vboxsf windows_share /home/dev/shared/mount_pointdev是我的用户,FYI / etc / fstab也起作用!
MediaVince

1
您的答案对我有用,但是目录已以root身份挂载。我改变了mount命令rc.local脚本,包括我的用户ID( )。2000 mount.vboxsf -o rw,uid=1000 /home/mwittie/Dropbox Dropbox vboxsfPS如果有人正在寻找关于如何打开一个教程rc.local在Ubuntu 17.04 这个一直为我工作。PPS我不需要在中包含vboxsf /etc/modules
Mike Wittie

5

经过一个筋疲力尽的早晨,尝试在Virtualbox 5.0.20中运行的Ubutntu 16.04中的所有上述操作均未成功(尤其令rc.local解决方案无法正常工作的情况),它的工作方式是:

  1. 从Virtualbox GUI的“共享文件夹”菜单注册所需目录,但不能自动挂载该目录,也不能从Virtualbox永久挂载。否则,主机目录是由root挂载的,非root用户甚至从admin组都很难访问。

  2. 在fstab中添加简单条目:

    [VirtuablBoxNameOfMount] /media/[guestOSuser]/[mountSubdir]    vboxsf   rw, noauto   0     1
    

    注意noauto选项-否则引导加载程序将失败。

  3. /etc/sudoers在来宾操作系统中使用命令visudo 将相应的行添加如下:

    ALL ALL = NOPASSWD: /bin/mount /media/[guestOSuser]/[mountSubdir]/
    

这将允许非root用户进程专门挂载此文件(因为fstab无法使用'user'选项挂载...)

  1. 在用户的.profile中添加相应的行:

    sudo mount /media/[guestOSuser]/[mountSubdir]/
    

现在,选定的用户子目录在登录时已为选定的用户准备就绪!


您是否找到过解决方法noauto
约尔根·西格瓦尔德森(JörgenSigvardsson)'11

这是唯一对我有用的解决方案。但是除此之外,我还必须在/ etc / modules中添加“ vboxsf”,以确保.profile在vboxsf准备就绪之前没有运行mount命令。
huyz

而不是使用sudo,将'user'添加到fstab选项中,任何用户都可以挂载文件系统
Lars Nordin

有关更新fstab的信息,请参见pclosmag.com/html/issues/200709/page07.html,此处的注释仅部分有用。fstab的第四列是逗号分隔的选项列表,将用户(uid = xxx)添加到该列表,例如noauto,uid = 1000,gid = 1000
qodeninja

rw和noauto之间有一个空格,这会导致解析错误。没有空白的示例为我工作
weberjn

4

对于较新的基于systemd的系统,您需要替代方法-最简单的方法是在另一个问题的另一个答案中提到的方法- 基本上说您需要comment/etc/fstab条目中添加特殊选项:

src     /my_mount/src_host  vboxsf  auto,rw,comment=systemd.automount 0 0

但是,要使上述方法在某些系统上起作用,您需要在VirtualBox的“共享文件夹”->“添加”对话框中选中“自动安装”框,这意味着您可能会在目录中多次重复安装。

对于更干净的安装-没有重复的目录,也不需要“自动安装”-您需要使用systemd的mountautomount指令。为此,/usr/lib/systemd/system/在所需的挂载点之后在named中创建两个条目,例如,与上面的fstab挂载点匹配,它们将被命名my_mount-src_host.mount并包含:

[Unit]
Description=VirtualBox shared "src" folder

[Mount]
What=src
Where=/my_mount/src_host 
Type=vboxsf
Options=defaults,noauto,uid=1000,gid=1000

my_mount-src_host.automount

[Unit]
Description=Auto mount shared "src" folder

[Automount]
Where=/my_mount/src_host
DirectoryMode=0775

[Install]
WantedBy=multi-user.target

然后,他们需要启用:

sudo systemctl enable  my_mount-src_host.automount
sudo systemctl enable  my_mount-src_host.mount

它们现在将在启动时安装。如果要立即安装它们(前提是已创建共享文件夹),可以这样做:

sudo systemctl start  my_mount-src_host.mount

请注意,如果目录中包含奇数名称或破折号(-),请使用systemd-escape该名称查找适当的转义名称。


在Ubuntu 18.04上,comment=systemd.automount没有选中自动安装VBox的第一个带选项的解决方案也可以工作。在寻找解决方案之前,我奋斗了几天,谢谢!
HubertL

很好听-我已更新我的答案以反映您的发现。
Pierz

这个在Debian 9上工作,其他人没有。
cslotty

3

我尝试了rc.local解决方案,但无法正常工作。
但是我发现问题似乎与您从中运行命令的文件夹有关(不知道为什么)。所以我在挂载命令之前添加了一行更改目录到我的主文件夹,现在它可以工作了。

因此,我的Windows共享名为Dropbox,我的挂载点为/home/jamie/Dropbox,我的用户名为jamie,这是我在rc.local中输入的内容:

cd /home/jamie
mount.vboxsf /home/jamie/Dropbox Dropbox vboxsf
exit 0

辉煌!谢谢。经过与其他解决方案的斗争,这是第一次!
诺伯特·诺伯森

sleep 2安装设备之前,我必须添加一个。
Adriano P

2

我在上面建议的模式下执行了非常类似的操作,但是这些脚本创建了所需的脚本,并使用以下脚本安装或卸载共享文件夹:

#!/bin/bash
#
# Mount automatically even shared folder on startup and unmount it at shutdown.
#
# VirtualBox (c) 2015 by Oracle Systems Inc.
#
####

# Check user privileges.
if [[ $EUID -ne 0 ]]; then
    echo -e "This script must run at ROOT user!" \
        "\nPlease, use 'sudo', 'visudo' or any other to run it."
    exit 1
fi

# Check paramas from caller.
if [[ $# -eq 0 ]]; then
    echo -e "Auto-Mount selected shared folder of VirtualBox machine." \
        "\nUsage:" \
        "\n    VBoxShared <drive_one> <drive_two> <...>"
    exit 2
fi

declare EVENT=          # This set the ACTION: -m OR -u
declare -a DRIVES=()

# Processing each param:
for arg in "$@"; do
    case "$arg" in
        "-m"|"--mount")
            if [[ -z ${EVENT} ]]; then
                EVENT=-m
            else
                exit 318        # parameters at conflict!
            fi
            ;;

        "-u"|"--umount")
            if [[ -z ${EVENT} ]]; then
                EVENT=-u
            else
                exit 318        # parameters at conflict!
            fi
            ;;

        *)
            DRIVES=("${DRIVES[@]}" "${arg}")
            ;;
    esac
done
unset arg

[[ -z ${EVENT} ]] && exit 1             # ERROR: No se ha establecido la acción a realizar.
[[ "${#DRIVES[@]}" -gt 0 ]] || exit 1   # ERROR: No se han indicado las unidades a manejar.

# Process each shared folder stored on '${DRIVES}' array
for drive in "${DRIVES[@]}"; do
    DEST="/media/sf_${drive}"

    case "${EVENT}" in
        "-m")
            [[ -d ${DEST} ]] || (mkdir ${DEST} && chown root:vboxsf ${DEST} && chmod 770 ${DEST})
            mount -t vboxsf ${drive} ${DEST}
            ;;

        "-u")
            if [[ `df --output=target | grep "${DEST}"` > /dev/null ]]; then
                umount -f ${DEST}
                rm -rf "${DEST}"
            fi
            ;;
    esac
    unset DEST
done
unset drive

unset EVENT
unset DRIVES
exit 0

另存为/opt/.scripts/VBoxShared.sh

确保可以运行该程序。在外壳上输入:

sudo chmod a+x /opt/.scripts/VBoxShared.sh

现在,我们添加一行在以下位置运行此脚本rc.local

sudo nano /etc/rc.local

并将这些行添加到最后一行(exit 0)之前:

. /opt/.scripts/VBoxShared.sh --mount <SharedFolder1> [<SharedFolder2> <SharedFolder3> ...]

保存(CtrlO)并关闭(CtrlX

此时,我们将<SharedFolder>在启动时自动挂载列出的所有共享文件夹。

要卸载它,我们只需要输入:

sudo nano /etc/rc6.d/K99-vboxsf-umount.sh

#!/bin/bash

. /opt/.scripts/VBoxShared --umount <SharedFolder1> [<SharedFolder2> <SharedFolder3> ...]

exit 0

保存(CtrlO),然后关闭(CtrlX

sudo chmod a+x /etc/rc6.d/K99-vboxsf-auto.sh

就这样!


2

这是一个可行的解决方案。

以root用户身份(IE sudo su)转到主文件夹(
cd〜)并创建一个cron文件:vi cronjobs
添加以下
@reboot sleep 15; 挂载-t vboxsf应用程序/ mnt / app

保存存档

注意:将应用替换为共享文件夹名称,并将/ mnt / app替换为您要挂载的位置。在这种情况下,我首先在mount下创建了文件夹应用程序(mkdir app)。

要将cron作为root启用(对于上述文件名),
crontab cronjobs

确保cron处于活动状态:
crontab -l

重新启动,它将被安装。15秒的睡眠时间足以让一切准备就绪。


在最新版本的Ubuntu中,删除了接受的答案中的rc.local。此替代解决方案有效:)
笨拙的linux用户'18

0

我最近在更新到Ubuntu LTS-18 (不对VirtualBox进行任何更改,并重新安装扩展名和blah-de-blah)后自动挂载停止工作时遇到了该线程。该sf_xxx目录存在于/media/,但他们没有真正被安装。

尝试将它们装入/etc/fstab(如VirtualBox自己的文档所建议的那样)不起作用:即使我修改了/etc/modules文件,引导也无法进入“紧急模式” 。

什么没有最终的工作-虽然我认为这是一个讨厌的黑客-是crontab上述伎俩。

直到今天,我仍然不知道“发生了什么”。


0

我遇到一个可以查看共享文件夹的问题,但是其中没有文件。因此,我进行了类似于以上所示的黑客操作:

我确保我的用户位于正确的组中,并且fstab中有一个用于安装共享的条目,并且权限设置正确,并且在VirtualBox设置中启用了自动挂载,但仍然没有文件可见。
因此,我在Ubuntu 18.04 GUI中打开了“启动应用程序”应用程序,并创建了一个任务,该任务仅在启动时就运行了“ sudo mount -a”。无论出于何种原因,在启动时自动解析fstab时,共享文件夹都无法正确安装,因此重新安装所有内容似乎可以解决此问题。现在,我可以看到共享中的文件。


0

我在这里尝试了所有解决方案,但都没有成功。

起作用的是安装主管并运行python脚本。

安装主管

apt-get install supervisor

python脚本(我的位于/home/ubuntu/shared_folders.py)

import subprocess
import os
import time

shared_folder = '/home/ubuntu/shared'

file_count = len(os.listdir(shared_folder))

mnt_command = 'mount -t vboxsf -o rw,uid=1000,gid=1000 shared-folder ' + shared_folder
if file_count == 0:
        # mount
        subprocess.Popen(mnt_command, shell=True)

time.sleep(3600)

为主管创建配置文件

nano /etc/supervisor/conf.d/sharedfolders.conf

[program:shared_folders] command=python shared_folders.py directory=/home/ubuntu process_name=%(program_name)s_%(process_num)s numprocs=1 numprocs_start=0 autostart=true autorestart=true startsecs=1 startretries=3 exitcodes=0,2 stopsignal=TERM stopwaitsecs=10 ;user=pavelp redirect_stderr=true stdout_logfile=/var/log/supervisor/qlistener-stdout.log stdout_logfile_maxbytes=50MB stdout_logfile_backups=10 stdout_capture_maxbytes=0 stdout_events_enabled=false stderr_logfile=/var/log/supervisor/qlistener-stderr.log stderr_logfile_maxbytes=50MB stderr_logfile_backups=10 stderr_capture_maxbytes=0 stderr_events_enabled=false environment=APPLICATION_ENV=development serverurl=AUTO

开放监督员

sudo supervisorctl

读取配置

reread

添加配置

add shared_folders


0

(就我而言,我的主机操作系统是Mac OS X,而来宾操作系统是ubuntu)

以上解决方案都没有,这里这里提到的解决方案都对我有用。他们所有人都有问题。

这是我最终为解决此问题所做的事情:

1-我在VirtualBox UI中创建了一个共享文件夹,指向VMShares我的Mac OS中命名的文件夹,并将其命名wd

2-然后我安装了Ubuntu Guest Addition工具(需要重新启动)

3-然后我在来宾操作系统中创建了一个文件夹作为挂载点(在我的情况下,名称为/home/fashid/host

4-然后我跑了:

sudo VBoxControl sharedfolder list

这是要确保该共享对来宾OS可用的命令,同时您仍需要将其安装在来宾OS中以使其实际可用。

它将显示如下内容:

Shared Folder mappings (1):
01 - VMShares

这是把戏!它显示了您需要在下面的命令中放入的实际名称,以实际安装它并使它在来宾操作系统中可用:

sudo mount -t vboxsf VMShares /home/farshid/myshares

您知道这一点了吗?我以后没有在任何地方使用wd。在第3步中,我需要提取实际的(主机)文件夹名称,而不是我在GUI对话框中分配的任意名称。

通过上述步骤,我的问题得以解决。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.