オンラインイベント「Microsoft Build 2020」を開催中のマイクロソフトは、「Windows Subsystem for Linux 2」(WSL 2)の正式リリースを発表しました。
[速報]WSL 2が正式版に到達。今後はLinuxのGUIアプリへも対応すると。Microsoft Build 2020 - Publickey
⇧ 2020年の5月に正式リリースって話は出てたけども、ネックになってたのが「Windows 10 May 2020 Update」なんだけども、
2020年10月初め、Windows 10 May 2020 Update(バージョン2004)に3回目のオプションの更新(Cリリース)が提供されました。過去3回と同様、Windows 10 バージョン1809~1909から1週間以上(今回は15日)、大幅に遅れての提供です。Windows 10 バージョン2004におけるCリリースのインストール挙動は、やはり何かおかしいです。幾つかのパターンで試してみました。
Windows 10 May 2020 Update後のWindows Updateに“へん”化あり[その3]:山市良のうぃんどうず日記(190) - @IT
⇧ 2020年の10月時点においても、何か安定してないって話があって、どうも躊躇してしまってたんですよね。
とは言え、 「Windows 10 October 2020 Update」とかも出てるので、流石に「Windows 10 May 2020 Update(バージョン2004)」で正規リリースの「WSL 2(Windows Subsystem for Linux 2)」を導入しても差し支えないだろうと。
レッツトライ~。
WSL 2(Windows Subsystem for Linux 2)って?
Microsoftさんの公式のドキュメントによると、
WSL 2 は、Linux 用 Windows サブシステムが Windows 上で ELF64 Linux バイナリを実行できるようにする、Linux 用 Windows サブシステム アーキテクチャの新しいバージョンです。 その主な目標は、ファイル システムのパフォーマンスを向上させることと、システム コールの完全な互換性を追加することです。
⇧ ということで「WSL(Windows Subsystem for Linux)」の新バージョンですと。
「ELF64 Linux バイナリ」の実行ができるようになった点が「WSL(Windows Subsystem for Linux)」との大きな違いということなんですかね?
「ELF」って?
Executable and Linkable Format (ELF) とは、コンパイラが生成するオブジェクト、および、ライブラリとリンクされた実行ファイルのファイルフォーマットである。a.outフォーマット、COFFの後継として広く採用されている。セクション数の制限が緩く、メモリ上で連続していないファイルや、ロードされる場所と実行される場所が違う箇所を含む場合にも対応が可能な柔軟な設計となっている。
System V が採用し、GNUツールチェーンがサポートしている。今ではBSD派生OSやLinuxをはじめとするフリーなOSにおける実行ファイルフォーマットや、ゲーム機等を含む組み込み機器開発にも数多く使われている。
⇧ Linuxでも使われてるファイルフォーマットらしい。
「ELFファイルの構造」は、
⇧ 上図のような感じらしい。
「WSL(Windows Subsystem for Linux)」ってのは、
Linux 用 Windows サブシステムを使用すると、開発者は、従来の仮想マシンまたはデュアルブート セットアップのオーバーヘッドなしで、ほとんどのコマンド ライン ツール、ユーティリティ、アプリケーションを含む GNU/Linux 環境を変更せずそのまま Windows 上で直接実行できます。
次の操作を行います。
- Microsoft Store から好みの GNU/Linux ディストリビューションを選択します。
grep
、sed
、awk
などの一般的なコマンドライン ツールや、その他の ELF-64 バイナリを実行します。- 以下のような Bash シェル スクリプトや GNU/Linux コマンド ライン アプリケーションを実行します。
- 自分の GNU/Linux ディストリビューション パッケージ マネージャーを使用して、追加のソフトウェアをインストールします。
- Unix に似たコマンド ライン シェルを使用して Windows アプリケーションを起動します。
- Windows で GNU/Linux アプリケーションを起動します。
⇧ ってことらしい。
「WSL(Windows Subsystem for Linux)」と「WSL 2(Windows Subsystem for Linux 2)」で決定的に異なっているところは?
WSL 1とWSL 2のアーキテクチャの違い
WSL 1は、サブシステムが特殊なプロセス環境を作り、Linuxのカーネル機能をNTカーネルの機能呼び出しに変換してLinuxプログラムを実行する環境を作っていた。このためWSL 1ではLinuxカーネル自体は存在していなかった。これに対してWSL 2では仮想マシン内に専用パッチを当てたLinuxカーネルを動かし、Linuxの実行環境を作る。Linuxカーネルが動作するためほとんどのLinuxプログラムを動作させることができる。
完全なLinuxがWindows 10上で稼働する? 「WSL 2」とは:Windows 10 The Latest - @IT
⇧ 上記サイト様によりますと、「Linuxカーネル」があるかどうかってことらしいですね。っていうか、「Linuxカーネル」が無いのに「Linux」と謳うことはできない気がするんだが...だから名前が「WSL(Windows Subsystem for Linux)」ってことだったのかね。
「WSL 2(Windows Subsystem for Linux 2)」は名前が紛らわしいけど、「Linuxカーネル(WSL 2パッチ)」が動いてるんなら、完全な「Linux」ってことじゃないのかね?
VirtualBoxやVMwareとはバッティングしないの?
ここで、気になるのが、 「WSL 2(Windows Subsystem for Linux 2)」では「ハイパーバイザー(Hyper-V)」が使われてるらしいですと。
ただ、Microsoftの公式のドキュメントでは、アーキテクト図が見当たらず、
⇧ Microsoftに就業してる人のブログで、アーキテクト図が紹介されてますが、本当に「ハイパーバイザー(Hyper-V)」使われてるの?って懸念が浮かび上がりますかね。
だからかもしれませんが、
WSL 2 に Hyper-V は使用されていますか? Windows 10 Home では使用できるようになりますか?
WSL 2 は、WSL を現在使用できるすべての SKU (Windows 10 Home を含む) 上で使用できます。
最新バージョンの WSL では、仮想化を有効にするために、Hyper-V アーキテクチャが使用されます。 このアーキテクチャは、"仮想マシン プラットフォーム" のオプション コンポーネントで使用できます。 このオプションのコンポーネントは、すべての SKU 上で使用できます。 WSL 2 は間もなくリリースされるため、このエクスペリエンスの詳細をすぐにご確認いただけます。
⇧ っていうような質問が飛び交うと。「ハイパーバイザー(Hyper-V)」は使われてますと。
気になってた、他の仮想化アプリケーションとバッティングしないかどうかですが、
WSL 2 と、VMware や VirtualBox などの他のサード パーティの仮想化ツールを実行できますか?
一部のサード パーティ アプリケーションは、Hyper-V が使用されている場合は機能しません。つまり、VMware や VirtualBox など、WSL 2 が有効な場合は実行できません。 しかし、VirtualBox と VMware の両方から、Hyper-v と WSL2 をサポートするバージョンが最近リリースされました。 VirtualBox の変更点についてはこちらから、VMware の変更点についてはこちらから、詳細を参照してください。 トラブルシューティングの問題については、GitHub の WSL リポジトリにある VirtualBox の問題に関するディスカッションをご覧ください。
⇧「VirtualBox」や「VMware」側で対応してくれたらしいので「VirtualBox」や「VMware」で対応すれば共存させることはできそうですと。
「VirtualBox」の場合は、おそらく、
VirtualBox 6.0.0 (released December 18 2018)
This is a major update. The following major new features were added:
⇧「VirtualBox 6.0.0」の変更が該当するんじゃないかと。「WSL」については「VirtualBox」側で言及してる部分が見当たらなかったけど...
つまり、「VirtualBox」の場合は、6.0.0 以上のバージョンを使っていればバッティングは回避できそうですと。
と思いきや、
VirtualBoxは、Windows 10 1809のときにバージョン6.0.0でHyper-Vに対応しました。
原因は、仮想化のすべての処理をユーザーモードで行わなくてはいけないようにしたからです。
WSL2やHyper-Vに対応したVirtualBox 6.1.16が公開されました。パフォーマンスは悪くなっていますが、安定して動いています。
⇧ という、Microsoftさんの傍若無人ぶりに、周囲の人間の疲弊は並々ならぬものであった。
というわけで、「VirtualBox 6.1.16」以上でないと駄目みたいね...
自分のインストールしてる「VirtualBox」のバージョン確認してみた。
ちなみに、「chocolatey」でインストールしてた場合、「chocolatey」でもバージョン確認はできるっぽいけど、バージョンの細かい部分までは表示されない模様。あと、virtualbox以外の情報も表示されるという...
⇧ う~ん、バージョンアップが必要やね...
WSL2(Windows Subsystem for Linux 2)を導入してみる
導入手順については、
⇧ 一応、Microsoftの公式のドキュメントがありますと。
ただ、
Linux 用 Windows サブシステム (WSL) をインストールするには、次の 2 つのオプションを使用できます。
-
簡略化されたインストール " (プレビュー リリース) ":
wsl --install
簡略化されたインストール コマンド
wsl --install
を使用するには、Windows Insider Program に参加し、Windows 10 のプレビュー ビルド(OS ビルド 20262 以降) をインストールする必要がありますが、手動インストールの手順に従う必要がなくなります。 必要な操作は、管理者特権でコマンド ウィンドウを開いてwsl --install
を実行するだけです。再起動後、WSL を使用する準備が整います。 -
手動インストール :以下に示す 6 つの手順に従います。
WSL の手動インストール手順を以下に示します。これを使用して、任意のバージョンの Windows 10 に Linux をインストールできます。
⇧「簡略化されたインストール」の場合は「OS ビルド 20262 以降」ってあるけど、それの調べ方を載せといて~、って話ですよね、流石はMicrosoft様、安定の不親切さ。
で、衝撃的なんだけども、
⇧ どういうわけかMicrosoftの公式ページだと、「OS ビルド 20262 以降」についての記載がない...
Wikipediaさんに頼ることにしました。
Windows 10 のメインストリーム ビルドには"YYMM" というラベルが付けられており、YY は 2 桁の年を表し、MM はリリース予定の月を表します (たとえば、バージョン1507は2015年7月にリリースされたビルドを表します)。バージョン20H2以降、Windows 10 リリースの命名法は年と月のパターンから年と半年のパターン (YYH1、YYH2) に変更された。
⇧ ということですが、「OS ビルド」の規則については依然として、判明せず...
というわけで、「手動インストール」でトライすることにしました。
WSL2 の正式版が使えるのは、「Windows 10 2004 May 2020 Update」適用後です。まずは自分のOSがアップデート済みかを確認しましょう。
⇧ 上記サイト様を参考に確認していきます。
Win + R
を押して出てきたダイアログに winver
と入力してOKを押します。
⇧ ということなので、
いざ。
ここで赤枠でかこった Version 情報が、Version 2004 (OS Build 19041) 以降になっていれば大丈夫です。 (言語設定を英語にしているので、日本語設定の場合とは文言が多少違うかもしれません。)
⇧ ということみたいなので、大丈夫そうです!
⇧ 上記サイト様によりますと、自分のPCのWindows がどうアップデートを重ねてきたかなんかも確認できるみたい。
$AllBuilds = $(gci "HKLM:\System\Setup" | ? {$_.Name -match "\\Source\s"}) | % { $_ | Select @{n="UpdateTime";e={if ($_.Name -match "Updated\son\s(\d{1,2}\/\d{1,2}\/\d{4}\s\d{2}:\d{2}:\d{2})\)$") {[dateTime]::Parse($Matches[1],([Globalization.CultureInfo]::CreateSpecificCulture('en-US')))}}}, @{n="ReleaseID";e={$_.GetValue("ReleaseID")}},@{n="Branch";e={$_.GetValue("BuildBranch")}},@{n="Build";e={$_.GetValue("CurrentBuild")}},@{n="ProductName";e={$_.GetValue("ProductName")}},@{n="InstallTime";e={[datetime]::FromFileTime($_.GetValue("InstallTime"))}} }; $AllBuilds | Sort UpdateTime | ft UpdateTime, ReleaseID, Branch, Build, ProductName
話が脱線しましたが、自分の場合は、 「WSL(Windows Subsystem for Linux)」からインストールする必要があるみたいなので、PoweShellを管理者権限で起動し以下のコマンドを実行で。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
コマンドの実行が完了したらば、PCを再起動します。
再起動後、以下のコマンドを実行で。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
コマンドの実行が完了したらば、また、PCを再起動します。
再起動後、以下のコマンドを実行で。
systeminfo
ご自分のマシンのタイプに合った「WSL 2(Windows Subsystem for Linux 2)」のインストーラーをインストールします。
⇧ 上記の「手順 4 - Linux カーネル更新プログラム パッケージをダウンロードする」のリンク(自分は「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」のリンクを押下しました)を押下で。
インストーラーがダウンロードできたら、インストーラーを起動で。
「Next」を押下で。
「Finish」を押下。
そしたらば、以下のコマンドを実行。
wsl --set-default-version 2
WSL 2 (Windows Subsystem for Linux 2)のインストールは完了したようですが、Linuxディストリビューションを1つもインストールしてないデフォルトの状態だと、
PS C:\Users\Toshinobu> wsl -l -v Linux 用 Windows サブシステムには、ディストリビューションがインストールされていません。 ディストリビューションは Microsoft Store にアクセスしてインストールすることができます: https://aka.ms/wslstore
みたいな感じで、何でもいいからインストールしろと促されるようです。
VirtualBoxをバージョンアップする
WSL 2(Windows Subsystem for Linux 2)とは関係ないのですが、VirtualBoxも使えるようにしておきたいので。
VirtualBox 6.1.16以上であれば、「WSL 2 (Windows Subsystem for Linux 2)」と共存ができるようなので、 バージョンアップしときます。(時間があれば、Vagrantとかもバージョンアップしていきたいところですが、今回は割愛)
自分は、「chocolatey」でインストールしてしまってるので、「chocolatey」でアップグレードしていこうと思います。
ちなみに、もう少しすると、「winget(「Windows Package Manager」のクライアントツール)」っていう「パッケージ管理ツール」が正式リリースされるみたいね。
今回紹介する「Windowsパッケージマネージャー」は、プレビュー版であり、コマンドオプションや動作など細かい部分は、最終的に変更される可能性があることをご理解いただきたい。現時点での完成予定は、2021年5月である。GitHubでソースコードが公開されており、ここで進行状況を見ることもできる。原稿執筆時点では、winget.exeのバージョンが「v.0.2.2941」であった。
Windows環境再構築をコマンドラインで自動化可能にするMicrosoft製ツール「winget」とは:Windows 10 The Latest(1/2 ページ) - @IT
⇧ 全Windowsの民が待ち望んでいたといっても過言でない、ついにWindowsに正式な「パッケージ管理ツール」がやって来るんですね。
なので「chocolatey」や「scoop」から「winget」へ切り替わっていくことになるかもですね、時代の流れ~。
はい、脱線しましたが、VirtualBoxをバージョンアップで。コマンドプロンプトを管理者権限で起動して、以下のコマンドを実行。
choco upgrade virtualbox
新たにコマンドプロンプトを起動して、バージョンアップできてるか確認。
ただ、「Guest Additions」もアップグレードしないといけないんだけど、自動で更新してくれるのが、ゲストOSがWindowsのものしか用意されてないっぽいので、一旦、対応はパスで。
何故か、
⇧ ゲストOSがWindowsの場合に限り、提供してるっぽいという...
Docker Toolboxをアンインストールで
「WSL 2(Windows Subsystem for Linux 2)」は「Hyper-V」を内部で利用している関係上、「Docker」を使う場合は「Docker Desktop」をインストールする必要があるらしく、「Docker Toolbox」とバッティングするらしいので、「Docker Toolbox」をアンインストールしていきます。
正規のアンインストール方法は
⇧ 公式サイトに掲載されてるようです。
私はコマンドプロンプトを管理者権限で起動して、以下コマンドを実行いたしました。(自分は「chocolatey」を使って「Docker Toolbox」をインストールしてるため)
choco uninstall docker-toolbox
消しきれなかったフォルダを削除しときます。
自分の場合は、「C:\Users\[ユーザー名]\.docker」が残ってたので「削除(D)」で。
さようなら、「Docker Toolbox」。いままで、ありがとう(涙)。
Docker Desktopをインストール
「Docker」使わない場合は、不要ですが、「Docker」を使いたいので「Docker Desktop」をインストールしていきます。
「chocolatey」を使ってインストールしました。
choco install docker-desktop
で、
インストール後の Docker Desktop は、自動的に起動できません。Docker Desktop を開始するには Docker を検索し、検索結果にある Docker Desktop を選択します。
Windows Home に Docker Desktop をインストール — Docker-docs-ja 19.03 ドキュメント
⇧ まさかの初回起動は、コマンドでの起動は受け付けていませんと...
というわけで、「Docker Desktop」のアイコンをクリック。
はい、エラー。
どうやら、一旦、PCから「サインアウト」すれば動くようになるそうな。
「サインアウト」後、無事動きました。
動き出しました。
「docker」コマンドも動くようになりました。
とりあえず、「Settings」で設定の確認してみます。
Windows 10 Homeで「Docker for Desktop」を使ってる場合は、「Use the WSL 2 based engine (Windows Home can only run the WSL 2 backend)」にチェックが入っていればOKみたいですね、というかチェックボックスが不活性化されてるので、そもそもチェックを外したりできないようになってますね。
ちなみに、
「WSL 2 based engine」とあるように、この機能を有効にした場合は、WSL 2 の仮想マシンとして Docker サーバーが動くようです。PowerShell で WSL のディストリビューション一覧を表示するとそれが分かります。
⇧ 上記サイト様によりますと、「WSL 2 based engine」は、WSL 2の仮想マシンとして「Docker サーバー」が動くらしいです。
Windows 10 Homeを使ってる場合は、
Hyper-V マネージャーを開くと、DockerDesktopVM という仮想マシンが作成されて動いているのが分かります。
⇧ 残念ながら、「Hyper-V マネージャー」で「仮想マシン」がどれだけあるのか確認することはできないようです。
⇧ 上記サイト様によりますと、「Windows 10 Home」で「WSL 2 」を使ってる場合は、「\\wsl$」で「WSL 2 」環境下のファイルを確認できるようです。
⇧ 自分の場合は、「Docker Desktop」をインストールしたばかりなので、いまのところ「Docker Desktop」関連のファイルだけある状態。
一応、「\\wsl$\docker-desktop-data\isocache」に「ISOファイル」のキャッシュ?っぽいものがあったので、「Docker Desktop」の「仮想マシン」がどっかで動いてるってことなんですかね。
「Docker Toolbox」だと「docker-machine」コマンドで「Dockerエンジン」入りの「仮想マシン」とか作成できたわけだけど、「Windows 10 Home」で使う「Docker Desktop」は「仮想マシン」作成っぽいコマンドとか無いので、ちょっと、慣れるまでに時間かかりそうね...
う~ん、結局のところ、「Windows 10 Home」とそれ以外でやっぱりできることが変わってきちゃうんですかね...
とりあえず、時間ができたら、「WSL 2 」で「RHEL(Red Hat Enterprise Linux)」とか導入できるか試していきますか。
2021年2月19日(金)追記:↓ ここから
Windows 10 Homeでも「WSL 2(Windows Subsystem for Linux 2)」で仮想マシンを確認できるみたい。
Windowsコンテナの操作にはdockerを利用する場合が多いが、その他にhcsdiag.exe
というものが存在します。
しかしながら、コマンドのリファレンスが現時点(2019/12)で見つからないため、そのオプションと実行した結果をここに記載します。
⇧ 上記サイト様によりますと、「hcsdiag.exe」ってコマンドが存在するそうな。
PowerShellを管理者権限で起動して、以下のコマンドを実行してみた。
hcsdiag list
⇧ 一応、「WSL」の「VM(仮想マシン)」が「Running」になってるから起動してることになるみたい。
「Windows 10 Home」以外であれば、「VMMS」の「VM(仮想マシン)」も表示されるみたいね。
「Virtual Machine Management Service」の略らしく、「vmms.exe」ってのが実行されてるってことらしいね、「Windows 10 Home」でも動かせるのかは謎です...
そもそも「Hyper-V」に関わる部分のどこまでが「Windows 10 Home」でも操作できるのかが分からん...
2021年2月19日(金)追記:↑ ここまで
2021年2月20日(土)追記:↓ ここから
ちなみに、「Docker Desktop」を止めてPCをシャットダウンすると、PCのシャットダウン時にエラーが出ないかも。(駄目でした...なんか「wsl.exe」ってやつが動き続けて、PCシャットダウン時にエラー出ますね)
ただ、
wsl --shutdown
だと、「Docker Desktop」の仮想マシンが止まらないっぽいので、
wsl --terminate [Name]
って感じで、明示的に指定しないと駄目らしい。
「WSL 2」で存在してた「VM(仮想マシン)」のほうも止まった模様。
試しに、「docker-desktop」を再起動すると、
「WSL 2」で存在してた「VM(仮想マシン)」が再び起動し出すという...
⇧ ということは、動いてる「VM(仮想マシン)」は「Docker Desktop」のものということなんですかね?
「WSL 2」自体は、
WSL 2 uses the latest and greatest in virtualization technology to run a Linux kernel inside of a lightweight utility virtual machine (VM). However, WSL 2 is not a traditional VM experience.
https://docs.microsoft.com/en-us/windows/wsl/compare-versions
⇧「lightweight utility virtual machine (VM)」ってのが動いてる、ってことみたいなんですが、この「VM(仮想マシン)」自体の状態ってのは、どうやって調べたら良いのかね?
「WSL 2」については、
The new Windows subsystem for Linux architecture: a deep dive - BRK3068
⇧ 上記サイト様が詳しいですかね。
いまいち、「lightweight utility virtual machine (VM)」の中に「VM(仮想マシン)」や「コンテナ」が入るという認識で良いのかが分からん...
「WSL 2」の文脈で語られる時の「Linux ディストリビューション」は「VM(仮想マシン)」の形で導入されるということなのか、「VM(仮想マシン)」とも「コンテナ」とも全く異なる形で導入されているということなのか?
このあたり、有識者の方が解説してくれることを切に願いますね。(日本語で)
とりあえずで、「WSL 2」を導入してはみたものの、何か発展途上の感は否めないようですね。
2021年2月20日(土)追記:↑ ここまで
今回はこのへんで。