読者です 読者をやめる 読者になる 読者になる

Arch Linux で Chrome Remote Desktop

目的

細い回線でリモートデスクトップしたい。 サーバは Arch Linux でクライアントは OS X ないし Android

x11vnc, xrdp, Chrome Remote Desktop (CRD) を試したのだが、 この中では CRD が最も速く使い勝手がよいという結論に達した。 ただ CRD は導入の手順がやや分かりにくいため、ここに記録しておくことにする。

最終的な構成

f:id:crckyl:20150314232653p:plain

サーバ側は CRD が Xvfb を起動する以外は基本的に CUI で使う。 ただし初期設定に chromium が必要なので、そのときだけ ssh -Y する。

インストール

AUR の chrome-remote-desktop を使う。

$ yaourt -S chrome-remote-desktop

このままでは上手く動かないので、コメント欄を参考に少しいじる。

$ /opt/google/chrome-remote-desktop/chrome-remote-desktop --add-user
$ echo openbox-session > ~/.chrome-remote-desktop-session
$ mkdir ~/.config/chrome-remote-desktop
# mv /etc/chromium/native-messaging-hosts{,.bak}
# ln -s /etc/opt/chrome/native-messaging-hosts /etc/chromium/

chrome-remote-desktop --add-user でログインユーザが chrome-remote-desktop グループに追加される。ここでログインし直しておく。

iptables の設定

Google を通していわゆる NAT 越えというやつをやるので、iptables まわりの設定は特に必要ないようだ。 ヘルプの「共有に関する問題のトラブルシューティング」セクションによれば、tcp 443, tcp 5222 を使うとある。

初期設定

画面がないので ssh -Y server chromium する。 chrome web store で Chrome Remote Desktop をインストールして起動すると、 以下のスクリーンショットのようになる。

f:id:crckyl:20150314231813p:plain

"Enable remote connections" ボタンが出ていない場合は設定に失敗している。 どうやらこのボタンが /opt/google/chrome-remote-desktop あたりにある python スクリプトを起動するようなので、そのあたりをチェックするとよい、かもしれない。

"Enable remote connections" ボタンをクリックすると、PIN の入力を促され、サーバが起動する。 クライアント側の chromium で接続できることを確認し、 ~/.config/chrome-remote-desktop/host#6f129a2e6e103ea3xxxxxxxxxxxxxxxx.json というふうなファイルができていることを確認する。 "Disable remote connections" せずにサーバ側 chromium を閉じる。

$ /opt/google/chrome-remote-desktop/chrome-remote-desktop --stop
$ ps -ef | grep chrome-remote-desktop # プロセスが残ってないことを確認
$ systemctl --user start chrome-remote-desktop
$ systemctl --user status chrome-remote-desktop # 起動したことを確認

画面解像度の設定と自動起動

/opt/google/chrome-remote-desktop/chrome-remote-desktop を見ると CHROME_REMOTE_DESKTOP_DEFAULT_DESKTOP_SIZES 環境変数でデスクトップのサイズを指定できることがわかる。 systemd の設定ファイルは /usr/lib/systemd/user/chrome-remote-desktop.service にあるので、 これを ~/.config/systemd/user/ にコピーして書き換える。

$ cp /usr/lib/systemd/user/chrome-remote-desktop.service ~/.config/systemd/user/
$ vim ~/.config/systemd/user/chrome-remote-desktop.service
$ diff -u /usr/lib/systemd/user/chrome-remote-desktop.service ~/.config/systemd/user/chrome-remote-desktop.service
--- /usr/lib/systemd/user/chrome-remote-desktop.service 2015-03-13 23:51:05.000000000 +0900
+++ /home/odd/.config/systemd/user/chrome-remote-desktop.service        2015-03-14 05:13:12.330063438 +0900
@@ -5,6 +5,7 @@
 
 [Service]
 Type=forking
+Environment=CHROME_REMOTE_DESKTOP_DEFAULT_DESKTOP_SIZES=1280x720 CHROME_REMOTE_DESKTOP_LOG_FILE=%h/.config/chrome-remote-desktop/log
 ExecStart=/opt/google/chrome-remote-desktop/chrome-remote-desktop --start
 ExecStop=/opt/google/chrome-remote-desktop/chrome-remote-desktop --stop
 ExecReload=/opt/google/chrome-remote-desktop/chrome-remote-desktop --reload
$ cat ~/.config/systemd/user/chrome-remote-desktop.service
[Unit]
Description="Chrome Remote Desktop host daemon"
ConditionDirectoryNotEmpty=%h/.config/chrome-remote-desktop
ConditionPathExistsGlob=%h/.config/chrome-remote-desktop/host#*.json

[Service]
Type=forking
Environment=CHROME_REMOTE_DESKTOP_DEFAULT_DESKTOP_SIZES=1280x720 CHROME_REMOTE_DESKTOP_LOG_FILE=%h/.config/chrome-remote-desktop/log
ExecStart=/opt/google/chrome-remote-desktop/chrome-remote-desktop --start
ExecStop=/opt/google/chrome-remote-desktop/chrome-remote-desktop --stop
ExecReload=/opt/google/chrome-remote-desktop/chrome-remote-desktop --reload

[Install]
Alias=chromoting.service
WantedBy=default.target

[Service]Environment の行を追加した。 動作確認したら enable しておこう。

$ systemctl --user daemon-reload
$ systemctl --user restart chrome-remote-desktop # 動作確認
$ systemctl --user enable chrome-remote-desktop