サーバーを触らず Lubuntu に
Chrome Remote Desktop を設定した

  • ディスプレイやキーボードを接続していないヘッドレスサーバーでも、SSH と macOS のブラウザだけで Chrome Remote Desktop の設定を完結できます。
  • インストールやセッション設定は SSH で行い、Google 認証コマンドだけ macOS 側のブラウザで取得して SSH に貼り付けるのがポイントです。
  • デスクトップ環境ごとに ~/.chrome-remote-desktop-session の起動コマンドが変わるため、事前に環境確認スクリプトで何が入っているかを把握しておくと確実です。
  • Lubuntu(LXQt)・Linux Mint(Xfce)など異なるディストリビューションでも、セッション設定のコマンドを差し替えるだけで同じ手順が通ります。

関連記事

1. セットアップの全体像

1.1. サーバーを触らずにリモートデスクトップを設定する

自宅サーバーにディスプレイやキーボードを常時つないでいない場合、Chrome Remote Desktop を設定するためだけに周辺機器を引っ張り出すのは面倒です。
設定が終われば不要になるものを、設定のためだけに用意するのは本末転倒でもあります。

Chrome Remote Desktop は、SSH と macOS 側のブラウザだけで設定が完結します。
鍵になるのは、Google 認証に必要なコマンドを macOS 側のブラウザで発行し、そのコマンドを SSH 経由で貼り付けるという手順です。
「ブラウザ操作は Linux 実機上でやるもの」と思い込みがちですが、実際には macOS 側で代替できます。

1.2. 前提と構成

対象環境はこの通りです。

  • 接続先:Lubuntu 24.04(デスクトップ環境は LXQt)
  • 接続元:macOS
  • Linux サーバーへのアクセス手段:SSH のみ

Chrome Remote Desktop の仕組みはシンプルで、Linux 側でホストプロセスが起動し、Google のリレーサーバーを介して macOS 側のブラウザと通信します1
Linux 側にポートを直接開ける必要はありません2

1.3. 環境確認:まず何が入っているかを把握する

設定に入る前に、Linux 側の環境を確認します。
LXQt のコマンドパスやすでに入っているパッケージによって、後続の手順が変わるためです。

以下のスクリプトを SSH 先で実行してください。

cat > crd_check.sh <<'EOF'
#!/usr/bin/env bash
set -u

echo "=== OS ==="
cat /etc/os-release
echo

echo "=== Kernel / Architecture ==="
uname -a
dpkg --print-architecture 2>/dev/null || true
echo

echo "=== Current user ==="
id
echo

echo "=== Desktop session files ==="
ls -la /usr/share/xsessions/ 2>/dev/null || echo "No /usr/share/xsessions/"
echo

echo "=== LXQt related commands ==="
for cmd in startlxqt lxqt-session openbox dbus-launch Xorg xauth; do
  printf "%-16s : " "$cmd"
  command -v "$cmd" || echo "not found"
done
echo

echo "=== Installed packages ==="
dpkg -l 2>/dev/null | grep -Ei \
  'chrome-remote-desktop|google-chrome|chromium|lxqt|lubuntu|openbox|dbus-x11|xserver-xorg|xauth' \
  || echo "No matching packages found"
echo

echo "=== Chrome Remote Desktop files ==="
ls -la /opt/google/chrome-remote-desktop/ 2>/dev/null \
  || echo "Not installed"
echo

echo "=== Session config ==="
f="$HOME/.chrome-remote-desktop-session"
[ -f "$f" ] && cat "$f" || echo "Not found"
echo

echo "=== Group membership ==="
id -nG "$USER" | tr ' ' '\n' | grep -x chrome-remote-desktop \
  && echo "In group: YES" || echo "In group: NO"
echo

echo "=== Service status ==="
systemctl status "chrome-remote-desktop@$USER" --no-pager 2>&1 || true
echo
EOF

chmod +x crd_check.sh
./crd_check.sh | tee crd_check_result.txtCode language: Bash (bash)

