Hejdaの見る夢

一人前のエンジニアを目指して頑張ったこととかをつらつら書くブログ

Ubuntu 16.04 LTSで、Linuxカーネルを4.4.0-143-genericに上げたら、VirtualBoxが使えなくなった件

経緯

きっかけ

2019/03/18に何気ない気持ちで ホストマシン(Ubuntu 16.04 LTS)で sudo apt update && sudo apt upgrade -y としたら、VirtualBox v5.2が起動しなくなりました

症状と考えうる理由

症状としては、VirtualBox自体は起動するのですが、その中で作成した仮想マシンが起動出来ず、新しく作ることも出来ませんでした

理由としては、 sudo apt upgrade 後のLinuxカーネルではAPIに変更点があったらしく、VirtualBoxがそのAPIの変更に追従出来ていないようです

対処開始

Linuxカーネルのバージョンは 4.4.0-143-generic でした

$ uname -r
4.4.0-143-generic

VirtualBoxコマンドラインを使った際に、今回のエラーへの対処として、

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.

と表示されるので、素直にターミナルで実行してみますが

$ sudo /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.

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.

同じエラーが出てしまいます…

他の対応を試みる

VirtualBoxの公式サイト(https://www.virtualbox.org/wiki/Downloads)から、 VirtualBox v5.1, v6.0をパッケージでダウンロードしてインストールしてみたり、コマンドラインでインストールしてみましたが一向にならず…

呟いてみたところ…

Oracleの対応を待つわけにもいかないので、「ホストマシンのカーネルをダウングレードするしかないかなぁ(´・ω・`)」と日報に書いたら、同僚が解決方法が記載されているブログを見つけてれくました!!

上記のサイトに従って作業をしたところ、再び起動出来るようになりました!!

下記に作業記録を記載しておきます

作業

ソースコードを修正しますので、作業する際は自己責任でお願いします ⚠

まずは最新にしましょう

  • aptのアップデート
    • 可能であれば、最新にしておきましょう
$ sudo apt update
$ sudo apt upgrade
  • VirtualBoxのアップグレード
    • コマンドラインでもパッケージからのインストールでもどちらでもよいと思います
    • 可能であれば、最新にしておきましょう
    • わたしはVirtualBox v6.0.3にしました

ここから、VirtualBoxソースコードを修正していきます

$ sudo cp -a /usr/src/vboxhost-6.0.4/vboxdrv/r0drv/linux/memobj-r0drv-linux.c{,.bk.20190320}
  • バックアップ出来たか、確認します
$ sudo ls -la  /usr/src/vboxhost-6.0.4/vboxdrv/r0drv/linux/memobj-r0drv-linux.c*
-rw-r--r-- 1 root root 60644  3月 20 16:34 /usr/src/vboxhost-6.0.4/vboxdrv/r0drv/linux/memobj-r0drv-linux.c
-rw-r--r-- 1 root root 60638  1月 26 03:21 /usr/src/vboxhost-6.0.4/vboxdrv/r0drv/linux/memobj-r0drv-linux.c.bk.20190320
  • 該当のファイルを編集します
    • # if GET_USER_PAGES_API >= KERNEL_VERSION(4, 9, 0) -> if GET_USER_PAGES_API >= KERNEL_VERSION(4, 4, 168) と変更します
    • 合計で3箇所あります
$ sudo vim /usr/src/vboxhost-6.0.4/vboxdrv/r0drv/linux/memobj-r0drv-linux.c
  • 編集した箇所を確認しまします
$ sudo diff -s /usr/src/vboxhost-6.0.4/vboxdrv/r0drv/linux/memobj-r0drv-linux.c /usr/src/vboxhost-6.0.4/vboxdrv/r0drv/linux/memobj-r0drv-linux.c.bk.20190320 
1078c1078
< # if GET_USER_PAGES_API >= KERNEL_VERSION(4, 4, 168)
---
> # if GET_USER_PAGES_API >= KERNEL_VERSION(4, 9, 0)
1098c1098
< # if GET_USER_PAGES_API >= KERNEL_VERSION(4, 4, 168)
---
> # if GET_USER_PAGES_API >= KERNEL_VERSION(4, 9, 0)
1117c1117
< # if GET_USER_PAGES_API >= KERNEL_VERSION(4, 4, 168)
---
> # if GET_USER_PAGES_API >= KERNEL_VERSION(4, 9, 0)
  • 改めて、vboxconfigコマンドを実施します
$ sudo /sbin/vboxconfig 
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
$

成功!!!!!!!!!!!!!!!

この後は、GUIVirtualBoxを起動して、既存の仮想マシンが正常に起動出来れば問題は解決です!!

まとめ

  • 今回はOracleが修正するより先に1エンジニアが問題箇所を特定し、解決策をインターネットに上げることで多くのユーザが救われたと思います
  • 改めて、エンジニアリングの世界ってすごいなと体感した出来事でした
  • あと、この対応はあくまで一時的なので、早く本家のVirtualBoxが対応してほしいです (-人-)

参考URL