我最近在 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/*"
- 移至
.tar
Windows 文件系统 - 导入
.tar
并运行wsl -d Arch
。这产生了以下错误,导致发行版无用。Error mounting one of the file systems. Run 'dmesg' for more details.
- 我尝试运行
dmesg
但wsl -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)安装的大多数服务提供了脚本/单元文件。如果您想走这条路,请告诉我,我可以分享我的设置说明。