Docker全盛だけど、未だにVagrant(VirtualBox)を使う機会があってですね。
Vagrantの起動のタイミングでローカルの指定ディレクトリをマウントする機能(synced_folder)をVagrantfileに記述したら、エラーが表示されたのでその現象を解決した話です。
今回の実行環境
- macOS Catalina 10.15.7
- Vagrant 2.2.14
- VirtualBox 6.1.18
- ノートン360 8.6.4
config.vm.synced_folder の使い方
VagrantのドキュメントにSynced FoldersのBasic Usageのページがあるので、このページを参考に今回は以下のように設定してみました。
Vagranfileを置いているカレントディレクトリをVagarantのBox内の「/vagrant」に割り当てるという設定にしています。
config.vm.synced_folder ".", "/vagrant", :nfs => true
発生したエラーの内容
上記の設定を行ってVagrantを起動すると以下のエラーが発生しました。
% vagrant up
Bringing machine 'default' up with 'virtualbox' provider..
・
・
・
==> default: Mounting NFS shared folders...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
mount -o vers=3,udp 192.168.33.1:/System/Volumes/Data/Users/akase244/synced_test/vagrant
Stdout from the command:
Stderr from the command:
mount.nfs: Connection timed out
エラー内容の最後の1行に「mount.nfs: Connection timed out」という記載があり、この情報を頼りにググってみると同じエラーが発生したという記事がいくつか見つかりましたが、解決までには至りませんでした。
ノートン360の存在を思い出す
色々と試行錯誤したあとに、このMacは業務用PCなので「ノートン360」をインストールしていることを思い出しました。
ノートン360のファイアウォールが原因かも。ということを閃いたので、以下の手順を試しました。
- Macのネットワーク設定から有線LANとWiFiをオフに。(業務用PCを危険に晒すわけにはいかないので)
- ノートン360のファイアウォールをオフに。
- Vagrantを起動。
- 以下のように仮想環境にログインして、「/vagrant」配下にマウントされていることが確認できました。
% vagrant ssh
$ ls -l /vagrant
合計 16
-rw-r--r-- 1 501 games 551 6月 9 14:46 Vagrantfile
-rw-r--r-- 1 501 games 38 6月 6 10:06 ansible.cfg
-rw-r--r-- 1 501 games 33 6月 6 09:39 hosts
-rwxr-xr-x 1 501 games 134 6月 6 09:11 playbook.yml
drwxr-xr-x 6 501 games 192 6月 5 15:26 roles
はい、見事に当たりです。ということで、ノートン360の設定状況を確認して解決していきます。
ノートン360のログを確認
ノートン360の設定画面を開き、「アクティビティ」から「セキュリティ履歴」をクリックします。
セキュリティ履歴画面のファイアウォールの「接続の遮断」という項目に、Vagrantfileの「config.vm.network "private_network"」で指定したIP(192.168.33.10)とlocalhost(127.0.0.1)が遮断されている記録がありました。
Vagrantfileの「config.vm.synced_folder」では「:nfs => true」のようにNFSを指定していました。
rpcbindはNFSで利用されるプロトコルですね。もう、絶対にこれやん。。。
解決方法
先程の「接続の遮断」の対象行を右クリックすると、「アドレスを信頼」という項目が表示されますのでこれを選択します。
今回はlocalhost(127.0.0.1)とVagrantfileの「config.vm.network "private_network"」で指定したIP(192.168.33.10)のどちらも許可するように設定しました。
ノートン360の設定を確認
ノートン360の設定画面を開き、「ファイアウォール」のメニューの「接続の遮断」のスパナアイコンをクリックします。
「表示する」のプルダウンを「ゾーン」に変更すると、先程「アドレスを信頼」を行ったアドレスが追加されていることが確認できました。
ノートン360のファイアウォールが有効な状態で「config.vm.synced_folder」が動作するか確認
今度は「default: Mounting NFS shared folders...」の後にエラーが発生せず正常に起動しました。
% vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
・
・
・
==> default: Mounting NFS shared folders...
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
仮想環境にログインして、「/vagrant」配下にマウントされていることも確認できました。めでたしめでたし。
% vagrant ssh
$ ls -l /vagrant
合計 16
-rw-r--r-- 1 501 games 551 6月 9 14:46 Vagrantfile
-rw-r--r-- 1 501 games 38 6月 6 10:06 ansible.cfg
-rw-r--r-- 1 501 games 33 6月 6 09:39 hosts
-rwxr-xr-x 1 501 games 134 6月 6 09:11 playbook.yml
drwxr-xr-x 6 501 games 192 6月 5 15:26 roles
まとめ
今回のように普段使用している環境にインストールしているアプリケーションが思わぬ影響を与えていることもあるので、ググっても答えが見つからない場合は、一旦落ち着いて発生している問題の切り分けを行うことが大事だなぁと。
おまけ
後日、再びVagrantの起動時にsynced_folderの処理に失敗するようになりました。
調べてみると、セキュリティ履歴画面のファイアウォールの「接続の遮断」の画面にまた「localhost」が遮断されている履歴が表示されていました。
前回の対応で確かに「127.0.0.1」については「アドレスを信頼」の対応を行ったはずです。
「接続の遮断」の画面で「アドレスを信頼」の対応を行った「localhost(127.0.0.1)」については、右クリックをするとこのように「アドレスの信頼を中止」と表示されるのですが。。。
新たに遮断されているアドレスを右クリックすると「localhost」にも関わらず、「アドレスを信頼」のメニューが表示されていました。これは???
ワケがわからず「アドレスを信頼」をクリックしてみると答えがわかりました。正体は「::1」でした。
以下の方法IPv6を無効化してみましたが、
対象のサーバでIPv6を運用するのであれば「アドレスを信頼」の対応でもよいですが、利用しないのであれば nmcli
コマンドでIPv6を無効化しておくという対応でもよさそうですね。
$ sudo nmcli connection modify インターフェース名 ipv6.method ignore
nmcli connection show
でインターフェース名を確認して。
$ sudo nmcli connection show
NAME UUID TYPE DEVICE
System eth0 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet eth0
System eth1 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet eth1
ens3 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ethernet --
nmcli connection modify
でインターフェース毎に無効化を行う。
$ sudo nmcli connection modify "System eth0" ipv6.method ignore
$ sudo nmcli connection modify "System eth1" ipv6.method ignore
もしくは sysctl
コマンドを使って /etc/sysctl.conf
に書き込む形でもよいかもです。
$ sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
$ sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
$ sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1