我能够找出部分定量的答案,而无需做大量的工作。这是我的(脑筋急转弯)方法:
1) 使用以下命令生成软件包列表及其安装大小和依赖项列表:
dpkg-query -Wf '${Package}\t${Installed-Size}\t${Depends}
2)解析结果并为每个包构建统计图:
struct PkgStats
{
PkgStats() : kbSize(0), dependantCount(0) {}
int kbSize;
int dependentCount;
};
typedef std::map<std::string, PkgStats> PkgMap;
直接依赖于该包dependentCount
的其他包的数量在哪里。
结果
以下是对我的系统依赖最多的包的前 20 个列表:
Package Installed KB # Deps Dup'd MB
libc6 10096 750 7385
python 624 112 68
libatk1.0-0 200 92 18
perl 18852 48 865
gconf2 248 34 8
debconf 988 23 21
libasound2 1428 19 25
defoma 564 18 9
libart-2.0-2 164 14 2
libavahi-client3 160 14 2
libbz2-1.0 128 12 1
openoffice.org-core 124908 11 1220
gcc-4.4-base 168 10 1
libbonobo2-0 916 10 8
cli-common 336 8 2
coreutils 12928 8 88
erlang-base 6708 8 46
libbluetooth3 200 8 1
dictionaries-common 1016 7 6
Dup'd MB
如果没有共享 ( = installed_size * (dependants_count - 1)
, for ) 将被复制的兆字节数在哪里dependants_count > 1
。
看到 libc6 在上面并不奇怪。:) 顺便说一句,我有一个典型的 Ubuntu 9.10 安装程序,安装了一些与编程相关的软件包,以及一些 GIS 工具。
一些统计数据:
- 安装包总数:1717
- 平均直接家属人数:0.92
- 不共享的总重复大小(忽略间接依赖项):10.25GB
- 直方图 # 的直接受抚养人(注意对数 Y 刻度):
请注意,以上完全忽略了间接依赖(即一切都应该至少间接依赖于 libc6)。我真正应该做的是构建所有依赖关系的图表并将其用作我的统计数据的基础。也许我会在某个时候解决它并发布一篇冗长的博客文章,其中包含更多细节和严谨性。