您的位置:首页 > Web前端

VMware安装Fedora18,升级3.8.2内核,导致hgfs无法编译安装,无法共享文件夹的问题解决方法

2013-03-17 02:04 986 查看
本人是个升级控,无论是什么软件,只要出了最新版本就必须跟上。于是便因而部分软件不兼容,导致出现了一些问题。

近日将电脑中VMware安装的Fedora虚拟机升级到了最新的发布版本Fedora18,并更新内核到3.8.2。发现虽然我的VMware已经升级到最新版本的9.0.2,但vmware tools仍然不支持3.8.2的内核。导致在安装vmware tools 安装时hgfs编译出错,无法与主机开启共享文件夹。

虽然有ftp等很多代替的方法,但是由于本人有着一定程度上的强迫症,习惯一旦改变就会非常的不自在。

于是便根据报错的原因,找到了个解决问题的办法,特此和遇到同样问题的朋友分享一下。

首先需要安装一次vmware-tools,观察所遇到的编译错误。

我遇到的编译错误不多,一共有两个。

1. 结构体 super_block 缺少s_frozen

2. vmtruncate 函数未定义,被隐式声明

第一个问题,很容易解决,只需要在所需要连接的内核源代码super_block中加入s_frozen即可。

Fedora18在安装了kernel-devel后,super_block所在的内核头文件为/lib/modules/3.8.2-206.fc18.x86_64/build/include/linux/fs.h,只需要编辑该文件,

在struct super_block中加入

int s_frozen;


第一个问题便解决。

第二个问题,是由于vmtruncate函数在新内核中已经不在使用,因而没有相应的定义。所以解决该问题比较简单的方式是修改hgfs,用其他方式实现原vmtruncate的功能。

经过尝试,我选择在hgfs中,重新定义vmtruncate。

首先 在/usr/lib/vmware-tools/modules/source目录中解压vmhgfs.tar

然后编辑其中的inode.h,增加了vmtruncate函数的声明如下:

int vmtruncate(struct inode *inode, loff_t newsize);

再后,编辑inode.c ,再其中增加vmtruncate函数的定义,如下:

int vmtruncate(struct inode *inode, loff_t newsize)
{
int error;
error = inode_newsize_ok(inode, newsize);

if (error)
return error;
truncate_setsize(inode, newsize);
truncate_pagecache(inode, newsize, inode->i_size);
return 0;
}


并修改HgfsTruncatePages函数中comp_vmtruncate函数的调用处,修改为直接调用vmtruncate。

static int
HgfsTruncatePages(struct inode *inode, // IN: Inode whose page to truncate
loff_t newSize)      // IN: New size of the file
{
int result;
pgoff_t pageIndex = newSize >> PAGE_CACHE_SHIFT;
unsigned pageOffset = newSize & (PAGE_CACHE_SIZE - 1);
struct page *page;
char *buffer;

ASSERT(inode);

LOG(4, (KERN_DEBUG "VMware hgfs: HgfsTruncatePages: entered\n"));
result = vmtruncate(inode, newSize);
if (result) {
LOG(4, (KERN_DEBUG "VMware hgfs: HgfsTruncatePages: vmtruncate failed "
"with error code %d\n", result));
return result;
}
/*
* This is a bit complicated, so it merits an explanation. grab_cache_page()
* will give us back the page with the specified index, after having locked
* and incremented its reference count. We must first map it into memory so
* we can modify it. After we're done modifying the page, we flush its data
* from the data cache, unmap it, release our reference, and unlock it.
*/
page = grab_cache_page(inode->i_mapping, pageIndex);
if (page == NULL) {
LOG(4, (KERN_DEBUG "VMware hgfs: HgfsTruncatePages: could not get page "
"with index %lu from page cache\n", pageIndex));
return -ENOMEM;
}
buffer = kmap(page);
memset(buffer + pageOffset, 0, PAGE_CACHE_SIZE - pageOffset);
flush_dcache_page(page);
kunmap(page);
page_cache_release(page);
compat_unlock_page(page);
return 0;
}


最后,将修改后的hgfs重新打包并代替原有的hgfs.tar,运行./vmware-tools-distrib/bin下的vmware-config-tools.pl,(注意此处不能与运行vmware-install.pl重新安装vmware-tools,这样修改的hgfs就会白修改了)。

重现编译配置vmware tools。

这时hgfs便可以顺利编译了。配置上共享文件夹看看效果吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