WSLコンテナーにおけるネットワーク
ホストとブリッジ接続、または完全切断が可能
WSLコンテナーでは、以下に表に示した3つのネットワークが利用できる。これは、Dockerと同じだ。wslc.exe containerコマンドでコンテナを起動するような場合(wslc.exe container run)に、--networkオプションなどでコンテナが利用するネットワークを指定する。なお、何も指定がなかった場合、bridgeが選択される。
bridgeは、コンテナ用の仮想ネットワークが作られ、コンテナごとにIPアドレスが割り当てられる。この仮想ネットワークとホスト間はブリッジ接続される(パケットの中身を精査せず、パケットを通過させる接続方法)。
これに対して、hostはコンテナがホストネットワークを共有し、ホスト内のプロセスのように動作する。このようにすることでNATやブリッジ接続処理(ソフトウェアで実現されている)を回避して、bridgeよりも高速にネットワーク接続できる。
noneは、コンテナーをネットワークから完全に切断したい場合に使う。これが指定された場合、ネットワーク側とはまったく通信ができなくなる。
WSLコンテナーでは、こうしたネットワークの振る舞いはDockerと同じだが、仮想環境内で走らせているために実装がまったく異なる。これまでにWSLでは、Linux側で/etc/wsl.conf を使ってネットワークモードを切り替えられた。そのモードとしてデフォルトで「Consomme」(コンソメ)と呼ばれるネットワークモードが使われる。
コンソメは、仮想環境のOpenVMMプロジェクトの一部として開発されたユーザーモードで動作するNAT技術で、コンテナ内では通常のネットワークスタックを動作させ、最後に通信パケットを横取りして、パケットを解析。仮想環境とホスト間の通信に必要な処理をする。なお、WSLコンテナー登場以前には、WSLで「virtioproxy」と呼ばれていたもの。
またコンソメは、仮想環境とホスト間の高速な通信をするためのvirtioと呼ばれる技術を使って、最終的にホストとデータをやりとりする。VIRTIOは、OASIS(Organization for the Advancement of Structured Information Standards、構造化情報標準促進協会)が策定する仮想I/Oデバイスの仕様である。
VIRTIOは、物理アドレスを割り当てた共有リングバッファを使う。このリングバッファは、ホストと仮想マシンで共有される。仮想マシンは、リングバッファに要求を書き込む。このとき、特定のアドレスに書き込むことで、ハイパーバイザーに書き込みがあったことを通知するともに、VM_EXITが実行され、仮想環境から抜け出してホスト側の処理が起動する。
ホスト側のハイパーバイザーは、書き込まれた要求を読み取って処理を開始する。今度は処理結果をリングバッファに書き込んで、仮想マシン側に割り込みを使って、結果が戻ったことを通知する(割り込みにより仮想環境が再開する)。
この方法では、ホストと仮想マシンの切り替えが最小限となり、さらにリングバッファにより大量のデータを高速に受け渡すことが可能になる。
従来のWSLとホスト間の通信には、ハイパーバイザー(Hyper-X)の通信機能で9P(Plan 9で開発された汎用プロトコル)が使われていた。
●OpenVMM
・The OpenVMM Project | Microsoft Community Hub
https://techcommunity.microsoft.com/blog/windowsosplatform/the-openvmm-project/4547237
・Introduction - The OpenVMM Guide
https://openvmm.dev/guide/
・GitHub - microsoft/openvmm: Home of OpenVMM and OpenHCL
https://github.com/microsoft/openvmm
●Consomme
・Consomme - The OpenVMM Guide
https://openvmm.dev/guide/reference/backends/consomme.html
・WSL での詳細設定の構成 | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/wsl/wsl-config
●virtio
・VIRTIO TC: Virtual I/O Device | OASIS
https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=virtio
ホスト側では、リングバッファから受け取った要求をハイパーバイザが管理するVM Device hostを介して、ホストの物理デバイス(Hyper-Xのプライマリパーティションにデバイスドライバがある)でネットワーク側と通信をする。
WSLコンテナーのネットワーク機能は、改良で高速化される。WSLのドキュメントに「Consomme」があることから、WSLでもある程度の恩恵を受けられるだろう。
本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事
-
第550回
PC
WSLコンテナーにおけるストレージについて解説 -
第549回
PC
安定版に進化したWSLコンテナーの仕組み -
第548回
PC
Windows 11 Ver.26H2の配布が開始 すでに5回目のメジャーアップデートで「次」も気になる頃合い!? -
第547回
PC
Windows 11におけるファイルとフォルダの削除の仕組みについて -
第546回
PC
Windows 11でBluetoothオーディオ共有(Auracast)を試してみる -
第545回
PC
PowerShellにおけるwinget -
第544回
PC
Windows 11 Ver.26H2プレビュー公開 さらにその次のWindowsも少し見えてきた -
第543回
PC
「WMIC」が消滅 コマンドが消える「WMI」とはそもそも何? -
第542回
PC
PowerToysの最新版では、今使っているアプリの複数ウィンドウをショートカットで切り替えられる便利機能が追加 -
第541回
PC
AIを組み込んだWindowsターミナル「Intelligent Terminal」をインストールして試してみる - この連載の一覧へ












