2015年2月25日水曜日

Ubuntu 12.04 の linux kernel 3.13.0-46 と VMware

今日、Ubuntuの更新をしたら、VMware Tools の vmhgfs.ko がコンパイルできなくなった。

新旧のカーネルヘッダやソースを比べてみると、struct dentry の d_alias が共用体になったため、コンパイルが通らなくなったことがわかった。
エラーが起きた場所を見ると、とても一般的な部分なので、他のファイルシステムのドライバ内にも似たようなコードがあるだろうと考えた。
検索すると、いくつも見つかった。その変更を真似して、同じようにvmhgfsのソースを直すと、コンパイルができるようになった。

具体的な方法は、以下の通り。

まずは普通にVMwareToolsを展開する。
tar -zxvf /media/VMware\ Tools/VMwareTools-9.6.4-2441333.tar.gz

展開されて出来たサブディレクトリvmware-tools-distribへ移動して、vmhgfsのソースコードを一時的に展開する。
cd vmware-tools-distrib
mkdir xxx    (vmhgfs.tarを一時的に展開するディレクトリを作る)
cd xxx
tar -xvf ../lib/modules/source/vmhgfs.tar

エディタで、vmhgfs-only/inode.cの1920行付近を以下のように変更する。
vi vmhgfs-only/vmhgfs.tar 2015/05/08 修正
vi vmhgfs-only/inode.c

1914       /* Find a dentry with valid d_count. Refer bug 587879. */
1915       hlist_for_each_entry(dentry,
1916 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
1917                            p,
1918 #endif
1919                            &inode->i_dentry,
1920 //                         d_alias) {                      REP. Shin 2015/02/25
1921                            d_u.d_alias) {
1922          int dcount = hgfs_d_count(dentry);
1923          if (dcount) {
1924             LOG(4, ("Found %s %d \n", dentry->d_name.name, dcount));
1925             return HgfsAccessInt(dentry, mask & (MAY_READ | MAY_WRITE | MAY_EXEC));
1926          }
1927       }
1928       ASSERT(FALSE);
書き込み禁止属性が付いているので、":wq!" で保存終了する(viで編集しているなら)。

どうせ、VMwareToolsのISOイメージファイルは残っている。
なので、細かなbackupを取らずに、元のやつに書き戻す。
tar -cvf ../lib/modules/source/vmhgfs.tar vmhgfs-only/
cd ..    (一時的に作ったディレクトリ”xxx”から出る)

VMware Toolsのインストール作業を継続する。
sudo ./vmware-install.pl

これで治るのだが、問題がある。
実はこのいい加減な改造をすると、逆に前のカーネルではコンパイルが通らなくなる。
バージョン番号というかリビジョン番号というかを、プリプロセッサマクロで細かく見極めることができるのなら、両対応にすることもできるだろうけど、どうやればいいのかわからない(3.13.0までは同じであることに注意)。
自宅の母艦でしかVMwareを使ってないので、個人的には専用改造でも十分だ。
そのため、このやや乱暴な改造にした。

たぶん近い将来VMwareからVMwareToolsの更新か、Workaroundが出るだろう。
私の解決策は中途半端なので、急ぎの対応が必要ないなら、それを待つのが良いだろう。