CLOVER🍀

That was when it all began.

vagrant-libvirtを使って仮想マシンを起動した時に、NFSが使えない場合にエラーになるのを回避する

これは、なにをしたくて書いたもの?

Vagrantで仮想マシンのプロバイダーにlibvirtを使っている時、NFSに関するエラーが出て仮想マシンが起動しなかったという事象に遭遇し、
さてどうしましょうと調べてみた話。

その内容を書こうかな、と。

環境

Ubuntu Linux 18.04 LTSで、Vagrantは2.2.5。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:    18.04
Codename:   bionic


$ vagrant -v
Vagrant 2.2.5

Vagrantを使える環境は2つあって、ひとつは仮想マシンのプロバイダーがVirtualBox。

$ VBoxManage -v
6.0.12r133076

もうひとつはlibvirt。

$ libvirtd -V
libvirtd (libvirt) 4.0.0

$ kvm --version
QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.19)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers

Debianの仮想マシンを起動する

ちょっとDebianの仮想マシンに用があって、以下のBox(プロバイダーとしては、VirtualBoxとlibvirt用のものが存在)を使って

Vagrant box debian/buster64 - Vagrant Cloud

$ vagrant init debian/buster64

起動。

$ vagrant up

### プロバイダーがlibvirtの場合は
$ vagrant up --provider=libvirt

VirtualBoxの方はうまくいくのですが、libvirtの方はNFSが使えないと言われてエラーになり、仮想マシンが起動しません。

It appears your machine doesn't support NFS, or there is not an
adapter to enable NFS on this machine for Vagrant. Please verify
that `nfsd` is installed on your machine, and try again. If you're
on Windows, NFS isn't supported. If the problem persists, please
contact Vagrant support.

なにがエラーになっているかというと、Synced Folderです。ホスト側でNFSが使えないのが原因です。

DebianのBoxのVagrantfileを見ると、確かにSynced FolderにNFSを使うようになっています。

  config.vm.synced_folder ".", "/vagrant", type: "nfs", nfs_version: "4", nfs_udp: false

Synced Folderの設定を変える

Synced Folderの実現方法には、いろいろあるみたいですね。

Synced Folders - Vagrant by HashiCorp

エラーメッセージを調べると、みんな「NFSをインストールしよう」となっているのですが…そりゃあそうですよね。

Vagrant: synced_folder を nfs マウントする | deadwood

linux - When “vagrant up” it says “It appears your machine doesn't support NFS” (Debian jessie) - Stack Overflow

でも、このためだけにわざわざNFSサーバーを導入するのは、それはそれで嫌だなぁと…。

で、vagrant-libvirtプラグインのSynced Folderの設定に、なにか載ってたなぁと思って調べてみます。

Synced Folders

以下のどちらかを設定すると、とりあえず起動するようになります。

  config.vm.synced_folder './', '/vagrant', type: '9p', disabled: false, accessmode: "squash", owner: "1000"

# または

  config.vm.synced_folder './', '/vagrant', type: '9p', disabled: false, accessmode: "mapped", mount: false

後者だと、マウントがなくなりますが。

accessmodeの意味は、libvirtの設定になるので、こちらを参照。

libvirt Domain XML Format / Filesystems

Starting the Guest using libvirt

9pについては、こちら。

9P - Wikipedia

Virtfs (Plan 9) vs NFS as tool for share folder for virtual machine - Unix & Linux Stack Exchange

たまに、以下の表示で止まりますが、再度仮想マシンを起動し直すと良いかも…。

==> default: Waiting for domain to get an IP address...

他のBox(vagrant-libvirt)を使った時の起動ログを見ていると、Rsyncで実現したりしているものもあります。

==> default: Installing rsync to the VM...
==> default: Rsyncing folder: /path/to/ => /vagrant

Synced Folderについては、VirtualBoxをプロバイダーにした方がお手軽かもしれませんね。
※パフォーマンスはNFSの方が有利らしいですが

Vagrant + VirtualBox で nfs を使って、synced_folder を速くする - Shin x blog

Vagrantのsynced_folderのtypeを比べてみた | 東北ギーク

もしくは、割り切ってネットワークの設定でIPアドレスを固定してアクセスしたりしましょう。