我跑了
sudo pacman -Syu
...看到所有需要下载的软件包并退出。然后我运行
sudo pacman -S openssl
只更新那个包,就成功了。现在,我什么也做不了了。最大的问题是连 pacman 都运行不了。
$ sudo ls -l /var/cache/pacman/pkg/openssl*
sudo: error in /etc/sudo.conf, line 0 while loading plugin "sudoers_policy"
sudo: unable to load /usr/lib/sudo/sudoers.so: /usr/lib/libc.so.6: version `GLIBC_2.33' not found (required by /usr/lib/libcrypto.so.1.1)
然后
# pacman -U /var/cache/pacman/pkg/openssl-1.1.1.i-2-x86-64.pkg.tar.zst
pacman: /usr/lib/libc.so.6: version `GLIBC_2.33' not found (required by /usr/lib/libcrypto.so.1.1)
这些操作在 /var/log/pacman.log 中只有 11 行。在成功将 openssl 从 1.1.1.i-2 -> 1.1.1.j-1 更新后,最后三行是:
[ALPM] running 'clean_package_cache.hook'...
[ALPM-SCRIPTLET] pacman-conf: /usr/lib/libc.so.6: version `GLIBC_2.33' not found (required by /usr/lib/libcrypto.so.1.1)
[ALPM-SCRIPTLET] ==> no candidte packages found for pruning
我担心重启系统,因为我确信它不会成功,如果有指导的话,我可能会更容易退出。我找到了一些信息这里这似乎可能是相关的,但我希望我不需要做那么大的努力,因为系统仍然处于启动状态。
答案1
获取 archlinux 的实时映像,将其安装到 USB 并启动它。
然后使用以下命令将旧根分区挂载到 /mnt/old_root
mkdir /mnt/old_root
mount /dev/sdX2 /mnt/old_root
其中 /dev/sdX2 是根分区。请lsblk
事先使用命令检查。
然后输入
pacstrap /mnt/old_root glibc lib32-glibc
这将在您的系统中安装最新版本的 glibc。您现在可以重新启动,错误应该已经消失。
顺便提一下,archlinux(及其衍生产品)不支持部分升级。即,只升级一个软件包而不升级其他软件包。请阅读此链接:
https://wiki.archlinux.org/index.php/System_maintenance#Partial_upgrades_are_unsupported
我可以确认这有效因为我刚刚这样做了
答案2
如果主机有docker,解决方案如下:
- 使用根卷运行 archlinux 容器:
docker run -it -v /:/tmp/hostroot archlinuxrolling/pacman bash
- 在容器内更新 glibc
pacman -S -r /tmp/hostroot glibc lib32-glibc
答案3
仅在更新 pacman 后,我也遇到了类似的问题。我想在不重启的情况下修复该问题。
我也没有安装docker,正如提到的@谢尔盖。
错误消息类似于:
pacman: /usr/lib/libc.so.6: version `GLIBC_2.38' not found (required by pacman)
pacman: /usr/lib/libc.so.6: version `GLIBC_2.38' not found (required by /usr/lib/libalpm.so.13)
和,
pacman-conf: /usr/lib/libc.so.6: version `GLIBC_2.38' not found (required by pacman-conf)
pacman-conf: /usr/lib/libc.so.6: version `GLIBC_2.38' not found (required by /usr/lib/libalpm.so.13)
所以我找到了pacman-静态AUR 软件包提供了 pacman 的静态链接版本。我尝试构建它,但构建过程需要一个可以工作的pacman-conf
,而我也没有。(我在下面进一步描述了这个过程,但它不是解决方案所必需的。)有一个为 x86_64 预构建的 pacman-static 二进制版本由软件包作者提供,它确实起作用了。
我使用这个预先构建的 pacman-static 二进制文件来升级包glibc
。
$ gpg --verify pacman-static.sig pacman-static
$ gpg --recv-keys F850562FCDA369F80D33000AE48D0A8326DE47C5
$ gpg --verify pacman-static.sig pacman-static
$ chmod +x pacman-static
$ sudo su
# ./pacman-static -Sy
# ./pacman-static -S glibc
这解决了原来的问题,之后一切正常pacman
并pacman-conf
开始工作。但现在我需要升级整个系统,因为其他一切都依赖于 glibc。
pacman -Syu
(或者,我可以尝试将pacman
软件包降级到早期版本(并跳过升级 glibc 软件包和系统的其余部分),目前这是可行的,但我现在不会尝试。)
。
。
构建pacman-static
包(上面的修复不需要)
我还没有完成从源代码构建 pacman-static 包,但是这是我得到的:
它需要devtools
软件包,如果尚未安装,则必须从源代码构建。(因为 pacman 不可用)
https://gitlab.archlinux.org/archlinux/devtools/-/releases/
该软件包似乎还有一个预构建版本devtools
。我下载的最新版本是:
https://gitlab.archlinux.org/archlinux/devtools/-/releases/v1.0.4/downloads/devtools-1.0.4.tar.gz.sig https://gitlab.archlinux.org/archlinux/devtools/-/releases/v1.0.4/downloads/devtools-1.0.4.tar.gz
$ gpg --verify devtools-1.0.4.tar.gz.sig devtools-1.0.4.tar.gz
$ gpg --recv-keys E240B57E2C4630BA768E2F26FC1B547C8D8172C8
$ gpg --verify devtools-1.0.4.tar.gz.sig devtools-1.0.4.tar.gz
Makefiledevtools
需要asciidoc
生成文档的包,而我没有,所以我注释掉了需要 asciidoc 的部分。devtools
之后我可以成功构建和安装该包。
在开发者工具中Makefile注释掉以下行:
@a2x --no-xmllint --asciidoc-opts="-f doc/asciidoc.conf" -d manpage -f manpage --destination-dir=$(BUILDDIR)/doc/man -a pkgdatadir=$(DATADIR) $<
并注释掉以下3行:
for manfile in $(MANS); do \
install -Dm644 $$manfile -t $(DESTDIR)$(MANDIR)/man$${manfile##*.}; \
done;
之后使用以下命令构建并安装它:
$ make binprogs library conf completion
$ sudo su
# make install
这将安装额外的 x86_64 构建符号链接到archbuild
,由构建脚本使用pacman-static
(构建包.sh) (但这需要一个工作pacman-conf
...)
由于没有pacman-conf
可用的静态版本,所以我没有进一步了解。