アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Windows11 で WSL を触ってみた

morishitaです。

ここ 10 年ほどほとんど Windows OS を使っていません。

社会人になってしばらくは Windows を使ってました。
しかし、やがて仕事では Linux を使うようになり、その後 Mac に乗り換えてからはずっと Mac です。プライベートでも Mac です。
Windows 7 までは Mac 上の VirtualBox の仮想マシンにインストールして極稀に(IE で動作確認するためなどに)使っていたのですが Windows 10 では動作が遅すぎてそれもやらなくなりました。

ということで、Windows 7 より新しい Windows はほぼ使ったことがありません。
そんな私ですが WSL を試したくて久々に Windows を触ってみました。

利用したマシンのスペックは次の通りです。

  • Windows 11 Pro
  • Intel Core i7 8700
  • メモリ 16GB

Mac で使っているアレはあるのか?

とりあえず触り始めたものの、デスクトップの様子はだいぶ変わっています。
どこに何があるのやらといった感じですっかり Windows 浦島太郎状態です。

開発ができる環境を整える前に、そもそもOSを快適に使うのに Mac では次の 3 つは必須だと思っています。

これらの Windows 版はなさそうです。では代替するものはなにかということろから調べました。

パッケージマネージャ

何をするにもアプリのインストールは必要なので、まずはパッケージマネージャから。
まあ、Windows Store からポチポチでもいいのですが、コマンドで探してサクッとインストールできる方がいいなぁと思うのです。 昔使っていたChocolateyもまだ健在のようですが、他にもないかとググってみると winget という CLI ツールがありました。OSS でなんと Microsoft 製です。 Chocolatey に比べるとインストールできるパッケージ数が少ないようですが Microsoft 製ということで採用しました。 winget 自体は Microsoft Store からサクッとインストールできます。

インストールしたらターミナルから次の様にパッケージをインストールできるようになります。

> winget install --id Microsoft.PowerToys

サブコマンドのsearch でパッケージを探したり、listでインストール済みパッケージを表示したりできます。アンインストールもuninstallで可能です。

一つのパッケージインストールの度にダイアログで許可を求められるところは作業性的にはいまいちですね。
また、brew bundle に相当する機能がないのも残念です。

しかし、いちいちインストーラの UI でポチポチやらなくていいのはやはり便利です1winget を使って次のパッケージをインストールしました。

  • Obsidian.Obsidian
  • Microsoft.VisualStudioCode
  • Google.Chrome
  • Microsoft.PowerToys
  • Microsoft.PowerShell
  • Docker.DockerDesktop
  • など

Google 日本語入力(Google.JapaneseIME)もインストールできそうなのですが、試すとエラーが出たので Google のサイトからインストールしました。 次のサイトで wingetでインストールできるパッケージを検索できます。

winget.run

キーマップカスタマイズ

US キーボードを使っているので capscntrol を入れ替えたりしたいのですが、ググると KeySwapAutoHotKey などがメジャーな様です。 それらでも良かったのですが Microsoft の PowerToys の keyboard manager でもできそうなのでこれを使うことにしました。

次を設定しました。

  • caps と ctrl の入れ替え
  • alt(left) は ctrl を割り当て
    • Mac の Control + C などのショートカットと同じキー配置の操作にするため
  • alt(right) に IME kanji を割り当て
    • これで IME の ON/OFF をトグルできます

alt キーを殺してしまったのが気になりますが、だいぶ Mac のキーボード操作感に近づきました。

ランチャー

Windows キーで開くメニューからアプリ名を入力して起動できるので、とりあえずこれで事足りるかなと思って別途インストールはしませんでした2

WSL を試す!

ざっくり OS の使い勝手を整えたところで本題の WSL です。 WSL というのは Windows Subsystem for Linux のことです。
以前、Mac OS 版 WSL を謳っている Lima について書きましたが、その時からどんなものなのだろうと思っていました。

tech.actindi.net

ついに本家 WSL を試します。

Hyper-V の有効化

WSL をインストールするには Hyper-V が有効になっている必要があります。 Hyper-V というのは Windows に組み込まれているハードウェアの仮想化機能ですね3

まずはこの Hyper-V の状態を確認します。
Windows メニューから[設定]を開き、[アプリ]-[オプション機能]-[Windows のその他の機能]を選択します。

f:id:HeRo:20220224014142p:plain
Windowsのその他の機能 設定

