Qemu をSSH越しに動かしたい (gtk initialization failed)
背景
開発サーバでQemu仮想マシン(VM)を動かしたいけど、SSHで接続していることを想定している。デスクトップへアクセスしている場合はターミナルからqemu-system-x86_64コマンドを実行するとGTKのGUIフロントエンドが起動する。仮想マシン上でCLIしか使用しない場合でも同様である。
開発サーバへ通常SSHでアクセスし、作業している環境でVMの起動のためにリモートデスクトップをするのが面倒、遅いときにターミナルで画面が確認したくなったので調べてみた。(VMでの作業が目的なら、VMを画面なしで起動し、SSHでアクセスすればよいが、今回はカーネルのブート状況が見たかった。)
ちなみにデスクトップにアクセスしているときのように単純に起動しようとすると次のようになる。
$ qemu-system-x86_64 -m 4G -enable-kvm -drive if=pflash,format=raw,readonly=on,file=/usr/share/ovmf/OVMF.fd -drive file=./disk.raw,format=raw,if=virtio -cpu host
gtk initialization failed
解決方法
オプション1
-nographic をつけて実行する
例: qemu-system-x86_64 -m 4G -enable-kvm -drive if=pflash,format=raw,readonly=on,file=/usr/share/ovmf/OVMF.fd -drive file=./debian-13-generic-amd64.raw,format=raw,if=virtio -cpu host -nographic
画面:

VMはCtrl + a xで終了できる。Ctrl + a cとするとQemuモニタに切り替わるのでここでq(enter)としても終了できる。
localhost login: QEMU 7.2.19 monitor - type 'help' for more information
(qemu) q
オプション2と比較して軽く動作した。
オプション2
-display curses をつけて実行する
例: qemu-system-x86_64 -m 4G -enable-kvm -drive if=pflash,format=raw,readonly=on,file=/usr/share/ovmf/OVMF.fd -drive file=./debian-13-generic-amd64.raw,format=raw,if=virtio -cpu host -display curses
画面:

このオプションで起動するとVGA出力の画面になるので、Alt + 3でコンソール出力の画面に切り替えられる。(動画内でも切り替えている)
gtk での画面をテキストベースで再現しているような動作になる。ただし画面の解像度を再現するため、表示がターミナルいっぱいに表示されない。
VMはAlt + 2で表示されるQemuモニタ画面でq (Enter)すると終了できる。
QEMU 7.2.19 monitor - type 'help' for more information
(qemu)q
Discussion