如何将已安装的软件包选择从一个Debian系统复制到另一个?(Debian Wheezy)


19

我正在尝试在VM中设置暂存环境,以便在将更新应用到主系统之前对其进行测试。

为此,我已经在VM中完成了Debian Wheezy的基本安装(与主系统上相同),然后以root身份从VM中运行:

# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh me@main-system 'dpkg --get-selections | grep -v deinstall' | \
  dpkg --set-selections

在我的情况下,不幸的是需要i386架构。该系统是amd64本机。

问题是dpkg --set-selections在VM中运行。我确实有一些需要特殊处理的软件包(实际上,这是我首先要提供暂存环境的主要原因),但是当我运行上面的最后一条命令时,得到的输出行如数以百万计:

dpkg: warning: package not in database at line NNN: package-name

用于基本系统中确实应该可用的软件包。实例包括xtermyelpzip

现在我的问题是:

将软件包选择列表从一个Debian系统转移到另一个系统(假设在Wheezy中为相同的Debian发行级别),然后随后应用这些更改的具体过程是什么目的是使两者都具有相同的已安装软件包列表,理想情况下,这样diff会使两者的输出dpkg --get-selectionsdpkg --list在两者的输出之间进行“ a”操作,从而显示出没有差异。

grep -v deinstall部分是从Ask 软件包中dpkg --set-selections借用的Prevent软件包中删除的

我已将VM中的源更改为与主系统上的源相同,还安装了apt-transport-https

deb https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb [arch=amd64] http://archive.zfsonlinux.org/debian wheezy main

查看--set-selections输出,我看到:

dpkg: warning: package not in database at line 1: a2ps
dpkg: warning: package not in database at line 1: abiword
dpkg: warning: package not in database at line 1: abiword-common
dpkg: warning: package not in database at line 1: abiword-plugin-grammar
dpkg: warning: package not in database at line 1: abiword-plugin-mathview
dpkg: warning: package not in database at line 1: accountsservice
dpkg: warning: package not in database at line 1: acl
dpkg: warning: package not in database at line 4: aglfn
dpkg: warning: package not in database at line 4: aisleriot
dpkg: warning: package not in database at line 4: alacarte
dpkg: warning: package not in database at line 4: alien
...

行号看起来很奇怪,--get-selections输出的相应部分是:

a2ps install
abiword install
abiword-common install
abiword-plugin-grammar install
abiword-plugin-mathview install
accountsservice install
acl install
acpi-support-base install
acpid install
adduser install
aglfn install
aisleriot install
alacarte install
alien install

请注意,在之间aclaglfnacpi-support-baseacpidadduser 正为其没有错误报告。似乎已报告错误的软件包是un根据dpkg -l,还是dpkg -l根本不了解它们(dpkg-query: no packages found matching ...)。我知道有一些本地安装的软件包,但不是很多。i386不图,直到gcc-4.7-base:i386 install 越往下列表(在--get-选择输出线342)。


dpkg --get-selections … | … dpkg --set-selections是复制软件包选择的方法。如果失败了,您将需要提供有关原因的更多信息。在这两个系统上发布完整的源代码,的输出dpkg --get-selections和的完整成绩单dpkg --get-selections(也许我们可以通过查看有效的方法和无效的方法来识别模式)。如果主系统是amd64或i386?如果不添加i386架构,是否可以正常工作?
吉尔斯(Gilles)'“ SO-别再邪恶了”

@Gilles真的需要它的完整输出吗dpkg --get-selections(我假设您的意思是dpkg --set-selections笔录?)?甚至仅前者就超过3600行,大约100 KB。
CVn

您需要发布足够的信息,以便我们辨别哪些包触发错误而哪些包不会触发错误(除非您自己能弄清楚)的模式。/var/lib/dpkg/Packages(甚至更长)的副本也可能有用-这可能是Packages文件损坏的症状。
吉尔斯(Gilles)'所以

