
答え1
回答が遅くなりました。最初に言及したプロジェクトはほぼ間違いなく終了しており、今後誰もこのニーズを抱えることはないと思われます。しかし、まあ、やってみます...
chroot jail を作成します。root として次の操作を実行します。
- 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
(顧客は初期化を要求したディレクトリ「本当の」ルートinitではなくファイル)
ここで、wsl セッションを起動するには、 のショートカットを設定します。もちろん、wsl -u root -e sh -c "cd /newroot; exec /usr/sbin/chroot /newroot/" su - username
デフォルトを置き換えます。username
これにより、ユーザーは、選択したディレクトリ構造のみを使用して chroot jail に起動されます。当然、ファイルではなくディレクトリが含まれinit
ますinit
。
答え2
tl;dr:/init
ファイルは削除できませんランニングWSL ディストリビューション。サブシステムがそのファイルを使用しており、実行中の WSL ディストリビューション内のすべてのプロセスがそこからフォークされるためです。
では、何ができるでしょうか?ファイルはロックされたディストリビューションを実行している間、サブシステムによって実行されます。回避策は、実行中のディストリビューションを待つか終了することです。
wsl.exe --terminate Distro
コマンドを使用します。ここで、Distro
終了したい実行中のWSLディストリビューションの名前です。ディストリビューションがインストールされているフォルダーに移動し、これまたはこれファイルを削除します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
。ディストリビューションが起動されると、Linux Subsystem Manager Service (LXSS) は、そのファイルをrootfsフォルダにコピーします (CopyFileW()
Win32 APIを使用)。WSL2 まず\tools
フォルダーは 9p プロトコルでマウントされ、その後上記のように使用されます。