答案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
(客户需要初始化目录而不是“真正的”根初始化文件)
现在,要启动 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 子系统管理器服务 (LXSS) 会将该文件复制到 rootfs 文件夹中(使用CopyFileW()
Win32 API)。对于WSL2 首先\tools
使用 9p 协议安装文件夹,然后按上述方式使用。