経緯
きっかけ
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の対応を待つわけにもいかないので、「ホストマシンのカーネルをダウングレードするしかないかなぁ(´・ω・`)」と日報に書いたら、同僚が解決方法が記載されているブログを見つけてれくました!!
- Kernel 4.4.172 Breaking Some Application
上記のサイトに従って作業をしたところ、再び起動出来るようになりました!!
下記に作業記録を記載しておきます
作業
⚠ ソースコードを修正しますので、作業する際は自己責任でお願いします ⚠
まずは最新にしましょう
- 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. $
成功!!!!!!!!!!!!!!!
この後は、GUIでVirtualBoxを起動して、既存の仮想マシンが正常に起動出来れば問題は解決です!!
まとめ
- 今回はOracleが修正するより先に1エンジニアが問題箇所を特定し、解決策をインターネットに上げることで多くのユーザが救われたと思います
- VirtualBoxはOSSですし、UbuntuもLinuxディストリビューションとして有名ですよね
- 改めて、エンジニアリングの世界ってすごいなと体感した出来事でした
- あと、この対応はあくまで一時的なので、早く本家のVirtualBoxが対応してほしいです (-人-)
参考URL
- 偉大な解決者様のブログ
- 上記のブログを紹介している日本語のブログ