@吉尔斯有趣的一点。我没有真正考虑过这种可能性,但是我在这些镜子上使用了不同的镜子。让我看看如果将VM指向相同的Debian镜像是否仍然会发生。支持。
CVn 2015年

@Gilles并没有什么明显的区别,但是我确实找到了其他东西。请参阅更新的问题。
CVn 2015年

Answers:


17

要克隆Debian安装,请使用该apt-clone实用程序。从Wheezy开始,它在Debian中可用(作为单独的软件包,不是默认安装的一部分),从12.04开始,它在Ubuntu中可用。在现有计算机上运行

apt-clone clone foo

这将创建一个文件foo.apt-clone.tar.gz。将其复制到目标计算机,然后运行

apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz

如果您正在使用的旧系统apt-clone不可用,或者您只想复制已安装软件包的列表而不是任何配置文件,请按以下手动步骤操作。

  • 在源计算机上:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • 在目标计算机上:

    cp sources.list /etc/apt/
    apt-get update
    /usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
    dpkg --set-selections <selections.list
    apt-get dselect-upgrade
    xargs apt-mark auto <auto.list
    

我相信您会受到dpkg的不兼容更改的影响,该更改首先使它变得喘不过气来。有关背景,请参见错误#703092

简短的故事是,dpkg --set-selections现在仅接受文件/var/lib/dpkg/status或中存在的程序包名称/var/lib/dpkg/available。如果像大多数人一样仅使用APT管理软件包,/var/lib/dpkg/available则不会保持最新状态。

运行后apt-get update和运行前dpkg --set-selectionsapt-get -u dselect-upgrade运行以下命令:

apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail

从jessie开始,您可以简化为

apt-cache dumpavail | dpkg --merge-avail

或者,运行

/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/

甚至更简单

apt-get install dctrl-tools
sync-available

不需要安装其他软件包,但会再次下载软件包列表的另一种简单方法是

dselect update

有关更多信息,请参见dpkg FAQ。(这在dpkg手册页中有所提及,但更多的方式是在您已经意识到的情况下提醒您该问题,而不是说明如何解决该问题!)

请注意,使用克隆软件包安装dpkg --set-selections不会恢复APT中的自动/手动标记。有关更多详细信息,请参见从dpkg --set-selections'*'恢复所有数据和依赖项。您可以使用以下方法将标记保存在源系统上:

apt-mark showauto >auto.list

并将它们还原到目标系统上

xargs apt-mark auto <auto.list

3
这个问题应该比现在更明显。我不敢相信我之前从未听说过!
Faheem Mitha 2015年

有趣。要试一试。谢谢!
CVn 2015年

@FaheemMitha是的,令我惊讶的是,我之前从未听说过它。我不敢相信dpkg --set-selections自从狂喜之前我就没有用过!
吉尔(Gilles)'所以

好的,那给出的警告列表要短得多--set-selections。现在如何应用更改?甚至apt-get -u dist-upgrade只提到了少数软件包(所有与ZFS相关的软件包),其中应该有数百个(即使不是数千个)受影响的软件包。
CVn 2015年

@MichaelKjörling那是apt-get -u dselect-upgrade
Gilles'所以别再邪恶了'

0

我是怎么做到的

  1. 主机上:

    apt-get update && apt-get dist-upgrade
    dpkg --get-selection >/tmp/source.sel
    cat /etc/apt/sources.list
    

    关心/etc/apt/sources.list.d是否使用...

    然后将source.sel文件复制到目标主机。

  2. 目标主机上:

    vi /etc/apt/sources.list 
    

    适应的sources.list即使有不同的镜子,但相同的组件列表。

    apt-get update
    dselect upgrade
    dpkg --set-selection </tmp/source.sel
    dselect install
    

    现在,我的目标主机正在安装很多东西,那么我可能需要一些时间来发布它。


也许上面的“我如何做到”描述中的“ dselect升级”应该是“ dselect更新”。
乔纳森·金米特
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.