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 つは必須だと思っています。
- パッケージマネージャ homebrew
- キーマップカスタマイズ Karabiner Elements
- ランチャー Alfred
これらの Windows 版はなさそうです。では代替するものはなにかということろから調べました。
パッケージマネージャ
何をするにもアプリのインストールは必要なので、まずはパッケージマネージャから。
まあ、Windows Store からポチポチでもいいのですが、コマンドで探してサクッとインストールできる方がいいなぁと思うのです。
昔使っていたChocolateyもまだ健在のようですが、他にもないかとググってみると winget
という CLI ツールがありました。OSS でなんと Microsoft 製です。
Chocolatey に比べるとインストールできるパッケージ数が少ないようですが Microsoft 製ということで採用しました。
winget
自体は Microsoft Store からサクッとインストールできます。
インストールしたらターミナルから次の様にパッケージをインストールできるようになります。
> winget install --id Microsoft.PowerToys
サブコマンドのsearch でパッケージを探したり、listでインストール済みパッケージを表示したりできます。アンインストールもuninstallで可能です。
一つのパッケージインストールの度にダイアログで許可を求められるところは作業性的にはいまいちですね。
また、brew bundle
に相当する機能がないのも残念です。
しかし、いちいちインストーラの UI でポチポチやらなくていいのはやはり便利です1。
winget
を使って次のパッケージをインストールしました。
- Obsidian.Obsidian
- Microsoft.VisualStudioCode
- Google.Chrome
- Microsoft.PowerToys
- Microsoft.PowerShell
- Docker.DockerDesktop
- など
Google 日本語入力(Google.JapaneseIME)もインストールできそうなのですが、試すとエラーが出たので Google のサイトからインストールしました。
次のサイトで winget
でインストールできるパッケージを検索できます。
キーマップカスタマイズ
US キーボードを使っているので caps と cntrol を入れ替えたりしたいのですが、ググると KeySwap や AutoHotKey などがメジャーな様です。 それらでも良かったのですが Microsoft の PowerToys の keyboard manager でもできそうなのでこれを使うことにしました。
次を設定しました。
- caps と ctrl の入れ替え
- alt(left) は ctrl を割り当て
- Mac の
Control + C
などのショートカットと同じキー配置の操作にするため
- Mac の
- alt(right) に IME kanji を割り当て
- これで IME の ON/OFF をトグルできます
alt キーを殺してしまったのが気になりますが、だいぶ Mac のキーボード操作感に近づきました。
ランチャー
Windows キーで開くメニューからアプリ名を入力して起動できるので、とりあえずこれで事足りるかなと思って別途インストールはしませんでした2。
WSL を試す!
ざっくり OS の使い勝手を整えたところで本題の WSL です。
WSL というのは Windows Subsystem for Linux のことです。
以前、Mac OS 版 WSL を謳っている Lima について書きましたが、その時からどんなものなのだろうと思っていました。
ついに本家 WSL を試します。
Hyper-V の有効化
WSL をインストールするには Hyper-V が有効になっている必要があります。 Hyper-V というのは Windows に組み込まれているハードウェアの仮想化機能ですね3。
まずはこの Hyper-V の状態を確認します。
Windows メニューから[設定]を開き、[アプリ]-[オプション機能]-[Windows のその他の機能]を選択します。
画面の最下部にある[Windows のその他の機能]を選択すると次の設定ウィンドウが開きます。 なんとなく Windows 7 の頃から変わってなさそうなデザインに懐かしさを感じつつ、リストから Hyper-V を探します。
チェックがついていれば「キャンセル」をクリックして閉じて構いません。 チェックがついていなければチェックして「OK」ボタンをクリックします。 すると次のダイアログが表示され、なにやら処理が始まります。
しばらくすると処理が終わり次のように表示されます。
素直に指示に従って「今すぐ再起動」ボタンをクリックして再起動します。
WSL のインストール
再起動したら、いよいよ WSL のインストールです。 管理者権限で開いた PowerShell で次を実行します。 このコマンドだけで WSL のセットアップを全部やってくれます。
> wsl --install
メッセージを眺めつつしばらく待つと、再起動を促すメッセージが最後に表示されるので、それに従って再起動します。
再起動後、自動的にインストールの続きが実行されます。 なにも指定しないと Ubuntu が選択されます。
最後にユーザとパスワードの入力が求めらるので入力して終了です。 とても簡単にインストールできます。
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
インストールしたら次の拡張もインストールします。
WSL 側
続いて、Windows Terminal 等で WSL に入って適当な作業ディレクトリで code .
とコマンドします。
初回実行時には次のように WSL 側に必要な 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 の設定を開きます。
開いたら 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 入れ替えるかな。
最後に
アクトインディではエンジニアを募集しています。
参考
- winget ツールを使用したアプリケーションのインストールと管理 | Microsoft Docs
- PowerToys のインストール | Microsoft Docs
- Windows11のHyper-Vを有効化して仮想環境を構築する準備 - Win11ラボ
- WSL の開発環境を設定する | Microsoft Docs
- WSL で VS Code の使用を開始する | Microsoft Docs
- WSL での Docker コンテナーの概要 | Microsoft Docs
-
パッケージによってはインストーラーが表示されるものもあるようです。↩
-
「Windows ランチャー」でググるといろいろあってこれだ! というデファクトはなさそうですが、ueliが良さげでした。↩
-
有効でなければどうなるかというと後述の
wsl --install
でエラーが発生します。↩ -
参照はできるのですが、デフォルトでは Read Only なのでいい感じに使うには工夫が必要なのですが。↩
-
まあ、本番で使うものを手元の開発マシンでビルドなんかしないんですけどね。M1 Mac だったらビルドできるのに本番 CI でエラーになったりするのは嫌だし、デバッグも面倒だなと思うんです。↩
-
有料回避についてはなんか方法があるかもしれません。Git Bash で docker コマンドだけインストールしてつなぐとか。でもWindows側からのシームレスな使い勝手ではなくなるのではと思います。まあ、Docker使うときにはWSLに入ればいいだけではあるのですが。↩