Estou usando o novo WLS2 no Windows 10 Home. Percebi que, quando executei o "npm", o "npm" dos meus arquivos de programa do Windows foi executado em vez da versão do Linux.
Quando tentei executar cmd.exe ou notepad.exe do WSL2, notei que eles também funcionam!
Como isso é possível? Como o WSL2 é capaz de executar executáveis do Windows?
Além disso, como posso forçar o WSL2 a priorizar os executáveis do Linux sobre os do Windows nos casos em que eles têm os mesmos nomes?
O executável do Windows (binário PE) é adicionado como uma entrada binfmt_misc no WSL2. Em palavras simples, binfmt_misc é um recurso do kernel do Linux que permite que formatos de arquivos executáveis arbitrários sejam reconhecidos e passados para determinados programas.
No WSL2, o
init
binário (do qual todo processo é bifurcado) registra o binário do Windows PE como um executável e o torna executável por si só (ou seja, oinit
). Aqui está uma saída da entrada PE binfmt:WSLInterop
é apenas um nome para a entrada. O número mágico4d5a
sãoMZ
os dois primeiros bytes do executável do Windows PE. Assuma que esta é uma impressão digital com a qualinit
(o interpretador) reconhece o binário PE.Os usuários podem desabilitar o registro com este comando:
Leituras adicionais:
Ele executará qualquer executável (Windows ou Linux) que esteja em sua
$PATH
variável de ambiente. Ele pesquisa os diretórios em ordem, portanto, se você deseja executar as versões linux de preferência, certifique-se de que esses diretórios estejam antes dos diretórios do Windows no caminhobash está sendo executado como um processo pico. Quando você tenta executar um programa, o driver do subsistema linux reconhece a solicitação para executar um processo e chama
ZwCreateUserProcess
o kernel do Windows, criando o processo do Windows.Ele pode chamar a função porque todas as chamadas de sistema feitas por processos pico são traduzidas em chamadas NT no modo kernel, tanto via
LXCORE.SYS
quanto pelo kernel,ntoskrnl.exe
.Crie um alias para os aplicativos Linux que você deseja priorizar em relação aos homônimos do Windows. Por exemplo:
alias foo='/caminho/para/barra'