答案1
更新的简短答案:
这应该在最新的 Jammy 更新中得到修复(请参阅下面的 Launchpad 报告)。
sudo apt update && sudo apt upgrade -y
... 然后再试一次。
如果没有,请告诉我(更重要的是,通过 Launchpad 报告告知 Ubuntu 团队),但这是旧的解决方法...
旧的简短答案:
printf '#!/bin/sh\nexec /lib64/ld-linux-x86-64.so.2 /usr/bin/gzip "$@"' | sudo tee /usr/local/bin/gzip
sudo chmod +x /usr/local/bin/gzip
解释:
这是目前 WSL1 和 Ubuntu 22.04(Jammy)以及其他一些最新发行版的一个已知问题:
由于许多软件包(包括apt
)都使用了,这使得 Jammy 在 WSL1 下几乎无法使用gzip
。
请注意(对于使用不同术语搜索此内容的其他人),当创造tar 稍有不同:
/bin/sh: 1: gzip: Exec format error
gzip
几年前,Ubuntu Eoan 也发生过类似(但不完全相同)的情况。参考:
从阅读这些问题的评论中,我不清楚问题出在 WSL1 还是用于创建二进制文件的工具链中gzip
。在 Eoan 案例中,该问题最终在 中得到“解决” binutils
,但我不清楚这是否只是针对 WSL1 核心问题的一种解决方法。
无论如何,有三种可能的解决方案:
如果可以,请在 WSL2 下运行 Jammy。WSL2 中的 Linux 内核可以
gzip
毫无问题地处理更改。这只是 WSL1 ELF 加载器中的一个问题。使用上面的解决方法,用
gzip
通过 调用“真实”(但已损坏)版本的路径上的早期版本进行替换/lib64/ld-linux-x86-64.so.2
。从一条评论在 WSL GitHub 问题中,可以修补
gzip
二进制文件以解决该问题。我个人不喜欢这种方法,但如果你想尝试一下:
echo -en '\x10' | sudo dd of=/usr/bin/gzip count=1 bs=1 conv=notrunc seek=$((0x189))
由于工具链中的某些内容可能是罪魁祸首,因此该问题似乎也出现在:
- 其他发行版(据报道是 Arch,几乎肯定还有其他发行版)
- 其他二进制文件(据报道是 Node.js)
据报道,该 GitHub 线程中也有一个针对 Node 问题的补丁。
然而,修补分发二进制文件并非没有风险。希望有人能找出导致此问题的工具链问题,或者 WSL 团队会更改 ELF 加载程序代码以进行补偿。
答案2
为了使 Ubuntu-22.04 WSL 1 具有 gzip 1.10-4ubuntu4 的工作版本,您可以使用以下命令更改偏移量 0x189 处的值:
echo -en '\x10' | sudo dd of=/usr/bin/gzip count=1 bs=1 conv=notrunc seek=$((0x189))
答案3
将 WSL 1 更改为 WSL 2 对我来说很有效
https://docs.docker.com/desktop/windows/wsl/#enabling-docker-support-in-wsl-2-distros
获取发行版名称列表:
wsl -l -v
更改 WSL 版本:
wsl --set-version <DISTRO NAME> 2