2015-01-09

Ubuntu で Vagrant 最新版を使って KVM を起動する

Ubuntu Desktop 14.04 Trusty 64bit で Docker を試していて、Docker を Vagrant 経由で使ったらどうなるかなとふと思ったのだが、Vagrant の Docker プロバイダーは Ubuntu 14.04 で提供されているバージョンの Vagrant では提供されない。そこで最新版の Vagrant をインストールして(Docker を試す前に)KVM 仮想マシンを起動してみようと思ったらハマりどころがたくさんあった、という話。

Vagrant 最新版のインストール

公式サイトからダウンロードしてきてインストールする。依存する Ruby などは自分で抱え込んでいるようなので、事前に準備することは何もない。

$ cd /tmp
$ curl -LO https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.deb
$ sudo dpkg -i vagrant_1.7.2_x86_64.deb
$ echo ‘PATH=/opt/vagrant/bin:$PATH' >> .bashrc

KVM のインストール

以前の記事(Septième Sens: UbuntuでKVM仮想マシンを作成する)を参考にして

$ sudo aptitude install kvm virtinst

のようにインストールして進めていると何かがおかしい。KVM がインストールされていないようだ… 上のコマンドを実行したときのメッセージをよくみると、

  "kvm" is a virtual package provided by:
    qemu-kvm:i386 qemu-kvm
  You must choose one to install.

と表示されるだけでインストールされずにスルーされていたことが判明。いろいろ調べた結果、今回の Vagrant 経由で試す場合は以下でよいことがわかった。

$ sudo aptitude install qemu-system-x86 libvirt-bin

ちなみに

$ sudo aptitude install kvm virtinst

での(失敗した)インストールの後で qemu-system-x86 をインストールした場合には libvirt-bin を再起動する必要がある点に注意。これをしないと、libvirtd が KVM を見つけられなくてよくわからないエラーが出る羽目になる。

なお、aptitude でなく apt-get install kvm でインストールした場合には自動で適切なものが選択されるようなので問題は発生しないものと思われる。

vagrant-kvm のインストール

この時点で vagrant-kvm をインストールすると失敗する。

$ vagrant plugin install vagrant-kvm
  ...
  An error occurred while installing ruby-libvirt (0.5.2), and Bundler cannot continue.
  Make sure that `gem install ruby-libvirt -v '0.5.2'` succeeds before bundling.
  ...

この記事を書いた時点の vagrant-kvm プラグインは ruby-libvirt 0.5.2 を要求している。しかし Ubuntu 14.04 の ruby-libvirt は 0.5.1 である。したがって最新版を gem でインストールする必要がある。

$ sudo apt-get install ruby-dev libvirt-dev
$ gem install --user-install ruby-libvirt
$ vagrant plugin install vagrant-kvm

vagrant-mutate のインストール

vagrant のイメージを変換するプラグインが必要である。

$ vagrant plugin install vagrant-mutate

ところで、vagrant install で以下のような非常に奇妙なエラーが出ることがある。

  Net::HTTPNotFound: No gems found matching "vagrant-vmware-fusion" "2.5.0" nil

これは既知のバグ(例えばココを見よ)であるが修正されていないようだ。対処法はもう一度 install を実行すること。たいていの場合うまくいく。

Vagrant 用イメージのダウンロード

ここで Vagrant の Getting Started を参考にしてイメージをダウンロードするとハマる。

$ vagrant box add hashicorp/precise64
$ vagrant box list
  hashicorp/precise64 (virtualbox, 1.1.0)
$ vagrant mutate hashicorp/precise64 kvm
  Vagrant-mutate can not download from Vagrant Cloud for you.

