VagrantでCentOSを利用した場合に、ある日突然、VirtualBox Guest Additionsが更新できなくなる原因と対応

投稿者: | ↻ : 2020年4月27日

はじめに

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パッケージが得られるようになっています。