如何追踪在 Ubuntu(Linux)上安装的软件包?

如何追踪在 Ubuntu(Linux)上安装的软件包?

(这个问题与10458。有人认为 Fedora 和 Ubuntu/Debian 有很大不同,因此需要不同的答案。)

当我使用任何 Ubuntu 设置时,我都会逐渐安装一些超出基线安装的软件包。如果我重新安装,或者需要安装一台新机器,我通常会重新安装这些具体的软件包,我想快速完成,以便以最少的麻烦重新开始工作。据我所知,所有软件包管理器(apt-getaptitudesynaptic)都可以告诉我安装了哪些软件包,并且它们都有日志(尽管每个工具的日志都不同,这很麻烦)。但它们都不能告诉我哪些软件包我有安装,而不是依赖项或系统更新。即使是日志也很棘手,因为我不完全确定我应该从中提取什么,或者如何集成它们(对于各种 apt 系列工具而言)。这意味着每次我重新安装,甚至只是备份,我都不确定如何重新创建该列表。

我并不期望任何工具能帮我完成这些工作,但如果它们不能,我就会寻找解决方法。即使是 grep 的模式、好的经验法则或对记录内容的清晰认识也会很有用。这里可能没有“最佳答案”,但好的答案会非常有帮助。


以下大多数答案都大致符合我的要求,而且在一定程度上很有用。所选答案是最接近在新系统上重新安装我的工具的合理自动方法,尽管存在所有警告。

答案1

在任何基于 Debian 的机器上,这是复制软件包集的常用方法。在旧机器上:

dpkg --get-selections "*" > my_favorite_packages

将文件复制my_favorite_packages到新机器(U盘是个不错的选择,但scp也可以正常工作)。然后运行此序列(具有 root 权限):

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

这不会让你仅有的您安装的软件包。它还会获取它们的依赖项等。此外,如果两台机器之间的存储库不同,则所有赌注都无效。

至于日志,apt-get在 处保留一份日志/var/log/apt/history.log(感谢 Tshepang 在评论中更新了这一点);dpkg在 处有一份日志/var/log/dpkg.log,但众所周知,这份日志很难解析,而且只能使用 root 权限读取;aptitude在 处有一份日志/var/log/aptitude,您可以使用普通用户权限翻阅它。

据我所知,你说得对,这些日志都没有具体跟踪你安装了什么,而不是自动安装的依赖项。不过,你可以通过搜索获取​​这些信息aptitude。搜索所有已安装的软件包(也是自动安装的):

aptitude search '~i ~M'

如果你想仅有的您安装的那些(不是自动依赖项),否定~M

aptitude search '~i !~M'

如果你想要格式化,那么你就有仅有的软件包名称和单词“install”aptitude也可以实现这一点。这将为您提供一个可供输入的列表dpkg --get-selections

aptitude search '~i !~M' -F "%p install"

(我对 RedHat 或基于 RedHat 的系统一无所知。抱歉。对于 Linux,确实没有唯一的答案本身因为包管理是不同发行版的重要组成部分不同的

答案2

用于dpkg -l '*' > jaunty.original记住新安装的系统上所有已安装的软件包。

安装完所有附加软件包后,请执行下列操作dpkg -l '*' > mysystem.2009017

附加包只是有区别:diff jaunty.original mysystem.2009017

答案3

Aptitude 在这方面确实相当出色。Aptitude 确实知道何时手动或通过依赖关系安装了某些东西,您可以告诉它删除不再需要的东西,这些东西只是因为其他东西依赖于它而安装的,始终让您的系统尽可能小。

Ubuntu 安装由几个软件包组成,ubuntu-minimal、ubuntu-desktop、ubuntu-server 等等。如果您告诉 Aptitude 将这些软件包标记为手动安装,并删除其他所有软件包,那么您最终会得到最少的软件包。

我在我的博客的两篇文章中解释了如何做到这一切:清理 Debian GNU/Linux清理 Debian GNU/Linux(或 Ubuntu),重演。简而言之,你要找的答案是:

aptitude search ~i | grep -v "i A"

上次我使用它时,如果你使用 apt-get,它就不起作用了。这就是为什么我总是推荐 aptitude,据我所知,Debian 正在弃用 apt-get 而支持 aptitude。

我不知道如何在 Fedora 上执行此操作,您可能应该将其分成另一个问题。Fedora 和 Ubuntu 是不同的操作系统并且应该被这样对待(即使他们共享他们的内核和一些东西)。

答案4

当您使用时,dpkg您不知道该软件包是用户手动安装的还是自动安装的(作为依赖项或在初始操作系统安装期间)。如果您想保留该信息,您需要获取仅实际手动安装的软件包的列表。

为此,您可以使用以下两个单行代码中的任意一个。 在我的计算机上,它们都产生完全相同的输出,并且比迄今为止在此问题中提出的所有解决方案都更精确。 它们是两个答案的组合(1)(2)。请注意,我最初发布了这个答案这里

使用apt-mark

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

使用aptitude

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

很少有包裹仍然漏网,尽管我怀疑这些实际上由用户安装,要么在安装后立即通过语言本地化设置安装,要么通过 Totem 编解码器安装程序安装。此外,尽管我只安装了非特定版本的元包,但 linux-header 版本似乎也会累积。示例:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

它是如何工作的

  1. 获取手动安装的软件包列表。对于 aptitude,附加命令sed会删除行末剩余的空格。
  2. 获取全新安装后立即安装的软件包列表。
  3. 比较文件,仅输出文件 1 中不存在而文件 2 中的行。

其他可能性不起作用:

  • 使用ubuntu-14.04-desktop-amd64.manifest文件(这里对于 Ubuntu 14.04)而不是/var/log/installer/initial-status.gz。更多软件包显示为手动安装,即使它们不是。
  • 例如,使用apt-mark showauto而不是/var/log/installer/initial-status.gz.apt-mark不包括 xserver-xorg 包,而另一个文件则包括。

两者都列出了比上述解决方案更多的包。

相关内容