これは vagrant-mutate のバグで、比較的最近 Vagrant に導入された「/ を含む名前」の扱いがうまくいっていないためである(→ Support boxes with slash in name · Issue #52 · sciurus/vagrant-mutate)。

そこで URL を直接指定してダウンロードする必要があるが、前出の hashicorp/precise64 のイメージの URL を調べて、それをダウンロードしよう。

$ vagrant box add precise64 https://atlas.hashicorp.com/hashicorp/boxes/precise64/versions/1.1.0/providers/virtualbox.box
$ vagrant mutate precise64 kvm

Vagrant から KVM を起動

先程変換したイメージを元に KVM を起動する。

$ mkdir /tmp/vag
$ cd /tmp/vag
$ vagrant init precise64
$ vagrant up --provider=kvm
  ...
  /home/kimura/.vagrant.d/boxes/test/0/kvm/box-disk1.img': Permission denied (Libvirt::Error)
  ...

再び謎のエラーが発生してしまった。これはカーネルの AppArmor 関連のバグだそうだ(→ https://github.com/adrahon/vagrant-kvm#ubuntu)。回避するには以下を実行する。

$ sudo apt-get install apparmor-utils
$ sudo aa-complain /usr/lib/libvirt/virt-aa-helper

これでうまくいくはず。

$ vagrant up --provider=kvm
$ vagrant ssh

vagrant-libvirt との衝突

vagrant-kvm と同様の機能を持つプラグインに vagrant-libvirt がある。この2つのプラグインを同時にインストールすると衝突して非常に謎なエラーが発生してハマることになるので注意。

$ vagrant plugin install vagrant-libvirt
$ vagrant up --provider=kvm
  ...
  /home/kimura/.vagrant.d/gems/gems/vagrant-libvirt-0.0.24/lib/vagrant-libvirt/cap/mount_p9.rb:9:in `mount_p9_shared_folder': wrong number of arguments (3 for 2) (ArgumentError)
  ...

vagrant-kvm を呼び出したはずなのになぜか vagrant-libvirt のコードで例外が発生してしまっている!vagrant-kvm のサイトでは vagrant-libvirt との衝突は修正されたと書いてあったが、私の所では残念ながら両立していない。

まとめ

$ cd /tmp
$ curl -LO https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.deb
$ sudo dpkg -i vagrant_1.7.2_x86_64.deb
$ echo ‘PATH=/opt/vagrant/bin:$PATH' >> .bashrc

Bash 終了後、再開。

$ sudo apt-get install qemu-system-x86 libvirt-bin
$ sudo apt-get install ruby-dev libvirt-dev
$ gem install --user-install ruby-libvirt
$ vagrant plugin install vagrant-kvm
$ vagrant plugin install vagrant-mutate
$ sudo apt-get install apparmor-utils
$ sudo aa-complain /usr/lib/libvirt/virt-aa-helper
$ vagrant box add precise64 https://atlas.hashicorp.com/hashicorp/boxes/precise64/versions/1.1.0/providers/virtualbox.box
$ vagrant mutate precise64 kvm
$ mkdir /tmp/vag
$ cd /tmp/vag
$ vagrant init precise64
$ vagrant up --provider=kvm
$ vagrant ssh

2014-12-04

Vim でコメントの継続をやめるには

Vim: can I disable continuation of comments to the next line? - Super User」に出ていた質問。

'formatoptions' を変更する(:set formatoptions-=cro などとする)とよいとの回答だが、.vimrc にこれを設定してもうまくいかない。

これは Vim が特定の syntax (c, python, ruby ...) を検出したときに読み込む .vim ファイルで 'formatoptions' を変更しているからである。

例えば ftplugin/c.vim では setlocal fo-=t fo+=croql (fo は formatoptions の省略形)となっている。よって常に formatoptions-=cro としたければ ~/.vim/after/ftplugin/c.vim を作成して、その中で setlocal formatoptions-=cro とする必要がある。

2012-07-24

Ubuntu で Ruby や Perl をサポートする Vim をインストールする

Vim で複数のファイルを読み込んでいるときに、別のファイル(バッファ)へと切り替えるために BufExplorer というプラグインを利用していたのだが、ここのところ挙動不審で、起動すると最下行に「ESCAPE」などと赤背景の反転文字で表示されて Enter キーの入力を強制されるようなことが起こるようになっていた。

そこで何か代わりになるものはないかと探していたところ、「Command-T がすばらしい - hate.hate.hateda」という記事を見つけた。Command-T は TextMate の Command-T ショートカットで起動されるファイルブラウザを模倣した  Vim プラグインで、カレントディレクトリ以下のファイルを表示してキーの入力により簡単に絞り込んで目的のファイルを読み込めるようにするものである。このプラグインにはバッファ切り替えを同様のインタフェースで行う機能も付いているので好都合だ。

ただしこのプラグインは動作するのに Ruby のサポートをオンにしてコンパイルした Vim を要求する。ところが Ubuntu (Debian) の vim パッケージで提供されているものはこのサポートがオンになっていない。自分で Vim をコンパイルし直すしかないかな、と思っていると、vim-gnome パッケージが提供している Vim は Ruby サポートをオンにしてコンパイルされていることを偶然知った(Ruby の他にも Perl, Python, Lua, Tcl のサポートがオンになっている)。まず vim-gnome をインストールする。

$ sudo apt-get install vim-gnome

これによりコマンドライン版の vim は vim-gnome が提供するものを指すようになっている。必要なら以下のようにして vim パッケージが提供しているものを指すように戻すことができる。

$ sudo update-alternatives --config vim

また、以下のようにして editor を差し替えておいた方がいいだろう。

$ sudo update-alternatives --config editor

(追記) vim-nox も同様に LL 言語サポートオンの vim を提供する。nox は no X (Window) という意味のようで、何か別のパッケージ用にコンパイルされたものという意味ではない。サーバのように X がインストールされていないなら vim-nox を、デスクトップ版なら vim-gnome または vim-gtk をインストールするのがよいだろう。