Linux母艦は必要?Windows機を格下げしてVSCode Remote-SSH+Claude Code Remote Controlで24時間開発環境を作ってみた

正直に言うと、Windows機(FMV UH75/J3 B)一台で開発を回している今の環境に、大きな不満があったわけじゃない。ただ、Linux機(U9311、Xubuntu)を新しく用意したのに、これをどう活かすか決めきれずにいたのがずっと引っかかっていた。

正直、Windows機からLinux機にメインを移すのって大がかりな引っ越しになる気がして腰が重かったんだよね。

何が一番不安だったんですか?

今の環境がそのまま『移植』できるのかどうかがよく分からなかった。
「これを24時間つけっぱなしの母艦にして、Windowsは軽い作業用に回したらどうなるんだろう」。そんな軽い思いつきを口にしてはみたものの、環境ごと引っ越すイメージが湧かず、しばらく手が止まっていた。結局、コード資産と環境設定を別物として切り分ければいいだけだと気づいてから、ようやく話が動き出した。
この記事では、Windows機を軽い開発用に格下げしLinux機を24時間稼働の母艦にする発想から、複数マシンでのプロジェクト共有ルール、VSCode Remote-SSHでのデスク作業、Claude Code Remote Controlでのスマホ操作まで、実際に迷ったこと・勘違いしたことも含めてそのまま整理していく。
1. WindowsメインかLinux母艦化か:24時間稼働環境へ移行すべきかの判断基準
1-1. なぜWindows機を軽い開発用に格下げしLinuxを24時間稼働の母艦に据えたのか
結論から言うと、そこまで難しく考える必要はなかった。コード資産と環境設定は別物として切り分ければいい。コードはgit cloneすれば手に入る。一方でインストール済みのツール類やdotfiles(設定ファイル)は、クローンでは付いてこないので別途セットアップし直す必要がある。この二つを混同していたのが不安の正体だった。

コード資産と環境設定を別レーンで捉え直し、サブ機格下げと母艦新設で安全な24時間開発体制を構築しましょう。
1-2. コード資産と環境設定を切り分ければ環境移行のハードルは下がる
「全部を一度に移す」と考えると身構えてしまうが、「コードは持っていける、環境は作り直す」と分けて考えると作業の見通しが立つ。ここでの判断基準はシンプルで、Gitで管理されているかどうかという線引きだけだ。管理されているものはgit cloneで済み、管理されていないツール類やdotfilesは別途セットアップし直す、という違いを意識するだけで移行のハードルはぐっと下がる。
2. 直接マウントかGit同期か:複数マシンで同一プロジェクトを扱う際の事故防止策
2-1. SambaやSSHFSでの直接マウントがファイル競合・破損事故を招く理由
母艦を分けると、次に浮かんでくるのは「WindowsとLinux、両方から同じプロジェクトを触りたい」という話だ。最初に考えたのは、WindowsからLinux側のプロジェクトフォルダをSamba(ファイル共有)やSSHFS(SSH経由のファイルシステムマウント)で直接開いて編集する方法だった。一見手軽そうに見えるが、これは同時書き込みが発生した場合の競合・ロック事故のリスクを抱え込むことになる。

全部のプロジェクトじゃなくて、今触ってない1個だけならマウントしてもいいんじゃないですか?

僕もそれ考えたんだけど、結局『今は触ってない』の判断をいちいち自分でやらないといけないのが面倒でさ。事故る可能性がゼロにならないなら、最初からやらない方を選んだ。
2-2. 独立したgit cloneとGitHub経由のpush/pull運用が最も安全な選択になる理由
最終的に選んだのは、各マシンがそれぞれ独立したgit cloneを持ち、GitHub経由でpush/pullして同期する運用だ。直接のファイル共有と違って、最悪の事態がデータ破損ではなく単なるマージコンフリクトで済むのが大きい。コンフリクトは面倒でも直せる、という点が判断の決め手になった。

