Hyper-V 仮想マシン内で Git と SSH を使う – Intel N100 ミニ PC で構築する開発環境(8日目)

ミニPC (CPU: Intel n100) を購入しました。Windows でも Ubuntu でも使えるようにして、「Intel N100 ミニ PC で構築する開発環境(2日目) | hiro345」で紹介した環境を用意していくつもりです。

最初から読むこともできます。目次もあります。)

 今回は、Hyper-V 仮想マシン内で、WSL2 と Docker Desktop が動いたので、この中で Git を使う環境を用意してみることにしました。git コマンドと ssh コマンドが使える環境にします。そのときの手順を簡単に紹介します。

  • Git for Windows をインストールして git コマンドを利用
  • WSL2 Ubuntu で git コマンドを利用
  • Docker コンテナで git コマンドを利用
  • Windows 標準の ssh-keygen コマンドを利用
  • WSL2 Ubuntu で ssh-keygen コマンドを利用
  • Docker コンテナで ssh サーバーを起動
  • Docker コンテナ、Windows、WSL2 Ubuntu で ssh コマンドを利用

Git for Windows をインストールして git コマンドを利用

 基本的に WSL2 か Docker コンテナの git コマンドを使えば良いので、Git for Windows はなくてもなんとかなるのですが、Windows 環境で git コマンドをそのまま使いたい時もあるので、インストールしてみました。インストール時にオプション指定がいろいろあって、何を指定するのが自分にとって良いのか判断するのが非常に大変です。こういう設定について理解していないがために、ちょっとしたことにつまづいてしまって、うまく動作しなくて困るということも多そうです。

 ここでは、VS Code でも Git for Windows の git コマンドを使うこと、WSL2、Docker コンテナからも Git リポジトリを使うという前提でいるので、それに合わせた設定を指定してインストールしました。

 なお、Bash 環境もインストールできるので、使う指定としました。今回は MSYS2 のものがインストールされました。結構いい感じで Linux を使っているような感じで git コマンドや周辺のコマンドが使えるので、それなりに便利そうです。

 ただ、docker コマンドの実行には Windows の PowerShell が必要なときがありました。Bash 環境からも実行はできるのですが、docker コマンドの一部の機能がうまく動作しませんでした。

 こういった場面があると、以前は頑張って動かせるようにと調べたものですが、今は WSL2 と Docker コンテナがあるので、そちらを使うという方針に自分はしています。環境構築をしている時間は少ないほうが良いので、簡単に解決できるものでない場合は、使える環境の方を利用する方がトータル的に効率が良くなるはずだという考えです。

 なお、Git for Windows をインストールするときに ssh 関連の指定がありました。これについては、基本的に Windows 標準のものを使うようにしておきました。Git for Windows についているものを使うと、使える ssh のコマンドが増えすぎてしまって、どのコマンドがいま実行されているのか判断しにくくなってしまいます。問題が起きた場合に、関係のない設定ファイルを眺めていたといったことがないように、Windows 標準のものに絞っておきます。

 ちなみに、WSL2 や Docker コンテナで使う ssh コマンドは、それぞれの環境のものが動作するので、Windows 標準のものが勝手に使われることはありません。

