安装过程不详解,请参照Archwiki :
https://wiki.archlinux.org/index.php/VMware
主要记录编译安装Vmware的内核模块时遇到的问题和处理方法,对应命令如下
1 2 3 |
vmware-modconfig --console --install-all |
1. -Werror型报错之变量类型错误
类似如下:
1 2 3 4 5 6 7 |
/tmp/modconfig-igcvK1/vmmon-only/linux/driver.c:109:19: error: initialization of ‘vm_fault_t (*)(struct vm_fault *)’ {aka ‘unsigned int (*)(struct vm_fault *)’} from incompatible pointer type ‘int (*)(struct vm_fault *)’ [-Werror=incompatible-pointer-types] |
没有找到如何取消-Werror参数的办法,但我们可以修改源码解决这个问题。
Vmware内核模块的源码在 /usr/lib/vmware/modules/source下面,先到该目录下并解压源码归档。
1 2 3 4 5 |
cd /usr/lib/vmware/modules/source tar xfv vmmon.tar #对应报错信息中的文字vmmon-only找到的这个归档名 vim vmmon-only/linux/driver.c #也是根据报错信息定位的文件 |
用vim打开修改对应报错代码并保存退出:
1 2 3 4 |
#.fault = LinuxDriverFault #这是源码,我们修改成如下 .fault = (unsigned int (*)(struct vm_fault *))LinuxDriverFault #类型强转 |
修改好了再归档回去:
1 2 3 |
tar cf vmmon.tar vmmon-only |
再进行编译安装这条报错信息应该就消失了。
2.-Werror型报错之implicit-function-declaration
示例
1 2 3 4 5 6 7 8 |
/tmp/modconfig-igcvK1/vmmon-only/linux/hostif.c:2331:11: error: implicit declaration of function ‘get_ds’; did you mean ‘get_fs’? [- Werror=implicit-function-declaration] set_fs(get_ds()); ^~~~~~ get_fs |
通过网上查找我们发现get_ds()已经被抛弃了,参见以下Github网址
https://github.com/torvalds/linux/commit/736706bee3298208343a76096370e4f6a5c55915
所以我们只要将get_ds()都修改成KERNEL_DS即可
1 2 3 4 5 |
#这里假设已经在目录/usr/lib/vmware/modules/source #亦假设归档vmmon.tar已经解压,如果没有,请参见1 vim vmmon-only/linux/hostif.c #用vim打开这个源程序 |
1 2 3 4 |
#找到get_ds(),修改成KERNEL_DS,如下: set_fs(KERNEL_DS); |
保存退出并重新规档:
1 2 3 |
tar cf vmmon.tar vmmon-only |
之后重新编译安装即可。
总结:
这个过程每个人遇到的问题不可能完全一样,但解决途径基本是一致的
- 明确报错类型,定位报错文件
- 根据已有知识或网络查找出问题所在然后进行源码修改
- 重新归档和执行模块编译安装
对于变量类型直接赋值导致的错误,进行强制转换即可。
对于一些舍弃的宏或者函数,则需要替代成新的可用的。
其他的暂时未遇到,遇到再来补充。
感谢大佬,碰上了同样的问题