构建pacman-static包(上面的修复不需要)

构建pacman-static包(上面的修复不需要)

我跑了

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,解决方案如下:

  1. 使用根卷运行 archlinux 容器:
docker run -it -v /:/tmp/hostroot archlinuxrolling/pacman bash
  1. 在容器内更新 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

这解决了原来的问题,之后一切正常pacmanpacman-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可用的静态版本,所以我没有进一步了解。

相关内容