Macbook のUTMで仮想Ubuntu 24 を使ってみた。一部失敗して諦め。
MacはSequoia 15.6
手順
- Ubuntu 24 isoをダウンロード。arm64のserver。
- UTMでisoを指定して起動。qemuじゃない方を選択。
起動はしたが、バックスラッシュとアンダースコアが入力できない。
以前のUbuntu 22の時はできていたのだが、そのファイルはこちら。
基本ログインから
# /etc/default/keyboard
XKBMODEL="pc105"
XKBLAYOUT="jp,jp"
XKBVARIANT=",mac"
XKBOPTIONS=""
BACKSPACE="guess"
sudo dpkg-reconfigure keyboard-configuration
でキーボードを色々変えてみたがダメ。
setxkbmap jp
を使えという話もあったが、これもダメ。
検索したがUbuntuなのに情報がない。
mozcの機能を使うという話もあったが、こちらはmozcもibusも使わないのだ。
xevでキーコードを検出してXmodmapで割り当てろ、という話も見たが、
xevでキーが検出されなかった。諦め。
Ubuntu側でssh-serverをたて、そこにログインすることでキーが使えるはず。
sudo apt install opensssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
sudo apt install ufw -y
sudo apt ufw allow ssh
sudo ufw enable
if a # でUbuntu側ipアドレスを確認
ssh username@Ubuntu側IPアドレス
で入れた。
Xのアプリを動かす
MacもX11なのでUbuntuのX11アプリも表示できるはず。
Mac側準備
Appleが公式にXQuartzを出しているが、デフォルトではインストールされていない。
XQuartz公式
からインストール。再起動は不要だった。
/etc/ssh/sshd_config を編集
# /etc/ssh/sshd_config
# 以下のコメントを外す
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
sudo systemctl restart ssh
そしてログアウトして再度sshでログイン
ssh -Y username@Ubuntu側IPアドレス
そしてUbuntu側でアプリ起動
sudo apt install x11-apps -y
xeyes
出た!
ここの時点でUbuntu側xtermもMacに表示が出て、バックスラッシュもアンダースコアも入力できる。バックスラッシュは円記号だが。
じゃあgnome-terminalも動くよな
でもエラーが出た
No matching fbConfigs or visuals found
glx: failed to create drisw screen
Mac側で間接的なGL描画を許可
defaults write org.xquartz.X11 enable_iglx -bool true
これでエラーは出なくなった。しかしUbuntuの方で表示されてしまう。
dbus-run-session -- gnome-terminal --working-directory=$HOME
で一瞬だけ表示されたが消えた。エラーメッセージはこちら
A connection to the bus can't be made
これは「dbus-run-session で作った一時的な通信路と、Ubuntu本体の通信路が衝突して自滅」ということだが対処方法がない。他のターミナルを探す。
xfce4-terminal
xterm
terminator
は使える。
さらに執念で表示させる
gnome-terminal が Mac 側の X11 サーバーと通信するのを邪魔している環境変数をリセット
GDK_BACKEND=x11 GNOME_TERMINAL_SCREEN=1 dbus-run-session -- bash -c "export DISPLAY=$DISPLAY; xauth add $(xauth list $DISPLAY); gnome-terminal --app-id=org.gnome.Terminal.Custom$(date +%s) --working-directory=$HOME"
warningがめっちゃ出るけどgnome-terminalがmacに表示された。
やっていること
| 呪文 | 効能 |
|---|---|
| GDK_BACKEND=x11 | Wayland阻止。MacはX11のみ |
| GNOME_TERMINAL_SCREEN=1 | 既存プロセスへの合流阻止。gnome-terminalは既存プロセスがあるとそちらに合流しようとする。 |
| dbus-run-session -- bash -c "..." | 隔離された通信箱の作成。通常、アプリはUbuntu本体の「D-Bus(アプリ間通信のハブ)」に繋がろうとする。しかし、SSH越しだとそのハブに触らせてもらえない。そこで、**「このコマンド専用の使い捨て通信ハブ(Session Bus)」**をその場で作って、その中でアプリを隔離して動かす。 |
export DISPLAY=$DISPLAY; xauth add $(xauth list $DISPLAY) |
鍵(認証情報)の持ち込み。 上の手順で作った「隔離された箱」の中は真っさらなので、Macへ映像を送るための宛先(DISPLAY)も、接続するための合鍵(xauth のマジッククッキー)もまだない状態。 箱の外(SSHセッション)から**「宛先はここだぞ」「鍵はこれだぞ」と情報を箱の中にコピー**する。 |
| gnome-terminal --app-id=org.gnome.Terminal.Custom$(date +%s) | 名前の偽装。gnome-terminal は起動時に「俺は org.gnome.Terminal だ」と名乗る。すると、Ubuntu本体側で動いている管理者が「お、その名前なら俺が面倒見るよ(でも画面はUbuntu側に出すぞ)」と横取りしてしまう。 ここで date +%s(現在の秒数)を使って org.gnome.Terminal.Custom174000000 のようにデタラメな名前を名乗らせることで、本体の管理者に気づかれず、Mac側のプロセスとして独立させることができる。 |
gnome-terminal --app-id=org.gnome.Terminal.Custom$(date +%s)
これだけで出た。今度はwarningは全くでない。これが正しいようだ。
Shift+Ctrl+C, Shift+Ctrl+V のコピペショートカットがUTMだと使えなかったが、これなら使えている。便利と言えば便利。
GTKプログラミング
目的であるGTKプログラミングのために、簡単なサンプルを動かす。
と、クラッシュ。
libEGL warning: DRI3 error: Could not get DRI3 device
libEGL warning: Ensure your X server supports DRI3 to get accelerated rendering
No matching fbConfigs or visuals found
glx: failed to create drisw screen
No provider of glGenSamplers found. Requires one of:
Desktop OpenGL 3.3
GL_ARB_sampler_objects
OpenGL ES 3.0
中止 (コアダンプ)
XLIB_SKIP_ARGB_VISUALS=1 GSK_RENDERER=cairo python3 test.py
これは、warningは消えないが、起動できる。
GLをやめるとワーニングもなくなり、起動できた。
GDK_DEBUG=gl-disable GSK_RENDERER=cairo python3 test.py