Visual Studio Codeで拡張機能である「Remote-SSH」を用いて、リモート環境に「VS Code Server」をインストールし、便利な開発環境を構築する過程で、これでもかというほどエラーに引っ掛かったのでその時の記録件、トラブルシューティング用メモ
そもそも、与えられたリモート環境が下のようなもので、周りにエディタ含めの作業環境を聞いても、Vimをメインにしている方ばかり、VS Code自体知らない...だと...
- セキュリティ都合でインターネット分離(オフライン)
- 基本SSH接続不可能
- ホームディレクトリ以下容量制限(<vscode-server)
目次
状況および最終目標の確認
人によって、リモート接続が失敗する原因は様々なので、ひとまず現状を整理しておきます。
最低限の共通事項
- 「Visual Studio Code」をローカル環境へインストール済み
- 目的リモート環境のホスト名またはIPアドレスが分かっている
- リモート環境にユーザーとして登録されている
ユーザー毎の違い
- OSなどの環境
- インターネットとの隔絶状況
- 管理者権限の有無
- ホームディレクトリ以下の容量制限の有無
リモート環境のOSは今回、Linuxを想定しています。また、管理者権限の有無は問わないため、大勢のユーザーが利用する企業や大学のEWSのような環境でも対処可能です。
最終目標の確認
今回、VS Codeを用いたリモート接続で目指す開発環境の形は以下のようなものになっています。
ディレクトリとファイルの一覧が表示されるファイルツリーと、実際にファイルを開いて作業を行うウィンドウと、リモート上でコマンドを実行することができる、ターミナルが一枚の画面の中に納まるような環境を最終的に構築することができます。
これで、Vimのような癖の強いツールを新しく覚えなくても、一般的なGUI環境でのエディタのようにリモートサーバー上のファイルをリアルタイムに編集することが可能です。
VS Codeを用いたSSH接続自体の失敗
VS Codeを用いたリモート環境へのSSHの失敗には、以下のような理由が考えられます。
そもそもSSH接続を受け付けてない
初歩ですが、そもそも対象のリモート環境がSSHを用いた接続を受け付けているか確認する必要があります。
まずは、Windowsであれば「コマンドプロンプト」、Macであれば「ターミナル」などから「SSH ユーザー名@ホスト名またはIPアドレス」などと入力するか、TeratermなどのリモートクライアントなどからSSH接続可能か確認してみてください。
ポート番号もSSHデフォルトの22なら良いですが、変更されているならポート番号、それとパスワードも分からなければ接続できません。
また、SSHで直接対象のサーバーにアクセスできない場合でも、下記補足に示すように、あるサーバーを踏み台とすることで接続できることもあります。
私の場合も、目的のサーバーに直接SSHで接続することが叶わない環境であったため、以下のように踏み台のサーバーを経由させることで接続しました。
補足:踏み台サーバーを経由したSSH接続
セキュリティ的な観点から、重要なリモート環境に直接ローカルから接続できないことも珍しくないので、そのような場合には、踏み台となるサーバーを経由して目的の環境にアクセスする必要があります。ゲートウェイを設けている場合も多いので、こちらを踏み台とする方法もあります。
「.ssh/config」ファイルへの記入
記入例「.ssh/config」
# 踏み台サーバー
Host Host_1
HostName IP_Address or Host_Name
User User_Name
# 目的サーバー
Host Host_2
HostName IP_Address or Host_Name
User User_Name
ProxyJump Host_1
SSHの接続先が、VS Codeのホスト一覧に表示されない場合↓
サーバーの保存領域に空きがない
一度、ソフトのシミュレーションを回していた時に、数時間放置していたらコードミスでシミュレータが無限にディスクを食い荒らしており、Remote-SSHを用いたアクセスができなくなったことがあります。
TeraTermなどの軽量なリモートクライアントであれば接続できたので、重い処理を投げっぱなしで接続できなくなった場合には、保存領域の枯渇を疑ってみてもいいかもしれません。
この時、自分が原因だった場合、他者にも迷惑が掛かっている可能性が高いので即刻、該当ファイルを削除するなどして対処しましょう。
リモート環境にインターネット無し
Remote-SSHを用いたリモートの接続では、初回接続時にリモートマシン上に「.vscode-server」というディレクトリが自動的に作られます。
https://code.visualstudio.com/docs/remote/vscode-serverより引用
リモートマシンがセキュリティなどの観点で対策がなされており、特定のネットワークからしか接続できないような、インターネットから隔絶されている(オフラインの)マシンの場合、その過程で、「vscode-server-linux-x64.tar.gz」というファイルを「wget」コマンドでインターネットからインストールしてくる所でエラーが発生して失敗します。
この問題に対しては、本来wgetで自動的にインストールされる対象のファイルを、ローカルのパソコンでインストールし、手動でファイルをリモートマシンに転送することで解決できます。
エラーの起きている該当コマンド箇所を手動で「cp」コマンドで置き換えて、ファイル転送と併用する対処法なども調査していると見受けられましたが、細かいコードの書き換えを行わなければいけないため、私の場合、手動でファイルのダウンロード、転送、および解凍を行う方法で解決しました。
参考)cpコマンド置き換え手法
ローカル環境上の手順
手順1
「vscode-server-linux-x64.tar.gz」をインストールしてくる
このファイルを取得する方法としては、インターネットに接続できる環境でCromeやEdgeなどのブラウザに以下URLを、通常のように検索するように入力します。
https://update.code.visualstudio.com/commit:'VSCのコミットID'/server-linux-x64/stable
「'VSCのコミットID'」の部分は、インストールしているVS CodeのコミットIDに置き換えます。コミットIDの調べ方は、VS Code上部の「ヘルプ(H)」->「バージョン情報」から確認することが可能です。
手順2
一回でも対象リモート環境に接続する
一度も対象のリモートサーバーにアクセスしていない方は、一度だけでもVS CodeのRemote-SSHを用いてリモート環境にアクセスしておきます。
その時は、wgetでエラーが出ても良いので、一度でもアクセスしていると、リモート環境のユーザーのホームディレクトリ上に「.vscode-server」という、ディレクトリが残っているはずです。コマンド「ls ~/ -la」などでそれが存在することを確認しておきましょう。
手順3
手順1でダウンロードしてきた「vscode-server-linux-x64.tar.gz」をリモートサーバーへと転送する。
SSH接続さえできればSCPやSFTPでファイル転送が可能なはずなので、SCPコマンドや、WinSCP、FileZillaなどの無料のFTP/SFTPクライアントソフトウェアなどを用いて、対象のファイルを転送します。
転送する場所としては、手順2でできているはずの「.vscode-server/bin/"コミットID"/」以下に配置します。
▼配置位置の例
.vscode-server
├── bin
│ └── b3e4e68a0bc097f0ae7907b217c1119af9e03435 //コミットID
│ ├── ..........
│ └── /* ここに「vscode-server-linux-x64.tar.gz」を配置 */
以上でローカル側での前準備は終了です。
リモート環境上の手順
手順4
手順3で配置した圧縮ファイルを解凍する。
先ほど手順3で「vscode-server-linux-x64.tar.gz」を「.vscode-server/bin/"コミットID"/」以下に配置しましたので、これの解凍を以下のコマンドを用いて行います。
tar -zxvf ~/.vscode-server/bin/'コミットID'/vscode-server-linux-x64.tar.gz
手順5
自動でインストールおよび、解凍が行われるはずだったものを手動で行ってきたので、少しでも自動で行われる場合に環境を近づけるために以下2点を行っておきます。必要性のほどはよくわかりません。
初回接続失敗時にできた「~/.vscode-server/bin/'コミットID'/ 」配下のlockファイルを削除。無い場合は特になにもしない。
rm vscode-remote-lock.'コミットID'
VS Code remote development処理で必要となるflagファイルを設置
touch ~/.vscode-server/bin/'コミットID'/vscode-scp-done.flag
手順6
VSCodeにて、もう一度Remote-SSHでリモートサーバーにアクセス
上記手順で繋がるようになっているはずです。
ホームディレクトリ以下の容量制限
VS Codeの拡張機能Remote-SSHを用いたリモート環境への接続の際には「VisualStudio Code Server」というものを用いて、リモート環境のファイルなどにアクセスしているらしいです。
そのため、VSCを用いてサーバーに接続したときに「.vscode-server」というディレクトリがリモートサーバーのホームディレクトリ配下に自動で作成されますが、こいつが少なくとも150MB以上のサイズがあると思われます。
https://code.visualstudio.com/docs/remote/vscode-serverより引用
つまり、企業や大学で使われているEWSなどでユーザーのホームディレクトリ以下に「.vecode-server」のサイズ以下、100MBなどの容量制限が掛けられていると、初回接続時の「VS Code Server」をインストールしている時点で「容量超過」の警告を出されて接続できない場合があります。
自動でホームディレクトリ配下に配置される以上、ホームディレクトリを容量制限のないディレクトリに変更するなどできればよいですが、調べたところそれはできないらしいです。
そこで、上記リモート環境にインターネットが無い環境での「.vecode-server」ディレクトリの作り方を利用して、このディレクトリを容量制限のないディレクトリ以下に配置し、そのフォルダへのシンボリックリンク(Windowsでいうところのショートカット)をホームディレクトリ上に置くことで、VS Code Serverを用いた接続環境を構築します。
以下手順↓
手順1
インターネットが無い環境での「.vecode-server」ディレクトリの作り方の手順2までを行い、「.vecode-server」をホームディレクトリ以下に作る。
割り当てられた容量の超過のエラーが出て停止するが、この時残った「.vscode-server」ディレクトリサイズはそこまで大きなものではないです。
手順2
手順1で作成した「.vscode-server」を任意の容量制限の厳しくないディレクトリ(作業用ディレクトリなど)に移動および配置する。
mv ~/.vscode-server '任意ディレクトリへのパス'
手順3
インターネットが無い環境での「.vecode-server」ディレクトリの作り方の手順3~手順5までを行い、「.vscode-server」内のディレクトリを整える。
手順4
ホームディレクトリに「.vscode-server」へのシンボリックリンクを作成する。
ln -s '任意ディレクトリへのパス'/.vscode-server ~/.vscode-server
このとき、シンボリックリンクの名前を「.vscode-server」にしておく
手順5
VSCodeにて、もう一度Remote-SSHでリモートサーバーにアクセス
上記手順で繋がるようになっているはずです。
CentOS6環境は...
以下のようなエラーが出て接続に失敗した方は、CentOS6の環境ではありませんか?
リモートホストは、glibcおよびlibstdc++のVS Code Serverの前提条件を満たしていない可能性があります
The remote host may not meet VS Code Server's prerequisites for glibc and libstdc++
エラーの原因
エラーを見ると、glibcやlibstdc++というC言語用ライブラリになにか問題があることが分かります。
ここで、Visual Studio Codeの公式資料を見ると以下のように書かれています。
Remote Development requires kernel >= 3.10, glibc >=2.17, and libstdc++ >= 3.4.18. Recent x86_64 glibc-based distributions have the best support, but exact requirements can vary by distribution.
https://code.visualstudio.com/docs/remote/faqより引用
用は、「バージョン2.17以上のglibcとバージョン3.4.18以上のlibstdc++が必要!」ということを言われているらしいです。
CentOS6には、glibc-2.12とlibstdc++-3.4.13が入っているので、これはVS Code Serverの接続要件を満たしていません。
▼関連記事
対処方法
そんなこんなで、この解決方法には2種類あり、
- CentOS7以降をインストール
- CentOS6のglibcとlibstdc++をアップデート
つまり、提供されたリモート開発環境がCentOS6の環境で上記のようなエラーで接続ができない方は、管理者権限の有無によって現状エラー解決の運命が決まります。
管理者権限がある場合
参考:
管理者権限がない場合
最初に諦めたくないと言った上で申し訳ないですが、ちょっと厳しいです。
現状諦めてしまいましたが、上手くやればホームディレクトリ以下の権限のある領域にライブラリなどを配置し、パスを通すなどすれば動くようになる?かもしれません。
この辺のことに詳しい方がいれば、コメントなど頂けると大変助かります。
【重要】vscode-serverの他者への配慮
最後に、VS Codeを用いたリモート環境への接続が失敗する方の多くは、大勢で共有しているEWSのような環境へ「Visual Studio Code Server」を使った接続を試みているような方だと勝手に思っているので、そのような環境での配慮事項とその設定について、多少触れておきます。
参考:
VS Codeのユーザー設定から、「Watcher Exclude」の設定項目を探し、ファイル監視の機能をオフにしておかなければ、折角苦労して接続したリモート環境がサーバーの処理リソースを食い荒らして、よそ様の迷惑となることがあるらしいので、気持ちよく作業環境を使うためにも配慮しておきたいです。
参考:
https://qiita.com/waterame/items/9979f1730cccddc8e608
https://www.hpc.co.jp/support/security_glibc/
以上、お疲れさまでした。