你能确定在运行特定程序时哪些包根本没有被使用吗

你能确定在运行特定程序时哪些包根本没有被使用吗

我想创建一个自定义的 Ubuntu 服务器发行版,该发行版会自动在目标机器上安装和运行特定程序。我在这里找到了一个非常好的指南:

如何创建自定义的 Ubuntu 服务器 iso

我想删除正常安装带来的所有膨胀包,有没有办法确定哪些包根本没有使用,以便我可以将它们从我的发行版中删除?

附注:如果你确实遵循了上面提到的指南并且你正在运行 Ubuntu 14.04,请使用以下链接修复 kickstart 的错误(我没有足够的声誉将其添加到评论中,所以如果你愿意,请这样做)

kickstart 错误修复 ubuntu 14.04

答案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首先安装程序运行所需的东西(当程序因神秘错误而死亡时,您就会知道需要哪些东西)。

相关内容