web-dev-qa-db-ja.com

LinuxのWindowsサブシステムでWindows * .exeプログラムを実行できるのはなぜですか?

Windows 10 Homeで新しいWLS2を使用しています。 「npm」を​​実行すると、Linuxバージョンではなく、Windowsプログラムファイルの「npm」が実行されることに気付きました。

WSL2からcmd.exeまたはnotepad.exeを実行しようとすると、それらも動作することに気付きました!

これはどのようにして可能ですか? WSL2はWindows実行可能ファイルをどのように実行できますか?

さらに、同じ名前の場合にWSL2にWindowsの実行可能ファイルよりも優先してLinuxの実行可能ファイルを優先させるにはどうすればよいですか?

4
Daniel Santos

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は、エントリの単なる名前です。マジックナンバー4d5aMZで、Windows PE実行可能ファイルの最初の2バイトです。これがinit(インタプリタ)がPEバイナリを認識するためのフィンガープリントであると仮定します。

ユーザーは次のコマンドでレジストリを無効にできます:

echo 0 | Sudo tee /proc/sys/fs/binfmt_misc/WSLInterop

さらに読む:

4
Biswapriyo

$PATH環境変数にある実行可能ファイル(WindowsまたはLinux)を実行します。ディレクトリを順番に検索するため、優先的にLinuxバージョンを実行する場合は、それらのディレクトリがbeforeパス内のWindowsディレクトリであることを確認してください

6
Chris Dodd

bashはピコプロセスとして実行されています。プログラムを実行しようとすると、Linuxサブシステムドライバーはプロセスを実行する要求を認識し、WindowsカーネルでZwCreateUserProcessを呼び出して、Windowsプロセスを作成します。

Picoプロセスによって行われたすべてのシステムコールは、LXCORE.SYSとカーネルntoskrnl.exeの両方を介して、カーネルモードでNTコールに変換されるため、関数を呼び出すことができます。

3
Arush Agarampur

Windowsの名前より優先したいLinuxアプリ用に alias を作成します。例えば:

エイリアスfoo = '/ path/to/bar'

1
K7AAY