ふと社内のUbuntu 16.04で動作しているテストサーバーを再起動したところ…
仮想マシンが立ち上がらなくなってました。
最悪です…
このエラーメッセージが出てくる前に
sudo /sbin/vboxconfig
を実行すれば修復できる旨のメッセージが表示されたので実行しましたが、
# '/sbin/vboxconfig'
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: failed: Look at /var/log/vbox-setup.log to find out what went wrong.
となり、/var/log/vbox-setup.log を確認すると vboxdrv のビルドに失敗した、というメッセージ(コンパイルエラー)が出てました。
まずこのエラーで調べたところ、現在実行中のカーネルのカーネルへッダーが足りていないという情報を発見。
Ubuntu上でのVirtualBoxで仮想マシンを立ち上げようとしたときに Kernel driver not installed (rc=-1908) のエラーが出た場合の対処方法 – K-Lab
そういえばカーネルモジュール作るのにカーネルヘッダ必要だったなーと思い
sudo apt update
sudo apt install linux-headers-$(uname -r)
を実行しましたが、
# sudo apt install linux-headers-$(uname -r)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
linux-headers-4.4.0-143-generic はすでに最新バージョン (4.4.0-143.169) です。
linux-headers-4.4.0-143-generic は手動でインストールしたと設定されました。
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
...
これを削除するには 'sudo apt autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 18 個。
あれ…既に入ってる…
もう一度
sudo /sbin/vboxconfig
を実行してみるも当然通るはずもなく…
半分パニックになりながらいろいろ調べていたところ、Ubuntuのコミュニティサイト”Ask Ubuntu”の英語の記事でようやく有効な情報にたどり着きました。
VirtualBox error after last (Ubuntu) Software Update – Ask Ubuntu
どうやら、Ubuntu 16.04 に提供されている最新のカーネルをインストールすると、Virtualbox側が対応できていないためカーネルモジュールのビルドに失敗する…ということだそうです。マジかよ…
記事では VirtualBox 5.2.26でエラーが出たと書かれていますが、手元の環境では現時点で最新版の 6.0.4でも全く同じエラーが出ていたので、現時点でもまだ直っていないようです。
手元の環境ではカーネルバージョン 4.4.0-143 でエラーになっていましたが、記事によるとカーネルバージョン 4.4.0-138 であればVBoxがエラーにならず、かつ不具合等も出ず安定しているとのことだったので、このバージョンのカーネルより新しいものをすべて削除してしまうのが今回の解決策になりそうです。
とりあえず下記のコマンドを打ってカーネルをダウングレードします。
なお今回はOSの動作に必要なカーネルをいったんすべて削除するという大変リスキーな作業が含まれますので、十分注意してください。
※作業が完了するまで、絶対にOSを再起動しないでください。
カーネルのダウングレードを完了する前に再起動すると、最悪OSが起動しなくなります。
#問題を起こす新しいバージョンのLinuxカーネルを全て削除(この処理を行ったら必ず最後の処理まで完了させてください。さもないとOSが起動しなくなります。4.4.0-143よりも新しいカーネルがインストールされていれば、適宣削除対象に追加します。)
sudo apt-get purge linux-image-generic linux-headers-generic
sudo apt-get purge linux-image-4.4.0-139-generic linux-headers-4.4.0-139-generic \
linux-image-4.4.0-140-generic linux-headers-4.4.0-140-generic \
linux-image-4.4.0-141-generic linux-headers-4.4.0-141-generic \
linux-image-4.4.0-142-generic linux-headers-4.4.0-142-generic \
linux-image-4.4.0-143-generic linux-headers-4.4.0-143-generic
#上記コマンド実行中に現在実行中のカーネルを削除しようとしている旨のメッセージが出ますが、はい を選択して削除してください。
#残骸のパッケージを削除
sudo apt-get autoremove
#問題を引き起こさない古いカーネルをインストール(ダウングレード)
sudo apt-get install linux-image-4.4.0-138-generic linux-image-extra-4.4.0-138-generic
sudo apt-get install linux-headers-4.4.0-138 linux-headers-4.4.0-138-generic
#再起動前までに必ずここまで完了させてください。
念のため目的のカーネルがインストールされているか確認します。
sudo dpkg --get-selections | grep image
$ sudo dpkg --get-selections | grep -e generic -e headers
libaccount-plugin-generic-oauth install
linux-headers-4.4.0-138 install
linux-headers-4.4.0-138-generic install
linux-image-4.4.0-134-generic deinstall
linux-image-4.4.0-137-generic deinstall
linux-image-4.4.0-138-generic install
linux-image-4.4.0-21-generic deinstall
linux-image-extra-4.4.0-134-generic deinstall
linux-image-extra-4.4.0-137-generic deinstall
linux-image-extra-4.4.0-138-generic install
linux-image-extra-4.4.0-21-generic deinstall
linux-modules-4.4.0-143-generic install
plainbox-provider-resource-generic install
linux-headers-4.4.0-138-generic と linux-image-4.4.0-138-generic、 linux-image-extra-4.4.0-138-generic のステータスが install となっていることを必ず確認します。
installとなっていれば再起動しても大丈夫です。
再起動が完了したら、次のコマンドを打って実行中のカーネルを確認します。
uname -r
$ uname -r
4.4.0-138-generic
となっていれば作業完了です。
この状態で
sudo /sbin/vboxconfig
を実行すれば vboxdrv のエラーは解消しているはずです。
VirtualBoxの動作まで確認出来たら、問題が解決されるまでの当面の間、自動でカーネルがアップグレードされないようにaptパッケージマネージャーでカーネルバージョンを固定するように設定します。
sudo vi /etc/apt/preferences.d/linux-kernel.pref
などどして設定ファイルを作成し、下記の内容を書き込みます。
Package: linux-generic
Pin: version 4.4.0-138.164
Pin-Priority: 1001
Package: linux-headers-generic
Pin: version 4.4.0-138.164
Pin-Priority: 1001
Package: linux-image-generic
Pin: version 4.4.0-138.164
Pin-Priority: 1001
これでaptでパッケージを更新してもカーネルは更新対象にならなくなります。
$ uname -r
4.4.0-138-generic
$ sudo apt update
ヒット:1 http://jp.archive.ubuntu.com/ubuntu xenial InRelease
取得:2 http://jp.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
無視:3 http://dl.google.com/linux/chrome/deb stable InRelease
ヒット:4 http://archive.ubuntulinux.jp/ubuntu xenial InRelease
無視:5 http://archive.ubuntulinux.jp/ubuntu-ja-non-free xenial InRelease
取得:6 http://jp.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]
ヒット:7 http://archive.ubuntulinux.jp/ubuntu-ja-non-free xenial Release
取得:8 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [925 kB]
ヒット:9 http://dl.google.com/linux/chrome/deb stable Release
取得:11 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main i386 Packages [807 kB]
取得:13 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 DEP-11 Metadata [318 kB]
取得:14 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main DEP-11 64x64 Icons [233 kB]
ヒット:15 http://ppa.launchpad.net/danielrichter2007/grub-customizer/ubuntu xenial InRelease
取得:16 http://jp.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [739 kB]
取得:17 http://jp.archive.ubuntu.com/ubuntu xenial-updates/universe i386 Packages [677 kB]
取得:18 http://jp.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 DEP-11 Metadata [252 kB]
取得:19 http://jp.archive.ubuntu.com/ubuntu xenial-updates/universe DEP-11 64x64 Icons [350 kB]
取得:20 http://jp.archive.ubuntu.com/ubuntu xenial-updates/multiverse amd64 DEP-11 Metadata [5,964 B]
取得:21 http://jp.archive.ubuntu.com/ubuntu xenial-backports/main amd64 DEP-11 Metadata [3,324 B]
取得:22 http://jp.archive.ubuntu.com/ubuntu xenial-backports/universe amd64 DEP-11 Metadata [5,104 B]
ヒット:23 http://security.ubuntu.com/ubuntu xenial-security InRelease
4,531 kB を 1秒 で取得しました (3,831 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードできるパッケージが 17 個あります。表示するには 'apt list --upgradable' を実行してください。
$ sudo apt list --upgradable
一覧表示... 完了
base-files/xenial-updates 9.4ubuntu4.8 amd64 [9.4ubuntu4.7 からアップグレード可]
distro-info-data/xenial-updates,xenial-updates 0.28ubuntu0.10 all [0.28ubuntu0.9 からアップグレード可]
google-chrome-stable/stable 73.0.3683.86-1 amd64 [72.0.3626.119-1 からアップグレード可]
libc-bin/xenial-updates 2.23-0ubuntu11 amd64 [2.23-0ubuntu10 からアップグレード可]
libc-dev-bin/xenial-updates 2.23-0ubuntu11 amd64 [2.23-0ubuntu10 からアップグレード可]
libc6/xenial-updates 2.23-0ubuntu11 amd64 [2.23-0ubuntu10 からアップグレード可]
libc6-dbg/xenial-updates 2.23-0ubuntu11 amd64 [2.23-0ubuntu10 からアップグレード可]
libc6-dev/xenial-updates 2.23-0ubuntu11 amd64 [2.23-0ubuntu10 からアップグレード可]
libpam-systemd/xenial-updates 229-4ubuntu21.17 amd64 [229-4ubuntu21.16 からアップグレード可]
libsystemd0/xenial-updates 229-4ubuntu21.17 amd64 [229-4ubuntu21.16 からアップグレード可]
libudev1/xenial-updates 229-4ubuntu21.17 amd64 [229-4ubuntu21.16 からアップグレード可]
locales/xenial-updates,xenial-updates 2.23-0ubuntu11 all [2.23-0ubuntu10 からアップグレード可]
multiarch-support/xenial-updates 2.23-0ubuntu11 amd64 [2.23-0ubuntu10 からアップグレード可]
snapd/xenial-updates 2.37.4 amd64 [2.34.2ubuntu0.1 からアップグレード可]
systemd/xenial-updates 229-4ubuntu21.17 amd64 [229-4ubuntu21.16 からアップグレード可]
systemd-sysv/xenial-updates 229-4ubuntu21.17 amd64 [229-4ubuntu21.16 からアップグレード可]
udev/xenial-updates 229-4ubuntu21.17 amd64 [229-4ubuntu21.16 からアップグレード可]
なお、4.4.0-138-generic 以外のバージョンのカーネルを削除しても、まれにカーネルパッケージの残骸が残っていて、別のバージョンのカーネルがデフォルトで起動してしまうことがあるようです。
その場合は下記記事のような手順で起動時のブートローダ画面で 4.4.0-138 カーネルを指定して起動してください。
それにしても、再起動したらVirtualBoxが起動しなくなるとか本当に困るので、早く修正されてほしいですね…