画面の最下部にある[Windows のその他の機能]を選択すると次の設定ウィンドウが開きます。 なんとなく Windows 7 の頃から変わってなさそうなデザインに懐かしさを感じつつ、リストから Hyper-V を探します。

f:id:HeRo:20220224014229p:plain
windowsの機能の有効化または無効化 ウィンドウ

チェックがついていれば「キャンセル」をクリックして閉じて構いません。 チェックがついていなければチェックして「OK」ボタンをクリックします。 すると次のダイアログが表示され、なにやら処理が始まります。

f:id:HeRo:20220224014313p:plain
変更適用中

しばらくすると処理が終わり次のように表示されます。

f:id:HeRo:20220224014350p:plain
変更適用完了

素直に指示に従って「今すぐ再起動」ボタンをクリックして再起動します。

WSL のインストール

再起動したら、いよいよ WSL のインストールです。 管理者権限で開いた PowerShell で次を実行します。 このコマンドだけで WSL のセットアップを全部やってくれます。

> wsl --install

f:id:HeRo:20220224014429p:plain
wsl のインストールの様子

メッセージを眺めつつしばらく待つと、再起動を促すメッセージが最後に表示されるので、それに従って再起動します。

再起動後、自動的にインストールの続きが実行されます。 なにも指定しないと Ubuntu が選択されます。

f:id:HeRo:20220224014500p:plain
wsl のインストールの様子(再起動後)

最後にユーザとパスワードの入力が求めらるので入力して終了です。 とても簡単にインストールできます。

WSL 環境の確認

WSL をインストールすると Windows Terminal に Ubuntu というプロファイルが追加されます。
それを選択すると WSL で導入された Ubuntu の仮想マシンの中でターミナルが開きます。

どのような仮想マシンなのか uname/etc/os-release の確認結果は次のとおりです。

❯ uname -a
Linux hero-win11 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

❯ cat 
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

導入される Ubuntu は現時点(2022 年 2 月)で最新の LTS バージョンですね。

WSLとWindowsのファイルシステム共有

WSL 側では Windows のファイルシステムは /mnt/ にマウントされています。 C ドライブだけしかないマシンだと、/mnt/c/Users/{windows ユーザ名}/ に Windows 側のホームディレクトリがあります。

Windows 側からは //wsl$/ubuntu をファイルエクスプローラや Windows Terminal 等で開くと WSL の仮想マシンのルートディレクトリにアクセスできます。 \wsl.localhost\Ubuntu\home{ユーザ名} を開くと WSL のホームディレクトリにアクセスできます。

これらのディレクトリを使って相互にデータをやり取りできますが、1つのディレクトリを WSL 、Windows 両方から共有している感覚ではないです。それぞれの OS で別々のホームディレクトリあるが、アクセスする手段はあるという感じですね。

この点に関しては Lima の方がシームレスに行き来できる感じがします4

WSL へのソフトウェアのインストール

WSL で作られる Ubuntu 環境は Windows からアクセスしやすいように各種設定がなされるということ以外は普通の仮想マシンです。

Ubuntu なのでapt で各種パッケージもインストールできます。というか WSL で開発をするには必要なパッケージをインストールしていかねばなりません。

とりあえず次のコマンドですでにインストールされているパッケージを最新にしてから必要なパッケージをインストールしていくと良いでしょう。

sudo apt update && sudo apt upgrade

VSCode を使う

コードエディタとして VSCode をセットアップします。

Windows 側

まずは Windows 側で VSCode をインストールします。

PowerShell で次のコマンドでインストールします。

winget install --id Microsoft.VisualStudioCode

インストールしたら次の拡張もインストールします。

marketplace.visualstudio.com

WSL 側

続いて、Windows Terminal 等で WSL に入って適当な作業ディレクトリで code . とコマンドします。

初回実行時には次のように WSL 側に必要な VSCode Server なるソフトウェアがインストールされます。

f:id:HeRo:20220224014744p:plain
vscode-serverの自動インストール

処理が終わると、Windows 側で VSCode が起動します。もちろん WSL の仮想マシンに接続しコマンドを実行した作業ディレクトリを開いた状態です。 ローカルディレクトリを開いて作業しているのと何ら変わらない感じです。
VSCode の組み込みターミナルも WSL に接続した状態で利用できます。

