通过NFS服务来实现主机与虚拟机之间共享文件夹

本文主要来自之前的一篇博文《基于cypress-devstack搭建OpenEDX开发环境》 中抛开vagrant直接使用virtualBox进行项目开发的方法。有朋友按此设置没有成功,主要是在宿主机与虚拟机之间文件权限混乱的问题。奈何我自己对linux也是不懂,后来发现用nfs服务来共享文件可以解决此问题,这里就记录下 nfs服务的配置以备忘。

修改nfs配置

如果系统中安装过vagrant,那nfs服务一般都已经安装了,如果没有请自行安装nfs服务。

接下来编辑 /etc/nfs.conf 文件:

nfs.server.mount.require_resv_port = 0

修改完成后,保存,继续编辑 /etc/exports 文件:

“/Users/datochan/Documents/OpenEDX/analytics_api” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/cs_comments_service” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/ecommerce” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/ecommerce_worker” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/edx-platform” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/insights” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/ora” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/programs” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/src” 192.168.33.10 -alldirs -mapall=501:20 “/Users/datochan/Documents/OpenEDX/themes” 192.168.33.10 -alldirs -mapall=501:20

这里需要说明的是: -mapall=501:20 中 501和20 是宿主机中当前用户的uid和gid。如果不知自己的uid和gid的可以用id命令查询, 如下:

~/Documents/WorkSpaces »> id uid=501(datochan) gid=20(staff) groups=20(staff),701(com.apple.sharepoint.group.1),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),33(_appstore),100(_lpoperator),204(_developer),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh)

修改完成后,执行命令sudo nfsd restart重启nfs服务。

虚拟机中挂载宿主机器共享的文件夹

ssh到虚拟机中, 安装 nfs 服务,我的虚拟机中是ubuntu系统:

sudo apt-get install nfs-common

这样我们就可以在虚拟机中查看宿主机当前共享的文件夹了,如下:

showmount -e 192.168.33.1

注意: 这里 192.168.33.1 是宿主机映射在虚拟机中的ip地址,一般ssh进入虚拟机中时会显示出来。 下面是 showmount 命令的执行结果:

/Users/datochan/Documents/OpenEDX/themes 192.168.33.10 /Users/datochan/Documents/OpenEDX/src 192.168.33.10 /Users/datochan/Documents/OpenEDX/programs 192.168.33.10 /Users/datochan/Documents/OpenEDX/ora 192.168.33.10 /Users/datochan/Documents/OpenEDX/insights 192.168.33.10 /Users/datochan/Documents/OpenEDX/edx-platform 192.168.33.10 /Users/datochan/Documents/OpenEDX/ecommerce_worker 192.168.33.10 /Users/datochan/Documents/OpenEDX/ecommerce 192.168.33.10 /Users/datochan/Documents/OpenEDX/cs_comments_service 192.168.33.10 /Users/datochan/Documents/OpenEDX/analytics_api 192.168.33.10

继续以nfs的方式将共享文件夹挂载好:

sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/src /edx/src
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/ora /edx/app/ora/ora
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/insights /edx/app/insights
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/themes /edx/app/edxapp/themes
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/programs /edx/app/programs/programs
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/ecommerce /edx/app/ecommerce/ecommerce
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/edx-platform /edx/app/edxapp/edx-platform
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/analytics_api /edx/app/analytics_api/analytics_api
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/cs_comments_service /edx/app/forum/cs_comments_service
sudo mount -t nfs 192.168.33.1:/Users/datochan/Documents/OpenEDX/ecommerce_worker /edx/app/ecommerce_worker/ecommerce_worker

至此,文件夹共享就结束了。

解决主机与虚拟机中文件权限混乱的问题

继续回到本文一开头说的宿主机与虚拟机中用户权限混乱的问题上来。这个问题大致描述是这样的:

由于代码是在宿主机中的, 而且项目在第一次执行的时候npm或者pip会加载好多第三方库进来,默认的 *nix内核的文件系统创建的文件权限是: rwxr-xr-x 权限或者 rwxrwxr-x权限。此时,如果我们在虚拟机中启动项目时用的用户并无法跟宿主机器想吻合,这样就导致用户没有写权限,从而报权限不足的错误。这样折腾了好久,也为此提了两个问题如下:

可能是我个人不是很喜欢逛技术类社区,问题提错地方了,没有人给解决。后来在研究vagrant时发现它用的是nfs服务,再从网上找资料发现了这篇文章,问题也迎刃而解: 将虚拟机中uid和gid修改的跟宿主机用户一样即可。

另外,在我实际操作过程中,发现npm有可能也会报权限不足的问题。只需要 删除掉 /edx/app/edxapp/.npm/ 以及 /edx/app/edxapp/.cache/ 俩目录,重新执行命令: paver devstack lms即可。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:通过NFS服务来实现主机与虚拟机之间共享文件夹(陈大头的博客)