有没有办法让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时安装。
我想看一下我需要安装的软件包列表,以便在另一台机器上重新创建我当前的软件包。
这可能吗?
答案 0 :(得分:11)
deborphan
,有点儿。它构建了系统中每个包的列表,找出了取决于什么的包,并打印出没有任何依赖关系的包。默认情况下,它只打印库(以便于查找由其他软件包安装且不再需要的库,因此名称)。它主要可以选择你想要的东西。我像下面这样运行:
deborphan -anp required --no-show-section
-a
指定所有包(不仅仅是库)
-n
忽略“建议”或“推荐”依赖性检查(即只是“取决于”)
-p required
列出所有套餐,尽管优先级为
--no-show-section
并未指出它所在的debian部分,只是一个很好的格式化功能,您可能会发现它对构建列表很有用。
现在,它会错过包,因为某些包具有循环依赖性。但那些往往相当不常见,所以它应该让你足够接近。
答案 1 :(得分:2)
dannysauer发布的代码是一个开始。获得包含依赖项的软件包列表后,可以使用apt-rdepends
查找特定软件包的依赖项(有关示例用法和输出,请参阅this page)。
程序大纲
apt-rdepends
apt-rdepends
答案 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
它运作良好吗?可以以某种方式改进吗?