WSL2 Ubuntu で git コマンドを利用

 WSL2 Ubuntu でも git コマンドを使ってみました。こちらは標準でインストールされていたので、そのまま使い始めることができました。Git の使い方を学ぶにあたって、WSL2 が動作する環境があるなら、この Ubuntu で Git を使い始めるのが良さそうです。ただ、Windows 環境ではなく、コマンドを実行して使うというのが難しく感じるかもしれません。とはいえ、Git for Windows と比較すると、インストールがいらない、インストール時の指定について悩む必要がない、Git for Windows の Bash 環境より Ubuntu の Bash 環境の方が使いやすいといったメリットが多くあります。

 ところで、git コマンドを使うときは、グローバル設定の .gitconfig ファイルがどこにおかれるのか、そこにどんな設定をしておくのか、といった点について意識をしておいた方がよいです。ということで、WSL2 Ubuntu の .gitconfig ファイルを確認したところ、普通に `${HOME}/.gitconfig` にありました。

 ちなみに Widnows は `%HOME%/.gitconfig` にあります。ここで、Widnows は `%HOME%/.gitconfig` を確認したところ、core.editor に VS Code を使う指定がされていました。インストール時に VS Code をエディタとして使うと指定したからなのですが、同じように `${HOME}/.gitconfig` でも VS Code を使うように指定したらどうなるのかなぁと思って、指定しました。

 WSL2 Ubuntu の環境下では、VS Code の `code` コマンドは `/mnt/(略)/Code` にあります。これを指定しました。これで使ってみたところ、きちんと Remote WSL で接続した VS Code が起動して動作しました。こういう指定ができるのだと、少し感心しました。

 こういう、お試し設定が気軽にできるのも、Hyper-V の仮想マシン内で作業をしているからなのですが、やはり便利ですね。設定を少し失敗してもなんとかなるし、ホストマシンは安全だという安心感が半端なくあります。

Docker コンテナで git コマンドを利用

 Docker コンテナでも git コマンドは使えるので、そちらも試してみました。コンテナ内でしか使えないので制限は多いですが、VS Code をアタッチする方法で使うようにすれば、GUI でいろいろと作業ができるようになります。Remote WSL で Ubuntu へ接続して使うのと基本的に同じように利用ができるので、「Windows でも WSL2 でも Docker でも VS Code で Git を使うなら結局同じ」という感覚になるはずです。

 そうなると、VS Code が利用する git コマンドと、動作環境で差が出てくるのですが、これについては使い慣れている環境に近い方を使いたくなるはずです。つまり、Windows に慣れている人は Windows、Ubuntu になれている人は WSL2 Ubuntu、Docker に慣れている人は Docker を使うはずです。当然ですよね。ただ、VS Code で Git を使うことに慣れてくると、そのうちに裏で動作している環境は Windows でも WSL2 Ubuntu でも Docker でも変わりなく感じてくるようになります。また、使っているときに出会ったトラブルに対応しているうちに、裏で動作している環境について詳しくなっていって、困ることが減っていくはずです。

 Windows だけでなく Ubuntu や Docker を使いこなせるようになりたいと考えている人はできるだけ Windows 以外の環境でも Git を使ってみてもらいたいところです。

 なお、Docker コンテナの git コマンドを使うバッチファイルを用意しておけば、コマンドラインでの実行もできるのですが、通常の git コマンドと同様にというわけにもいかないので、あまり使い勝手はよくありません。

Windows 標準の ssh-keygen コマンドを利用

 git を使うときに、リモートのリポジトリへ接続するには ssh コマンドを組み合わせて使うことが多くあります。そのため、ssh コマンドも使えるようにしておきます。基本は ssh コマンド用のキーペアを ssh-keygen コマンドで作成します。今回は ed25519 フォーマットのものを作成しました。`%HOME%/.ssh` に ssh 用のファイルは生成されました。

WSL2 Ubuntu で ssh-keygen コマンドを利用

 WSL2 Ubuntu でも ssh コマンドを使えるようにしておきます。こちらも Windows 標準の ssh-keygen コマンドと同じように ssh-keygen コマンドが標準で用意されているので、これを使って キーペアを作成します。実は、Windows で作成したキーペアファイルを使うこともできます。ただ、安全性を考慮すると、どちらを使ってアクセスしたか区別がついたほうが良いので、ここでは別に作成してあります。

 キーペアファイルを共通にしていると、キーペアの管理がしにくくなります。例えば、マシンAとマシンBがあったとしてマシンCへ接続できるようになっていたとします。ここで、マシンBを紛失したとします。このときに、キーペアファイルが別になっていたら、マシンB用の公開鍵をマシンCから削除してアクセスできなくすることができます。

 しかし、もし共通で使っていた場合は、マシンB用の公開鍵をマシンCから削除してしまうとマシンAも接続ができなくなってしまいます。マシンAのキーペアを作成してマシンCへ公開鍵を設置してからでないと、マシンB用の公開鍵をマシンCから削除ができず手間がかかります。これは良くありません。こういったことを考慮すると、マシン単位で分けておくのが安全です。

 ということで、厳密には、Windows の物理マシンと WSL2 Ubuntu の仮想マシンは別ですから、分けておいたほうが良いのです。とはいえ、仮想マシン単位でキーペアをもたせるのは大変になることもあり、物理マシン単位で管理したい場合もあるでしょう。その場合は、同じキーペアをつかうという運用もありでしょう。

