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

0xC*_*22L 44 package-management aptitude dpkg

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

dpkg --get-selections '*' > selection.txt
Run Code Online (Sandbox Code Playgroud)

在另一台机器上:

dpkg --set-selections < selection.txt
Run Code Online (Sandbox Code Playgroud)

... 后跟以下任一项:

aptitude install
apt-get -u dselect-upgrade
Run Code Online (Sandbox Code Playgroud)

...安装软件包。

但是,似乎在此过程中丢失了一些信息,例如一个包(例如xyz)是否作为另一个包(abc)的依赖项自动安装。每当您执行类似apt-get --purge remove abc. 在原始机器上,您会收到通知,软件包xyz已作为依赖项安装abc,您可以使用apt-get autoremove它来摆脱它。

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

似乎保存和恢复如上所示的选择不足以恢复已安装包的微妙依赖关系。

有没有办法备份完整的元数据集以进行包管理,然后将其完整还原?

hto*_*que 39

备份:

apt-mark showauto > pkgs_auto.lst
apt-mark showmanual > pkgs_manual.lst
Run Code Online (Sandbox Code Playgroud)

恢复:

sudo apt-mark auto $(cat pkgs_auto.lst)
sudo apt-mark manual $(cat pkgs_manual.lst)
Run Code Online (Sandbox Code Playgroud)


小智 5

该问题的所选答案不完整并且不起作用(或不再起作用)。痛苦的解决方法是使用 bash for 循环来解析输出 *.lst 文件并将它们提供给apt install. 不过,选择不好,所以这里不再说明。

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

简而言之,在原始机器上:

apt-clone clone `uname -n`
Run Code Online (Sandbox Code Playgroud)

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

apt-clone restore original-machine-name.apt-clone.tar.gz
Run Code Online (Sandbox Code Playgroud)

我在此处包含此答案,因为此页面出现在初始网络搜索中,但另一个答案没有出现。这个方法看上去简单多了。