Fedora 14 暴力安装VMware-tools

新年我也放假,在家写论文。远程登录实验室机器还是太慢,在家又需要Linux和Windows同时使用,于是决定在VMware中安装一个Linux
先装了个Ubuntu 10.10,但是无论如何VM上的Ubuntu都不能完整安装VMware-tools导致不能和windows的宿主机共享文件夹。
想到已经装了一个Fedora 12是可以共享的(不过CPU和Memory配得太低了),改装Fedora 14,但失望的发现问题依旧。不过最终暴力解决。现将方方法公布如下:

目标:
在windows上的VMware 7.1 Station中安装Linux系统,并实现文件夹共享。为达此目标,必须在虚拟Linux中安装VMware tools

问题描述:
VMware tools解压安装无问题,过程参看其他文档。
第一次启动VMware tools需要执行vmware-config-tools.pl
这个脚本会根据当前的Linux版本重新编译VMware tool的内核模块
在自动搜索Linux Kernel版本时,不能正确识别kernel的头文件路径,手动添加路径仍然告知路径非法。

现象:
Searching for a valid kernel header path…
The path “” is not valid.
Would you like to change it? [yes] yes

What is the location of the directory of C header files that match your running
kernel? /usr/src/kernels/2.6.35.10-72.fc14.i686/include

The path “/usr/src/kernels/2.6.35.10-72.fc14.i686/include” is not valid.
Would you like to change it? [yes]

(我的Fedora 14已经将内核和头文件都更新到2.6.35.10-72,但是vmware-config-tools仍然报错)

解决方案:
在多方尝试,手动编译,安装open-vmware-tools等等统统失败之后,我决定该脚本跳过路径的合法性检查。
打开vmware-config-tools.pl文件,寻找类似下面的代码:

sub getValidKernelHeadersPath {
my $kh_path = shift;
my $modconfig = shift;
my $appLoaderArgs = shift;
my $answer;
my $query;
my $default;

while (1) {
if (system(“$modconfig –validate-kernel-headers \”$kh_path\” ” .
“$appLoaderArgs >/dev/null 2>&1”) == 0) {
$query = “The path \”$kh_path\” appears to be a valid path to the ” .
“kernel headers of the running kernel.”;
$default = ‘no’;
} else {
$query = “The path \”$kh_path\” is not valid.”;
$default = ‘yes’;
$kh_path = ”;
}

$answer = get_answer($query . “\n Would you like to change it?”,
‘yesno’, $default);
if ($answer eq ‘yes’) {
# Get new path.
$kh_path = query(‘What is the location of the ‘ .
‘directory of C header files that match your ‘ .
‘running kernel?’, $kh_path, 0);
} else {
last;
}
}
return $kh_path;
}

代码前一段是检查是否合法,如果不合法,会清空路径(这个是关键),然后询问是否需要再一次修改路径。
已经说过,我已经确定路径就是/usr/src/kernels/2.6.35.10-72.fc14.i686/include
只不过那个该死的检查中是说该路径非法。
所以,我将
$kh_path = ”;
这一句话注释掉。

下一次运行,尽管路径检查仍然失败,不过输入的头文件路径不会被丢弃。这样我们就可以在下一次要求输入新路径的时候选no,跳过检查

结果:
使用心得头文件路径,除了两个内核模块编译失败之外,其他的都编译成功。
最主要的,我们需要vmblock模块被重新编译,因为这个模块直接关系到文件共享。
没有编译成功的模块并没有关系,VMware会使用预编译的模块代替。

最后,跳过头文件路径检查,最终将文件共享启动。

PS:
有谁懂if (system(“$modconfig –validate-kernel-headers \”$kh_path\” ” . “$appLoaderArgs >/dev/null 2>&1”) == 0)
显然这句话在判断合法性,可是我还不是那么懂perl

Advertisements

明信片收到

哪位童鞋从成都给我发了张上海东方明珠的明信片?明信片已收到,非常感谢,上一次收到明信片已经是几年以前了。
不过该童鞋没有留下姓名,我只能在此表达我诚挚的谢意了。。。