VirtualBox Guest Additions は、Debian 系のOS (Ubuntu など) には公式の手順通りで簡単にインストールできるのですが、Red Hat 系 (CentOS や Oracle Linux など) ではエラーでインストールできないことがあります。
この間 CentOS の後継 OS として開始された Rocky Linux に VirtualBox Guest Additions をインストールしようとした時に少しはまったのでメモを残します。
環境
- OS: Rocky Linux 8.5
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