debian10 vagrant up時にエラーが出る。/usr/lib/virtualbox/VBoxManage: symbol lookup error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: undefined symbol: __gmpz_limbs_write

現象

環境

まず、先に書いておくとvagrantのissueに出ている github.com

virtualbox脆弱性が報告されていたため、virtualbox-6.1のupdateを行なった。合わせて、vagrantのリリースノートにもvirtualbox-6.1の変更に対応のようなものがあったため合わせてupdateを行なった。その結果vagrant upvagrant statusで以下のようなエラーが発生するようになった。

$ vagrant status
vagrant: There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below.
Command: ["--version"]
/usr/lib/virtualbox/VBoxManage: symbol lookup error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30:     undefined symbol: __gmpz_limbs_write

切り分け

コマンドラインからVBoxManageを叩いてみると、

$ VBoxManage --version
6.1.16r140961

動いた。

vagrantからは動かなく、VBoxManageからは動くため、vagrantの問題であることがわかる。

次にdebug logを有効にしてvagrantを動かしてみると

$ VAGRANT_LOG=debug vagrant status
...
INFO global: VAGRANT_APPIMAGE_HOST_LD_LIBRARY_PATH="/lib:/lib64:/usr/lib:/usr/lib64:/tmp/.mount_vagranOeXSRI/usr/lib/:/tmp/.mount_vagranOeXSRI/usr/lib/i386-linux-gnu/:/tmp/.mount_vagranOeXSRI/usr/lib/x86_64-linux-gnu/:/tmp/.mount_vagranOeXSRI/usr/lib32/:/tmp/.mount_vagranOeXSRI/usr/lib64/:/tmp/.mount_vagranOeXSRI/lib/:/tmp/.mount_vagranOeXSRI/lib/i386-linux-gnu/:/tmp/.mount_vagranOeXSRI/lib/x86_64-linux-gnu/:/tmp/.mount_vagranOeXSRI/lib32/:/tmp/.mount_vagranOeXSRI/lib64/:"
...
INFO subprocess: Starting process: ["/usr/bin/VBoxManage", "--version"]
INFO subprocess: Command not in installer, restoring original environment...
INFO subprocess: Detected AppImage environment and request to external binary. Updating library path.
DEBUG subprocess: Setting LD_LIBRARY_PATH to /lib:/lib64:/usr/lib:/usr/lib64:/tmp/.mount_vagranOeXSRI/usr/lib/:/tmp/.mount_vagranOeXSRI/usr/lib/i386-linux-gnu/:/tmp/.mount_vagranOeXSRI/usr/lib/x86_64-linux-gnu/:/tmp/.mount_vagranOeXSRI/usr/lib32/:/tmp/.mount_vagranOeXSRI/usr/lib64/:/tmp/.mount_vagranOeXSRI/lib/:/tmp/.mount_vagranOeXSRI/lib/i386-linux-gnu/:/tmp/.mount_vagranOeXSRI/lib/x86_64-linux-gnu/:/tmp/.mount_vagranOeXSRI/lib32/:/tmp/.mount_vagranOeXSRI/lib64/:
...

LD_LIBRARY_PATHを設定してからVBoxManageを行なっている。怪しい。というかこれだろう。

念の為、libgnutls.so.30に含まれるシンボルを確認する

$ readelf -s /usr/lib/x86_64-linux-gnu/libgnutls.so.30 | grep limbs_write
    25: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __gmpz_limbs_write

次にlibgnutls.so.30がloadする共有ライブラリをlddにより調べる

$ ldd /usr/lib/x86_64-linux-gnu/libgnutls.so.30
        linux-vdso.so.1 (0x00007ffce67b3000)
        libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f6fceb6f000)
        libidn2.so.0 => /usr/lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f6fceb50000)
        libunistring.so.2 => /usr/lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f6fce9cc000)
        libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f6fce7b9000)
        libnettle.so.6 => /usr/lib/x86_64-linux-gnu/libnettle.so.6 (0x00007f6fce781000)
        libhogweed.so.4 => /usr/lib/x86_64-linux-gnu/libhogweed.so.4 (0x00007f6fce748000)
        libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f6fce6c3000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6fce502000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6fcee58000)
        libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f6fce4f8000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6fce4f3000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6fce4d2000)

これらの共有ライブラリのうち、再びreadelfによりlibgmp.so.10__gmpz_limbs_writeの定義があることがわかる

$ readelf -s  /usr/lib/x86_64-linux-gnu/libgmp.so.10 | grep limbs_write
   367: 000000000001e740    21 FUNC    GLOBAL DEFAULT   12 __gmpz_limbs_write

libgmp.so.10/usr/lib/x86_64-linux-gnuの下に位置している.しかし/usr/lib/x86_64-linux-gnuLD_LIBRARY_PATHに入っていないのが原因であろう。

ここまで調べて、vagrantのissueVagrant fails to call VBoxManage · Issue #12088 · hashicorp/vagrant · GitHubに回避策があることを見つける。。。

回避策

AppImageといったパッケージの配布の方式がある。この特徴としてディストリビューションを選ばずインストールできるといったものが挙げられる。vagrantは最近?AppImage形式でも配布されている。

vagrant公式のダウンロードページにてlinuxを選択するとAppImage形式のvagrantがダウンロードされる www.vagrantup.com

AppImage形式のvagrantだとこの現象が発生する。deb形式のvagrantだと発生しない。

取得方法は、vagrant公式のダウンロードページにおいて、linuxを選択するのではなく、Debianを指定してダウンロードする。

表示順番が「MAC OS X」「WINDOWS」「LINUX」「DEBIAN」「CENTOS」となっている。左から見ていき、「LINUX」あったー、これだとしたのが悪かったのだな。きちんと確認しよう。