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

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

近日将电脑中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便可以顺利编译了。配置上共享文件夹看看效果吧。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值