事件起因
上次关闭了虚拟机之后, 手贱在Vmware里使用了"压缩磁盘以回收未使用的空间", 然后下次再启动的时候, 启动就报错了...
故障现象
/sbin/init提示找不到libz.so.1文件找不到.
故障分析
libz.so.1是zlib的库文件, 在系统中肯定是安装了的.
- 联想到上次关机前, 我滚了一次系统, 首先想到是不是Arch又日常滚挂了, 于是打开了Arch官网...可是没有任何关于此的通知, 相比应该不是滚系统的原因.
- 联想到我关机之后压缩了一下磁盘, 第二反应是不是文件系统挂了, 于是启动了livecd, 跑起了
brtfsck
, 然而它告诉我其实什么问题也没有.
恢复过程
于是这就很尴尬了...
既然文件系统本身没问题, 那就只好先恢复系统再说, 于是在livecd里把磁盘挂载, 然后find -name "libz.so.1"
...
诶...怎么只在/usr/lib32/
下有libz.so.1, 看来应该是/usr/lib/
下的文件丢失了导致的.
嗯 复制livecd的libz.so.1到/usr/lib/
, 成功启动.
然后我需要重装一下zlib, 于是pacman -S zlib
启动!
emmmm 我的pacman发生了什么!
看来不仅仅是丢了一个libz.so.1
的问题...好像zlib的软件包元数据也丢了Orz
更神奇的是, 我安装其他软件都没问题, 唯独zlib...emmmmm
群里有大佬建议说, 你不如用pacstrap安装一下试试看, 于是...
emmmmm 还是不行啊Orz
思考了一下, 你不是说desc文件找不到么, 于是我去那个目录看了一下
emmmm 好像只剩下一个mtree文件了, desc和files都丢掉了...
于是我想要不干脆把这个文件夹删掉, 是不是就当作我从来没装过zlib了.
立刻mv /var/lib/pacman/local/zlib-1:1.2.11-3 ~/ && pacman -S zlib
emmmm 好像是真的 虽然提示文件系统中已存在 这当然是因为我们已经安装过的原因
不过可以这样 pacman -S --dbonly zlib
~
成功! 这个时候再去pacman -S zlib
已经一点问题也没有了yeah
总结与后记
- pacman的软件包数据库真简单啊, 除了mtree是未知格式以外, desc和files都是纯文本文件
- pacman的单个软件包数据库挂了完全一点都不影响到整个软件包仓库
- 恢复完之后, 我发现上次关机前我滚过的包, 它又提醒我再滚一遍, 仿佛是一段时间内的磁盘写入完全丢失, 甚至还丢了别的文件
- 如果真的丢了别的文件, 其实我也看不出来Orz
- 所以既然用了brtfs, 那么就要常做snapshot啊_(:3」∠)_
- 所以下次再也不手贱压缩磁盘了!!!
以上
快上ZFS