如何从另一个 WSL 安装 chroot 到 WSL 安装?

如何从另一个 WSL 安装 chroot 到 WSL 安装?

我想从我的 Ubuntu WSL chroot 到我的 Kali Linux WSL。我正在运行 WSL2。在 Windows 中,我将我的 Kali Linux WSL 安装 ( \\wsl$\kali-linux) 映射到驱动器K:。在 Ubuntu WSL 中,我将K:驱动器安装到/mnt/k正在运行的 bu sudo mount -t drvfs K: /mnt/k。它已成功安装,但我无法 chroot 到/mnt/k。符号链接似乎存在问题。当我尝试运行 时chroot /mnt/k,出现以下错误:

chroot: failed to run command ‘/bin/bash’: Function not implemented

当我运行 ls 时,我得到类似的错误ls /mnt/k

ls: cannot read symbolic link '/mnt/k/bin': Function not implemented
ls: cannot read symbolic link '/mnt/k/lib': Function not implemented
ls: cannot read symbolic link '/mnt/k/lib32': Function not implemented
ls: cannot read symbolic link '/mnt/k/lib64': Function not implemented
ls: cannot read symbolic link '/mnt/k/libx32': Function not implemented
ls: cannot read symbolic link '/mnt/k/sbin': Function not implemented

我无法通过 cd 进入任何符号链接目录/mnt/k。如何实现 chrooting 进入我的 Kali Linux WSL 安装?

答案1

哪些地方不起作用

让我们首先总结一下您正在尝试的事情:

  1. 使用 Kali ext4 文件系统
  2. 通过 9p 协议共享(WSL2 会自动为您执行此操作)
  3. 从 Windows 连接到它(同样,WSL2 会自动为您执行此操作)
  4. 将 Windows 驱动器号映射到该网络驱动器
  5. 通过 9p/drvfs 在 Ubuntu 中挂载该驱动器
  6. chroot进入该挂载点

主要问题出现在该过程的早期,即步骤 #3(甚至可能是 #2)。此时,由于 Windows 无法理解 Linux 符号链接,正如您所注意到的,这些符号链接只是变成了文件。

然后尝试转身并将该驱动器重新安装到另一个 WSL 实例中并不会将它们重新转换为链接。

如何运行

至少有一种方法是使用/mnt/wsl跨发行版挂载点。

来自 Kali:

sudo mount --bind / /mnt/wsl/kali -o "X-mount.mkdir"

如果您希望每次重启 Kali 时自动完成挂载,那么:

sudo sh -c "grep '/mnt/wsl/kali' /proc/mounts >> /etc/fstab"

然后vi /etc/fstab将选项添加X-mount.mkdir到挂载。

从 Ubuntu:

chroot /mnt/wsl/kali
mount -t proc proc /proc

请注意,如果不在 chroot 内部进行额外的努力,WSL 中的一些功能将无法“工作”:

  • Windows 路径不会自动附加到 Linux PATH(可通过一些env魔法和其他技术解决)
  • Windows 驱动器不会自动安装在例如/mnt/c等处。(可通过/etc/fstab从 Ubuntu 内部将驱动器安装到 Kali fs 中来解决)
  • 即使驱动器已安装,运行 Windows.exe也无法正常工作(可以通过将 Interop 套接字位置从 Ubuntu 绑定安装到 Kali fs 来解决)
  • 在 Windows 11 上,WSLg 将无法工作(可以通过将 WSLg/X11 套接字从 Ubuntu 绑定安装到 Kali 来解决)

我的另一个答案在 Ask Ubuntu 上,其中涵盖了其中几个解决方案(Interop 和 WSLg)。我实际上也解决了安装 Windows 驱动器的问题,但我还没有机会在那里更新信息。

相关内容