新旧のカーネルヘッダやソースを比べてみると、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行付近を以下のように変更する。
書き込み禁止属性が付いているので、":wq!" で保存終了する(viで編集しているなら)。vi vmhgfs-only/vmhgfs.tar2015/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);
どうせ、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が出るだろう。
私の解決策は中途半端なので、急ぎの対応が必要ないなら、それを待つのが良いだろう。
viでファイルを編集するときのファイル名が間違っていた。
返信削除作業後に、まとめ直しているので、このようなミスもある。
久しぶりにVMwareの修正があり、対処方法をすっかり忘れていたので、自分で書いたブログを読んでいて気がついた。
失敗を恐れて書かないよりも、書いておいたほうがいい。