かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  メモ. WSL 2のLinuxは、LCOWの夢を見るか?

 

 

メモ. WSL 2のLinuxは、LCOWの夢を見るか?

2024年06月14日配信
2024年06月18日更新
執筆者:山内 和朗

 64ビット(x64)Windows 10の新しいバージョン(バージョン2004 ビルド19041以降)、Windows 11、およびWindows Server 2022では、Windows上で本物のLinuxカーネルのシェル環境(一部GUIに対応)を利用できる、「Windows Subsystem for Linux(WSL 2)」がサポートされています。

Linux用Windowsサブシステムとは(Microsoft)

 

Windows上のLinuxは、SFU→SUA→VM→LCOW→WSL 2へ

 

 Windows上でLinuxを利用したいという場合、真っ先に思いつくのは、仮想化技術(Hyper-Vハイパーバイザーなど)の仮想マシン(VM)のゲストOSとして動作させる方法でしょう。Windowsはかなり古いバージョンから「Services for UNIX(SFU)」やその後継である、POSIX準拠のサブシステム「UNIXベースアプリケーション用サブシステム(Subsystem for UNIX-based Applications《SUA》」(外部サイト)を提供し、UNIXとの相互運用を可能にしてきました。これらの機能はWindows 7およびWindows Server 2008 R2を最後に廃止されましたが、既にWindows Serverで利用可能になっていたHyper-Vがその代役を務めることになったわけです。

 Windows Server 2016で初めて搭載されたDockerベースのコンテナー技術(→「Windowsコンテナーについて」《外部サイト》)は、Windowsコンテナーをホストのプロセス上(プロセス分離モード)またはユーティリティ仮想マシン(UtilityVM)のカーネル上のプロセス(Hyper-V分離モード)で動かし、Windowsベースのアプリケーション/サービスを、クラウドネイティブなコンテナーアプリにすることを可能にしました。Hyper-V分離モードを応用し、LinuxコンテナーをWindowsコンテナー環境で動かす「Linux Containers on Windows(LCOW)」の開発が進められましたが、この機能は正式に搭載されることなく、実験的機能(Experimental)のまま2020年3月に開発終了となってしまいました(→旧ブログ記事≪外部サイト≫)。

 

 LCOWの開発がひっそりと終了する一方で、Windows 10バージョン2004(May 2020 Update)でWSL 2が正式版として華々しくデビューしました。LCOWの開発終了とWSL 2正式版の登場は、とても無関係には思えません。それは、姿と名前を変えたLCOWに見えたからです。

 LinuxのシステムコールをWindowsのシステムコールに変換するレイヤーを提供する初期のWSL 1とは異なり、ハイパーバイザー技術と完全なLinuxカーネルに基づくWSL 2は、システムコールの完全な互換性とWindowsを含めたシステム全体のパフォーマンスを提供します(→「WSL 1とWSL 2の比較」≪外部サイト≫)。そして、LCOWと同じように、本物のLinuxカーネルは、ハイパーバイザーで分離されたUtilityVMで実行され、Linuxディストリビューションがコンテナーとして実行されます。このWSL 2のアーキテクチャは、LCOWの実装とほぼ共通しています。

 Windowsコンテナーを実行するためのコンテナー技術が、“狭義のコンテナーサポート”としたら、WSL 2は“広義のコンテナーサポート”の1つと言うことができるでしょう。“広義のコンテナーサポート”には、「仮想化ベースのセキュリティ(Virtualization-Based Security≪VBS≫)」や、VBSに基づく「コア分離」(デバイスガードとも呼ばれます)、「Windowsサンドボックス」、「Microsoft Defender Application Guard」といったセキュリティ機能としての分離環境や、「Windowsユニバーサルプラットフォーム(WUP)アプリ(ストアアプリ)」の分離のための「アプリコンテナー(AppContainer)」といったものも含まれます。

 

デモ:DockerイメージをWSL 2用ディストリビューションにできる

 

 少し面白いデモをお見せします。実は、Dockerのコンテナー技術とWSL 2は共通している部分が多く、Dockerで取得したコンテナーイメージをファイルにエクスポートして、WSL 2にインポートすることができちゃったりします。お見せしましょう。

 Ubuntuに構築したDocker開発環境に、Docker HubからUbuntuの公式イメージを取得し、コンテナーとして実行して、Apache2をインストールします。実は、このUbuntuはWindows 11のWSL 2で動いているのですが、単に手っ取り早かっただけで、本物のUbuntuマシン環境だと思っていただいて構いません。uname -a(または-r)コマンドのカーネルリリース情報に「5.15.146.1-microsoft-standard-WSL2」と表示されるのは、WSL 2(のUtilityVM)上で動いているからです。

 

画面1

 

 Apache2のインストールが完了したら、サービスを開始して、テストページが表示されることを確認します。

画面2

 コンテナーを終了(停止)し、docker exportコマンドでファイル(.tar形式)にエクスポートします。WSL 2では、Linux側から/mnt/cのローカルパスでWindowsのファイルシステムにアクセスでき、逆にWindows側からは¥¥wsl$¥ディストリビューション名のUNCパスでLinux側のルートファイルシステムにアクセスできて便利です。手っ取り早いとは、Linux VMを準備するのが面倒というのと、WindowsとLinux間のファイルのやり取りが簡単だからです。

画面3

 WSL 2のコンポーネントだけをインストール(wsl --install --no-distribution)したWindows Server 2022デスクトップエクスペリエンスに、wsl --importコマンドを使用して、Docker開発環境からコピーしたLinuxディストリビューションのtarファイル(Apache2のインストールを含む)をインポートします。インポートはあっという間に終わり、wslをオプションなしで実行してインポートしたLinuxディストリビューションを開始します。すると、localhost(WSL 2のWindowsからLinuxディストリビューションのlocalhostは透過的)でホストされているApache2のテストページを確認できます。

memo07_scr04

 このデモでは、Docker開発環境からエクスポートしたものをWSL 2にインポートしましたが(参考→「WSLで使用するLinuxディストリビューションをインポートする|ディストリビューションのtarファイルを取得する」≪外部サイト≫)、WSL 2からもtarファイルをエクスポートして、別のWSL 2環境にインポートして使用できます。WSL 2は事実上、Linuxディストリビューション単位のコンテナーであるため、カーネルとアプリケーションのレイヤを分離できるといったコンテナーアプリのポータビリティは利用できませんが、カスタマイズしたものをコンテナー風に利用できることを感じていただけたでしょうか。

blog_subscribe

blog_comment

最新記事