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

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

即如果我安装了一个普通的Ubuntu服务器,在安装时select了sshd选项,然后安装了build-essential,我期望输出如下所示:

#ubuntu 9.10 server openssh-sshd build-essential 

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

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

这可能吗?

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

deborphan -anp required --no-show-section

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

现在,它会丢失包,因为一些包有循环依赖。 但那些往往是相当不常见的,所以它应该让你足够接近。

dannysauer发布的代码是一个开始。 一旦你有一个包含依赖关系的包列表,你可以使用apt-rdepends来查找特定包的依赖关系(参见这个页面的例子用法和输出)。

程序大纲

  1. 遍历由dannysauer的代码返回的包列表
  2. 每个调用apt-rdepends
  3. 从列表中删除apt-rdepends输出中显示的所有软件包

所以,你需要明确安装的软件包列表(比如ubuntu-desktop和openssh),而不是自动依赖关系? 我不积极,但我认为这就是dpkg --get-selections所做的。 所以,你可以做

 dpkg --get-selections > file 

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

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

我并不十分肯定这些命令只是手动选择的软件包,而我现在远离任何基于Debian的系统进行验证。 🙂

那这个呢:

 #!/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 

它工作正常吗? 可以改进吗?