Arch on VirtualBoxのグラフィック周りでハマった話

トラックパッドトラックポイントもFull HDの画面内を動き回るには使いづらい(カーソルが遅いと移動に時間がかかる上に変に力をかけ続けないといけないので疲れるし、速いと目的の場所に止めるのが難しい)ので、タッチパネル装備のThinkpad X1 Carbonを買った。実際使いやすいかはまた別の機会に書くとして、例によってセットアップが辛い感じになったのでログを残しておく。

マシン:Thinkpad X1 Carbox Gen6 ホストOS: Windows10 Pro ゲストOS: Arch Linux on VirtualBox 5.2.16

Archなので、例によってArch Wikiを見るとvirtualbox-guest-utilsというパッケージを入れれば万事ok的なことが書いてある。しかしなぜかIntelliJの描画が遅く、カーソルを動かすだけでCPUを150%くらい食い始める。これはどうもグラフィックドライバが良くないっぽいぞと思ってとりあえずglxgearsしてみると、150fpsくらいしか出ない上に描写がなんとなくカクカクしている。FirefoxWebGLのページを見てみると動かない。また、glxgearsの起動時に以下のようなエラーが出る。

libGL error: pci id for fd 37: 80ee:beef, driver (null)
libGL error: No driver found
libGL error: failed to load driver: (null)

Xorgの起動ログを見ると、DRIのドライバが読めていないように見える。

glados% grep EE .local/share/xorg/Xorg.1.log.old
[  1771.207] Current Operating System: Linux glados 4.17.9-1-ARCH #1 SMP PREEMPT Sun Jul 22 20:23:36 UTC 2018 x86_64
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
[  1771.217] (EE) Failed to load module "vboxvideo" (module does not exist, 0)
[  1771.217] (EE) Failed to load module "fbdev" (module does not exist, 0)
[  1771.218] (EE) Failed to load module "vesa" (module does not exist, 0)
[  1771.298] (EE) modeset(0): [DRI2] No driver mapping found for PCI device 0x80ee / 0xbeef
[  1771.298] (EE) modeset(0): Failed to initialize the DRI2 extension.
[  1771.298] (II) Initializing extension MIT-SCREEN-SAVER
[  1771.438] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1/1-1:1.0/0003:80EE:0021.0001/input/input5/event4"

こういう系のエラーは例によってぐぐってもまったく情報が出てこないので苦戦を強いられることになる。2時間ほど検索してもそのものズバリという回答は見つからなかったが、glxinfo | grep rendererするとllvmpipeというのが出てきて、これがどうやらソフトウェアレンダラらしい。つまり、VirtualBoxのグラフィックドライバが読まれていない。

もしかしたらVirtualBoxOpenGLドライバなんてものは存在せず想像上の存在に過ぎないかもしれないので、一応確認しておく。

glados% pacman -Ql virtualbox-guest-utils
virtualbox-guest-utils /etc/
virtualbox-guest-utils /etc/xdg/
virtualbox-guest-utils /etc/xdg/autostart/
virtualbox-guest-utils /etc/xdg/autostart/vboxclient.desktop
virtualbox-guest-utils /usr/
virtualbox-guest-utils /usr/bin/
virtualbox-guest-utils /usr/bin/VBoxClient
virtualbox-guest-utils /usr/bin/VBoxClient-all
virtualbox-guest-utils /usr/bin/VBoxControl
virtualbox-guest-utils /usr/bin/VBoxService
virtualbox-guest-utils /usr/bin/mount.vboxsf
virtualbox-guest-utils /usr/lib/
virtualbox-guest-utils /usr/lib/VBoxOGL.so
virtualbox-guest-utils /usr/lib/VBoxOGLarrayspu.so
virtualbox-guest-utils /usr/lib/VBoxOGLcrutil.so
virtualbox-guest-utils /usr/lib/VBoxOGLerrorspu.so
virtualbox-guest-utils /usr/lib/VBoxOGLfeedbackspu.so
virtualbox-guest-utils /usr/lib/VBoxOGLpackspu.so
virtualbox-guest-utils /usr/lib/VBoxOGLpassthroughspu.so
virtualbox-guest-utils /usr/lib/security/
virtualbox-guest-utils /usr/lib/security/pam_vbox.so
virtualbox-guest-utils /usr/lib/systemd/
virtualbox-guest-utils /usr/lib/systemd/system/
virtualbox-guest-utils /usr/lib/systemd/system/vboxservice.service
virtualbox-guest-utils /usr/lib/sysusers.d/
virtualbox-guest-utils /usr/lib/sysusers.d/virtualbox-guest-utils.conf
virtualbox-guest-utils /usr/lib/udev/
virtualbox-guest-utils /usr/lib/udev/rules.d/
virtualbox-guest-utils /usr/lib/udev/rules.d/60-vboxguest.rules
virtualbox-guest-utils /usr/lib/virtualbox/
virtualbox-guest-utils /usr/lib/virtualbox/mount.vboxsf
virtualbox-guest-utils /usr/lib/xorg/
virtualbox-guest-utils /usr/lib/xorg/modules/
virtualbox-guest-utils /usr/lib/xorg/modules/dri/
virtualbox-guest-utils /usr/lib/xorg/modules/dri/vboxvideo_dri.so
virtualbox-guest-utils /usr/share/
virtualbox-guest-utils /usr/share/licenses/
virtualbox-guest-utils /usr/share/licenses/virtualbox-guest-utils/
virtualbox-guest-utils /usr/share/licenses/virtualbox-guest-utils/LICENSE

よくわからんが、VBoxOGL.soというのがそれっぽい。じゃあ今のlibGL.soはなんなんだ?

glados% pacman -Qo /usr/lib/libGL.so
/usr/lib/libGL.so is owned by libglvnd 1.0.0-1

どうやらベンダのOpenGL実装を発見して動的にディスパッチしてくれるやつっぽいが、君動いてないよね?とりあえずこいつを無視してそれっぽい感じにしてみる。

glados% ln -sf /usr/lib/VBoxOGL.so /usr/lib/libGL.so.1.0.0

こうすると、glxgearsが300fpsくらい出るようになった。glxinfoも確認しておく。

glados% glxinfo | grep renderer
OpenGL renderer string: Chromium

Chromiumっていうのはブラウザではなく、他のレンダラにプロキシするレンダラらしい。あとxf86-video-fbdevとxf86-video-vesaもロードに失敗しているっぽいので入れておく。こうするとWebGLが動くようになった(俺達は雰囲気でLinuxをやっている)。

しかしIntelliJは依然としてアホみたいにCPUを食っているので厳しい……。レンダリングじゃなくて純粋にJavaVMと相性悪いのか?