
Implantei um ambiente de desenvolvimento no wsl e estou muito animado com isso. Meu único problema é a existência de um init
arquivo no caminho raiz do sistema.
Para um dos meus clientes, preciso ter um /init
diretório,esta é uma restrição que não pode ser alterada.
Escusado será dizer que isso torna meu ambiente de desenvolvimento wsl recém-descoberto inutilizável para este projeto.
Existe uma maneira de alterar o caminho do init
arquivo wsl?
Responder1
Tarde para responder; o projeto originalmente mencionado quase certamente terminou; e provavelmente ninguém mais terá essa necessidade novamente. Mas tudo bem, aqui vai...
Crie uma prisão chroot. Faça o seguinte como root:
- Crie um local para o chroot:
sudo mkdir /newroot; cd /newroot
- Recrie/bindmount todos os diretórios necessários dentro de
newroot
:mkdir usr; mount --bind /usr usr
mkdir etc; mount --bind /etc etc
mkdir root
mkdir -p /home/user; mount --bind /home/user home/user
(substitua o nome de usuário padrão pela instância WSl).mkdir var; mount --bind /var var
mkdir dev; mount --bind /dev dev
- E assim por diante para quaisquer outros diretórios necessários.
- Preste atenção aos links simbólicos do diretório raiz em sua distribuição. Por exemplo, pelo menos o Ubuntu também exigiria:
ln -s usr/lib lib
ln -s usr/lib32 lib32
- e assim por diante ...
mount -t proc none proc
mkdir init
(O cliente exigiu initdiretórioem vez do init root "real"arquivo)
Agora, para iniciar a sessão wsl, configure um atalho para wsl -u root -e sh -c "cd /newroot; exec /usr/sbin/chroot /newroot/" su - username
. Substitua o padrão, username
é claro.
Isso lançará o usuário em uma prisão chroot apenas com a estrutura de diretórios que você selecionou, que obviamente não inclui o init
arquivo, mas init
sim o seu diretório.
Responder2
dr: O /init
arquivo não pode ser removido de umcorrendoDistribuição WSL. Porque o subsistema está usando esse arquivo e todos os processos nessa distribuição WSL em execução são bifurcados a partir dele.
Então o que podemos fazer? O arquivo ébloqueadopelo subsistema durante a execução dessa distribuição. A solução alternativa é esperar ou encerrar a distribuição em execução. Use
wsl.exe --terminate Distro
o comando ondeDistro
é o nome da distribuição WSL em execução que você deseja encerrar. Vá até a pasta onde a distribuição está instalada, sigaesseouesse. Exclua oinit
arquivo.Ou, se você quiser fazer um tarball de toda a distribuição WSL, não há necessidade de encerrar a distribuição em execução. Crie o tarball e exclua o init:
cd /
tar -cpf backup.tar --exclude=/backup.tar --exclude=/init --xattrs --one-file-system /
Verifique todas as opções da linha de comando antes de executar este comando. Preservar a permissão do arquivo é obrigatório.
- De onde vem o arquivo init? O arquivo init é criado por desenvolvedores Microsoft WSL enão é similarcom systemd, sysVinit ou outros sistemas init GNU/Linux tradicionais. O arquivo real é
System32\lxss\tools\init
. Quando uma distribuição é iniciada, o Linux Subsystem Manager Service (LXSS) copia esse arquivo na pasta rootfs (comCopyFileW()
API Win32). ParaWSL2 primeiro a\tools
pasta é montada com o protocolo 9p e depois usada como acima.