NVIDIA製GPU付きホスト上のLXDでOpenGLを使用する方法


背景

LXD上でROSのGUIを出そうと思ったらOpenGLのversionがmesaは1.2までしか対応していないけれど1.4を要求されるので動かないという事態が発生した。
NVIDIAじゃなくてIntelのeGPUとかでも動く。

解決策

ホストにはNVIDIAのGPUが刺さっているので、これをコンテナから使えるようにしてやる。
基本的にはこれこれの内容を組み合わせてまとめただけである。

1度だけやる必要のある処理

これはホストに変更を加える。
ホスト側のUID周りの設定を変更して、LXCコンテナに存在するユーザをホストのユーザにマップできるようにする。こうすることでホストのドライバやGPUを使えるようにする。

echo "root:$UID:1" | sudo tee -a /etc/subuid /etc/subgid

コンテナに適用する処理

ここではコンテナの名前をnoeticとする。

lxc launch ubuntu:20.04 noetic

以下のコマンドはLXCコンテナのユーザを実際にホストのユーザにマップしている。

lxc config set noetic raw.idmap "both $UID 1000"
lxc restart noetic

以下のコマンドはLXCコンテナの中からX serverにアクセスできるように、必要なファイルをマウントしている。

lxc config device add noetic X0 disk path=/tmp/.X11-unix/X0 source=/tmp/.X11-unix/X0 
lxc config device add noetic Xauthority disk path=/home/ubuntu/.Xauthority source=${XAUTHORITY}

以下のコマンドはgpuをLXCコンテナに追加して、マップしたユーザで使用できるようにUIDとGIDを設定する。

lxc config device add noetic mygpu gpu
lxc config device set noetic mygpu uid 1000
lxc config device set noetic mygpu gid 1000

NVIDIAのGPUを使っている場合は以下のコマンドでLXCコンテナにNVIDIAのGPUを利用するための全権限を許可する。IntelのeGPUとかであればこの設定は不要。

lxc config set noetic nvidia.driver.capabilities all
lxc config set noetic nvidia.runtime "true"

設定を反映するために再起動する。

lxc restart noetic

テスト

設定がうまく行ったか確認する

lxc exec noetic -- sudo --login --user ubuntu
sudo apt update
sudo apt install x11-apps mesa-utils alsa-utils
nvidia-smi
export DISPLAY=:0
xclock
glxgears