Hatena::ブログ(Diary)

=== SANDmark 19106 === beginning stress test このページをアンテナに追加 RSSフィード

2013年06月28日

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 再起動

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

「これだから…」などという自分勝手な呆れ感を抱きながらグーグリングしていると
[ubuntu] Auto mounting shared folders with open-vm-tools というアメリカ語の記事を発見。
どうやら共有できないのではなく、自動でマウントしてくれないらしい。

上記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時間経った

2012年11月17日

Linux版ChromeにSmoothGesturesをインストール(ドラッグ&ドロップ)


結論から言うと、ChromeバグのせいでLinux環境で使えるマウスジェスチャ拡張がほぼ無いのです。
どうも右クリックイベントをうまく取れないらしく、
ジェスチャーと同時に右クリックメニューが開いてしまう。

唯一まともに動作していたのが Smooth Gestures だったのですが、
これもChromeウェブストアから「マルウェア/スパイウェア」認定されて消滅。*1

ではLinux環境ではマウスジェスチャは絶望的なのか、と思って調べたところ、
有志の方が以下のサイトで『情報送信しない版』と『Linux用パッチ』を公開されてました。

しかし最近のChromeさんはとってもセキュリティに敏感で
ウェブストア以外からは拡張機能インストールさせない
という制限を設けているため、そのままインストールというわけにはいきませんでした。

曰く「どうしてもインストールしたいなら『ツール→拡張機能』タブにファイルをドロップしろ」
とのことでしたが、すみませんChromeさんちょっといいですか、
Nautilusからドラッグしても反応してくれませんよね?

Webページにドラッグするとしっかり「インストールできません」と言うくせに
なぜ拡張機能画面ではドラッグ&ドロップイベントを認識してくれないのですか。
セキュリティ面でちょっと厳しすぎやしませんか(#^ω^)

というわけで解決策は Sidan kunde inte hittas | Framkalla dina fotominnen になりました。
幸い Ubuntu 12.10 では apt-get 一発で行けたのでご参考までに。

シェル:

$ sudo apt-get install dragbox
$ dragbox smooth-gestures-0.15.4.crx
$ dragbox smooth-gestures-plugin-0.8.crx

これで dragbox のウィンドウが現れるので、
ここからChromeの『拡張機能タブ』にドロップしてやると、
今度こそようやくインストールしてくれました。

smooth-gestures-0.15.4.crx 単体でも動作はするのですが、
右クリックメニューを出したいときに連打しなければならないなど
操作する上で地味にフラストレーションが溜まるので、
後者の smooth-gestures-plugin-0.8.crx を入れてやることで
Windows環境と同じ操作感を得ることができます。

Googleさん、早くバグ直して欲しいです……。
ついでに、GoogleIME(mozc)の辞書もLinuxで使えるようにしてください……。
ではまた!

*1:実際、何らかの情報を特定のサイトへ送信していたそうです。

2012年04月14日

MBRを上書きしてしまったときにgrubを修復する

久々のエントリ。
今回、UbuntuインストールされているマシンにWindows7をインストールして
その際MBRが上書きされてしまったんで、修復方法をメモっておきます。

パーティション構成:

  • /dev/sda1: NTFS (Windows 7)
  • /dev/sda2: ext4 (Ubuntu 11.10)
  • /dev/sda3: NTFS (予備)
  • /dev/sda4: ext4 (予備)

使用したのは Ubuntu 11.10 のインストールCD。
CD起動時のメニューで [F6] を押して(押さなくてもいいかも)
ブートオプションを表示し、

file=/cdrom/preseed/ubuntu.seed boot=casper initrd=/casper/initrd.gz

というようになっているところの boot=casper
root=/dev/sda2 (Ubuntuがインストールされているパーティション)に変更します。

で、「インストールされているUbuntuを起動」とかした気がする。
するとハードディスク(/dev/sda2)のUbuntuが起動するので、
rootユーザになって(あるいはsudoで)grubを再インストールしてやります。

# update-grub
# grub-install

おしまい。
update-grub が自動的に他のOSを見つけてgrub.cfgをいじくってくれるので、
Windows7も自動的に認識され、ブートされるようになりました。

もちろん、MBRを書き換えるための grub-install も忘れずに。
これでもう何も恐くないですね。

2012年03月31日

sudoersの書き換えに失敗してsyntax errorとか言われた→直した

Ubuntu(11.10)では /etc/sudoers というファイルがあって、*1
「新しく定義を追加する場合は /etc/sudoers.d/ 以下に書くことをオススメするよ」
的なことが書いてあります。つまり sudo するたびにパスワードを聞かれるのが鬱陶しいので
NOPASSWD 属性を付けようとしたんですが、あまりにもくだらない失敗をやらかしたのでメモ。

sudoers の書式は "man sudoers" すればとても詳しく出てくるんですが、
#(シャープ記号)で始まる行はコメントなんですね。
んで、Ubuntuの場合 /etc/sudoers の末尾に

#includedir /etc/sudoers.d

とか書いてある。
てっきり「これをコメントアウトすれば /etc/sudoers.d の中身が有効になるのかな」と思って
行頭の # を削除してドヤ顔で sudo してみたらエラー吐かれました。
結論から言うとこれコメントじゃなかったんですね。

#includedir それ自体がディレクティブになっているようで、
一旦書き換えて保存してしまうと、sudo がsyntax errorを吐いて使えなくなります。*2

  1. sudo が使えないのは困るのでsudoersを直したい
  2. そのためには root 権限が必要
  3. sudo vi /etc/sudoers → エラー
  4. sudo su - → エラー
  5. root のパスワードは隠蔽されているから su - を直接叩くわけにもいかない
  6. 最初に戻る

結局recovery modeでブートし、読み書きモードでファイルシステムをマウントし、
rootシェルから修正を行う羽目になりました。
目的はユーザがパスワード無しに sudo できるようにすることだったので、
まず /etc/sudoers の includedir を #includedir に直し、
/etc/sudoers.d/username に

username ALL=(ALL) NOPASSWD:ALL

と書き、

$ chmod 0440 /etc/sudoers.d/username

としてノーマルブート→解決となりました。*3

*1:このファイル自体はUbuntu特有ではないんだけど。

*2:具体的なメッセージは忘れた。

*3:余談ですが、sudoersではユーザやグループはもちろん、コマンド単位でもパスワードの問い合わせの有無を記述できるみたいです。