这两天 Archlinux 官方库里更新了最新版的 glibc。系统更新的时候会提示 /lib 文件夹已存在。个人并没有仔细去考究这个提示的缘由,粗暴的一位和以前的 filesystem 之类的提示一样。于是强制更新了 glibc,结果爆出一堆错误。经过一系列的查证,原来这次更新 archlinux 吧 /lib 的内容都移动到了 /usr/lib,然后做了 /lib 的软链接指向 /usr/lib。但如果 /lib 中存在非系统文件,比如我安装的 virtualbox,会再其中放一些 module,就会导致软链失败,结果整个系统不能使用了。
再网上找到一些类似的问题的解决方案,总结了以下才吧问题搞定。
首先重启机器,再菜单页,编辑启动项,添加 init=/usr/lib/ld-2.26.so /bin/sh,然后启动系统后会进到命令行模式。
接着输入 /usr/lib/ld-2.26.so /bin/mount -o remount,rw / 重载文件系统为可写。
然后将 /lib 里的残余文件都移动到 /usr/lib,并删除 /lib 设置好 /lib 到 /usr/lib 的软链
/usr/lib/ld-2.26.so /bin/mv /lib/* /usr/lib
/usr/lib/ld-2.26.so /bin/rmdir /lib
/usr/lib/ld-2.26.so /bin/ln -s /usr/lib /lib
接下来就是先把系统再更新一遍,因为刚才 glibc 出错导致更新失败了。
/usr/lib/ld-2.26.so /bin/pacman -Sfyu
这下应该系统恢复正常了。
胆大手贱.
http://blog.csdn.net/johnnywww/article/details/7623703
参考这里升级glibc, 其中 export CFLAGS="-g -O2 -march=i486" 改为 export CFLAGS="-g -O2 -march=x86_64"
更新完后报错. 所有的应用都报错 relocation error: /lib/tls/libc.so.6: symbol _dl_out_of_memory, version GLIBC_PRIVATE not defined in file ld-linux.so.2 with link time reference.
准备恢复
ln 不能用. export LD_PRELOAD="/lib/libc-2.3.4.so" 然后 /lib64/ld-2.3.4.so /bin/ln -sf xx xx, /lib64/ld-2.3.4.so /bin/ls -ltr xx 就可以用了.
ERROR: ld.so: object '/lib/libc-2.3.4.so' from LD_PRELOAD cannot be preloaded: ignored. 这个错误无视
/lib64/ld-2.3.4.so /bin/ls -ltr /lib64/ 找到今天修改的链接. 全部改回去.
比如: libutil.so.1 -> libutil-2.5.so 就改成 /lib64/ld-2.3.4.so /bin/ln -sf /lib64/libutil-2.3.4.so /lib64/libutil.so.1
大部分是一致的 2.3.4. 有些没有就找其他较低版本. 还没有就算了.
unset LD_PRELOAD
结束