VMware上のUbuntu13.04でvmware-toolsが動かなかったので

タイトル通り vmware-tools が動かなかったのです。というより、

  • カーネルが 3.8 になったので vmware-tools をビルドしようとしたら
  • linux-headers に version.h が無いと怒られ失敗し
  • ln -s でリンクを貼ってビルドし直したんだけど
  • カーネル 2.8 の方法でビルドしようとしやがるので当たり前のように失敗する

というどうしようもない状態に陥っていました。
ちなみに vmware-tools のバージョンは 9.5.0.19712 (build-958366) だったらしい。
多分バージョンによってはビルドできる。

が、いまどき VMware Player で Ubuntu を動かすライトユーザーとしては
いちいち VMware® さんに個人情報を送信して有料版体験版をダウンロードし、
そこから vmware-tools だけを失敬してアップデート…
などという苦行を強いられるのはさすがにもう嫌なので、
思い切って open-vm-tools に乗り換えてみました。

ようするにオープンソース版の vmware-tools らしい。

$ sudo apt-get install open-vm-tools       # 設定ファイルを置き換えるかどうか訊かれる。とりあえず全部置き換えた
$ sudo /etc/init.d/vmware-tools stop       # バッティング予防に既存の vmware-tools を停止
$ sudo /etc/init.d/open-vm-tools restart   # open-vm-tools 再起動

ここまでで特にエラーは無かったのだけれど、
共有フォルダが有効にならないという比較的フェイタルな事態に遭遇。

「これだから…」などという自分勝手な呆れ感を抱きながらグーグリングしていると
http://ubuntuforums.org/showthread.php?t=1596743 というアメリカ語の記事を発見。
どうやら共有できないのではなく、自動でマウントしてくれないらしい。

上記URLに掲載されてる open-vm-tools (シェルスクリプト) をためらいもなく実行すると
Syntax Error と怒って仕事してくれなかった上に、
よくよく見るとオリジナルのスクリプトとあまりにも構造が違っていたので
手動で改造した結果がこちら。

#!/bin/sh

### BEGIN INIT INFO
# Provides:		open-vm-tools
# Required-Start:	$local_fs $remote_fs
# Required-Stop:	$local_fs $remote_fs
# X-Start-Before:
# X-Stop-After:
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Description:		Runs the open-vm-tools services
# Short-Description:	Runs the open-vm-tools services
### END INIT INFO

. /lib/lsb/init-functions

exit_if_not_in_vm () {
	if [ ! -x /usr/bin/vmware-checkvm ] || ! /usr/bin/vmware-checkvm > /dev/null 2>&1
	then
		echo "Not starting as we're not running in a vm."
		exit 0
	fi
}

case "${1}" in
	start)
		# Check if we're running inside VMWare
		exit_if_not_in_vm

		log_daemon_msg "Loading open-vm-tools modules"
		log_progress_msg "vmhgfs"; modprobe vmhgfs
		log_progress_msg "vmxnet"; modprobe vmxnet
# ここに2行追加
		log_daemon_msg "Mounting hgfs"
		mount -t vmhgfs .host:/ /mnt/hgfs

		log_end_msg 0

		log_daemon_msg "Remove pcnet32 module, if vmxnet is loaded"
		# check if vmxnet module is loaded
		loaded="$(lsmod | grep -o vmxnet)"
		if [ "$loaded" = "vmxnet" ]; then
			# Removes pcnet32 module if vmxnet module is loaded
			modprobe -r vmxnet
			log_progress_msg "Removing pcnet32"; modprobe -r pcnet32
			modprobe vmxnet
		fi
		log_end_msg 0

		log_daemon_msg "Starting open-vm daemon" "vmtoolsd"
		/usr/bin/vmtoolsd --background /var/run/vmtoolsd.pid
		log_end_msg 0
		;;

	stop)
		# Check if we're running inside VMWare
		exit_if_not_in_vm
# ここにも2行追加
# ※ vmtoolsd のプロセスをころる前に umount するとエラーを吐くとコメントで情報を頂いたので位置だけ変更
		log_daemon_msg "Unmounting /mnt/hgfs"
		umount /mnt/hgfs

		log_daemon_msg "Stopping open-vm guest daemon" "vmtoolsd"

		if [ -f /var/run/vmtoolsd.pid ]
		then
			kill $(cat /var/run/vmtoolsd.pid)
		fi

		log_end_msg 0

		log_daemon_msg "Removing open-vm-tools modules"
		log_progress_msg "vmhgfs"; modprobe -r vmhgfs
		log_progress_msg "vmxnet"; modprobe -r vmxnet

		log_end_msg 0
		;;

	force-reload|restart)
		${0} stop
		sleep 1
		${0} start
		;;

	*)
		log_success_msg "Usage: ${0} {start|stop|restart|force-reload}"
		exit 1
		;;
esac

実際には mount,umount コマンドをそれぞれ start,stop に追加するだけなんですが、
mount -t vmhgfs .host:/ /mnt/hgfs ってなんだよ覚えられる気がしないよ。
起動時に毎回このコマンドを実行するのかと思うと何かこみ上げてくるものがありますね。

$ sudo /etc/init.d/open-vm-tools start
* Loading open-vm-tools modules                                         [ OK ]
* Mounting hgfs                                                         [ OK ] 
* Remove pcnet32 module, if vmxnet is loaded                            [ OK ] 
* Starting open-vm daemon vmtoolsd                                      [ OK ]
$ ls /mnt/hgfs/
C/ D/ E/ J/

何はともあれ、これで共有フォルダがゲスト側から見えるようになりました。
結論:

  • VMware Player ユーザには open-vm-tools のほうがいい
  • デフォルトで自動マウントするようにして欲しい
  • 作業が中断されて2時間経った