はじめに
VagrantでCentOSを利用した場合に、ある日突然、VirtualBox Guest Additionsが更新できなくなる原因と対応をまとめます。検証環境はmacOSですが障害の原因はゲストOS側にあるので、Windowsでも同じ障害が発生します。
2020.4.27追記
2年とちょっと過ぎたのですが、CentOS7.7環境の構築時に、当時の古いBOXイメージでも通用する正攻法を見つけてしまったので、差分として対応方法を追記してます。(ただし、当時の古いvagrant-vbguestプラグインは未対応です)
検証環境
ホストマシン
- macOS Sierra 10.12.6
- Vagrant 2.0.1
- VirtualBox 5.2.2
ゲストマシン(Boxイメージ)
- CentOS/7 (box version 1707.01) = CentOS7.3
- CentOS/7 (box version 1710.01) = CentOS7.4
- Fedora/26-cloud-base
- Fedora/27-cloud-base
詳細
障害となる条件
- 最新バージョンより古いバージョンのCentOSを利用している。または、新しいバージョンがリリースされて利用中のCentOSのバージョンが古くなった。
- vagrant-vbguestプラグインで、VirtualBox Guest Additionsの自動更新を有効にしている。
障害の内容
VirtualBox Guest Additionsは、ゲストマシンのカーネルモジュールとして組み込まれます。VirtualBox Guest Additionsの新しいバージョンがリリースされた場合、使用している機能によっては更新が必要となります。
Vagrantにvagrant-vbguestプラグインをインストール済みならば、vagrant upの時にVirtualBox Guest Additionsを最新に自動更新します。
vagrant-vbguestプラグインを使わずに手動でも更新を行えます。
どちらの方法でも更新が失敗します。
障害の原因
VirtualBox Guest Additionsの更新はビルド済みのファイルの配布ではなく、ゲストマシン上でリビルドされます。
通常カーネルモジュールをビルドするには、使用しているカーネルバージョンに合わせたkernel-develパッケージが必要になります。
このパッケージの正式名は以下のコマンドで取得できます:
[vagrant@localhost ~]$ echo kernel-devel-`uname -r`
kernel-devel-3.10.0-514.26.2.el7.x86_64
CentOSはリポジトリの考え方として、最新バージョンの一つだけが取得できるように設定されています。
しかし、メジャーバージョンで一つのリポジトリ(CentOS6系、CentOS7系)となっています。2017年9月にCentOS7.4がリリースされたので、CentOS7.3以前で必要なkernel-develパッケージが取得できなくなります。
現在のカーネルバジョーンに合わせたkernel-develパッケージが取得できないので、VirtualBox Guest Additionsの更新に失敗します。
解決方法
CentOSのリポジトリの定義ファイルを確認すると、最新(updates)の他に、保管(Vault)のリポジトリがあり、初期状態でVaultリポジトリは無効になっています。このVaultリポジトリの設定を変更することで旧バージョンのパッケージが取得できます。
CentOS7.3の環境を例とした設定の変更
変更前の設定確認
有効なリポジトリリスト
[vagrant@localhost ~]$ yum repolist enabled -q
repo id repo name status
!base/7/x86_64 CentOS-7 - Base 9,591
!extras/7/x86_64 CentOS-7 - Extras 283
!updates/7/x86_64 CentOS-7 - Updates 1,416
変更前のVaultリポジトリの設定
ファイル:/etc/yum.repos.d/CentOS-Vault.repo
# CentOS Vault contains rpms from older releases in the CentOS-7
# tree.
#c7.0.1406
[C7.0.1406-base]
name=CentOS-7.0.1406 - Base
baseurl=http://vault.centos.org/7.0.1406/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=0
...省略...
[C7.2.1511-fasttrack]
name=CentOS-7.2.1511 - CentOSPlus
baseurl=http://vault.centos.org/7.2.1511/fasttrack/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=0
取得可能なkernel-develパッケージ
[vagrant@localhost ~]$ uname -r
3.10.0-514.26.2.el7.x86_64
[vagrant@localhost ~]$ yum list kernel-devel-`uname -r` -q
Error: No matching Packages to list
[vagrant@localhost ~]$ yum list kernel-devel -q
Available Packages
kernel-devel.x86_64 3.10.0-693.5.2.el7 updates
現在のカーネルバージョンに一致したバージョンを取得できません。
変更する設定
Vaultリポジトリの設定ファイルに以下の内容を追加する。(変更には管理者権限が必要です)
2020.4.27追記
当時は直接編集していましたが、このrepoファイルを管理するためcentos-release
パッケージがあります。このパッケージを更新することで、/etc/yum.repos.d/
以下のいくつかのファイルが更新されます。
ただし、有効状態(enabled=1)にはならないので、yum
コマンドを実行する際に--enablerepo=C*-base
と--enablerepo=C*-updates
オプションが必要です。
[vagrant@localhost ~]$ sudo yum update -y centos-release
[vagrant@localhost ~]$ sudo yum install -y --enablerepo=C*-base --enablerepo=C*-updates kernel-devel-`uname -r`
CentOS7系ならば、vagrant-vbguestプラグインが対応してくたので、この問題に出会うことはなさそうです。
ファイル:/etc/yum.repos.d/CentOS-Vault.repo
# C7.3.1611
[C7.3.1611-base]
name=CentOS-7.3.1611 - Base
baseurl=http://vault.centos.org/7.3.1611/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
[C7.3.1611-updates]
name=CentOS-7.3.1611 - Updates
baseurl=http://vault.centos.org/7.3.1611/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
[C7.3.1611-extras]
name=CentOS-7.3.1611 - Extras
baseurl=http://vault.centos.org/7.3.1611/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
[C7.3.1611-centosplus]
name=CentOS-7.3.1611 - CentOSPlus
baseurl=http://vault.centos.org/7.3.1611/centosplus/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
[C7.3.1611-fasttrack]
name=CentOS-7.3.1611 - CentOSPlus
baseurl=http://vault.centos.org/7.3.1611/fasttrack/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
変更後の確認
有効なリポジトリリスト
[vagrant@localhost ~]$ yum repolist enabled -q
repo id repo name status
C7.3.1611-base/x86_64 CentOS-7.3.1611 - Base 9,363
C7.3.1611-centosplus/x86_64 CentOS-7.3.1611 - CentOSPlus 101
C7.3.1611-extras/x86_64 CentOS-7.3.1611 - Extras 451
C7.3.1611-fasttrack/x86_64 CentOS-7.3.1611 - CentOSPlus 0
C7.3.1611-updates/x86_64 CentOS-7.3.1611 - Updates 2,146
base/7/x86_64 CentOS-7 - Base 9,591
extras/7/x86_64 CentOS-7 - Extras 283
updates/7/x86_64 CentOS-7 - Updates 1,483
C7.3.1611-〜が新しく有効になったリポジトリです。
取得可能なkernel-develパッケージ
[vagrant@localhost ~]$ yum list kernel-devel-`uname -r` -q
Available Packages
kernel-devel.x86_64 3.10.0-514.26.2.el7 C7.3.1611-updates
現在のカーネルバージョンに一致したバージョンが取得可能になりました。
まとめ
新しいバージョンのリリースという外的要因で障害が発生するので、手元の環境だけを調べても根本的な原因を得られず、非常に面倒な問題です。しかし、一つの原因が明確になったので類似の問題への対処が可能になりました。
おまけ
Fedoraではどうしてるか?
同じRedhat系であるFedoraが、どう処理しているのか2バージョンで確認してみました。
結果は以下のようになりました。
- バージョンを省略した場合は、updateリポジトリから最新のkernel-develパッケージを取得する。
- バージョンを指定した場合は、fedoraリポジトリから指定バージョンのkernel-develパッケージを取得する。
確認結果
boxイメージ名:Fedora/27-cloud-base
ファイル:Vagrantfile
# vim: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "fedora/27-cloud-base"
config.vbguest.auto_update = false
config.vbguest.no_remote = true
end
確認
[vagrant@localhost ~]$ uname -a
Linux localhost.localdomain 4.13.9-300.fc27.x86_64 #1 SMP Mon Oct 23 13:41:58 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[vagrant@localhost ~]$ yum list kernel-devel
Last metadata expiration check: 0:00:44 ago on Tue 05 Dec 2017 06:26:55 PM UTC.
Available Packages
kernel-devel.x86_64 4.13.16-302.fc27 updates
[vagrant@localhost ~]$ yum list kernel-devel-`uname -r`
Last metadata expiration check: 0:02:26 ago on Tue 05 Dec 2017 06:26:55 PM UTC.
Available Packages
kernel-devel.x86_64 4.13.9-300.fc27 fedora
[vagrant@localhost ~]$ yum list kernel-devel-4.13.16-202.fc26.x86_64
Last metadata expiration check: 0:56:25 ago on Tue 05 Dec 2017 06:19:31 PM UTC.
Available Packages
kernel-devel.x86_64 4.13.16-202.fc26 updates
boxイメージ名:Fedora/26-cloud-base
ファイル:Vagrantfile
# vim: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "fedora/26-cloud-base"
config.vbguest.auto_update = false
config.vbguest.no_remote = true
end
確認
[vagrant@localhost ~]$ uname -a
Linux localhost.localdomain 4.11.8-300.fc26.x86_64 #1 SMP Thu Jun 29 20:09:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[vagrant@localhost ~]$ yum list kernel-devel
Last metadata expiration check: 0:08:22 ago on Tue 05 Dec 2017 06:19:31 PM UTC.
Available Packages
kernel-devel.x86_64 4.13.16-202.fc26 updates
[vagrant@localhost ~]$ yum list kernel-devel-`uname -r`
Last metadata expiration check: 0:08:51 ago on Tue 05 Dec 2017 06:19:31 PM UTC.
Available Packages
kernel-devel.x86_64 4.11.8-300.fc26 fedora
[vagrant@localhost ~]$ yum list kernel-devel-4.13.16-302.fc27.x86_64
Last metadata expiration check: 0:51:33 ago on Tue 05 Dec 2017 06:26:55 PM UTC.
Available Packages
kernel-devel.x86_64 4.13.16-302.fc27 updates
リポジトリの定義ファイルを確認すると、現在の環境から情報を取得し参照するリポジトリのuriを切り替えるようになっています。適切なバージョンのkernel-develパッケージが得られるようになっています。