1. 記事一覧 >
  2. ブログ記事
VSCode
category logo

Alpine LinuxをインストールしてVS Code Remote SSHしてみた

(更新) (公開)

はじめに

Alpine Linux をインストールして、Windows の Visual Studio Code(VS Code) を使って、SSH Remote Development をやってみました。参考サイトにたどり着くまでに若干手間取りましたので、解決法と発生したエラーを紹介していきたいと思います。


Alpine Linux を利用する必要はそもそも無かったのですが、Docker のベース環境としてよく出てくるため、気になって、普通に開発環境として使ってみたら、今回の記事のような対処が必要になり、少し後悔しました。


結論としては、特に問題無く SSH Remote Development ができました。ただ、一部の拡張機能に問題が起きる可能性があるようです。https://code.visualstudio.com/docs/remote/linux

何が必要かだけ知りたい方は、SSH Remote 準備 へ飛んでください。

【 Alpine Linux 】

必要なストレージ容量が少ない Linux ディストリビューションです。パッケージ管理システムとして APK を採用しています。デフォルトのシェルは、bash ではなく、ash です。


Alpine Linux インストール

Windows の VS Code から SSH リモート接続

python のコードフォーマッター(Black)、リンター(flake8)動作確認

までやっていきます。


【検証環境】

Windows10 PRO x64

 VS Code 1.68.1

 VMware Workstation 16 Pro

  alpine-virt-3.16.0-x86_64

   Python 3.10.5

Alpine Linux インストール

