10

有没有办法让 dpkg、apt-get 或 aptitude 生成需要安装在第二台机器上的软件包列表,以复制第一台机器上安装的软件包?

即如果我安装了一个普通的 Ubuntu 服务器,在安装时选择了 sshd 选项,然后安装了 build-essential 我希望输出看起来像:

#ubuntu 9.10 server
openssh-sshd
build-essential

据我所知,所有可用的打包工具都会在一个盒子上生成一个详细的包列表。我对 openssh libs、ld、gcc 以及 sshd 和 build-essential 引入的所有其他软件包不感兴趣,因为它们将在我安装 sshd 和 build-essential 时安装。

我只想查看需要安装的软件包列表,以便在另一台机器上重新创建我当前的软件包集。

这可能吗?

4

4 回答 4

12

deborphan, 有点。它构建系统中每个包的列表,找出依赖于什么,并打印出没有任何依赖关系的包。默认情况下,它只打印库(以便于查找由其他软件包安装且不再需要的库,因此得名)。它主要有做你想做的事情的选项。我像这样运行它:

deborphan -anp required --no-show-section

-a指定所有包(不仅仅是库)
-n忽略“建议”或“推荐”依赖检查(即只是“依赖”)
-p required列出所有包,尽管优先级
--no-show-section不指示它在 debian 的哪个部分,只是一个很好的格式化功能,你可能会觉得有用用于构建列表。

现在,它将丢失包,因为某些包具有循环依赖关系。但这些往往相当罕见,所以它应该让你足够接近。

于 2010-02-16T20:19:01.737 回答
2

dannysauer 发布的代码是一个开始。一旦您拥有包含依赖项的包列表,您就可以使用它apt-rdepends来查找特定包的依赖项(请参阅此页面以获取示例用法和输出)。

程序概要

  1. 遍历 dannysauer 的代码返回的包列表
  2. 呼吁apt-rdepends每个
  3. 从列表中删除显示在输出中的所有包apt-rdepends
于 2010-02-16T22:17:02.233 回答
1

那么,您想要显式安装的软件包列表(例如 ubuntu-desktop 和 openssh),而不是自动依赖项?我不积极,但我认为就是dpkg --get-selections这样。所以,你可以做

dpkg --get-selections > file

然后,在另一台计算机上,使用相同的“文件”并运行

dpkg --set-selections  < file
apt-get dselect-upgrade

不过,我并不绝对肯定这些命令只是手动选择包,而且我目前远离任何基于 Debian 的系统来验证。:)

于 2010-02-16T16:09:23.460 回答
1

那这个呢:

#!/bin/bash

packages=$(dpkg --get-selections | grep '[[:space:]]install$' | awk '{print $1}')

for pkg in $packages
do
    nr_lines=$(apt-cache -i rdepends $pkg | wc -l )
    if [ "$nr_lines" = "2" ]
    then
        echo $pkg
    fi
done

它运作良好吗?它可以以某种方式改进吗?

于 2013-03-28T07:41:57.217 回答