Archlinux – 安装 testing/glibc 2.16.0-2 时出现 “/lib exists in filesystem” 的一种处理方法

首先感谢falconindy提供的几个note, 这是我的解决思路的基础:

A few things to note...

1) If you find yourself in a position to recreate the symlink yourself, the link target is [b]usr/lib[/b] and not [b]/usr/lib[/b]. This is an important difference that's only evident in a chroot situation.
2) The linker is an interpreter, just like /bin/bash. If it exists on the system but the /lib symlink is missing/fubar, you can run ELF binaries directly via the linker, e.g. /usr/lib/ld-2.16.so /bin/ln -s ....

我遇到了和litemotiv一样的问题:
清理过/lib, 保证里面的文件都属于 glibc 后再次尝试升级:

(1/2) upgrading glibc                                                                            [########################################################] 100%
error: extract: not overwriting dir with file lib
error: problem occurred while upgrading glibc
call to execv failed (No such file or directory)
error: command failed to execute correctly
error: could not commit transaction
error: failed to commit transaction (transaction aborted)
Errors occurred, no packages were upgraded.

我的问题的特殊点是: 我没有打开一个root权限的命令行, root密码登陆被禁用(所以我无法使用su root), 而且我无法使用上面说的ld-2.16.so去加载sudo(由于sudo本身的安全规则).

于是我琢磨出了下面的方法去修复这个已经挂掉的系统, 希望能帮到遇到类似问题的盆友:

  1. 重启, 编辑grub里linux(或kernel)开头的那行, 在尾部添加:
    init=/usr/lib/ld-2.16.so /bin/sh
  2. remount文件系统使其可写:
    /usr/lib/ld-2.16.so /bin/mount -o remount,rw /
  3. 移除空的(上面的错误会使它是空的) /lib 目录:
    /usr/lib/ld-2.16.so /bin/rmdir /lib
  4. 手动修复链接:
    /usr/lib/ld-2.16.so /bin/ln -s usr/lib /lib
  5. 按 ctrl-alt-del 重启电脑, 然后用pacman重新安装一次glibc

然后各种东西都恢复正常了, 不需要使用恢复光盘之类的东西 🙂

参考: https://bbs.archlinux.org/viewtopic.php?pid=1126667#p1126667

10 thoughts on “Archlinux – 安装 testing/glibc 2.16.0-2 时出现 “/lib exists in filesystem” 的一种处理方法”

  1. 赞,这个已经被官方wiki推荐了。话说我是先看到DevoloperWiki里面链接的帖子后看到这里的。。。
    虽然我解决的时候没用这个办法,不过还是很厉害的样子。

      1. 哦,自从我上次因为开testing而吃尽了libpng的苦头之后就没有再开testing了。
        现在我的core/glib版本是2.16.0-1

          1. 我突然发现电脑不出声了……alsamixer识别声卡,但是gnome-sound-applet不认……
            不知道怎么回事,打算重启……

                1. 我是把 timidity -iA 写在 /etc/rc.local 里面,这样每一次启动MIDI软件的时候就不会忘记启动timidity++,昨天升级timidity++之后发现其他程序就不能发声了。
                  但是又不是权限问题(虽然是root启动),因为kill掉timidity之后再用root启动也很好……
                  纠结,现在不能让timidity自动启动了……

Leave a Reply

Your email address will not be published. Required fields are marked *

QR Code Business Card