![你能确定在运行特定程序时哪些包根本没有被使用吗](https://linux22.com/image/1122594/%E4%BD%A0%E8%83%BD%E7%A1%AE%E5%AE%9A%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%89%B9%E5%AE%9A%E7%A8%8B%E5%BA%8F%E6%97%B6%E5%93%AA%E4%BA%9B%E5%8C%85%E6%A0%B9%E6%9C%AC%E6%B2%A1%E6%9C%89%E8%A2%AB%E4%BD%BF%E7%94%A8%E5%90%97.png)
我想创建一个自定义的 Ubuntu 服务器发行版,该发行版会自动在目标机器上安装和运行特定程序。我在这里找到了一个非常好的指南:
我想删除正常安装带来的所有膨胀包,有没有办法确定哪些包根本没有使用,以便我可以将它们从我的发行版中删除?
附注:如果你确实遵循了上面提到的指南并且你正在运行 Ubuntu 14.04,请使用以下链接修复 kickstart 的错误(我没有足够的声誉将其添加到评论中,所以如果你愿意,请这样做)
答案1
您可以使用以下方法检查程序访问了哪些文件strace
:
-e trace=file
Trace all system calls which take a file name as an
argument. You can think of this as an abbreviation
for -e trace=open,stat,chmod,unlink,... which is
useful to seeing what files the process is
referencing. Furthermore, using the abbreviation
will ensure that you don't accidentally forget to
include a call like lstat in the list. Betchya
woulda forgot that one.
因此,类似于:
$ strace -fe trace=file -o log /bin/bash -c ''
$ awk -F\" '!a[$2]++&&/\//{print $2}' log | xargs dpkg -S 2>/dev/null | awk -F: '!a[$1]++{print $1}'
bash
libtinfo5
libc6
但请注意:无论如何,这个输出都不是特别有用:
- 它不会告诉您哪些包未被命令使用,因为使用可能是通过访问文件以外的某种方式(或者它访问了由包创建但未记录在
dpkg
数据库中的文件)。 - 它没有告诉你哪些包可能有不是被某个包使用过。例如,如果我运行一个交互式 bash 会话,包的数量会高很多,主要是因为这些包提供的完成脚本也被计算在内。列表甚至包括 GRUB!而 GRUB 显然不是需要通过 bash。
您应该做的是ubuntu-minimal
首先安装程序运行所需的东西(当程序因神秘错误而死亡时,您就会知道需要哪些东西)。