ファイルの直接マウントによる破損リスクを避け、独立したリポジトリ同士をGitHub経由で安全に同期させましょう。
3. 単体SSHかTailscale連携か:デスクでガッツリ作業するためのVSCode Remote-SSH設計
3-1. ネットワーク層(Tailscale)とツール・チャット層の役割混同を整理する
SSH設定を進めていたとき、「タイルでやるやんな?」と口にしてしまい、聞き返されてようやく「Tailscale」の言い間違いだと自分で気づいた場面があった。うろ覚えついでに確認してみたら、実はLinux機にはTailscale(複数端末を仮想的な一つのネットワークにまとめて繋ぐVPNサービス)が既に入っていて、接続まで済んでいた。以前別のプロジェクト(dify)の作業で導入していたのをすっかり忘れていたのが理由だ。Windows側も同様にセットアップ済みで、tailscale statusで確認するとuh75という名前でネットワークに参加していることが分かり、tailscale pingで疎通も確認できた。

スマホってタイルがいいのかな、それともクロードアプリ?

それ、比べる対象が違いますね。Tailscaleは端末同士をつなぐネットワークの層、Claudeアプリはその上で動くチャット・操作の層です。役割が別なので、どちらか一方を選ぶという話にはなりません。
この混同に気づけたのは大きかった。ネットワークの疎通と、その上で何のツールを動かすかは別の話だと切り分けられたことで、この後の設計がだいぶすっきりした。

Tailscale、VSCode、Claude Codeの3つの階層を明確に分離し、接続トラブルや設定の迷いを解消しましょう。
3-2. ed25519鍵ペア生成とVSCodeの><アイコンから始めるSSH接続手順
土台が整理できたところで、実際にVSCodeのRemote-SSH拡張機能をWindows側にインストールした。最初につまずいたのは、接続用のアイコンが見当たらなかったことだ。「緑色のアイコン」という説明を頼りに探していたが、実際は><型のアイコンで、色ではなく形が目印だった。ここに気づくまで一度手が止まった。
手順としては、Windows側でed25519(暗号方式の一種)の鍵ペアをパスフレーズなしで新規生成し、公開鍵をLinux側のauthorized_keysに登録。~/.ssh/configに接続先ホストを書いておき、ssh <ホスト名>でパスワードなしの接続を確認してからVSCodeでも同じホストにつないだ。パスフレーズをあえて設定しなかったのは、端末自体の画面ロックや暗号化に安全性を委ねる判断からだ。

ed25519鍵ペアと~/.ssh/configを正しく設定し、VSCodeの><アイコンからスムーズにリモート接続を確立しましょう。
4. VSCode Remote-SSHかClaude Code Remote Controlか:利用端末に応じた役割分担
4-1. デスクでの本格操作とスマホ・寝転がり時の軽微指示という明確な住み分け
「外出中や寝転がっている時にスマホから指示を出したい」という話をしていたときに出てきたのが、「クロードコードのリモートなかったっけ?」といううろ覚えの一言だった。最初はSSH経由でVSCodeを操作するイメージ(つまりRemote-SSHの延長)で捉えていたが、これはあくまでデスクトップ向けの使い方で、スマホでの軽い操作には向いていない。改めて調べてみると、Anthropicが2026年2月にリリースした「Remote Control」という機能があり、ローカルで動いているClaude Codeセッションをスマホアプリやclaude.ai/codeと同期できることが分かった。ポート開放が不要な点も含めて、まさに「外出先からちょっと指示を出したい」というニーズにそのまま合っていた。

SSHでスマホから母艦に繋ぐ方法も考えてたんだけど、結局それは要らなくなったってことか。

目的が『画面ごと操作したい』ならRemote-SSH、『Claude Codeにちょっと指示を出したい』ならRemote Controlです。デスクでガッツリ触るならRemote-SSH、スマホでの軽微な指示ならRemote Controlと分けて考えると迷いません。

デスクでのガッツリ開発はRemote-SSH、外出先やソファからの軽微な指示はRemote Controlと使い分けて効率を最大化しましょう。
4-2. ポート開放不要でローカルセッションをスマホと同期するRemote Controlの仕組み
Remote Controlの実体は、Windowsのターミナルに直接入っているclaudeコマンドではなく、VSCode拡張機能に内蔵されたネイティブバイナリだった。起動フラグも「remote-controlサブコマンド」というイメージとは違い、正しくは--remote-control [name]という形だ。対象フォルダにcdし、フルパスのバイナリを--remote-control付きで起動、表示されたQRコードをスマホのClaudeアプリの「Code」タブでスキャンする、という流れで接続できた。QRコードの有効期限は分単位で決まっているわけではなく、claude --remote-controlのプロセスが生きている間はずっと有効だと確認できた。
VSCode Remote-SSHとRemote Controlは、下の表のように役割がはっきり分かれている。
| 接続方式 | 主な用途 | 接続経路 | 必要な常駐ツール |
|---|---|---|---|
| VSCode Remote-SSH | デスクでのガッツリ開発・編集 | SSH/Tailscale | なし(VSCode Server) |
| Claude Code Remote Control | 外出先・ソファからの軽微指示 | ポート開放不要 | tmux(Linux母艦側) |

