WSL & Ubuntu, 초기화 파일 이동 방법

WSL & Ubuntu, 초기화 파일 이동 방법

저는 wsl에 개발 환경을 배포했는데 정말 기대됩니다. 내 유일한 문제는 init시스템의 루트 경로에 파일이 존재한다는 것입니다 .

루트 하위 디렉터리

내 고객 중 한 명을 위해 디렉토리가 필요합니다 /init.이는 변경할 수 없는 제약 조건입니다.

말할 필요도 없이 이로 인해 새로 발견된 흥미진진한 wsl 개발 환경이 이 프로젝트에 사용할 수 없게 됩니다.

wsl 파일의 경로를 변경하는 방법이 있습니까 init?

답변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 프로토콜로 마운트된 다음 위와 같이 사용됩니다.

관련 정보