如何列出重新创建一组已安装软件包所需的最小Debian软件包集?

时间:2010-02-16 15:13:34

标签: linux debian dpkg aptitude

有没有办法让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 个答案:

答案 0 :(得分:11)

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

deborphan -anp required --no-show-section

-a指定所有包(不仅仅是库)
-n忽略“建议”或“推荐”依赖性检查(即只是“取决于”) -p required列出所有套餐,尽管优先级为
--no-show-section并未指出它所在的debian部分,只是一个很好的格式化功能,您可能会发现它对构建列表很有用。

现在,它会错过包,因为某些包具有循环依赖性。但那些往往相当不常见,所以它应该让你足够接近。

答案 1 :(得分:2)

dannysauer发布的代码是一个开始。获得包含依赖项的软件包列表后,可以使用apt-rdepends查找特定软件包的依赖项(有关示例用法和输出,请参阅this page)。

程序大纲

  1. 遍历包列表 由dannysauer的代码返回
  2. 在每个
  3. 上致电apt-rdepends
  4. apt-rdepends
  5. 的输出中显示的列表中删除所有包

答案 2 :(得分:1)

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

dpkg --get-selections > file

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

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

我不是绝对肯定那些命令只是做手动选择的包,但我现在远离任何基于Debian的系统来验证。 :)

答案 3 :(得分: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

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