elementary OS にVNCをインストール

# はじめに
いろいろな事情でRやPythonの計算用マシンをWindowsからLinuxに移行することにしました。
で、見た目すてきなelementary OS、と思ったのですが、リモートコントロールする方法を見つけるのにだいぶ手間取ったので、自分用も兼ねて手順をメモします。

# 使った物
* [elementary OS 0.4.1 Loci](https://elementary.io/ja/)
* [TigerVNC 1.8.80](http://tigervnc.org)
* [VirtualGL 2.5.2](http://www.virtualgl.org)

# テスト環境
MacBook Pro Retina 13'' Late 2013のVMware Fusion 8.5.7上の仮想マシン。

# 手順
## elementary OSのインストール
[本家](https://elementary.io/ja/)からISOをダウンロードしてelementary OSをインストールします。寄付しないとダウンロード出来なそうなデザインのページですが、カスタムに$0を入力すれば寄付なしでもダウンロード出来ます。もちろん、寄付をしてもOKです。
インストール自体はあまり迷うこともないと思うので説明しませんが[ここ](http://mogi2fruits.net/blog/os-software/linux/elementary-os/2772/)とか[ここ](http://zaka-think.com/linux/ubuntu/elementary-os-を入れて最初にやったこと/)とかが参考になると思います。あとはお約束のGoogle先生に・・・。

## TigerVNCのインストール
VNCの実装としては、[なにやらよさげな](http://w.vmeta.jp/tdiary/20130203.html)TigerVNCをインストールします。
まず[公式サイト](http://tigervnc.bphinz.com/nightly/)からUbuntu 16.04LTS用のコンパイル済みバイナリ（執筆時点ではtigervncserver_1.8.80+20170605git70d216e1-1ubuntu1_amd64.deb）をダウンロードします。
ダウンロードしたファイルがある場所をターミナルで開き

```sh
sudo dpkg -i tigervncserver_1.8.80+20170605git70d216e1-1ubuntu1_amd64.deb
```

を打ち込みます。
すると、依存関係にあるパッケージがインストールできないうんぬん、とか言われるので、

```sh
sudo apt install -f
```

コマンドで依存パッケージをインストールし、再度

```sh
sudo dpkg -i tigervncserver_1.8.80+20170605git70d216e1-1ubuntu1_amd64.deb
```

を叩いてTigerVNCをインストールします。

## VirtualGLのインストール
TigerVNCだけだと接続に成功しても黒い画面しか表示されないようなので、VirtualGLもインストールします。
こちらも[ダウンロードページ](https://sourceforge.net/projects/virtualgl/files/)からコンパイル済みバイナリ（執筆時点ではvirtualgl_2.5.2_amd64.deb）をダウンロードします。
TigerVNCと同様にターミナルでファイルのある場所を開き、

```sh
sudo dpkg -i virtualgl_2.5.2_amd64.deb
```

でインストールします。

## VNCサーバーの起動
VNCの設定ファイルを生成させるため、ターミナルに`vncserver`コマンドを打ち込み、VNCサーバーを一度起動させます。
初回起動時にはVNCアクセス用のパスワードを聞かれるので入力します。
サーバーが起動したら、`vncserver -kill :1`コマンドでいったんサーバーを終了します。

## 設定ファイルの変更
生成された設定ファイルは`~/.vnc/xstartup`にあります。
失敗したときのために`cp xstartup startup.bak`でとりあえずバックアップを作成し、お好みのエディタで`xstartup`を開きます。
（何もなければ標準搭載の`editor`コマンドでもファイルが編集できます。）
デフォルトで設定ファイルは以下のようになっているので、これを書き換えていきます。

```sh
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
OS=`uname -s`
if [ $OS = 'Linux' ]; then
  case "$WINDOWMANAGER" in
    *gnome*)
      if [ -e /etc/SuSE-release ]; then
        PATH=$PATH:/opt/gnome/bin
        export PATH
      fi
      ;;
  esac
fi
if [ -x /etc/X11/xinit/xinitrc ]; then
  exec /etc/X11/xinit/xinitrc
fi
if [ -f /etc/X11/xinit/xinitrc ]; then
  exec sh /etc/X11/xinit/xinitrc
fi
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &
```

変更するのは２点です。まず17行目と20行目の`exec`を`vglrun`に置き換えます。
さらに最後の`twm &`をPantheon起動用に`vglrun /usr/bin/gnome-session --session=pantheon`に書き換えます。
変更後のファイルは下のような感じになります。

```sh
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
OS=`uname -s`
if [ $OS = 'Linux' ]; then
  case "$WINDOWMANAGER" in
    *gnome*)
      if [ -e /etc/SuSE-release ]; then
        PATH=$PATH:/opt/gnome/bin
        export PATH
      fi
      ;;
  esac
fi
if [ -x /etc/X11/xinit/xinitrc ]; then
  vglrun /etc/X11/xinit/xinitrc
fi
if [ -f /etc/X11/xinit/xinitrc ]; then
  vglrun sh /etc/X11/xinit/xinitrc
fi
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
vglrun /usr/bin/gnome-session --session=pantheon
```

## 接続テスト
接続テスト用にターミナルに`vncserver`コマンドを入力し、サーバーをもう一度起動します。
画面の解像度を変えるには`-geometry`オプションを使い、`vncserver -geometry 1280x800`のようにピクセル数を指定します。（Retina解像度（2560x1600）ではだいぶ動きが遅かったので半分の解像度を使いました。）
接続にはMac標準のVNCクライアント（画面共有）を使いました。
Finderのメニュー→移動→サーバへ接続で```vnc://マシンのアドレス:5901```を入力して接続します。
うまく行けば接続先のGUI環境が表示されるはずです。

# 試していないこと
標準レポジトリにある`vnc4server`でもVirtualGLを使えば接続可能なのかもしれませんが、試していません。
あとはXRDPが使いたいなぁ。。。

# おわりに
Linux初心者なのでなにか間違っているかもしれません。
間違いに気付いた方はお知らせ下さい。