Archlinux 启动错误 Kmod缺少libzstd.so.1文件

ldconfig 和 initramfs-linux.img

Image credit: Unsplash

前几天捣鼓trace-cmd,里面要用到zstd进行压缩解压缩。于是我就从facebook的repo上将zstd的源代码下载了下来,执行了make install以及copy来copy去的一系列骚操作。今天使用pacman -Syyu更新后,使用vim发现找不到指令,出于经验(之前遇到过每次更新后uname -rpacman -Q liux版本不一致情况),采取了reboot操作,但无法启动操作系统,出现了以下现象。

image-20230731210759339

由于libzstd之前确实遇到过,所以初步判断应该是我前几天捣鼓的时候把环境弄坏了,所以导致了找不到该文件。

解决步骤

  1. 使用liveUSB,按住F5进入UEFI界面,将USB启动盘的启动顺序提前

  2. 进入liveUSB,通过以下指令进入操作系统

    mount /dev/xxx /mnt
    mount /dev/xxx /mnt/boot	
    arch-chroot /mnt
    

    第一行为根目录所在分区,第二行为/boot目录所在分区

  3. zstd为archlinux引入对initramfs压缩解压缩的算法,一开始通过lsinitcpio initramfs命令发现其中存在/usr/local/lib64/libzstd.so.1的链接,尝试更改了生成initramfs的conf文件,取消zstd压缩,重新生成initramfs,但是reboot后依然报错,且lsinitcpio查看,发现libzstd.so.1仍在其中,因此重新推断是其他地方仍然加载了和libzstd

  4. kmod为动态链接的二进制程序,通过ldd /usr/bin/kmod发现其动态链接的libzstd.so.1指向/usr/local/lib64/libzstd.so.1,这个应该是我之前make install安装的,奇怪的是该路径下确实存在libzstd.so.1,但系统启动找不到该文件。通过lddconfig -p | grep zstd发现存在重复定义,同时根据lsinitcpio /boot/initramfs-linux.img发现其中存在/usr/local/lib64/libzstd.so.1的文件链接。因此判断为kmod加载时不知道出于什么原因找不到libzstd.so.1(即使路径下有),因此尝试将该动态链接指向/usr/lib/libzstd.so.1,于是寻找/etc/ld.so.conf.d/路径下文件内容为/usr/local/lib64的conf文件并将其删除,然后使用lddconfig命令进行更新。

  5. 此时ldconfig -p 中只剩下一个指向/usr/lib/libzstd.so.1的链接,ldd /usr/bin/kmod中的链接路径也改为了/usr/lib/libzstd.so.1

  6. 之后进入/boot目录,使用命令mkinitcpio -p linux重新生成initramfs-linux.img

  7. 退出系统进行reboot,问题解决。

其中遇到了太多的坑就不展开讲了,从中学到了一些linux启动和链接的知识,但也只是一知半解,只能提供一个解决办法,而且root cause还是不知道为什么,但因为急需电脑,所以就不做深究了,希望下次遇到了,这个post可以有些帮助,且能深究一下原因。

QianLong Sang
QianLong Sang
Thrid Year CS Phd

My research interests include operating system, computer architecture and computer security.