2013年7月23日火曜日

VMWare Player上のUbuntu13.04でVMWare Toolsのhgfsのコンパイルがコケる件


VMWare Player上のUbuntu13.04でVMWare Toolsをインストールしようとすると、ホストOSとゲストOSでディレクトリを共有するためのファイルシステムhgfs(Host-Guest Filesystem)のコンパイルに失敗します。


The VMware Host-Guest Filesystem allows for shared folders between the host OS
and the guest OS in a Fusion or Workstation virtual environment.  Do you wish
to enable this feature? [yes]

Using 2.6.x kernel build system.
make: ディレクトリ `/tmp/modconfig-fMqXb3/vmci-only' に入ります
/usr/bin/make -C /lib/modules/3.8.0-23-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
      MODULEBUILDDIR= modules
make[1]: ディレクトリ `/usr/src/linux-headers-3.8.0-23-generic' に入ります
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/linux/driver.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/linux/vmciKernelIf.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciContext.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciDatagram.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciDoorbell.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciDriver.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciEvent.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciHashtable.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciQPair.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciQueuePair.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciResource.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/common/vmciRoute.o
  CC [M]  /tmp/modconfig-fMqXb3/vmci-only/driverLog.o
  LD [M]  /tmp/modconfig-fMqXb3/vmci-only/vmci.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /tmp/modconfig-fMqXb3/vmci-only/vmci.mod.o
  LD [M]  /tmp/modconfig-fMqXb3/vmci-only/vmci.ko
make[1]: ディレクトリ `/usr/src/linux-headers-3.8.0-23-generic' から出ます
/usr/bin/make -C $PWD SRCROOT=$PWD/. \
      MODULEBUILDDIR= postbuild
make[1]: ディレクトリ `/tmp/modconfig-fMqXb3/vmci-only' に入ります
make[1]: `postbuild' は更新済みです
make[1]: ディレクトリ `/tmp/modconfig-fMqXb3/vmci-only' から出ます
cp -f vmci.ko ./../vmci.o
make: ディレクトリ `/tmp/modconfig-fMqXb3/vmci-only' から出ます
Using 2.6.x kernel build system.
make: ディレクトリ `/tmp/modconfig-fMqXb3/vmhgfs-only' に入ります
/usr/bin/make -C /lib/modules/3.8.0-23-generic/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
      MODULEBUILDDIR= modules
