CUBE SUGAR CONTAINER

技術系のこと書きます。

Multipass の仮想マシンで X Window System のアプリケーションを使う

今回は Multipass で作った仮想マシン上で X Window System のアプリケーションを使う方法について。 やり方としては、Multipass の仮想マシンに ssh(1) を使ってログインできるようにした上で X11 Forwarding すれば良い。

使った環境は次のとおり。

$ sw_vers   
ProductName:    macOS
ProductVersion: 12.4
BuildVersion:   21F79
$ uname -srm
Darwin 21.5.0 x86_64
$ multipass version                                                                        
multipass   1.10.0+mac
multipassd  1.10.0+mac

もくじ

下準備

まずはローカルのマシンに X Server (XQuartz) と Multipass をインストールする。 今回は Homebrew を使って入れる場合の例になる。

$ brew install --cask xquartz multipass

XQuartz を初めてインストールする場合には、おそらくユーザの再ログインが必要になる。

そして、インストールした Multipass を使って仮想マシンを作る。 ここでは Ubuntu 20.04 LTS のホストを focal という名前で作成している。

$ multipass launch \
    --name focal \
    --cpus 2 \
    --mem 2048M \
    20.04

次のように仮想マシンが起動すれば良い。

$ multipass list       
Name                    State             IPv4             Image
focal                   Running           192.168.64.2     Ubuntu 20.04 LTS

仮想マシンに X Window System のアプリケーションをインストールする。 今回は例として x11-apps の xeyes(1) を使う。

$ multipass exec focal -- bash -c "sudo apt-get install x11-apps"

上記はワンライナーにしてあるけど、ログインした上で実行するのであれば次のようにする。 なお、ローカルのマシンと仮想マシンを区別するために、以降では仮想マシン上での操作はターミナルの先頭に (focal) とつけることにする。

$ multipass shell focal
(focal) $ sudo apt-get install x11-apps

公開鍵を仮想マシンに登録する

続いて、ローカルのマシンで生成した公開鍵を Multipass の仮想マシンに登録する。

もし、ローカルのマシンに公開鍵が無いときは、ssh-keygen(1) で作る。 オプションについてはお好みで。

$ ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -P ''
$ ls ~/.ssh | grep id_rsa
id_rsa
id_rsa.pub

上記で作成した公開鍵を仮想マシンに登録する。 次のようなワンライナーで実行できる。 $(cat ~/.ssh/id_rsa.pub) の部分がローカルのマシンで生成した公開鍵にインラインで置換される。 <vm-name> の部分には仮想マシンの名前を入れる。

$ multipass exec <vm-name> -- bash -c "echo $(cat ~/.ssh/id_rsa.pub) >> ~/.ssh/authorized_keys"

今回であれば仮想マシンの名前は focal なので、次のとおり。

$ multipass exec focal -- bash -c "echo $(cat ~/.ssh/id_rsa.pub) >> ~/.ssh/authorized_keys"

ssh(1) で仮想マシンにログインする

公開鍵の登録ができたので、次は X11 Forwarding を有効にして ssh(1) で仮想マシンにログインする。

仮想マシンの IP アドレスは multipass info サブコマンドで取得できる。 ワンライナーで IP アドレスだけを抽出するには、次のようにすれば良い。

$ multipass info focal | grep IPv4 | awk '{print $2}'
192.168.64.2

上記の IP アドレスに ssh(1) でログインする。 このとき -X オプションを指定して X11 Forwarding する。

$ ssh -X \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    ubuntu@$(multipass info focal | grep IPv4 | awk '{print $2}')

上記は仮想マシンのフィンガープリントをローカルのマシンに登録しない場合の例。 これは、Multipass を使っていると仮想マシンを作り直すことも多いため。

X Window System のアプリケーションを実行する

ログインできたら仮想マシン上で X Window System のアプリケーションを実行するだけ。

(focal) $ xeyes

上手くいけば次のようにウィンドウが表示されるはず。

xeyes(1) のウィンドウ

いじょう。