Ubuntu 13.10にVMware Toolsをインストールする
Ubuntu 13.10にVMware Toolsをインストールしようとすると、以下のビルドエラーが表示され一部のモジュールがビルドできません。これはゲストOSとして「VMware Player」にインストールしたUbuntu 13.10の内容です。
以下ログです。
make: ディレクトリ `/tmp/modconfig-lOHtKg/vmhgfs-only' に入ります
/usr/bin/make -C /lib/modules/3.11.0-13-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
MODULEBUILDDIR= modules
make[1]: ディレクトリ `/usr/src/linux-headers-3.11.0-13-generic' に入ります
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/backdoorGcc64.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/backdoor.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/cpName.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/bdhandler.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/cpNameLinux.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/cpNameLite.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/dentry.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/dir.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/file.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/filesystem.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/fsutil.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/hgfsBd.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/hgfsEscape.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/hgfsUtil.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/inode.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/link.o
/tmp/modconfig-lOHtKg/vmhgfs-only/inode.c: In function ‘HgfsPermission’:
/tmp/modconfig-lOHtKg/vmhgfs-only/inode.c:1893:29: error: ‘struct dentry’ has no member named ‘d_count’
int dcount = dentry->d_count;
^
make[2]: *** [/tmp/modconfig-lOHtKg/vmhgfs-only/inode.o] エラー 1
make[2]: *** 未完了のジョブを待っています....
make[1]: *** [_module_/tmp/modconfig-lOHtKg/vmhgfs-only] エラー 2
make[1]: ディレクトリ `/usr/src/linux-headers-3.11.0-13-generic' から出ます
make: *** [vmhgfs.ko] エラー 2
make: ディレクトリ `/tmp/modconfig-lOHtKg/vmhgfs-only' から出ます
/usr/bin/make -C /lib/modules/3.11.0-13-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
MODULEBUILDDIR= modules
make[1]: ディレクトリ `/usr/src/linux-headers-3.11.0-13-generic' に入ります
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/backdoorGcc64.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/backdoor.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/cpName.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/bdhandler.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/cpNameLinux.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/cpNameLite.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/dentry.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/dir.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/file.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/filesystem.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/fsutil.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/hgfsBd.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/hgfsEscape.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/hgfsUtil.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/inode.o
CC [M] /tmp/modconfig-lOHtKg/vmhgfs-only/link.o
/tmp/modconfig-lOHtKg/vmhgfs-only/inode.c: In function ‘HgfsPermission’:
/tmp/modconfig-lOHtKg/vmhgfs-only/inode.c:1893:29: error: ‘struct dentry’ has no member named ‘d_count’
int dcount = dentry->d_count;
^
make[2]: *** [/tmp/modconfig-lOHtKg/vmhgfs-only/inode.o] エラー 1
make[2]: *** 未完了のジョブを待っています....
make[1]: *** [_module_/tmp/modconfig-lOHtKg/vmhgfs-only] エラー 2
make[1]: ディレクトリ `/usr/src/linux-headers-3.11.0-13-generic' から出ます
make: *** [vmhgfs.ko] エラー 2
make: ディレクトリ `/tmp/modconfig-lOHtKg/vmhgfs-only' から出ます
ビルドできるようにソースコードを修正する
上記のエラーを修正します。ポイント
修正のポイントは、「vmware-tools-distrib/lib/modules/source/vmhgfs.tar」内の「/vmhgfs-only/inode.c」ファイルに「https://raw.github.com/rasa/vmware-tools-patches/master/patches/vmhgfs/vmhgfs-d_count-kernel-3.11-tools-9.6.0.patch」のパッチを当てることです。1.VMware Toolsの展開
「VMware Tools」を展開します。ここでは例として、「~/ダウンロード」に展開しました。
2.アーカイブマネージャーで開く
「~/ダウンロード/vmware-tools-distrib/lib/modules/source/vmhgfs.tar」をダブルクリックします。3.ファイルの展開
今回パッチを当てる「inode.c」ファイルを「~/ダウンロード」に展開します。4.ファイルの展開完了
以下のようにファイルが読み込み専用になっているので、読み書きできるようにアクセス権を変更します。5.アクセス権の変更
ファイルのプロパティー画面を開き、「アクセス」を「読み書き」に変更します。6.パッチファイルの作成
テキストエディターを起動し、「https://raw.github.com/rasa/vmware-tools-patches/master/patches/vmhgfs/vmhgfs-d_count-kernel-3.11-tools-9.6.0.patch」の中身をコピー&ペーストします。テキストエディターに貼り付ける内容は以下の内容です。
--- vmhgfs-only/inode.c 2013-08-15 22:32:22.000000000 -0700
+++ vmhgfs-only.patched/inode.c 2013-09-16 21:31:12.323041668 -0700
@@ -31,6 +31,9 @@
#include <linux/namei.h>
#endif
#include <linux/highmem.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
+#include <linux/dcache.h>
+#endif
#include "compat_cred.h"
#include "compat_fs.h"
@@ -1890,7 +1893,11 @@
#endif
&inode->i_dentry,
d_alias) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
+ int dcount = d_count(dentry);
+#else
int dcount = dentry->d_count;
+#endif
if (dcount) {
LOG(4, ("Found %s %d \n", dentry->d_name.name, dcount));
return HgfsAccessInt(dentry, mask & (MAY_READ | MAY_WRITE | MAY_EXEC));
@@ -1943,10 +1950,12 @@
list_for_each(pos, &inode->i_dentry) {
int dcount;
struct dentry *dentry = list_entry(pos, struct dentry, d_alias);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 38)
- dcount = atomic_read(&dentry->d_count);
-#else
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
+ dcount = d_count(dentry);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)
dcount = dentry->d_count;
+#else
+ dcount = atomic_read(&dentry->d_count);
#endif
if (dcount) {
LOG(4, ("Found %s %d \n", (dentry)->d_name.name, dcount));
+++ vmhgfs-only.patched/inode.c 2013-09-16 21:31:12.323041668 -0700
@@ -31,6 +31,9 @@
#include <linux/namei.h>
#endif
#include <linux/highmem.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
+#include <linux/dcache.h>
+#endif
#include "compat_cred.h"
#include "compat_fs.h"
@@ -1890,7 +1893,11 @@
#endif
&inode->i_dentry,
d_alias) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
+ int dcount = d_count(dentry);
+#else
int dcount = dentry->d_count;
+#endif
if (dcount) {
LOG(4, ("Found %s %d \n", dentry->d_name.name, dcount));
return HgfsAccessInt(dentry, mask & (MAY_READ | MAY_WRITE | MAY_EXEC));
@@ -1943,10 +1950,12 @@
list_for_each(pos, &inode->i_dentry) {
int dcount;
struct dentry *dentry = list_entry(pos, struct dentry, d_alias);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 38)
- dcount = atomic_read(&dentry->d_count);
-#else
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
+ dcount = d_count(dentry);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)
dcount = dentry->d_count;
+#else
+ dcount = atomic_read(&dentry->d_count);
#endif
if (dcount) {
LOG(4, ("Found %s %d \n", (dentry)->d_name.name, dcount));
7.ファイルの保存
「~/ダウンロード」フォルダーに保存します。ファイル名は「inode.c.patch」にしました。
8.パッチの適用
「patch」コマンドでパッチを適用します。「端末」を起動し、カレントディレクトリーを「~/ダウンロード」に変更します。
cd ~/ダウンロード
次に以下のコマンドを実行して、パッチを適用します。
patch -p1 < inode.c.patch
以下は実行例です。
「patching file inode.c」と表示されれば完了です。
「inode.c」ファイルをテキストエディターで開くと、以下のようにパッチが適用されています。
赤枠は一例です。