ただし書いたコードを実行するには WSL 側に必要なパッケージをインストールしておく必要があります。

また、VSCode の拡張は WSL 環境で使うものを別途インストーする必要があります。Windows ローカルでインストールしている拡張は使えません。このあたりは Remote SSH や Remote Container を利用する場合と同じですね。

WSL で Docker を使う

サーバサイドのエンジニアとしては Docker もないと仕事になりません。
WSL 環境で Docker を使えるようにしていきます。

作業は Windows 側で Docker Desktop をインストールするだけです。
PowerShell で次のコマンドでインストールできます。

winget install --id Docker.DockerDesktop

インストールが終わったら Docker Desktop の設定を開きます。

f:id:HeRo:20220224072746p:plain
Docker Desktop の設定

開いたら General の Use the WSL 2 based engine が有効になっていることを確認します。
多分、最初からチェックが付いていると思います。私の環境はそうでした。

これで、Windows 側からの Docker コマンドの接続先が WSL 環境で稼働する Docker エンジンになっているはずです。

試しにハロワを試してみます。

Windows の PowerShell で hello-world イメージを実行すると次のとおりです。

PS C:\Users\hero\Desktop> docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

コンテナ自体は上記のメッセージを表示したら終了してしまいますが停止して残っています。

PS C:\Users\hero\Desktop> docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
73c30a434598   hello-world   "/hello"   2 minutes ago   Exited (0) 2 minutes ago             awesome_liskov

次に WSL のコンソールで確認してみます。

❯ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
73c30a434598   hello-world   "/hello"   2 minutes ago   Exited (0) 20 minutes ago             awesome_liskov

同じコンテナが見えます。

これで Windows から WSL 内の Docker コンテナを操作できることも確認できました。

まとめというか感想

確か M1 Mac が発表された頃は Intel Mac もしばらく発売するよとアナウンスされてた気がするのですが、現状、 M1 Mac だけになってしまいました。
しかしサービスの本番稼働環境は x86_64 なんでソースのコンパイルや Docker イメージのビルドを考えると Arm 系 CPU のマシンでなく Intel 系マシンでの開発環境の模索もしておいたほうがいいかなと思って Windows 11 + WSL の気になるところをざっくり試してみました5

何年ぶりかの Windows 環境に戸惑いながらでしたが、思ったより WSL 環境を用意するのは簡単でした。
Windows からシームレスに Ubuntu のコンソールに入れるのは便利です。 WSL 環境が Windows に統合されていると感じます。
WSL のコンソールから VSCode を起動すると Windows 側で起動するなんておおっ! さすが MS のツールで固めた環境だけあると思ってしまいました。
Lima の様に仮想マシンの起動停止を自分でやらなくても良いのも楽です。

ただ、WSL の本質が仮想マシンである以上、結局は Windows に加えて Linux の環境整備、運用が必要なのだなと思いました。二度手間感が否めません。
そして開発のための環境は基本 Linux 側です。

表計算やプレゼン資料は MS Office は必要なくて Google Docs で十分です。その他のドキュメントも esa や Redmine など Web システム上で作ってるし。
Windows でないとできない作業があるかな? って考えてみるとなさそうなんですよね。
Docker にしても Docker Desktop の有料を回避できそうでもないですし6

結局 Ubuntu を直接使ったほうがいいんじゃないかという結論に至りました。

さてと、OS 入れ替えるかな。

最後に

アクトインディではエンジニアを募集しています。

actindi.net

参考


  1. パッケージによってはインストーラーが表示されるものもあるようです。

  2. 「Windows ランチャー」でググるといろいろあってこれだ! というデファクトはなさそうですが、ueliが良さげでした。

  3. 有効でなければどうなるかというと後述の wsl --install でエラーが発生します。

  4. 参照はできるのですが、デフォルトでは Read Only なのでいい感じに使うには工夫が必要なのですが。

  5. まあ、本番で使うものを手元の開発マシンでビルドなんかしないんですけどね。M1 Mac だったらビルドできるのに本番 CI でエラーになったりするのは嫌だし、デバッグも面倒だなと思うんです。

  6. 有料回避についてはなんか方法があるかもしれません。Git Bash で docker コマンドだけインストールしてつなぐとか。でもWindows側からのシームレスな使い勝手ではなくなるのではと思います。まあ、Docker使うときにはWSLに入ればいいだけではあるのですが。