为什么将 Arch 的引导映像导入 WSL2 会导致挂载错误,但导入 Arch 的 Docker 映像则不会?

为什么将 Arch 的引导映像导入 WSL2 会导致挂载错误,但导入 Arch 的 Docker 映像则不会?

我最近在 WSL2 上安装了 Arch,想知道为什么官方引导映像导入失败,但导入提取的 Arch 的 Docker 映像却正常。

情况1

  • 从以下镜像中下载最新的 bootstrap 镜像:archlinux 网站
  • 重新打包它以摆脱root.x86_64子目录:
    fakeroot -- bash -c "tar -xf bootstrap.tar.gz && tar -czaf rootfs.tar.gz root.x86_64/*"
    
  • 移至.tarWindows 文件系统
  • 导入.tar并运行wsl -d Arch。这产生了以下错误,导致发行版无用。
    Error mounting one of the file systems. Run 'dmesg' for more details.
    
  • 我尝试运行dmesgwsl -d Arch --exec dmesg返回了相同的先前错误,因此无法查明问题所在。

案例 2

  • 使用最新的 Arch 镜像创建了一个 Docker 容器。
    docker run -t --name arch archlinux ls /
    
  • 将其导出至 tar 文件。
    docker export arch -o arch-wsl.tar
    
  • 导入它。运行wsl -d Arch。它立即将我带入bash

知道为什么这两种情况会产生不同的结果吗?

答案1

简短回答:

您第一次尝试使用引导映像并fakeroot生成无效的 rootfs。它实际上并没有删除root.x86_64父目录。

更多详情:

根据Error mounting one of the file systems. Run 'dmesg' for more details.我的经验,通常意味着档案不包含有效的(对于 WSL)根文件系统。

起初我以为这是由于导入了 gzip 文件,因为默认值--export是简单的 tar(并且您在 Docker 步骤中执行此操作)。

但是,我刚刚用 atar和 a都测试过了.tar.gz,两种方法都有效。不过,我使用的步骤略有不同——具体来说,我使用的是sudo而不是 ,fakeroot因为我正在从现有的 Ubuntu 20.04 发行版尝试。 编辑:我也在我的 Artix 发行版下尝试了一下fakeroot,发现了问题。请参阅下面的部分“为什么你的 fakeroot 尝试没有成功”

我成功完成了以下操作。首先,从 Ubuntu 20.04 开始:

wget http://mirror.rackspace.com/archlinux/iso/2022.03.01/archlinux-bootstrap-2022.03.01-x86_64.tar.gz
sudo tar --xattrs -xzvf archlinux-bootstrap-2022.03.01-x86_64.tar.gz
cd root.x86_64/
sudo tar --xattrs -cf ../archtest.tar .
# or
# sudo tar --xattrs -czf ../arch-wsl.tar.gz .
mv ../arch-wsl.tar* /mnt/c/Users/<some_location_in_my_profile>
# I have a standard WSL directory under my Documents folder

然后从 PowerShell(显然您已经熟悉这些步骤):

cd <location_from_above>
mkdir -p instances\arch
wsl --import arch .\instances\arch .\arch-wsl.tar --version 2
wsl ~ -d arch

为什么你的 fakeroot 尝试没有成功

我运行了您的命令行以在 Artix 下试用它,我可以看到问题所在。从它创建的 tarroot.x86_64中仍然有。要摆脱它,您需要使用选项-C/--directory来指定真正的根:

fakeroot -- bash -c "tar -xf bootstrap.tar.gz && tar -C root.x86_64 -czaf rootfs.tar.gz ."

但是,仍然存在一个问题,因为结果存档在某些命令上不具备适当的安全功能:

tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability'

尝试--xattrs像上面那样简单操作sudo,但仍然不起作用,而且我也不确定为什么:

fakeroot -- bash -c "tar --xattrs -xf bootstrap.tar.gz  && tar --xattrs -C root.x86_64 -czaf rootfs.tar.gz ."

结果是:

tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability'
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability'
tar: ./usr/bin/newuidmap: Unknown file type; file ignored
tar: ./usr/bin/newgidmap: Unknown file type; file ignored
tar: Exiting with failure status due to previous errors

如果您能找出在 下失败的原因fakeroot,请告诉我。但该sudo版本对我来说运行良好。

一些补充说明:

  • 创建默认用户后,你需要使用以下命令将其设置为 WSL 默认用户这些步骤

  • Arch 仍然是一个 Systemd 发行版,并且(您可能已经知道),由于(a)WSL 的/init系统设置了 WSL/Windows 集成,以及(b)Systemd 要求它是 PID1,Systemd 在 WSL 下没有得到很好的支持。

    我很快从 Arch 迁移到了 Artix,因为后者是一个基于 Arch 的无 Systemd 发行版。我还处于“早期”阶段(大约一个月前),但结果令人鼓舞。Artix 支持 5 种不同的替代进程管理器,并且为通过pacman(但不是 AUR)安装的大多数服务提供了脚本/单元文件。如果您想走这条路,请告诉我,我可以分享我的设置说明。

答案2

感谢@NotTheDr01ds 抽出时间指出我之前的尝试和结果中存在的问题tar

我发现使用bsdtarincluded withlibarchive代替GNU tarwith效果很好fakeroot

fakeroot -- bash -c "bsdtar -xf bootstrap.tar.gz  && bsdtar -C root.x86_64 -czaf rootfs.tar.gz ."

这样就完美导入了。然后您可以继续初始化pacman密钥环和其他内容。

至于为什么GNU tar会产生警告,我不确定。根据,这只是两个工具之间的兼容性冲突。我找到了一个比较此处讨论

相关内容