Vagrant ✕ libvirt(KVM)の仮想マシンでX11転送する

vagrant-logo-2 vagrant
vagrant-logo-2

はじめに

以前、Vagrantを使用してlibvit(KVM)の仮想マシンを立ち上げました。今回はそのマシンをX11転送できるようにしていきます。

動作環境

  • ubuntu 22.04
  • vagrant 2.3.4

X11 Forwarding

参考リンクによると、X11転送はVagrantfileに次の2つを追加すればよさそうでした。

  1. config.ssh.forward_x11 = true
  2. config.ssh.forward_agent = true

そのときのVagrantfileは次のようになりました。

Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"

  config.ssh.forward_x11 = true
  config.ssh.forward_agent = true

  config.vm.provider "libvirt" do |vb|
    vb.cpus = "4"
    vb.memory = "4096"
  end
end

仮想マシンの再起動

それでは、仮想マシンを再起動して設定を反映します。vagrant reloadコマンドを実行します。

$ vagrant reload
==> default: Attempting graceful shutdown of VM...
==> default: Creating shared folders metadata...
・
・
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

次に、vagrant sshコマンドで仮想マシンにログインします。では、試しにxeyesでx11転送されるか確認してみましょう。その結果は、ディスプレイが開けないというエラーが出てしまいました。

$ vagrant ssh
$ sudo apt install x11-apps
$ xeyes 
Error: Can't open display:

どうやら原因はDISPLAY環境変数が設定されていないことにありそうです。

解決法

いろいろ探していると、vagrantのgithubのissueに似たような現象が報告されていました。X11転送を有効にするには/etc/ssh/sshd_configX11UseLocalhost noの設定がいるようです。

プロビジョニング

それでは、/etc/ssh/sshd_configを修正していきましょう。ここではプロビジョニングという機能を使います。

ちなみにプロビジョニングとは、仮想マシンを自動的にセットアップするために必要なスクリプトやコマンドを指定することです。プロビジョニングを行うことで、手動で仮想マシンを設定する手間を省くことができます。

Vagrantfileの修正

11行目で/etc/ssh/shd_configを修正してX11UseLocalhost noにしています。ついでに、8行目でaptのリポジトリを日本にあるサーバに変更しています。

Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"

  config.ssh.forward_x11 = true
  config.ssh.forward_agent = true

  config.vm.provision "shell", inline: <<-SHELL
    export DEBIAN_FRONTEND=noninteractive
    sed -i.org -e 's|mirrors.edge.kernel.org/ubuntu|ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/archives|g' /etc/apt/sources.list
    apt-get update && apt-get upgrade -y
    sed -i 's/[#]*X11UseLocalhost[ ]*[a-z]*/X11UseLocalhost no/' /etc/ssh/sshd_config
    systemctl restart sshd
  SHELL

  config.vm.provider "libvirt" do |vb|
    vb.cpus = "4"
    vb.memory = "4096"
  end
end

プロビジョニングの実行

それでは、プロビジョニングを実行しましょう。vagrant reload –provisionコマンドを実行します。稼働している仮想マシンを一旦シャットダウンしてプロビジョニングを始めます。

$ vagrant reload --provision

動作確認

最後に、動作確認してみましょう。まず、vagrant sshコマンドでログインします。すると、DISPLAY環境変数もちゃんと設定されています。

$ vagrant ssh
$ echo $DISPLAY
ubuntu2204.localdomain:10.0

では、xeyesを実行してみましょう。

$ xeyes

無事X11転送されてxeyesが表示されました。

コメント