从dpkg --set-selections'*'恢复所有数据和依赖关系


44

所以我可以在一台机器上运行:

dpkg --get-selections '*' > selection.txt

在另一台机器上:

dpkg --set-selections < selection.txt

...,然后执行以下任一操作:

aptitude install
apt-get -u dselect-upgrade

...安装该软件包。

但是,在此过程中似乎丢失了一些信息,例如是否xyz自动安装了一个软件包(例如)作为对另一个软件包的依赖(abc)。您可以看到,无论何时执行类似的操作apt-get --purge remove abc。在原始计算机上,系统将通知您xyz已安装软件包作为的依赖项abc,您可以使用apt-get autoremove它来摆脱它。

现在我知道了deborphandebfoster,但是鉴于手头的(简单)任务,它们使用起来很麻烦。

像上面显示的那样保存和还原选择似乎不足以还原已安装软件包的微妙依赖性。

有没有一种方法可以备份整套元数据以进行程序包管理,然后将其完整还原?


我经常想知道同一件事,我生成了一个大型shell脚本,其中包含所有软件包(减去libs)的“ sudo apt-get install”。当然,我遇到了您遇到的相同问题。
Chuck R

我猜想,开始查找的最佳位置是检查dpkg是否实际上负责该信息。如果不是这样,那也许是适当的工作。
哈克2012年

3
如果您采用手动方式,则可能有兴趣apt-mark保存/恢复有关自动安装或手动安装的软件包的信息
Lekensteyn 2012年

它不在10.04软件包回购中,对吗?这是Canonical仓库还是第三方的一部分?
0xC0000022L 2012年

2
不,那只是“供您参考”的评论。我将使用apt-mark(它是apt的一部分,因此应该已经安装)来获取并设置软件包的标记(有关详细信息,请参见其手册页)。
htorque

Answers:


39

备份:

apt-mark showauto > pkgs_auto.lst
apt-mark showmanual > pkgs_manual.lst

恢复:

sudo apt-mark auto $(cat pkgs_auto.lst)
sudo apt-mark manual $(cat pkgs_manual.lst)

谢谢,正要问您或Lekensteyn将此作为答案。
0xC0000022L 2012年

这些命令是否允许您从该列表中重新安装程序?
Svetlana Belkin

恢复时可以删除额外安装的软件包吗?
n611x007 2014年

1
你能解释一下之间的区别automanual?谢谢。
Anto 2015年

我不小心将一堆其他软件包标记为手动...是否有还原方法?谢谢
dentex

2

所选问题的答案不完整,因此无法(或不再有效)。痛苦的修补程序是使用bash for循环来解析输出* .lst文件并将其提供给apt install。但是,错误的选择将在此不再赘述。

更好的选择是使用apt-clone,如Unix&Linux Stackexchange上的此答案所示。这将创建一个小文件(对于我的系统,大约为100K或更少)。据称,它将毫不费力或痛苦地克隆软件包。

因此,简而言之,在原始计算机上:

apt-clone clone `uname -n`

然后,在要克隆到的机器上,复制克隆文件并运行:

apt-clone restore original-machine-name.apt-clone.tar.gz

我在此处包含此答案,因为此页面在最初的网络搜索中出现,但其他答案没有。这种方法看起来更简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.