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

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

我正在尝试在虚拟机中设置临时环境,以便在将更新应用到我的主系统之前测试更新。

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

# 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在虚拟机中运行。我确实有一些需要特殊处理的包(这些实际上是我首先想要一个临时环境的主要原因),但是当我运行上面的最后一个命令时,我得到了无数行输出,例如:

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

对于真正应该在基本系统中可用的软件包。示例包括xtermyelpzip

现在我的问题是:

将软件包选择列表从一个 Debian 系统转移到另一个 Debian 系统的具体过程是什么(假设相同的 Debian 版本级别,在 Wheezy 中)然后随后应用这些更改?目标是两者都具有相同的已安装软件包列表,理想情况下,在两者的diff输出之间执行dpkg --get-selections或后不会显示任何差异。dpkg --list

grep -v deinstall部分借用自防止包在完成后被删除dpkg --set-selections结束于询问 Ubuntu。

我已将虚拟机中的源更改为与主系统上的源相同,还安装了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

请注意,在acl和之间aglfnacpi-support-base,acpidadduser 没有报告任何错误。似乎报告错误的软件包要么是un根据dpkg -l,要么dpkg -l根本不知道它们 ( dpkg-query: no packages found matching ...)。我知道有一些本地安装的软件包,但不多。i386直到gcc-4.7-base:i386 install 很多列表的更下方(--get-selections 输出中的第 342 行)。

答案1

要克隆 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 常见问题解答了解更多信息。 (dpkg 手册页中提到了这一点,但更多的是在您已经意识到的情况下以提醒您该问题的方式,而不是以解释如何解决问题的方式!)

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

apt-mark showauto >auto.list

并将它们恢复到目标系统上

xargs apt-mark auto <auto.list

答案2

我是怎么做到的

  1. 来源主持人:

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

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

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

  2. 目的地主持人:

    vi /etc/apt/sources.list 
    

适应来源.list即使使用不同的镜子,但相同成分列表。

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

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

相关内容