結局やりたいことは、Vagrant上で動作しているTensorFlowなどで、GUIで結果を確認したいだけのことなんだけど、いろいろ調べて、構築するのに結構時間がかかった。
やりたいこと
Vagrant上で動作しているアプリケーションは基本CUIで動作するのだが、GUIのウィンドウも立ち上がるようにしたい。 このために、Vagrant+Putty+Xmingで環境を構築する。
Vagrantの設定
VagrantFileに、以下の2行を追加する。 一行目は、IPアドレスを固定している。これにより、Puttyなどで接続するときに毎回アドレスが変わるのを防いでいる。 次に、Xウィンドウのポートフォワードを設定している。これにより、GUIでの接続を可能にしている。
config.vm.network "private_network", ip: "192.168.33.10" config.ssh.forward_x11 = true
config.ssh - Vagrantfile - Vagrant Documentation
config.ssh.forward_agent - If true, agent forwarding over SSH connections is enabled. Defaults to false.
これで、sshフォワーディングにより、Xが起動できるようになる。 この後、とりあえずvagrant halt && vagrant up して、環境を再構築しておく。
Puttyの設定
Puttyに、上記のIP: 192.168.33.10 に接続するプロファイルを追加しておく。
このプロファイルは、Xmingで接続するときに利用する。ちなみに、通常のsshでも同様のことが実現できるが、Puttyの方がパスワードを記録しておいてくれるので操作が楽になる。
Xmingの設定
Xmingは、Windows用のX-Windowのサーバだ。これを使って、Vagrant内のUbuntuのプログラムのGUIをWindowsのGUIとして表示させるようにする。 まずは、Xmingをインストールするところから。下記URLからダウンロードしてインストールする。
Xlaunchで、接続用のプロファイルを作る
- Xlaunchを立ち上げる。
- display settingsでは、僕はマルチウィンドウが好きなので、Multiple Windowsを指定
- 最初に何を起動させるか指定。とりあえず、ちゃんと起動していることを確認するために、"Start a program"を指定しておこう。
- 起動するプログラムを指定。ここでは、gnome-terminalを指定しておいた。接続にはPuttyを用いる。そして、先程指定した対象となるBoxのIPアドレスを指定し、ユーザ名、パスワード(任意)を入力しておく。
- 次の設定は特になにもしない
- 設定を保存しておく。僕はパスワードも一緒に保存しているが、これは任意。
作成した設定ファイルをダブルクリックして起動
先程作成したコンフィグレーションデータをダブルクリックしてXlaunchを立ち上げる。ただしここではVagrantで、対象となる仮想マシンが立ち上がっていることが前提。
これで、このように仮想マシン内のGUIアプリケーションを呼ぶことができるようになる。もちろん、大好きなEmacsを立ち上げることも可能。
VagrantのCUI側からGUIのアプリケーションを立ち上げることは可能なのか
今回は、まずgnome-terminalを呼び出してからEmacsなどのGUIアプリケーションを呼び出したが、Vagrant sshしたターミナルからGUIのアプリケーションを立ち上げることはできるのか。 普通にGUIアプリケーションを起動させようとしても、失敗してしまう。
vagrant@vagrant-ubuntu-precise-64:~$ gnome-terminal Failed to parse arguments: Cannot open display: vagrant@vagrant-ubuntu-precise-64:~$ xterm xterm Xt error: Can't open display: xterm: DISPLAY is not set
DISPLAY変数が設定されていないようだが、これは実際にはどのように設定すれば良いのだろう?
とりあえず見様見真似でやってみよう。DISPLAY=:10.0を追加してみる。
vagrant@vagrant-ubuntu-precise-64:~$ DISPLAY=:10.0 emacs&
立ち上がった!