VirtualBox Guest Additions は、Debian 系のOS (Ubuntu など) には公式の手順通りで簡単にインストールできるのですが、Red Hat 系 (CentOS や Oracle Linux など) ではエラーでインストールできないことがあります。

この間 CentOS の後継 OS として開始された Rocky Linux に VirtualBox Guest Additions をインストールしようとした時に少しはまったのでメモを残します。

環境

VirtualBox Guest Additions インストール手順

まず Rocky Linux を VM にインストールしたら、dnf update を実行し再起動します。これは必ず必要な手順なので注意が必要です。

$ sudo dnf update -y
$ sudo reboot

その後、必要なパッケージをインストールします。

$ sudo dnf install -y kernel-devel kernel-headers gcc make perl elfutils-libelf-devel

最後に VirtualBox のメニューから Guest Additions のディスクを挿入し、インストールスクリプトを実行すればインストールできます。

$ sudo mount /dev/cdrom /mnt
$ sudo /mnt/VBoxLinuxAdditions.run

インストール時のエラー対応

エラー1: “Kernel headers not found for target kernel …”

インストールされた kernel-headers と uname -r で表示されるカーネルのバージョンが合っていないときにこのエラーが発生します。エラーメッセージ全文は以下のようなものです。

$ sudo /mnt/VBoxLinuxAdditions.run
...
VirtualBox Guest Additions: Kernel headers not found for target kernel 4.18.0-348.el8.0.2.x86-64. Please install them and execute 
    /sbin/rcvboxadd setup
modprobe vboxguest failed
...

まずバージョンの不一致を確認します。

# インストールされてる kernel-headers のバージョンを確認
$ sudo yum list installed | grep kernel-headers
kernel-headers.x86_64    4.18.0-348.20.1.el8_5

# uname -r で表示されるカーネルバージョンを確認
$ sudo uname -r
4.18.0-348.el8.0.2.x86-64

上記の例では、kernel-headers のバージョンは 4.18.0-348.20.1.el8_5 ですが、uname -r で表示されるカーネルバージョンは 4.18.0-348.el8.0.2.x86-64 となっていて一致していません。

これは上記のインストール手順で dnf update を実行し再起動していない場合に、カーネルのバージョンが更新されていないため発生するエラーです。

インストールされているカーネルバージョンや、デフォルトのカーネルバージョンは grubby コマンドで確認、設定することができます。もしデフォルトカーネルが kernel-headers のバージョンと一致していないようなら、デフォルトカーネルを変更します。

# カーネルの一覧を表示
$ sudo grubby --info=ALL
index=0
kernel="/boot/vmlinuz-4.18.0-348.20.1.el8.0.2.x86_64"
...
index=1
kernel="/boot/vmlinuz-4.18.0-348.el8.0.2.x86_64"
...

# デフォルトカーネルを表示
$ sudo grubby --default-kernel
/boot/vmlinuz-4.18.0-348.el8.0.2.x86_64

# デフォルトカーネルを変更
$ sudo grubby --set-default /boot/vmlinuz-4.18.0-348.20.1.el8.0.2.x86_64 

Rocky Linux では問題になりませんが、Oracle Linux では sysconfig の設定で UEK (Unbreakable Enterprise Kernel) がデフォルトに設定されている場合があります。もし grubby で設定されたカーネルが UEK ではない場合 (カーネルのバージョンに “…el8uek…” のように “uek” の文字が無い場合)、以下のように sysconfig の設定も変更します (変更しなかった場合、dnf update した時にカーネルが以前のバージョンに変更されるためです)。

# Oracle Linux の場合、UEK が指定されている場合があるので変更する
$ sudo vim /etc/sysconfig/kernel
---
# DEFAULTKERNEL=kernel-uek
DEFAULTKERNEL=kernel
---

エラー2: “ValueError: File context for …/mount.vboxsf already defined”

これは一度 VirtualBox Guest Additions のインストールに失敗して、再度インストールスクリプト (VBoxLinuxAdditions.run) を実行しようとした時に発生するこのあるエラーです。

エラーメッセージ全文は以下のようなものです。

$ sudo /mnt/VBoxLinuxAdditions.run
...
ValueError: File context for /opt/VBoxGuestAdditions-<version>/other/mount.vboxsf already defined
...

これは SELinux のコンテキストが既に定義されているという意味です。インストールスクリプトを再度実行する場合は、都度 SELinux のコンテキストを削除する必要があります。

SELinux のコンテキストは以下のコマンドで削除できます。

$ semanage fcontext -d /opt/VBoxGuestAdditions-<version>/other/mount.vboxsf
$ restorecon /opt/VBoxGuestAdditions-<version>/other/mount.vboxsf