我正在尝试在虚拟机中设置临时环境,以便在将更新应用到我的主系统之前测试更新。
为此,我在 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
对于真正应该在基本系统中可用的软件包。示例包括xterm
、yelp
和zip
。
现在我的问题是:
将软件包选择列表从一个 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
和之间aglfn
是acpi-support-base
,acpid
和adduser
没有报告任何错误。似乎报告错误的软件包要么是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-selections
apt-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
我是怎么做到的
在来源主持人:
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
文件到目标主机。在目的地主持人:
vi /etc/apt/sources.list
适应来源.list即使使用不同的镜子,但相同成分列表。
apt-get update
dselect update
dselect upgrade
dpkg --set-selections </tmp/source.sel
dselect install
而现在,我的目的主机目前正在安装很多东西,那么我可能需要一些时间来发布这个。