解决vmware上使用linux虚拟,无法共享文件的问题

在vmware workstation 开启了linux 虚拟机,添加文件共享相关设置后,在虚拟机里面看不到,这是因为什么呢,其实是vmtools 的问题!!本文带你解决!!

前段时间,一个朋友在windows 使用 linux 虚拟,因为要共享windows 上的文件夹给linux 虚拟机。

而这个功能vmware 自己带了,只需要添加就行,不需要做什么客户的设置,图片如下:

按正常的情况来讲,只要安装了vmtools 之后,这里添加了共享,在虚拟机的 /mnt/hgfs 目录,就可以看到我们添加的共享文件夹的,可是这次,我的朋友并不是这么幸运,添加了文件夹,只是有 /mnt/hgfs 这个目录,目录下并没有任何文件。

后来经过了解情况,由于没有安装 vmtools,所以看不到,这个功能,是由vmtools 来控制的,安装了vmtools 之后,还是一样,再后来,我远程过去操作,再次安装,依然无效。

后来经过排查,安装了vmtools 以后会添加一个名为 vmhgfs 的 kernel module,经过查看,这个并没有对应模块

[root@localhost ~]# lsmod | grep vm
vmw_vsock_vmci_transport 30577 0
vsock 34855 5 vmw_vsock_vmci_transport
vmw_balloon 18190 0
vmw_vmci 67106 1 vmw_vsock_vmci_transport
vmwgfx 235043 2
drm_kms_helper 146456 1 vmwgfx
ttm 93908 1 vmwgfx
drm 372540 5 ttm,drm_kms_helper,vmwgfx
[root@localhost ~]#

图片如下:

怀疑是不是安装 vmtools 的,没有启用这个模块,于是,从新安装一遍,并且查看每一步确认的提示,避免提示的直接确认而忽略了这个模块的安装。

在安装过程中,还遇到如下的错误提示:

The path "" appears is not a valid path to the 3.10.0-514.6.1.el7.x86_64 kernel headers.

这个是由于系统没有安装 kernel header 文件,而导致找不到,如果遇到这个错误,安装 kernel 对应版本的 header 文件,即可,命令如下:

yum -y install kernel-devel-$(uname -r) # Redhat \ CentOS
apt-get -y install linux-headers-$(uname -r) # Debian \ Ubuntu
##其它发行版本,请调整相应命令

安装完成后,重新运行 vmtools 的安装脚本 vmware-install.pl 即可,安装后这一步缺少 header 文件的提示就变成如下这样

The path "/lib/modules/3.10.0-514.6.1.el7.x86_64/build/include" appears to be a valid path to the 3.10.0-514.6.1.el7.x86_64 kernel headers.

注意这里显示了路径,并且是 appears ,不是之前的 is not a valid

还有一点需要注意的是,在安装 vmtools 的时候,需要有 perl 语言环境支持,并且还要有 gcc 编译器,还需要系统对应的 kernel header 文件。perl 一般的linux系统都自带了,而 gcc 和 kernel 头文件,则不一定有,安装如下

yum -y install gcc kernel-devel-$(uname -r)
apt-get -y install gcc linux-headers-$(uname -r)

##其它发行版本,请调整相应安装命令

在解决的了头文件的问题之后,原本以为应该可以解决了,所以再次运行安装,在安装的时候,gcc 编译器报一个错误,还是和 vmhgfs.ko 相关的,既然是 .ko 文件,这个是内核模块的文件啊,我想,估计这次安装完了也不行,内核模板编译出错,忽略了这个错误,继续安装下去,结果和我猜想的一样 lsmod 命令依然看不到模板,/mnt/hgfs 目录也没有文件
gcc 编译器报错如下:

In file included from include/linux/mmzone.h:9:0,
from include/linux/gfp.h:5,
from include/linux/mm.h:9,
from include/linux/pagemap.h:7,
from /tmp/modconfig-EgxhOq/vmhgfs-only/page.c:28:
include/linux/wait.h:1044:1: note: expected ‘unsigned int’ but argument is of type ‘int (*)(void *)’
wait_on_bit(void *word, int bit, unsigned mode)
^
/tmp/modconfig-EgxhOq/vmhgfs-only/page.c:1649:23: error: too many arguments to function ‘wait_on_bit’
TASK_UNINTERRUPTIBLE);
^
In file included from include/linux/mmzone.h:9:0,
from include/linux/gfp.h:5,
from include/linux/mm.h:9,
from include/linux/pagemap.h:7,
from /tmp/modconfig-EgxhOq/vmhgfs-only/page.c:28:
include/linux/wait.h:1044:1: note: declared here
wait_on_bit(void *word, int bit, unsigned mode)
^
make[2]: *** [/tmp/modconfig-EgxhOq/vmhgfs-only/page.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [_module_/tmp/modconfig-EgxhOq/vmhgfs-only] Error 2
make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.6.1.el7.x86_64'
make: *** [vmhgfs.ko] Error 2
make: Leaving directory `/tmp/modconfig-EgxhOq/vmhgfs-only'

后来在网上查到资料,说是因为 centos 7 的 内核使用3.10的版本,在函数 wait_on_bit_io() 中有三个参数,而vmtools 的代码在3.19后才用3个参数的 wait_on_bit_io() 函数,代码如下:

int
HgfsWbRequestWait(HgfsWbPage *req) // IN: request of page data to write
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
return wait_on_bit_io(&req->wb_flags,
PG_BUSY,
TASK_UNINTERRUPTIBLE);
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
return wait_on_bit(&req->wb_flags,
PG_BUSY,
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
HgfsWbRequestWaitUninterruptible,
#endif
TASK_UNINTERRUPTIBLE);
#else
wait_event(req->wb_queue,
!test_bit(PG_BUSY, &req->wb_flags));
return 0;
#endif
}

现在,我们只需要修改一下这个函数。

在vmtools 解压出来的目录里面,进入 lib/modules/source 目录,在这个目录里,可以看到有好几个以.tar结尾的文件,其中 vmhgfs.tar ,把这个包解压出来,使用如下命令

tar -xf vmhgfs.tar

这个包解压后,会有一个 vmhgfs-only 的文件夹

修改这个 vmhgfs-only 文件夹的下的 page.c 文件,在 1639 行,使用vim或者任何你喜欢的编辑器,修改如下:

原文件
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)

修改后的文件
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)

修改后保存,回到 lib/modules/source 目录,删除原本的 vmhgfs.tar 文件,再重新打包

rm -f vmhgfs.tar
tar -cf vmhgfs.tar vmhgfs-only

最后再回到vmtools 安装目录,重新执行 ./vmware-install.pl 安装,即可解决

安装完成后,可以使用 lsmod | grep vm 看到,vmhgfs 这个模板已经存在并加载了,现在,共享文件夹就可以使用了

 

猜您喜欢