来自 http://www.aiview.com/2008/03/gentoo_linux_deleted_var_db_pkg.html

前段时间折腾tmpfs 文件系统,不小心弄丢了/var/db/pkg 下面所有的文件,在查资料的过程中,才了解这个文件夹的重要。

这个文件夹对于Gentoo 的作用,相当于Windows 应用程序的Uninstall 文件,所有通过Portage 安装的程序包信息都保存在这,每个程序包包含哪些文件,以及文件的路径信息是最重要的,缺少这些信息,将无法正常的卸载程序包,其他一些重要的信息丢失也 导致Portage 系统混乱。

这个文件夹丢失,虽然系统中的应用程序可以照常运行,但却是最大的灾难,除非不再打算通过Portage 对包进行任何维护工作,比如升级,安装新的软件等。解决方法只有一个:重新merge 所有软件包,重新生成这部分信息。一般来说,系统中软件包的规模在几百,甚至上千个,里面还有一些重磅角色,全部重新编译一遍,可能需要几十个小时 (OpenOffice 在我的T43 上花去10个小时进行编译)。

文件夹丢失后,我最初找到了这个讨论(en),参考hielvc 写的脚本, 希望通过读取/var/log/emerge.log 恢复丢失的信息,但这个方法只能恢复出系统中所有已安装软件包名称和版本信息,无法找回已安装文件的列表,能不能通过某个Gentoo 工具得到每个软件包默认的文件列表呢,答案应该是不可以,因为Gentoo 是一个定制性的系统,大部分文件都是编译后生成的,并没有一个默认的库能够告诉这些文件的具体信息。换句话说,我的/var/db/pkg 是唯一的,如果没有备份,只能重新编译一遍系统来生成它们,下面这个讨论中,didymos很清楚的解释了这个问题,也证实了我的想法:PANIC! I deleted /var/db/pkg

所幸,在把我的/var/db/pkg 放入内存之前,我留下一个备份,但随后,我merge了约50个软件包,这些信息被写入内存中的/var/db/pkg ,随后就在一次重启后彻底丢失了。

在具有备份的情况下,我使用以下步骤重建了/var/db/pkg,时间成本主要花费在重新merge 约50个软件包。

步骤恢复备份的/var/db/pkg 文件夹

恢复之后,/var/db/pkg 代表了merge 50个包之前我的系统的状况,但我的系统实际多出了一些包,或者一些已存在包的升级。

找出/var/db/pkg 与实际系统的不一致

前面提到的hielvc 写的脚本可以派上用场,但hielvc 忽略了一些情况(emerge -> unmerge -> emerge again),结果可能并不准确,我重写了一个脚本rebuildpkgdb,用法:

# ./rebuildpkgdb -pThis is a dry-run, Nothing really changed.Done! Please check package.lst

这将得到系统中实际安装的所有包列表(包含版本),再使用下面命令获取/var/db/pkg 记录的列表。

#  find /var/db/pkg/ -type d |cut -d/ -f 5- |awk -F/ 'NF > 1' |sort > package.db

然后比较两个文件,找到以下包:

  1. 存在于package.lst,但不存在于package.db

  2. 存在于package.db,但不存在于package.lst

  3. 都存在,但版本不同(取 package.lst)

对于第一种情况,是因为我在/var/db/pkg 丢失之后,unmerge 了一些包,虽然emerge.log 显示unmerge 成功,但因为丢失/var/db/pkg,实际文件并没有从文件系统真正删除。

而后两种情况是我备份/var/db/pkg 之后,丢失的信息。

因此对于上面三种情况,都执行一次merge 即可。

remerge

将上个步骤取得的包列表格式化成类似下面的命令,重新merge一遍,这个过程将重建正确的/var/db/pkg。

# sudo emerge -av =app-admin/eselect-ctags-1.3 =app-admin/eselect-wxwidgets-0.8 \
=app-admin/sudo-1.6.9_p14 =app-editors/emacs-22.1-r3 ...These are the packages that would be merged, in order:Calculating dependencies... done![ebuild  N    ] sys-fs/mtools-3.9.10  USE="X" 0 kB [ebuild     U ] kde-base/kpdf-3.5.9 [3.5.8] USE="xinerama -arts -debug -kdeenablefinal" 0 kB [ebuild     U ] kde-misc/krusader-1.80.0-r1 [1.80.0] USE="xinerama -arts -debug -javascript -kde" 0 kB [ebuild  N    ] sys-boot/syslinux-3.52  0 kB  ...Total: 49 packages (42 upgrades, 6 new, 1 in new slot), Size of downloads: 3 kBWould you like to merge these packages? [Yes/No]检查系统

列出那些在/usr/lib/portage/world,但不在/var/db/pkg 中的软件包:

# emaint --check world

如果上面命令找到了任何包,那么应该先merge 它们,如果事实不需要它们,再进行unmerge ,这样可以保证world, /var/db/pkg/, 以及文件系统三者的一致性。

revdep-rebuild

最后执行revdep-rebuild 查找系统中的任何共享库以及依赖关系的缺失,如果需要,会自动merge 需要的软件包。这个命令可能需要运行多次,直到没有任何问题发现为止。

# revdep-rebuild如果没有/var/db/pkg 备份

这是个很不幸的状况,如果真正希望world, /var/db/pkg/, 以及文件系统这三者具有一致性,那么似乎没有别的选择,找个空闲时间依次执行下面的命令,来重建/var/db/pkg

# emaint --check world# emerge -e system# emerge -e world# revdep-rebuild

