WSL 和 Ubuntu,如何移动初始化文件

WSL 和 Ubuntu,如何移动初始化文件

init我在 wsl 上部署了一个开发环境,对此我感到非常兴奋。我唯一的问题是系统根路径中存在一个文件。

根子目录

对于我的一个客户,我需要一个/init目录,这是一个无法改变的约束。

不用说,这使得我令人兴奋的、新发现的 wsl dev 环境无法用于这个项目。

有没有办法改变 wsl 文件的路径init

答案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 协议安装文件夹,然后按上述方式使用。

相关内容