Docker コンテナで ssh サーバーを起動

 次に ssh コマンドを使ってみることにします。ssh コマンドを使うためには ssh サーバーが必要なので用意します。ここで、Windows も WSL2 Ubuntu も標準で ssh サーバーを起動することができるのですが、ssh コマンドの試用のために起動するものなので、使い捨てに近い感じで動かしたいところです。

 こういったときには Docker コンテナが便利です。Docker Hub で検索したところ、良さそうな ssh サーバー用コンテナイメージがあったので、それを使って起動してみました。ここで、このイメージを使って ssh-keygen コマンドの実行ができたのですが、Git Bash 環境だとうまく動作しませんでした。PowerShell、WSL2 Ubuntu からはきちんと使えました。

 Git Bash 環境で作業をするとわかるのですが、パスが Ubuntu と同じような表示になったり、`/etc/hosts` ファイルがあったりと、ちょっと特殊な環境なので、それが影響しているようです。`entrypoint` として、`/ssh-keygen.sh` を指定するのですが、Git Bash 環境では、これがなぜか `C:/(略)/ssh-keygen.sh` を実行することになるようで、ファイルが見つからないというエラーになります。

 ということで、PowerShell や WSL2 Ubuntu から docker コマンドを実行して起動しました。ちなみに VS Code を使うときは docker-compose.yml ファイルで Docker コンテナを操作するのが圧倒的に楽なので、docker-compose.yml ファイルを用意しました。

 さて、ここでちょっと話がずれますが、WSL2 Ubuntu 環境で少し失敗しました。実は、最初のコマンド実行では、タイプミスで Docker コンテナが起動しませんでした。それで、`docker context ls` を実行してみたら、`default` と `desktop-linux` と2つ表示されました。

 ここで、「今使っている context に問題があるのかも」と思ったので、「context を切り替えたらいいのかなぁ」と切り替えをしてしまいました。

 このせいで、docker コマンドが動かなくなってしまいました。少し焦ったのですが、おちついて、`${HOME}/.docker/config.json` を編集して、context を無事戻せました。いやぁ、知っていたから良かったけど、知らなかったらやばかったですね。まぁ、Docker Desktop や PowerShell から Docker コンテナは操作できるからなんとかなるといえばなりますけど、WSL2 で docker コマンドが使えなくなると、めちゃくちゃ不便になってしまいます。復旧できて良かったです。

Docker コンテナ、Windows、WSL2 Ubuntu で ssh コマンドを利用

 最初に、ssh サーバーを稼働させている Docker コンテナへアタッチして、Docker コンテナ内で ssh 接続をしてみました。127.0.0.1 のループバックネットワークを使いました。接続にあたっては、`/config/.ssh/authorized_keys` ファイルに公開鍵の登録が必要だったので、Docker コンテナ内で ssh-keygen コマンドを使ってキーペアを作成し、公開鍵の登録もしてから試しました。

 それから、Windows、WSL2 Ubuntu から ssh コマンドで ssh サーバーへ接続してみました。無事に接続ができました。ついでに ssh サーバーを稼働させている Docker コンテナへ VS Code をアタッチしてみたところ、きちんと動作しました。

 ということで、本日はここまで。

同じタグの記事: Intel N100
同じタグの記事: Ubuntu
同じカテゴリの記事: Linux
同じカテゴリの記事: Win