在之前的一篇文章《Virtualbox虚拟机网络配置(NAT + Host-only - Bridged)》里说到,日常开发工作中,常常会使用虚拟机,在里面安装Server,搭建服务端环境供开发调试。开发过程中难免有频繁的文件修改操作,如果是使用SSH登陆虚拟机服务器去编辑代码,或者本机编辑后再通过SFTP上传等方式更新虚拟机中的文件,不免麻烦。

了解过Virtualbox的同学应该可以知道:Virtualbox在虚拟机中安装了增强包之后,支持和宿主机使用共享文件夹。那么,我们只要将开发的项目文件,放在共享文件夹中,就可以在本机编辑修改文件后实时的在虚拟机中反映该变化,节省了我们手动去同步的时间和精力,拥有和直接在本机部署运行环境做开发时基本一致的体验。

下面就简单的介绍一下Virtualbox虚拟机中的Linux server(以Ubuntu server 12.04为例)与宿主机共享文件夹的配置。

首先需要安装Virtualbox虚拟机增强包:

  1. 在虚拟机中安装Linux server以后,等待虚拟机启动完毕,再依次点击虚拟机菜单上的 设备 => 安装增强功能 
     
  2. 进入server的命令行,挂载增强包的光盘,然后运行安装脚本:
    $ sudo mount /dev/cdrom /mnt
    $ cd /mnt
    $ sudo ./autorun.sh

安装完Virtualbox虚拟机增强包之后,可以使用fstab自动挂载共享文件夹,或者Virtualbox本身提供的自动挂载功能在虚拟机启动后自动挂载共享文件夹。如果虚拟机安装的是Ubuntu14.04或者之后的版本,推荐使用Virtualbox自动挂载方式,比较稳定,不易发生挂载失败的情况。下面逐一介绍操作方法:

fstab自动挂载方式

  1. 依次点击虚拟机菜单上的 设备 => 共享文件夹 ,打开共享文件夹配置,选择你的共享文件夹,如下图所示:

     
  2. 编辑/etc/fstab文件,加入开机自动挂载共享文件夹的配置并保存:
    develop /share vboxsf rw,fmode=766,dmode=777 0 0

Virtualbox自动挂载方式

Virtualbox自动挂载方式是指在设置共享文件夹的界面上勾选「自动挂载」,由Virtualbox为我们在虚拟机启动后自动挂载共享文件夹。

Virtualbox自动挂载的文件夹一般位于/media/sf_<share-folder-name>,例如此处,共享文件夹的名称是develop,自动挂载到虚拟机以后的路径就是/media/sf_develop,目录权限是770

user@serv:/media$ ll
drwxrwx---  1 root vboxsf 4096 Jan  1 00:01 sf_develop/

创建目录链接(如有必要):

$ sudo ln -s /media/sf_develop/ /share

假如当前用户不是root,那么需要将当前用户加入vboxsf组,以保证可以访问共享目录:

$ sudo adduser user vboxsf

操作完毕,重启虚拟机。启动后如果没有错误,在虚拟机的/share/目录中就能看到本地机器/data/develop/目录中的文件了,以后在本机/data/develop/目录下编辑代码修改文件之后就不需要再手动同步到虚拟机,虚拟机可以实时的反映出文件的变化,极大的方便了开发调试工作。

另外需要注意的一点是,共享文件夹的格式为vboxsf,有可能不能正常使用Linux的sendfile模块的功能。一些常见的web server如Nginx和Apache,如果在它们的配置文件中启用了sendfile模块,可能会导致响应到客户端的文件内容错误。关于该问题的具体描述,有兴趣的同学可以Google "vboxsf sendfile" 了解。目前的建议是参考这些服务的具体配置方法,将sendfile模块禁用,以保证文件内容可以被正确发送。