- 記事一覧 >
- ブログ記事
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) を選択しています。
iso で起動して、setup-alpine
コマンドでインストールします。
新しい仮想マシンウィザードでは、
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
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接続しようとしたらエラーになった」に書かれていますので、そちらを参照してください。
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)を開く
で、
{
"git.path": "/usr/bin/git"
}
を設定します。
VS Code で commit できるようになります。
その他機能チェック
python のコードフォーマッター(Black)、リンター(flake8)の動作確認をします。
Black と flake8 についての詳しい説明は、別記事「VS CodeでPythonのコードフォーマッター(black)、リンター(flake8)をセットアップ」にありますので、そちらを参照してください。
SSH 接続拡張機能インストール
Python 拡張機能を有効にするため、SSH 接続拡張機能をインストールします。
SSH接続拡張機能、Python拡張機能についての詳しい説明は、別記事「VS CodeでRaspberry Pi DesktopへSSH接続しようとしたらエラーになった」にありますので、そちらを参照してください。
Python 拡張機能
Python 拡張機能をインストールします。
Black インストール
Black をインストールします。
# pip3 install black
# which black
/usr/bin/black
VS Code の設定をします。
# vi /home/admin/.vscode-server/data/Machine/settings.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
{
"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"
]
}
動作確認
以下のようなコードを貼り付けて、動作確認します。
print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
a = x[(1+1):5]
早速、flake8 がエラーを指摘してきます。 この状態で、上書き保存します。
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)
原因:
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
{
"git.path": "/usr/bin/git",
}
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。