debian10 vagrant up時にエラーが出る。/usr/lib/virtualbox/VBoxManage: symbol lookup error: /usr/lib/x86_64-linux-gnu/libgnutls.so.30: undefined symbol: __gmpz_limbs_write
現象
環境
- debian10
- virtualbox-6.1.16
- vagrant-2.2.14 Downloads | Vagrant by HashiCorp
まず、先に書いておくとvagrantのissueに出ている github.com
virtualboxの脆弱性が報告されていたため、virtualbox-6.1のupdateを行なった。合わせて、vagrantのリリースノートにもvirtualbox-6.1の変更に対応のようなものがあったため合わせてupdateを行なった。その結果vagrant up
やvagrant 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-gnu
がLD_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」あったー、これだとしたのが悪かったのだな。きちんと確認しよう。