
답변1
답변이 늦었습니다. 원래 언급된 프로젝트는 거의 확실히 끝났습니다. 그리고 어느 누구도 다시는 이런 필요를 갖지 않을 것입니다. 하지만 아 글쎄, 여기 간다 ...
chroot 감옥을 만듭니다. 루트로 다음을 수행하십시오.
- chroot의 위치를 생성합니다:
sudo mkdir /newroot; cd /newroot
- 내부에 필요한 모든 디렉터리를 다시 생성/바인드마운트합니다
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
(WSl 인스턴스의 기본 사용자 이름을 대체합니다).mkdir var; mount --bind /var var
mkdir dev; mount --bind /dev dev
- 기타 필수 디렉토리에 대해서도 마찬가지입니다.
- 배포판의 루트 디렉터리 심볼릭 링크에 주의하세요. 예를 들어, 적어도 Ubuntu에는 다음이 필요합니다.
ln -s usr/lib lib
ln -s usr/lib32 lib32
- 등등 ...
mount -t proc none proc
mkdir init
(고객이 초기화를 요구했습니다.예배 규칙서"실제" 루트 초기화가 아닌파일)
이제 wsl 세션을 시작하려면 wsl -u root -e sh -c "cd /newroot; exec /usr/sbin/chroot /newroot/" su - username
. username
물론 기본값을 대체하십시오 .
그러면 선택한 디렉토리 구조만 있는 chroot 감옥으로 사용자가 실행됩니다. 여기에는 파일이 포함되지 않고 init
대신 init
디렉토리가 포함됩니다.
답변2
tl;dr: /init
파일을 다음에서 제거할 수 없습니다.달리기WSL 배포. 하위 시스템이 해당 파일을 사용하고 실행 중인 WSL 배포의 모든 프로세스가 해당 파일에서 분기되기 때문입니다.
그럼 우리는 무엇을 할 수 있나요? 파일은잠긴해당 배포판을 실행하는 동안 하위 시스템에 의해. 해결 방법은 실행 중인 배포를 기다리거나 종료하는 것입니다. 종료하려는 실행 중인 WSL 배포판의 이름이
wsl.exe --terminate Distro
어디에 있는지 명령을 사용하세요 .Distro
배포판이 설치된 폴더로 이동하여 다음을 따르십시오.이것또는이것. 파일 을 삭제합니다init
.또는 전체 WSL 배포판을 tarball로 만들려는 경우 실행 중인 배포판을 종료할 필요가 없습니다. tarball을 만들고 init를 제외합니다.
cd /
tar -cpf backup.tar --exclude=/backup.tar --exclude=/init --xattrs --one-file-system /
이 명령을 실행하기 전에 모든 명령줄 옵션을 확인하세요. 파일 권한을 유지하는 것은 필수입니다.
- init 파일은 어디서 나오나요? init 파일은 Microsoft WSL 개발자가 생성하며유사하지 않음systemd, sysVinit 또는 기타 전통적인 GNU/Linux init 시스템을 사용합니다. 실제 파일은
System32\lxss\tools\init
. 배포판이 시작되면 LXSS(Linux Subsystem Manager Service)는 해당 파일을 rootfs 폴더(CopyFileW()
Win32 API 사용)에 복사합니다. 을 위한WSL2 먼저\tools
폴더가 9p 프로토콜로 마운트된 다음 위와 같이 사용됩니다.