VirtualBox
CentOS 7.5上でVagrantとAnsibleを使ってVirsualBoxを操作しようとしたら環境設定に色々ハマった記録。バグトラップな上にグーグル先生が的確な情報出してくれない!!
問題山積み
- VirsualBoxのインストールで失敗する (modprobe vboxdrv が云々)
- secure bootの影響で、署名がないモジュールをロードできないのが原因。署名すればよい。
- だがしかし、署名に使った公開鍵がenrollできない
- mokutilのバグ。1つ前のバージョンに戻す。
- Mac OS X用のVagrantfileとCentOS(Linux)用のVagrantfileではansible providerの名前が異なる
- Mac OS X 用は
ansible
。CentOS用はansible_local
。冪等性とは。 - 参考: Ansible Not Found during Post Provision Task
- Mac OS X 用は
- なんかVagrantfileからは実行できないのに、ansible-playbookでは実行できるんですが… (これは秘密鍵のパスとか、そういう問題かも)
- NFSマウントが失敗する
- firewalldがお仕事してた。vboxnet0をtrusted zoneへ叩き込む(いいのかそれで?)
- "CentOS VirtualBox Vagrant"とかでググると「Vagrantで(WIndowsの)VirtualBoxにCentOSを入れようず」いう話ばかりが出てくるんですよね…。しかし他に適当なキーワードもなく。
各々の対策記録
VirsualBoxのインストールで失敗する
CentOSのおそらく7.4以降~バグ修正版が出るまでは、先に「署名に使った公開鍵がenrollできない」を読んでください。二度手間になります。
RedHatの 26.8. セキュアブート用のカーネルモジュールの署名 が日本語ですし、「何をやっているのか」まで分かってよいです。
単にやるべきことを知りたいだけならば Signing VirtualBox & VMware modules 等があります。 なお、CN=以降はcommon nameを入れるところなので各自考えて置き換えることになります。
例に出ているのは「vboxdrv」だけなのですが、実際は同じディレクトリ内の全ファイルに署名しないとダメでした(全ファイル必要なのかは組み合わせテストが面倒なので確認していません)。
modinfo -n vboxdrv
でこのモジュールファイルのフルパスが出てくるので、そこでパス名から必要なファイルを見つけてください。ちょっとイイ感じにやりたければ ls $(dirname $(modinfo -n vboxdrv) )/* |xargs -l1
とかすればイケるんじゃないかとは思う。
署名に使った公開鍵がenrollできない
問題は、上記でモジュールに署名したあと、その公開鍵を mokutil
へ登録した後で、再起動するとUEFI コンソールで mokutil
にセットしたパスワードを聞かれ、パスすれば以後は公開鍵がOSへ永続登録される、という部分です。何度再起動してもそんな画面出てこないのです…っ
原因は、最新版の mokutil
にバグがあり、肝心のUEFIコンソールが起動しないとのこと。
以下にその説明があります。
元々問題に気付いたのはこのあたりの記事。 "The uefi secure boot bug" の文言を読んだ時の脱力感がハンパない。
Red Hat Bugzilla – Bug 1477735 Shim was unable to measure state into the TPM
対策ですが、バグのない1つ前の mokutil
はCentOSの場合7.3にあります。 http://vault.centos.org/7.3.1611/os/x86_64/Packages/ から mokutil
と shim
のRPMをダウンロードして、最新版を yum remove
で削除後にインストールします。
成功すれば、ブート時にきっちり止まりますので確実に分かります。
この作業前に mokutil
へ鍵を登録したりパスワードをセットしていた場合、その作業からやり直しになるので注意してください。
Mac OS X用とCentOS(Linux)用とのVagrantfile差異
一覧に書いた通りです。Mac OS X 用は ansible
。CentOS用は ansible_local
。このあからさまな違いから見て、CentOS用は何か使い方を変えると ansible
になるのかもしれませんが。
参考記事は以下。
NFSマウントが失敗する
原因がわからないときは、 vagrant ssh
でゲストOSに入ったのち、おそらく画面に表示されているであろうコマンド( mount -o vers=3,udp <ホスト側IP>:<ホスト側Path> /vagrant
等)を実行してみるのがよいです。この際、mount コマンドに --verbose
を追加することで、ある程度情報が増えます。
私のケースの場合 mount.nfs: portmap query failed: RPC: Unable to receive - No route to host
が出ていたので、これは経路が切れてるな…と考えた次第。その後sshでゲスト→ホスト接続を試してみて、接続できたのでfirewallかな、と。
firewall-cmd --add-interface vboxnet0 --zone=trusted
firewall-cmd --list-all --zone=trusted
(確認)
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: vboxnet0
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
のような結果になればOK。