
答案1
遲到回答;最初提到的項目幾乎肯定已經結束;而且沒有人可能再有這種需求。但是哦,好吧,這裡是......
創建一個 chroot 監獄。以 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
(客戶要求初始化目錄而不是「真正的」root 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.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 檔案是由 Microsoft WSL 開發人員建立的不相似使用 systemd、sysVinit 或其他傳統的 GNU/Linux init 系統。實際的文件是
System32\lxss\tools\init
.當發行版啟動時,Linux 子系統管理員服務 (LXSS) 會將檔案複製到 rootfs 資料夾中(使用CopyFileW()
Win32 API)。為了WSL2 首先\tools
使用 9p 協定安裝該資料夾,然後按上述方式使用。