Ubuntuで最新カーネルにアップグレードするとVirtualBoxが動作しなくなった件

ふと社内の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 カーネルを指定して起動してください。

Ubuntu カーネルのバージョン変更 – Qiita

それにしても、再起動したらVirtualBoxが起動しなくなるとか本当に困るので、早く修正されてほしいですね…

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG