こんにちは、サイオステクノロジー技術部 武井(Twitter:@noriyukitakei)です。今回はWindows Subsystem for Linuxを用いて、Webアプリケーション開発環境を劇的に改善してみたいと思います。
3回シリーズでお届けする予定で、第1回目は概要編となります。
※ 本記事は技術評論社「Software Design」2019年11月号(詳細はこちら)に私が寄稿した「Microsoft Azureで最新Webアプリ開発」の記事をベースとしております(本ブログ掲載は技術評論社様ご了承済みです)。
※ WSLでなくDockerとVisual Studio Codeを合わせた事例もありますので、是非ご参考下さい!!
- Visual Studio Code + Docker + Remote DevelopmentでTomcat上のWebアプリを超簡単にデバッグ
- Visual Studio CodeのRemote DevelopmentとDockerで快適な開発環境をゲット
Windows Subsystem for Linuxとは?
Windows Subsystem for Linux(以降、WSL)は、平たく言うとWindows内でLinuxを実行できる仕組みです。これによりWindowsでの開発環境は劇的に改善します。
開発環境としてのWindowsは、そのインターフェースの親しみやすさから、言わずもがな使いやすいです。また、Windowsは音楽や動画などのメディア系ファイルを扱うOSとしては、秀逸です。一方で、シェルの扱いやすさは、Linuxに軍配が上がります。ログをgrepしながらtailしたりなどの操作はWindowsでは中々にハードルが高いのが事実です(出来なくはないですが)。そんなLinuxとWindowsのいいとこ取りをしたいというエンジニアは数多いらっしゃると思います。
例えば、WindowsよりLinuxが優れている例として、先程もご説明した「シェルの操作性」があります。以下のような、重複した行が散在するテキストファイルから、重複した行だけを取り出してソートするという例を考えてみます。
banana
apple
peach
apple
banana
banana
tomato
banana
Windows、Linuxそれぞれの場合で、上記の内容を実現するシェルは以下のとおりです。
■ Windowsの場合
PS> Get-Content test.txt | Group-Object | Where-Object {$_.Count -gt 1} | Select-Object -ExpandProperty Name | Sort-Object
■ Linuxの場合
$ sort test.txt | uniq -d | sort
やはり、Linuxの方に軍配が上がりますね。Windowsの場合より、シンプルな方法で実現が可能です。
いずれのコマンドも結果は同じで、以下のとおりとなります。
apple
banana
確かに今までも、CygwinやVirtual Boxなどの仮想化ソフトウェアによるLinux on Windowsの実現方式がありました。今回ご紹介するWSLとそれらの決定的な違いは、「導入の容易さ」「高速起動」「Windowsとの親和性」です。
導入の容易さ
まず、導入の容易さについて、ご説明致します。Virtual Boxを始めとした仮想環境は、ネットワークやストレージ、メモリを始めとした各種リソースの設定、それからOSのインストールと、かなりの手間と時間を要します。
それと比べて、WSLを導入するまでは数ステップ、時間にすれば10分程度で、OSインストール済みの環境が出来上がり、しかも全てGUIで完結します(後述するWSL2は一部CLIが必要)。本当に簡単で、あっという間です。
高速起動
WSLの起動は、ほぼ一瞬です。それは、Windowsのコマンドプロンプトを起動するのと同じような感覚といっても過言ではありません。
Virtual Boxなどの仮想環境は、昨今のOSの起動が早くなったとはいえ、WSLには遠く及びません。bashなどのシェルが使いたい時に、たとえ5秒待たされるのさえストレスに感じます。
使いたい時にさっと使えるのは、大きなアドバンテージになるのではないでしょうか?
Windowsとの親和性
WSLは非常にWindowsとの親和性が高いことが、大きなメリットです。その一例として、Windows⇔Linux間の相互ファイルアクセスです。
Virtual Boxでも、SambaなどのCIFSプロトコルに対応したサーバーを立てれば、もちろん可能です。しかし、Sambaのインストールや設定といった煩雑な作業が待っていますし、アクセス権の設定やファイル名の文字コードなど、頭を悩ませることがありますよね。
WSLであれば、とても簡単です。WindowsからLinux上にあるファイルにアクセスするには、「\\wsl$\[ディストリビューションの名前]」というパスにアクセスすればOKです。ディストリビューションがUbuntuの場合は「\\wsl$\Ubuntu」となります。
LinuxからWindowsの場合は、「/mnt/[ドライブ名]」というパスにアクセスすると、Windowsの指定したドライブ直下にアクセスが出来ます。Cドライブにアクセスする場合は、「/mnt/c」となります。
Windows上でLinuxを使う場合、WSLは従来の方法に比べて、たくさんのメリットがあることがご理解頂けたかと思います。
WSL1とWSL2の違い
2019年5月にシアトルで開催されたマイクロソフトの開発者向けイベント「Build 2019」で、従来のWSLを強化した「WSL2」が発表されました。
アーキテクチャが大きく刷新されたWSL2の特徴は、「仮想マシン上で動作するホンモノのLinux」ということです。ここからは、今までご説明したWSLとWSL2を明確に区別するために、WSL1と呼称します。
ここで、「え?WSL1のLinuxはニセモノなの?」という疑問が湧くと思いますが、半分アタリです。
WSL1とWSL2のアーキテクチャのイメージ図に基づき、その違いについて、ご説明します。
WSL1は、Linuxカーネルのファンクションコールが、LXCoreというシステムによって、Windowsへのファンクションコールに変換されて、動作しています。よって、WSL1にはLinuxカーネルは存在しません。ご存知のとおり、ファンクションコールは多数あり、それら全てをLXCoreでは変換しきれないため、Linuxの動作を忠実に再現することができません。そのため、Linuxのファンクションコールに強く依存するDockerなどは動作しません。
一方で、WSL2は、Hyper-Vベースの仮想マシンサービス上にLinuxカーネルを搭載したOSが動作します。これにより、Windows上でフル互換のLinuxが動作します。このアーキテクチャは、一見、時代の流れに反しているようにも見えますが、このHyper-Vは、WSL2専用にカスタマイズされた軽量なものであり、さらにLinuxカーネルもマイクロソフト独自パッチを当てることで軽量化を実現しているので、約2秒程度の超高速起動を実現しています。ささっとbashが使いたいときに、Linux環境の起動がもったりするのは、かなりストレスになるのは想像に難くありません。WSL1同様、WSL2もストレスフリーのbash環境を実現できます。
ただ、残念ながら本記事執筆現在(2019年9月10日)、WSL2はWindows Insider Preview版の機能となっており、まだ正式リリースはされていません。Windows Insider Previewは開発中のバージョンにより、まだバグが残っている可能性もあるため、ご利用には十分ご注意下さい。
先程もご説明しましたが、WSL2は、WSL1と違い、フル互換のLinuxです。よって、WSL2ではDockerやFUSEなど、強くカーネルに依存するソフトウェアが動作することが、最大のメリットです。次回以降で、このメリットを生かした、新たな開発手法をご紹介致します。
まとめ
WSL1とWSL2の概要及びその違いについてご理解頂けたかと思います。次回は、その2:導入編にて、WSL1及びWSL2のインストール方法や使い方についてご紹介いたします。
※ WSLでなくDockerとVisual Studio Codeを合わせた事例もありますので、是非ご参考下さい!!