Windows 10 Homeで新しいWLS2を使用しています。 「npm」を実行すると、Linuxバージョンではなく、Windowsプログラムファイルの「npm」が実行されることに気付きました。
WSL2からcmd.exeまたはnotepad.exeを実行しようとすると、それらも動作することに気付きました!
これはどのようにして可能ですか? WSL2はWindows実行可能ファイルをどのように実行できますか?
さらに、同じ名前の場合にWSL2にWindowsの実行可能ファイルよりも優先してLinuxの実行可能ファイルを優先させるにはどうすればよいですか?
WSL2はWindows実行可能ファイルをどのように実行できますか?
Windows実行可能ファイル(PEバイナリ)がWSL2の binfmt_misc エントリとして追加されます。簡単に言うと、 binfmt_misc は、任意の実行可能ファイル形式を認識して特定のプログラムに渡すことができるLinuxカーネル機能です。
WSL2では、init
バイナリ(そこからすべてのプロセスが分岐されます)がWindows PEバイナリを実行可能ファイルとして登録し、それ自体で実行可能にします(つまり、init
)。これは、PE binfmtエントリの出力です。
cat /proc/sys/fs/binfmt_misc/WSLInterop
enabled
interpreter /tools/init
flags: F
offset 0
magic 4d5a
WSLInterop
は、エントリの単なる名前です。マジックナンバー4d5a
はMZ
で、Windows PE実行可能ファイルの最初の2バイトです。これがinit
(インタプリタ)がPEバイナリを認識するためのフィンガープリントであると仮定します。
ユーザーは次のコマンドでレジストリを無効にできます:
echo 0 | Sudo tee /proc/sys/fs/binfmt_misc/WSLInterop
$PATH
環境変数にある実行可能ファイル(WindowsまたはLinux)を実行します。ディレクトリを順番に検索するため、優先的にLinuxバージョンを実行する場合は、それらのディレクトリがbeforeパス内のWindowsディレクトリであることを確認してください
bashはピコプロセスとして実行されています。プログラムを実行しようとすると、Linuxサブシステムドライバーはプロセスを実行する要求を認識し、WindowsカーネルでZwCreateUserProcess
を呼び出して、Windowsプロセスを作成します。
Picoプロセスによって行われたすべてのシステムコールは、LXCORE.SYS
とカーネルntoskrnl.exe
の両方を介して、カーネルモードでNTコールに変換されるため、関数を呼び出すことができます。
Windowsの名前より優先したいLinuxアプリ用に alias を作成します。例えば:
エイリアスfoo = '/ path/to/bar'