我想从我的 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
哪些地方不起作用
让我们首先总结一下您正在尝试的事情:
- 使用 Kali ext4 文件系统
- 通过 9p 协议共享(WSL2 会自动为您执行此操作)
- 从 Windows 连接到它(同样,WSL2 会自动为您执行此操作)
- 将 Windows 驱动器号映射到该网络驱动器
- 通过 9p/drvfs 在 Ubuntu 中挂载该驱动器
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 驱动器的问题,但我还没有机会在那里更新信息。