公式サイト(https://alpinelinux.org/downloads/)から、alpine-virt-3.16.0-x86_64.iso をダウンロードします。 Windows 10 PRO x64 の VMware にインストールするため、 VIRTUAL(x86_64) を選択しています。

alpine-virt-3.16.0-x86_64.iso をダウンロード


iso で起動して、setup-alpine コマンドでインストールします。

新しい仮想マシンウィザードでは、Linux - その他の Linux 5.x カーネル 64 ビット を選択しました。

Linux - その他の Linux 5.x カーネル 64 ビット を選択

setup-alpine コマンドでは対話式になりますので、以下のような回答になると思います。(一部省略しています。)


Which timezone are you in? のところで、JST が選択肢に無いため、とりあえず、UTC にしてインストールします。


Enter mirror number のところは、リポジトリサーバーの選択で、一番速いところが自動選択される f を入力しています。


Which disk(s) would you like to use? のところは、インストール先ディスクの入力です。(ここでは、ディスク1台 sda しか認識していなくて、そこにインストールして良いから、sda です。意味が分からない場合は、中止してください。)


How would you like to use it? のところは、何をインストールするかの問いですので、システム全体を意味する sys を入力しています。

localhost login: root
# setup-alpine
Select keyboard layout: [none] jp
Select variant (or 'abort'): jp
Enter system hostname [localhost] foo.example.org
Which one do you want to initialize? [eth0] eth0
Ip address for eth0? [dhcp] 192.168.11.6
Netmask? [255.255.255.0] 255.255.240.0
Gateway? (or 'none') [none] 192.168.0.1
Do you want to do any manual network configuration? (y/n) [n] n
DNS domain name? (e.g 'bar.com') bar.com
DNS nameserver(s)? 8.8.8.8
Changing password for root
New password: **********
Retype password: **********
Which timezone are you in? ('?' for list) [UTC] UTC
HTTP/FTP proxy URL? [none] none
Which NTP client to run? [chrony] chrony
Enter mirror number (1-74) to URL to add (or r/f/e/done) [1] f
Setup a user? [no] admin
Full name for user admin [admin] admin
New password: **********
Retype password: **********
Enter ssh key or URL for admin [none] none
Which ssh server? [openssh] openssh
Which disk(s) would you like to use? [none] sda
How would you like to use it? [?] sys
WARNING: Erase the above disk(s) and continue? (y/n) [n] y

インストールが完了したら、iso をイジェクトして、リブートします。

# reboot

シャットダウンするときは、poweroff です。


起動してきたら、teraterm 等で ssh 接続できます。


インストールの時に、タイムゾーンを UTC にしたのを JST に変更します。
tzdata インストールにより、/usr/share/zoneinfo/Asia/Tokyo が得られるため、これを /etc/localtime にコピーすると、JST になります。

# apk add tzdata
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Thu Jun 23 22:55:08 JST 2022

Python プログラム準備

開発対象に見立てた Python プログラムを準備します。


python3 と pip3 をインストールすることにします。


そのままインストールしようとすると、エラーになるので、コメントアウトされているリポジトリを有効にします。

# vi /etc/apk/repositories
#/media/cdrom/apks
http://mirrors.edge.kernel.org/alpine/v3.16/main
# http://mirrors.edge.kernel.org/alpine/v3.16/community
#http://mirrors.edge.kernel.org/alpine/edge/main
#http://mirrors.edge.kernel.org/alpine/edge/community
#http://mirrors.edge.kernel.org/alpine/edge/testing
#/media/cdrom/apks
http://mirrors.edge.kernel.org/alpine/v3.16/main
http://mirrors.edge.kernel.org/alpine/v3.16/community
http://mirrors.edge.kernel.org/alpine/edge/main
http://mirrors.edge.kernel.org/alpine/edge/community
http://mirrors.edge.kernel.org/alpine/edge/testing

# apk update
# apk add python3 py3-pip

# mkdir -p /home/admin/hello
# cd /home/admin/hello
# vi hello.py
hello.py
print("Hello World")
# python3 hello.py
Hello World

/home/admin/ は OS インストール直後無いのですが、ここで作っています。


SSH Remote 準備

さて、ここが本題なのですが、
https://www.reddit.com/r/vscode/comments/smw8tn/working_with_remote_ssh_in_alpine/
にほとんど答えが書かれていました。


以下、結論の手順だけ書きます。なぜこの手順なのかは、トラブルシューティング のセクションを参照してください。

# vi /etc/ssh/sshd_config
AllowTcpForwarding no
AllowTcpForwarding yes

#PermitTunnel no
PermitTunnel yes
# service sshd restart
# apk add gcompat libstdc++6 libuser bash

ここまでで準備完了ですが、ついでにデフォルトのシェルを bash にしておきます。

# touch /etc/login.defs
# mkdir /etc/default
# touch /etc/default/useradd
# lchsh admin
Changing shell for admin.
Password:
New Shell [/bin/ash]: /bin/bash
# chown -R admin /home/admin

SSH Remote 確認

接続確認をします。

SSH Remoteのやり方については、別記事「VS CodeでRaspberry Pi DesktopへSSH接続しようとしたらエラーになった」に書かれていますので、そちらを参照してください。

VS Code SSH Remote 接続確認

OK!
...ただし、
リモートホストは、glibc および libstdc++ の VS Code Server の前提条件を満たしていない可能性があります
の警告メッセージは表示されます。これは、どうしようもないようです。(無視すれば良い。)


接続するたびにパスワードを聞かれますので、公開鍵認証にします。(無事パスワードを聞かれなくなり、Alpine Linux でも特に問題無かったです。)
公開鍵の設置場所は、 /home/admin/.ssh//home/[ユーザー名]/.ssh/)ですが、最初は有りませんので、作成します。

# mkdir -p /home/admin/.ssh
# chmod 700 /home/admin/.ssh
# chown admin: /home/admin/.ssh

Windows 側で、SSH 鍵を作成します。


cmd.exe を開いて、ssh-keygen コマンドを入力します。
プロンプトは、全て何も入力せずエンターキーです。
(特に Enter passphrase のところは、パスワード無しで SSH 鍵を作成したいため。)

C:\Users\admin>ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\admin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\admin/.ssh/id_rsa.
Your public key has been saved in C:\Users\admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:2wnfXYUhsDkW78InNqiT4/m11rQJ9i+lvDQN1dbYqQQ admin@WIN10PRO64
The key's randomart image is:
+---[RSA 2048]----+
|          oE. .  |
|           =.. *o|
|          = ..+.*|
|         + o.....|
|        S * +.  .|
|       o *oB.+.. |
|      = ..=*+=o  |
|     . + ..oO.   |
|      o.... .+.  |
+----[SHA256]-----+

秘密鍵:C:\Users\admin\.ssh\id_rsa
公開鍵:C:\Users\admin\.ssh\id_rsa.pub
が作成されました。
※admin は、Windows の VS Code を操作しているユーザー名です。


公開鍵:C:\Users\admin\.ssh\id_rsa.pub の方を

>scp C:\Users\admin\.ssh\id_rsa.pub admin@192.168.11.9:~/.ssh/.

のように、接続先へ転送します。

サーバー側で authorized_keys に反映します。

# cat /home/admin/.ssh/id_rsa.pub >> /home/admin/.ssh/authorized_keys
# chmod 600 /home/admin/.ssh/authorized_keys
# chown admin: /home/admin/.ssh/authorized_keys

これで、パスワードを聞かれず、アクセスできるはずです。

VS Code側で、秘密鍵(.pubではない方)が id_rsa ではない場合、C:\Users\admin\.ssh\config に明示する設定が必要です。

Host 192.168.11.9

HostName 192.168.11.9

IdentityFile /Users/admin/.ssh/id_rsa2048

User admin

(この場合、サーバー側では、ペアの id_rsa2048.pub/home/admin/.ssh/authorized_keys に追記が必要。)

また、同じホストへ既にssh接続したことある場合、C:\Users\admin\.ssh\known_hosts から該当ホストのフィンガープリントの削除が必要です。


SSH Remote git

VS Code から git を扱えるようにします。
まず、サーバー側で git をインストールします。

# apk add git

次に VS Code 側で git のパスを指定します。
これを行わないと、git が見つからないです。

設定 → リモート[SSH: 192.168.11.9] → 設定(JSON)を開く

VS Code 設定


リモート[SSH: 192.168.11.9] → 設定(JSON)を開く

で、

settings.json
{
    "git.path": "/usr/bin/git"
}

を設定します。

VS Code で commit できるようになります。

VS Codeでcommit


その他機能チェック

python のコードフォーマッター(Black)、リンター(flake8)の動作確認をします。

Black と flake8 についての詳しい説明は、別記事「VS CodeでPythonのコードフォーマッター(black)、リンター(flake8)をセットアップ」にありますので、そちらを参照してください。


SSH 接続拡張機能インストール

Python 拡張機能を有効にするため、SSH 接続拡張機能をインストールします。

VS Code SSH接続拡張機能をインストール

SSH接続拡張機能、Python拡張機能についての詳しい説明は、別記事「VS CodeでRaspberry Pi DesktopへSSH接続しようとしたらエラーになった」にありますので、そちらを参照してください。


Python 拡張機能

Python 拡張機能をインストールします。

VS Code Python拡張機能をインストール


Black インストール

Black をインストールします。

# pip3 install black
# which black
/usr/bin/black

VS Code の設定をします。

# vi /home/admin/.vscode-server/data/Machine/settings.json
setting.json
{
    "git.path": "/usr/bin/git",
    "python.formatting.provider": "black",
    "editor.formatOnSave": true
}

flake8 インストール

flake8 をインストールします。

# pip3 install flake8
# which flake8
/usr/bin/flake8

VS Code の設定をします。

# vi /home/admin/.vscode-server/data/Machine/settings.json
setting.json
{
    "git.path": "/usr/bin/git",
    "python.formatting.provider": "black",
    "editor.formatOnSave": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--max-line-length=88",
        "--ignore=E203,W503,W504"
    ]
}