--remote-controlフラグで起動してQRコードをスキャンし、ポート開放なしでスマホとローカルセッションを同期させましょう。
5. 単独起動かtmux常駐か:接続を切っても処理を生き残らせるバックグラウンド運用
5-1. Linux母艦側でtmuxを起動・デタッチして端末切断に耐える環境を作る
Remote Controlを試してすぐに気づいたのが、VSCodeの統合ターミナルでそのまま起動すると、VSCode(あるいはWindows側)を閉じた時点でプロセスごと落ちてしまうことだった。「じゃあ実機の前にいないと使えないのか」と一瞬思ったが、そこは勘違いだった。tmux(ターミナルセッションをバックグラウンドで維持するツール)はLinux側で動くものなので、どの端末からtmux newを叩くかは関係ない。Windowsのターミナルから打ったコマンドでも、tmux越しに起動してデタッチしておけば、Windows側やRemote-SSHの接続を閉じてもLinux側でプロセスは生き残る。
実際にパソコンを置いたまま外出し、スマホからRemote Control経由でセッションに接続して作業できることを確認できた。これがこの環境づくりの中で一番手応えがあった瞬間だった。

Linux母艦側でtmuxセッションを起動・デタッチし、手元の端末を閉じてもスマホからのリモート操作を維持しましょう。
5-2. スマホからの指示で止まるダイアログ問題と実用的な回避テクニック
一つだけ実用上の注意点がある。Remote Control経由でファイルの書き込みなど承認が必要な操作を行うと、Y/Nの確認ダイアログが出て、スマホ側ではそこで応答できずに止まってしまうことがある。これはRemote Controlがローカルで既に起動しているセッションの「リモコン」として動く前提の機能で、外出先から全く新しいセッションをゼロから起こすことはできない、という性質とも関係している。
読み取りや非破壊的な操作であれば直接指示して問題ないが、編集や書き込みが絡む操作はサブエージェント(権限確認を自動で許可する設定で動く子プロセス)を経由させることで、ダイアログで止まる事態を避けられる。

スマホ操作時のダイアログハングを避けるため、書き込みや編集処理はサブエージェントを経由させて安全に実行しましょう。
まとめ
Windows一台で完結していた環境を、Linux母艦・複数マシン・スマホからの操作まで広げていく過程で分かったのは、遠回りに見えた確認作業がほとんど無駄になっていなかったということだ。Tailscaleの言い間違いに気づいたやり取りも、VSCodeのアイコンで手が止まったことも、結果的には「ネットワーク層とツール層を混同していた」「UIの目印を思い込みで探していた」という、その後の設計に直結する気づきにつながっている。
一番の転換点は、うろ覚えのまま流さずに「クロードコードのリモートなかったっけ?」を確認しにいったことだった。もしその場で確認せず、SSH経由でスマホから母艦に繋ぐ方式をそのまま作り込んでいたら、目的に対して遠回りな仕組みを育ててしまっていたと思う。
今の運用は、デスクでがっつり触りたいときはWindowsからVSCode Remote-SSHでLinux母艦に接続し、外出先や寝転がっているときはClaude Code Remote Controlでスマホから軽く指示を出す、という二段構えに落ち着いている。どちらの経路を使っても実体はLinux母艦側で動いているので、tmuxで起動してデタッチしておけば、手元の端末やアプリを閉じても作業は止まらない。この記事が、同じように複数端末での開発環境を整理したい人の判断材料になれば嬉しい。
手順チェックリスト
- Linux母艦側でtmuxセッションを開始する(
tmux new -s dev) - 対象プロジェクトフォルダへ移動する(
cd ~/Project/myapp) --remote-control付きでClaude Codeを起動する(claude --remote-control [name])- スマホのClaudeアプリなどで表示されたQRコードをスキャンする
- tmuxセッションをデタッチ(
Ctrl+B→D)してターミナルを閉じる