make[1]: ディレクトリ `/usr/src/linux-headers-3.8.0-23-generic' に入ります
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/backdoor.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/backdoorGcc32.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/bdhandler.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/cpName.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/cpNameLinux.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/cpNameLite.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/dentry.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/dir.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/file.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/filesystem.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/fsutil.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/hgfsBd.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/hgfsEscape.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/hgfsUtil.o
  CC [M]  /tmp/modconfig-fMqXb3/vmhgfs-only/inode.o
/tmp/modconfig-fMqXb3/vmhgfs-only/inode.c: 関数 ‘HgfsTruncatePages’ 内:
/tmp/modconfig-fMqXb3/vmhgfs-only/inode.c:888:4: エラー: 関数 ‘vmtruncate’ の暗黙的な宣言です [-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors
make[2]: *** [/tmp/modconfig-fMqXb3/vmhgfs-only/inode.o] エラー 1
make[1]: *** [_module_/tmp/modconfig-fMqXb3/vmhgfs-only] エラー 2
make[1]: ディレクトリ `/usr/src/linux-headers-3.8.0-23-generic' から出ます
make: *** [vmhgfs.ko] エラー 2
make: ディレクトリ `/tmp/modconfig-fMqXb3/vmhgfs-only' から出ます

The filesystem driver (vmhgfs module) is used only for the shared folder
feature. The rest of the software provided by VMware Tools is designed to work
independently of this feature.

If you wish to have the shared folders feature, you can install the driver by
running vmware-config-tools.pl again after making sure that gcc, binutils, make
and the kernel sources for your running kernel are installed on your machine.
These packages are available on your distribution's installation CD.


これネットで検索するとエラーの出た該当行、vmware-tools-distrib/lib/modules/source/vmhgfs.tar内のvmhgfs-only/inode.cの888行目


result = compat_vmtruncate(inode, newSize);





result = 0;


に変えろっていうのが大多数なんですが、ホントにtruncateとかしなくていいのか疑問だったので、調べて見ました。

まずこのcompat_vmtruncateは、vmhgfs-only/shared/compat_mm.hでdefineされていました。


/*
 * In 2.4.10, vmtruncate was changed from returning void to returning int.
 */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 10)
#define compat_vmtruncate(inode, size)                                        \
({                                                                            \
   int result = 0;                                                            \
   vmtruncate(inode, size);                                                   \
   result;                                                                    \
})
#else
#define compat_vmtruncate(inode, size) vmtruncate(inode, size)
#endif


カーネルバージョン2.4.10より前ならvoid型をint型に変えて、それ以降ならvmtruncateに書き換えるだけ。で、Ubuntu13.04のカーネルバージョンは3.8.0なんですが、カーネルソースダウンロードしてきて探してもありません。Ubuntu12.10の3.5.0で探してみたらありました。mm/truncate.cに。


/**
 * vmtruncate - unmap mappings "freed" by truncate() syscall
 * @inode: inode of the file used
 * @newsize: file offset to start truncating
 *
 * This function is deprecated and truncate_setsize or truncate_pagecache
 * should be used instead, together with filesystem specific block truncation.
 */
int vmtruncate(struct inode *inode, loff_t newsize)
{
        int error;

        error = inode_newsize_ok(inode, newsize);
        if (error)
                return error;

        truncate_setsize(inode, newsize);
        if (inode->i_op->truncate)
                inode->i_op->truncate(inode);
        return 0;
}


コメントの2ブロック目、ようはもうvmtruncate使うな、ってことのようです。
ちなみにinode->i_op->truncateがあれば呼び出すようになっていますが、3.8.0ではこのメンバはありません。

ということで私なりにですが、バージョン3.8.0より前ならそのまま、それ以降ならcompat_vmtruncateを上記のコードに近い形で置き換える、という方法を取りました。

以下その手順です。


# cd vmware-tools-distrib/lib/modules/source
# tar xf vmhgfs.tar
# vi vmhgfs-only/shared/compat_mm.h


103行目の


#define compat_vmtruncate(inode, size) vmtruncate(inode, size)


を以下のように変更。


#  if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
#     define compat_vmtruncate(inode, size) vmtruncate(inode, size)
#  else
#     define compat_vmtruncate(inode, size)                                   \
({                                                                            \
   int error = inode_newsize_ok(inode, size);                                 \
   if (!error)                                                                \
      truncate_setsize(inode, size);                                          \
   error;                                                                     \
})
#  endif


で、


# tar cf vmhgfs.tar vmhgfs-only
# cd ../../../
# ./vmware-install.pl


なんかWarningでましたが一応コンパイルは通って動くようになりました。


 CC [M]  /tmp/modconfig-z3oAcX/vmhgfs-only/inode.o
/tmp/modconfig-z3oAcX/vmhgfs-only/inode.c: 関数 ‘HgfsPermission’ 内:
/tmp/modconfig-z3oAcX/vmhgfs-only/inode.c:1755:8: 警告: ‘dentry’ はこの関数内初期化されずに使用されるかもしれません [-Wmaybe-uninitialized]
/tmp/modconfig-z3oAcX/vmhgfs-only/inode.c:1813:22: 備考: ‘dentry’ はここで定義されています


当然ですが、ここで紹介した方法によって何が起きても責任は負えませんので。

2013年7月11日木曜日

メモ。iPadとかでdnsだます方法。

Windows7で管理者権限でコマンドプロンプト起動。
> netsh wlan set hostednetwork mode=allow
> netsh wlan set hostednetwork ssid=hogehogeap
> netsh wlan set hostednetwork key=nyarlathotep keyusage=persistent
> netsh wlan start hostednetwork
確認は
> netsh wlan show hostednetwork
停止は
> netsh wlan stop hostednetwork

ローカルエリアネットワークでインターネット接続の共有

Ubuntuで/etc/hostsにだましたいURL入れる。
# dnsmasq

Windows7でDNSを上のUbuntuに変更。
iPadでhogehogeapに接続。

2013年7月6日土曜日

Ubuntu12.10にSELinux

メモ。
# apt-get install selinux
# apt-get install selinux-policy-src
# apt-get install selinux-policy-dev
リブート。