わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

homebrew-caskで古いバージョンのアプリケーションをインストールする

経緯

会社の先輩から「packerでboxを作れるようにしたんだけど他のPCでもちゃんと動くのか検証したいから時間があったら確かめてほしい」とだいぶ前から言われてて「このままじゃ時間を作るのも厳しいからえいやっとやってしまおう」と昨日決意し実行に移したら
"yum install kernel-devel"を実行したら"No package kernel-devel available."が返ってきた件 - わすれっぽいきみえ
virtual box4.3.10でdebian系unix仮想マシンの共有フォルダがマウント出来ないバグを踏んだ - わすれっぽいきみえ
に昔書いたような共有フォルダ周りでまたしても困った状態に陥った。

そのことを先輩に話したら「うーん、こういうことがあるからvirtual boxのバージョン俺はあげないまんまなんだよね。とはいえ弱ったなー。分かった。ちょっとpackerの設定を見直すわー」と言ってた。新しいbox楽しみにしとく。

今の私の環境では今月頭くらいに
homebrew-caskを使ってみた - わすれっぽいきみえ
という記事を書いたようにbrew caskを使ってvagrantもvirtual boxも管理するようにしていたので、デフォルトだと

  • vagrant 1.6.3
  • virtual box 4.3.12-93733

がインストールされる。
最新のものならbetaでもない限り動くだろうとこれまで思い込んでいたけれど、もうあんまりバグを踏みたくないので安易にアップデートするのではなく安定して動作するバージョンのものを入れたいニーズが出てきた。

というわけでbrew caskを使って古いバージョンのアプリケーションを入れる方法を探した。

方法

brew-caskのUSAGE.mdのAdditional Tapsの中にcasktoom/versionsという古いバージョンやbeta版、nightly版のアプリケーションをインストールできるCasksを管理してるtapがあって、それを使ったらvirtual boxとかは古いバージョンのものをインストール出来る。

ためしにvirtual box 4.2.24を入れるなら

$ brew tap caskroom/versions
$ brew cask install virtualbox422492790

とすればよい。
いろんなサイト巡ってたらbrew-caskを使って古いバージョンのアプリケーションをインストールするには「自分でCaskファイルを作らないといけない」みたいな記事を見かけるけど、caskroom/versionsはその手間を省けるので便利だと思う。実際のところcaskroom/versionsの中身もたくさんのCaskファイルのリポジトリでしかないし。足りないCaskがあったら自分で作るのもいいけど、ちょっと探すだけでまあまああるので、そっちをあたってみた方がいい気がする。ないから作ったという人はcaskroom/versionsにプルリク投げたらいいんじゃないかな。

番外編: vagrant haltする前にvirtual boxをアンインストールしちゃった、そこのおっちょこちょいなあなたに

つまり私だ。
まあ慌てるな。やり方はある。

brew caskでvirtual boxをアンインストールするときにvagrantのboxが立ち上がっててもエラーなしで消せちゃう。それを知らずにvirtual boxを再インストールしようとすると次のようなエラーを吐く。

==> Downloading http://download.virtualbox.org/virtualbox/4.3.6/VirtualBox-4.3.6-91406-OSX.dmg
######################################################################## 100.0%
==> Running installer for virtualbox43691406; your password may be necessary.
==> installer: Error - The installer has detected running Virtual Machines. Please shutdown all running VirtualBox machines and then restart the installation.
:beer: virtualbox43691406 installed to '/opt/homebrew-cask/Caskroom/virtualbox43691406/4.3.6-91406' (4 files, 114M)

そっかーvagrant落とすのすっかり忘れてたわーと思ってvagrant haltを実行しても

$ vagrant halt
The provider 'virtualbox' that was requested to back the machine
'web_server' is reporting that it isn't usable on this system. The
reason is shown below:

Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed.
Vagrant uses the `VBoxManage` binary that ships with VirtualBox, and requires
this to be available on the PATH. If VirtualBox is installed, please find the
`VBoxManage` binary and add it to the PATH environmental variable.

となってしまう。
vagrantはそれ自体が仮想マシン停止を出来る訳ではなく、消したvirtual box経由でマシン停止を行おうとするので、もう落とせなくなっている。
先に書いたvirtual box 4.3.6のインストールログにおいて、バージョンは無視していただいてPlease shutdown all running VirtualBox machines and then restart the installation.のところに注目するとvirtual boxは既に存在しないはずなのにマシンは起動中であるという意味なので、こいつはプロセスが死んでないままなんだなとにらんで一覧表示してみたら案の定生きてやがった。

$ ps -A | grep Virtual
 1065 ??         0:18.24 /Applications/VirtualBox.app/Contents/MacOS/VBoxXPCOMIPCD
 1067 ??         2:17.83 /Applications/VirtualBox.app/Contents/MacOS/VBoxSVC --auto-shutdown
 1109 ??        18:42.42 /Applications/VirtualBox.app/Contents/MacOS/VBoxHeadless --comment centos65_web_server_1399017380175_27774 --startvm f947a6ea-cef2-4e2b-96d1-cc82b3bd1b17 --vrde config
 1112 ??         0:01.57 /Applications/VirtualBox.app/Contents/MacOS/VBoxNetDHCP --ip-address 192.168.56.100 --lower-ip 192.168.56.101 --mac-address 08:00:27:45:D4:A2 --netmask 255.255.255.0 --network HostInterfaceNetworking-vboxnet0 --trunk-name vboxnet0 --trunk-type netadp --upper-ip 192.168.56.254
30877 ttys001    0:00.00 grep Virtual

というわけで、上記プロセスをひとつずつ丁寧に葬り、brew cask install virtualbox43691406を実行すると

Error: Cask for virtualbox43691406 is already installed. Add the "--force" option to force re-install.

あ、面倒くさい。
こういう時は先のインストールログにもあった/opt/homebrew-cask/Caskroom/virtualbox43691406/4.3.6-91406を直接開くと中にVirtualBox-4.3.6-91406-OSX.dmgの中身を展開したものがおかれているので、そこのVirtualBox.pkgをダブルクリックしてインストールを行う。

分かったことは

  • brew caskはvirtual boxのインストールについてはアプリケーションとして正しくインストールされたかどうかは判定しておらず、/opt/homebrew-cask/Caskroom/に展開したからおkとしている。
  • vagrantのboxが起動してようがおかまいなしにbrew cask uninstall virtualboxは走る。
  • vagrantのboxが起動したままvirtural boxをアンインストールするとvirtual boxのプロセスが残り続けて恐ろしいことになる。

みんなも気をつけよう!!