確認するのは主に3点です。

  • startlxqt/usr/bin/startlxqt に存在するか
  • chrome-remote-desktop パッケージがまだ入っていないか
  • 現在のユーザーが chrome-remote-desktop グループに属していないか

startlxqt が見つからない場合は、ls /usr/share/xsessions/cat /usr/share/xsessions/lxqt.desktopExec= の行を確認し、実際のコマンドパスを把握しておきましょう3

2. Linux 側の設定

2.1. パッケージのインストールとセッション設定

Chrome Remote Desktop のホストパッケージを Google の配布元から取得し、インストールします。

cd /tmp
wget https://dl.google.com/linux/direct/chrome-remote-desktop_current_amd64.deb
sudo apt update
sudo apt install -y ./chrome-remote-desktop_current_amd64.debCode language: Bash (bash)

インストール時に xserver-xorg-video-dummyxvfbxbase-clientspython3-psutil などが追加で入ります。
これらは Chrome Remote Desktop が仮想ディスプレイと X11 セッションを起動するために使う依存パッケージです4

次に、Chrome Remote Desktop が接続時に起動するデスクトップ環境を指定します5

echo "exec /usr/bin/startlxqt" > ~/.chrome-remote-desktop-sessionCode language: Bash (bash)

startlxqt のパスが異なる場合は which startlxqt で確認して置き換えてください。

ユーザーを chrome-remote-desktop グループに追加し、反映のために再起動します6

sudo usermod -a -G chrome-remote-desktop "$USER"
sudo rebootCode language: Bash (bash)

グループへの追加はログアウトと再ログインでも反映できますが、SSH 接続を切って入り直す場合でも exec su - "$USER" では反映されないことがあります。
再起動が確実です7

再起動後、SSH で入り直して確認します。

id
systemctl status chrome-remote-desktop@$USER --no-pagerCode language: Bash (bash)

idchrome-remote-desktop が含まれ、サービスが inactive (dead) であれば正常です。
この時点ではまだ Google アカウントとの紐づけが済んでいないため、サービスは起動しません。

2.2. Google 認証:macOS のブラウザと SSH をつなぐ

ここが「サーバーを触らずに完結させる」肝になる手順です。

macOS 側のブラウザで以下を開き、Lubuntu に紐づける Google アカウントでログインします。

https://remotedesktop.google.com/accessCode language: JavaScript (javascript)

「リモート アクセスの設定」から「別のパソコンを設定」を選ぶと、Debian Linux 向けの登録コマンドが表示されます。
コマンドの形式はこのようなものです。

DISPLAY= /opt/google/chrome-remote-desktop/start-host \
  --code="4/0A..." \
  --redirect-url="https://remotedesktop.google.com/_/oauthredirect" \
  --name=$(hostname)Code language: Bash (bash)

--code の値は一時的な OAuth 認証コードで、一定時間で失効します。
表示されたらすぐ次へ進んでください8

2.3. ホスト登録とサービス起動の確認

上のコマンドをコピーし、SSH 先の Lubuntu に貼り付けて実行します。
コマンドは macOS のブラウザで発行されたものですが、実行するのは Linux の SSH セッション上です。

実行すると PIN の入力を求められます。
6桁以上の数字を設定し、確認のため同じ PIN をもう一度入力します。
その後 sudo のパスワードを求められます。

初回実行時に次のようなメッセージが出ることがあります。

[ERROR] Failed to read /home/chii/.config/chrome-remote-desktop/host#....jsonCode language: PHP (php)

設定ファイルがまだ存在しないために出るもので、登録処理の中で作成されます9
最終的に以下が出れば成功です。

Host started successfully.

続けて状態を確認します。

systemctl status chrome-remote-desktop@$USER --no-pager
ls -la ~/.config/chrome-remote-desktop/Code language: Bash (bash)

active (running) になっていれば、ホストとして待受を始めています。
host#....json ファイルが作成されていることも確認できます。