这个过程可能很漫长,视机器的速度,如果有其他Gentoo 系统可以利用,那么可以尝试分布式编译来节省时间。

延展阅读

Gentoo Linux文档 -- Portage入门

Gentoo Forums :: 阅读主题 - PANIC! I deleted /var/db/pkg

Gentoo Forums :: 阅读主题 - deleted /var/db/pkg [solved]

HOWTO Use Portage Correctly - Gentoo Linux Wiki

GF16: Corrupt or empty world file, what do I do?

转载于:https://blog.51cto.com/axlrose/1287450

Gentoo Linux: /var/db/pkg 这个文件夹很重要![转]推荐阅读相关推荐

  1. 在 Linux 上使用 Meld 比较文件夹

    我们已经从一个新手的角度了解了 Meld (包括 Meld 的安装),我们也提及了一些 Meld 中级用户常用的小技巧.如果你有印象,在新手教程中,我们说过 Meld 可以比较文件和文件夹.已经讨论过 ...

  2. linux替换某个文件夹下所有文件,Linux 批量查找并替换文件夹下所有文件的内容...

    1.批量查找某个目下文件的包含的内容 cd etc grep -rn "查找的内容" ./ 2.批量替换某个目下所有包含的文件的内容 cd etc sed -i "s/查 ...

  3. 【问题解决方案】Linux中进入目录下文件夹

    [问题解决方案]Linux中进入目录下文件夹 参考文章: (1)[问题解决方案]Linux中进入目录下文件夹 (2)https://www.cnblogs.com/anliux/p/11486540. ...

  4. flac格式音频转wav|Linux 使用 Shell 循环遍历文件夹里的音频——简介

    FLAC (无损音频压缩编码)-百度百科简介 使用sox工具把 flac 格式转wav,命令如下: sox 1.flac 1.wav 如果你的 flac 通道数.采样率.量化进度和wav不一致的话,需 ...

  5. linux中要怎么创建文件夹

    我是一个linux初学者,由于工作上面需要,我需要在linux中创建一个文件夹,然后自学了一点点,其实创建文件夹很简单,下面分享给大家,越努力越幸运,共勉! 创建文件夹 mkdir 后面加文件夹名字 ...

  6. 如何在Linux中轻松隐藏文件和文件夹

    你有没有想要隐藏你的Linux文件系统上的文件或文件夹,但不知道该怎么做? 别担心,这不像听起来那么复杂,而且可以快速而有效地完成. 在本指南中,我们将介绍在Linux中可以有效隐藏文件和文件夹的简单 ...

  7. linux给普通用户赋予scp权限,关于linux新建用户并赋予文件夹权限和scp权限的问题...

    当前用户是aaa,新建用户bbb: $adduser bbb 赋予sudo权限(即把用户bbb添加到sudo组): $usermod -a -G sudo bbb 切换到bbb: $su - bbb ...

  8. linux ftp 550 下载,linux ftp服务器上传文件夹时提示550错误问题解决方法

    linux ftp服务器上传文件夹时提示550错误问题解决方法 标签: linux ftp服务器 550 中文文件夹上传错误 问题 分类: 计算机 2010-11-06 22:47 前几天在实验室搭配 ...

  9. linux zip压缩排除目录,linux tar压缩排除某个文件夹的方法

    一般直接用tar命令打包很简单,直接使用 tar -zcvf test.tar.gz test 即可. 在很多时候,我们要对某一个目录打包,而这个目录下有几十个子目录和子文件,我们需要在打包的时候排除 ...

最新文章

  1. upgrade lnmpa php.sh,LNMP 状态管理命令说明及Nginx、MySQL/MariaDB、PHP升级教程
  2. 避免使用aireplay-ng指令时出现AP通道不对的方法
  3. max格式转obj小工具_PDF文件转JPG等图片格式的小工具
  4. 使用postman测试oauth2.0认证服务中出现OAuth出现Bad credentials
  5. 62、滑动窗口的最大值
  6. BugkuCTF-MISC题隐写3
  7. java list stream avg_Java 8 Stream API中的多个聚合函数
  8. 洪学海(1967-),男,博士,中国科学院计算技术研究所研究员。
  9. 吃糖果(HDU-1205)
  10. 计算机五个部件中协调,计算机基础知识(一)
  11. 辽宁省计算机辅助普通话水平测试应试指南,计算机辅助普通话水平测试 应 试 指 南...
  12. flutter怎么手动刷新_Flutter 小技巧实现通用的局部刷新
  13. [导入]将asp.net usercontrol(用户控件页)转变为普通控件
  14. 《CCIE路由和交换认证考试指南(第5版) (第1卷)》——导读
  15. Android手动创建和解析Json
  16. [译] What is some general advice for a new PhD student?
  17. 拓端tecdat:Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
  18. 哈夫曼编码问题(贪心算法)
  19. 悲伤的时候总会想起什么
  20. BUAA-2023软件工程——团队成员介绍

热门文章

  1. linux系统终端more,一篇文章让你学透Linux系统中的more命令
  2. 鸟哥的linux私房菜简答题答案,《鸟哥的Linux私房菜》7章 Linux文件与目录管理 习题答案...
  3. php 中断输出,PHP捕捉异常中断的方法
  4. vmware workstation克隆linux后修改网卡为eth0方法
  5. Word2Vec学习笔记(三)续
  6. 2022年百度新能源汽车行业洞察
  7. 2021社区居家养老现状与未来趋势报告
  8. 面试中如何做一个好的自我介绍?
  9. mac vscode设置中文_VSCode编写latex
  10. mysql 无法处理非法数据_MySQL 处理非法数据