動作確認

以下のようなコードを貼り付けて、動作確認します。

hello.py
print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
a = x[(1+1):5]

VS Code flake8 確認

早速、flake8 がエラーを指摘してきます。 この状態で、上書き保存します。


VS Code Black 確認

Black の整形もうまくいきました!


トラブルシューティング



エラー内容:

# apk add python3 py3-pip

ERROR: unable to select packages:
py3-pip (no such package):
required by: world[py3-pip]


原因:
リポジトリが有効になっていない。


対処内容:

コメントアウトされているリポジトリを有効にする。

# vi /etc/apk/repositories
#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.16/main
http://dl-cdn.alpinelinux.org/alpine/v3.16/community
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing




エラー内容:

VS Code で SSH リモート接続

[21:47:17.973] Running script with connection command: ssh -T -D 51251 "192.168.11.9" bash
[21:47:17.975] Terminal shell path: C:\WINDOWS\System32\cmd.exe
[21:47:18.302] > ash: bash: not found


原因:
bash がインストールされていない。


対処内容:

bash インストール。

# apk add bash




エラー内容:

VS Code で SSH リモート接続

> Server did not start successfully. Full server log at /home/admin/.vscode-server

> /home/admin/.vscode-server/bin/30d9c6cd9483b2cc586687151bcbcd635f373630/bin/code
> -server: line 12: /home/admin/.vscode-server/bin/30d9c6cd9483b2cc586687151bcbcd6 > 35f373630/node: not found
[21:47:31.212] Resolver error: Error: VS Code Server を起動できませんでした