3. 接続と確認

3.1. macOS から接続する

macOS 側のブラウザで以下を開きます。
ホスト登録で使ったものと同じ Google アカウントでログインしていれば、$(hostname) で指定したホスト名が一覧に表示されます。

https://remotedesktop.google.com/accessCode language: JavaScript (javascript)

ホスト名を選択すると PIN の入力を求められます。
登録時に設定した PIN を入力すると、ブラウザ内に Lubuntu の LXQt デスクトップが表示されます10

3.2. ハマりやすいポイント

グループ反映のタイミング

sudo usermod -a -G chrome-remote-desktop "$USER" を実行しても、既存の SSH セッションには反映されません。
idchrome-remote-desktop が出ない場合は再起動してください。

初回の json 読み込みエラー

Failed to read host#....json は無視して構いません。
Host started successfully. が出ていれば登録は完了しています。

ローカルセッションとの競合

Lubuntu に物理的にログイン中の LXQt セッションと Chrome Remote Desktop のセッションが同時に動くと、黒画面や操作不能になることがあります。
Chrome Remote Desktop 経由でのみ使う場合は、Lubuntu 側のローカルセッションをサインアウトしておくと安定します11

LXQt 以外の場合

古い Lubuntu(18.04 以前)は LXDE が標準デスクトップ環境で、startlxqt は存在しません12
その場合はセッション設定を次のように変えます。

echo "exec /usr/bin/lxsession -s Lubuntu -e LXDE" > ~/.chrome-remote-desktop-sessionCode language: Bash (bash)

Linux Mint(Cinnamon)など別のデスクトップ環境でも、/usr/share/xsessions/ 内の .desktop ファイルの Exec= を確認し、同じ要領でセッション設定を書けば動きます。

4. 別の環境への応用:Linux Mint + Xfce の場合

4.1. 環境確認で違いを把握する

同じ手順を別のマシンで試したところ、OS が Linux Mint 22.3、デスクトップ環境が Xfce という構成でした。
crd_check.sh を実行すると /usr/share/xsessions/ には xfce.desktop だけが存在し、startlxqt など LXQt 系コマンドはありませんでした。

このように、まず環境確認スクリプトで何が入っているかを把握することで、セッション設定のコマンドを決められます。

4.2. Xfce 用のセッション設定

Xfce の場合、セッション設定は次のように書きます。

echo "exec /usr/bin/xfce4-session" > ~/.chrome-remote-desktop-sessionCode language: Bash (bash)

xfce4-session が存在するかは which xfce4-session で確認できます。
コマンドが見つからない場合は、先にインストールしてください。

sudo apt install -y xfce4 dbus-x11Code language: Bash (bash)

その後の手順はこれまでと同じです。
グループ追加と再起動、macOS 側ブラウザでの登録コマンド取得、SSH 先での実行という順番で進めます。

4.3. ディストリビューションとデスクトップ環境の対応

どの環境でも変わらない手順はパッケージのインストール、グループ追加、登録コマンドの実行です。
変わるのは ~/.chrome-remote-desktop-session に書くコマンドだけです。

デスクトップ環境ごとのコマンドはこの通りです。

  • LXQt(Lubuntu 18.10 以降):exec /usr/bin/startlxqt
  • Xfce(Linux Mint、Ubuntu Xfce 版など):exec /usr/bin/xfce4-session
  • Cinnamon(Linux Mint 標準):exec /etc/X11/Xsession /usr/bin/cinnamon-session-cinnamon2d
  • LXDE(Lubuntu 18.04 以前):exec /usr/bin/lxsession -s Lubuntu -e LXDE

