Loading

使用ArchWiki提供的方法恢复pacman本地数据库

0x01

​ 昨天在安装docker的时候,由于/分区空间不足,想通过软链接的方式把docker容器目录更改到/home分区,结果不小心

rm -rf /var/lib/

删掉了整个/var/lib文件夹,好多命令都失效了,后来通过复制live系统的同名文件夹恢复了一部分,但是存储在/var/lib/pacman/local下的已安装软件包数据库由于其独特性,无法全部恢复,造成的后果就是使用pacman安装软件包时会提示某些依赖库已存在。

0x02

​ 去社区看了下,arch中各种原因导致loacaldb损坏的案例不少见,但是像我这么蠢的原因应该找不出第二个😅(

​ 查找Archwiki上关于pacman 本地数据库损坏的修复方式,找到了这个条目:

https://wiki.archlinux.org/index.php/Pacman/Restore_local_database

通过读取pacman日志并进行过滤的方式恢复出已安装包的数据

​ 首先确认日志文件存在

cat /var/log/pacman.log

这一步如果找不到日志或者日志只有少数几行,建议使用archlinux社区中的软件包检测脚本。

使用shell awk语法编写过滤脚本

#!/bin/awk -f
i = 3 {}
$3 ~ /^\[[^]]+\]$/ {
  i = 4
}
$i ~ /^(installed|upgraded)$/ {
  pkg[$(i+1)] = 1
  next
} 
$i == "removed" {
  pkg[$(i+1)] = 0
} 
END {
  for (i in pkg) if (pkg[i]) print i
}

随后执行chmod +x xxx.awk并运行这个脚本./xxx.awk /var/log/pacman.log > pkglist.orig

文件pkglist.orig即包含了所有执行过安装操作的软件包

手动检查pkglist.orig删除来源非官方仓库的软件包,如自行编译构建的aur包等

接下来执行{ cat pkglist.orig; pacman -Slq; } | sort | uniq -d > pkglist过滤无法从仓库中安装的其他包

现在软件包列表已经基本完善,到这一步之后由于我使用的终端语法和bash稍有不同,后面的脚本内容总会因为不明原因报错。

于是使用文本编辑工具将pkglist中换行符替换成空格,并使用sudo pacman -S xxx --overwrite "*" 覆盖安装列表中全部软件包,这时pacman本地数据库已经基本恢复,已安装软件包均可正常更新和移除。

0x03

更改docker容器存储路径正确姿势:

​ 编辑/var/lib/systemd/system/docker.service的启动参数,使用--graph指定docker存储路径。

之后systemctl daemon-reload``systemctl restart docker

tips: linux使用rm命令误删除文件后第一选择是通过命令进程找回,如不慎关机重启建议使用数据恢复软件,以上两条皆无效时再考虑从其他主机scp或者复制文件到本机,本文中由于使用的操作系统为全新安装,无重要数据故采用第三种方式。

最后,为了保护数据安全,请经常备份重要数据并减少使用rm命令,改为转移文件到额外的中转目录中,并定期进行清理。

~

posted @ 2020-11-24 14:37  Cr1m3rA  阅读(629)  评论(0编辑  收藏  举报