原因:
node を実行できる環境になっていない。


対処内容:

gcompat と libstdc++6 をインストール。

gcompat: glibc にリンクされているバイナリを実行
libstdc++6: 標準 C++ ライブラリ

# apk add gcompat libstdc++6




エラー内容:

VS Code で SSH リモート接続

[21:56:30.078] [Forwarding server 52001] Got connection 1
[21:56:30.081] Failed to set up socket for dynamic port forward to remote port 36523: Socket closed. Is the remote port correct?
[21:56:30.090] > channel 3: open failed: administratively prohibited: open failed

リモート環境をフェッチできませんでした
リモート拡張ホスト サーバーへの接続に失敗しました (エラー: WebSocket close with status code 1006)

VS Code リモート環境をフェッチできませんでした


原因:
sshd のポートフォワーディングとトンネリングが有効になっていない。


対処内容:

ポートフォワーディングとトンネリングを許可する。

# vi /etc/ssh/sshd_config
# vi /etc/ssh/sshd_config
AllowTcpForwarding no
AllowTcpForwarding yes

#PermitTunnel no
PermitTunnel yes
# service sshd restart




エラー内容:

# lchsh admin

-ash: lchsh: not found


原因:
lchsh コマンド(ユーザーのシェルを変更するコマンド)がインストールされていない。


対処内容:
lchsh コマンドをインストール。

# apk add libuser




エラー内容:

# lchsh admin

Changing shell for admin.
Error initializing libuser: could not open configuration file `/etc/login.defs': No such file or directory.


原因:
lchsh コマンドが必要とするファイルが無い。


対処内容:
/etc/login.defs を touch

# touch /etc/login.defs




エラー内容:

# lchsh admin

Changing shell for admin.
Error initializing libuser: could not open configuration file `/etc/default/useradd': No such file or directory.


原因:
lchsh コマンドが必要とするファイルが無い。


対処内容:
/etc/default/useradd を touch

# mkdir /etc/default
# touch /etc/default/useradd




エラー内容:

VS Code で git 利用

[2022-06-23T13:20:37.090Z] [warning] Git installation not found.


原因:
git がインストールされていない。
VS Code 側で git の位置を特定できていない。


対処内容:

git をインストール。

VS Code 側で git の位置を設定

# apk add git
# vi /home/admin/.vscode-server/data/Machine/settings.json
settings.json
{
    "git.path": "/usr/bin/git",
}




loading...