正確なコマンドは /usr/share/xsessions/ 内の .desktop ファイルの Exec= 行で確認してください。
その値を ~/.chrome-remote-desktop-session に書けば、他の環境でも同じ手順が通ります。

  1. 通信方式は STUN または TURN で、ネットワーク状況に応じて切り替わります。TURN モードではパケットが Google のデータセンターを経由し、UDP/TCP ポート 3478 を使います。一般的なルーター環境では Linux 側からのアウトバウンド接続が通れば動作します。 – Chrome Remote Desktop network guide
  2. Linux ホストが Google のサーバーに対してアウトバウンド接続を開始する構造のため、ルーターのポート開放や静的 IP は不要です。ファイアウォールが外部からの着信をすべて遮断していても動作します。 – Chrome Remote Desktop network guide
  3. ~/.chrome-remote-desktop-session はユーザーごとのセッション設定ファイルで、Chrome Remote Desktop が X セッションを起動する際に参照します。このファイルが存在しない場合は接続時にデスクトップ環境の選択画面が表示されます。/usr/share/xsessions/ 内の .desktop ファイルの Exec= 行を確認してコマンドを特定するのが公式推奨の手順です。 – Access another computer with Chrome Remote Desktop
  4. xserver-xorg-video-dummy は物理的なビデオカードなしに X11 セッションを起動するダミービデオドライバで、Chrome Remote Desktop はバージョン 108 以降このドライバを仮想ディスプレイとして標準採用しています。xvfb(X Virtual Frame Buffer)は物理ディスプレイを持たないマシンで X11 アプリを動かすための仮想フレームバッファサーバで、xserver-xorg-video-dummy が使えない場合の代替として機能します。 – AUR chrome-remote-desktop
  5. ~/.chrome-remote-desktop-session はユーザー単位の設定ファイルで、グローバル設定の /etc/chrome-remote-desktop-session よりも優先されます。別のデスクトップ環境に切り替えたい場合はこのファイルを書き換え、sudo systemctl restart chrome-remote-desktop@$USER を実行します。 – Set up Chrome Remote Desktop for Linux on Compute Engine
  6. chrome-remote-desktop グループへの所属は、Chrome Remote Desktop サービスがそのユーザーのセッションを起動する際の PAM 認証で確認されます。グループに入っていないとセッションが起動しません。 – Set up Chrome Remote Desktop for Linux on Compute Engine
  7. Linux では usermod によるグループ変更は、そのユーザーが新たにログインセッションを開始するまで既存プロセスに反映されません。SSH で接続し直しても PAM がグループ情報をキャッシュしていることがあり、exec su - でも確実に反映されないケースがあります。 – Set up Chrome Remote Desktop for Linux on Compute Engine
  8. --code は OAuth 2.0 の認証コードで、通常は数分以内に失効します。失効した場合はブラウザで再度「リモート アクセスの設定」を開き、コマンドを発行し直してください。 – Google Chrome Remote Desktop Help
  9. host#...json は Chrome Remote Desktop がホスト登録時に生成する設定ファイルで、Google アカウントとの紐づけ情報や暗号化キーが保存されます。初回実行前にこのファイルが存在しないのは正常な状態で、start-host コマンドが実行される過程で生成されます。 – Set up Chrome Remote Desktop for Linux on Compute Engine
  10. PIN は Google アカウント認証とは独立した二段階目の認証として機能します。Google のサポートページでは「すべてのリモートデスクトップセッションは完全に暗号化されます」と明記されています。PIN を忘れた場合は remotedesktop.google.com/access からホストの設定をやり直す必要があります。 – Access another computer with Chrome Remote Desktop
  11. Chrome Remote Desktop for Linux は既存の X セッションに接続するのではなく、接続のたびに専用の X セッションを新たに起動します。この仕組みは VNC とは異なり、ローカルで同じデスクトップ環境が起動していると同一環境の複数インスタンスが競合します。 – Setting up Chrome Remote Desktop on Ubuntu
  12. Lubuntu は 18.10 のリリースで LXQt を標準デスクトップ環境として採用しました。それ以前は LXDE(Lightweight X11 Desktop Environment)が標準で、18.04 LTS が LXDE を採用した最後の LTS リリースです。 – Lubuntu FAQ