如何让我的 Debian 系统保持最新的软件包?

9 debian package-management

我在服务器上安装的大部分“软件”都需要是最新版本(Java、Tomcat、MySQL-Cluster)。所以我从来没有运气,有预建的 Debian 软件包(在发行版中)可用。因此,所有软件都是从项目网页下载并从源代码构建的。

现在我的问题是,在我的 Debian 系统上安装它们的正确方法是什么?

我的主要问题是,当直接从源代码安装它们时,它们不包含在包管理中(具有 aptitude)。似乎并没有真正建议使用 Checkinstall 并且 equiv 也有缺点。使用 dh_make 和 dpkg-buildpackage 构建我自己的包是处理这个问题的唯一正确方法吗?

如果您总是需要最新版本,您在做什么?

Fah*_*tha 10

想要更新的软件包是任何操作系统上的常见问题。Debian 的发布周期近年来平均为 2 年,所以在这个周期结束时,这可能是一个更紧迫的问题。缓解这种情况的一种方法是在稳定发布周期结束时进行测试,此时下一个版本几乎稳定。从问题中不清楚它是否更一般地谈论稳定和/或不稳定。无论如何,即使运行不稳定,拥有最新版本也可能是一个问题,因为最新版本可能尚未打包。Debian 开发人员/打包人员是志愿者,因此他们可能会感到无聊或忙于其他事情,从而导致软件包枯竭。

为简单和具体起见,我假设接下来的计划是将一个包向后移植到稳定版,但它更广泛地适用。所以,如果我想要一个更新版本的软件,但它不是稳定版,按大致顺序,这就是我要做的。

  1. Debian Backports 中查找软件包。有时,您可以找到足够新的软件包来满足您的目的。但是,与不稳定或实验性或上游的版本相比,这些软件包通常已经过时。

  2. 尝试直接从测试、不稳定或实验中安装包。如果 stable 与您尝试安装的任何版本都没有太大差异,这可能会奏效。如果系统开始尝试从更新的版本安装或升级基本软件包,您就会知道这种方法很糟糕。假设您尝试从不稳定安装,然后

    apt-get install packagename/unstable
    
    Run Code Online (Sandbox Code Playgroud)

    是第一件事要尝试。对于 apt 的稳定版本,这通常会失败,因为它需要来自不稳定的其他软件包,而这种咒语只会提高packagename足够高的偏好,以便将其安装在不稳定的环境中。如果您不明白这意味着什么,请离开并阅读man apt_preferences。继续从不稳定添加依赖项,确保它没有尝试升级基本包。例如,如果它开始尝试升级 libc6 或 X 或 KDE 或 Gnome,请立即中止。如果尝试从相同的源包升级其他包通常很好,因为它们通常紧密耦合在一起。要查看二进制包依赖的源包,请执行

    apt-cache showsrc packagename
    
    Run Code Online (Sandbox Code Playgroud)

    由于很多东西都依赖于 GNU C 库 (libc6),这曾经是一个问题。最近,API 似乎已经稳定下来,因此现在无需升级它就更常见了。如果包满足其对稳定版的运行时依赖性,但仍无法正常工作,请提交错误。如果打包人员告诉您这不是错误,那他们就错了。:-)

  3. 自己从测试、不稳定或实验中向后移植包。

    如上所述,向后移植是一种选择,但与不稳定或实验性或上游的版本相比,这些软件包通常已经过时。

    这通常需要递归依赖构建循环类型的东西。您首先需要使用以下命令获取构建依赖项

    apt-get build-dep packagename    
    
    Run Code Online (Sandbox Code Playgroud)

    如果由于其中一个依赖项不够新而失败,则您需要先向后移植该依赖项。这会导致螺旋失控。如果我必须处理超过 2 个级别的递归,我通常会放弃。但是请注意,真正的依赖关系并不一定像所说的那样紧密。旧版本可能有效。打包器通常不会尝试找到可以工作的构建(或实际上是运行时)依赖项的最旧版本。

  4. 检查来自相应上游的软件包的可用性。理想情况下,这些将匹配您的分发版本,但您也可以在必要时重建它们。

  5. 为比测试/不稳定/实验中的最新软件包更新的软件版本创建软件包。这可能相对具有挑战性,但有时仍然令人惊讶地可行。首先要注意的是,如果您尝试打包 Debian 中已有软件包的更新版本,那么您已经拥有了一个很大的优势,即您可以使用现有的软件包。做就是了

    apt-get source packagename
    
    Run Code Online (Sandbox Code Playgroud)

    apt-get将下载对应的源包,包括Debian的子目录,其中所述包装的生活。此外请注意,如今,这个包通常位于某个版本控制存储库中(git 似乎在 Debian 中很流行),而 stable apt(当前为0.8.10.3)会在您调用 apt-get source. 你应该看看这个,因为打包者可能拥有比任何发布的包都更新的包版本。例如。

    $ apt-get source mercurial
      Reading package lists... Done
      Building dependency tree       
      Reading state information... Done
      NOTICE: 'mercurial' packaging is maintained in the 'Svn' version control system at:
      svn://svn.debian.org/python-apps/packages/mercurial/trunk
    
    Run Code Online (Sandbox Code Playgroud)

    或者,您可以简单地使用

    apt-cache showsrc mercurial | grep Vcs
    
    Run Code Online (Sandbox Code Playgroud)

    列出存储库。

    如果包严重过期,您可能需要对
    包进行修改,刷新应用的补丁,但这通常仍然是一个很好的起点
    。Debian 似乎正在
    按照dpkg-source 3.0 (quilt) 格式对quilt上的包管理进行标准化,这有助于补丁更新。

    我将用一个真实的例子来结束我是如何向后移植pgfDebian 包的 。pgf 的最后一个打包版本是 2008 年的 2.00,此后发布了 2.10。请参阅请更新到 pgf (2.10) 的最新稳定版本中的讨论,以及我的后续错误与补丁,pgf:针对 2.0 Debian 包装的补丁。事实证明,pgf 的 Debian 打包非常简单,我只需要在 2.10 打包中更改一行即可使其工作。我最终也平息了所有 lintian 的抱怨,但这完全是可选的。


bah*_*mat 5

您当然可以构建自己的包,这会起作用。但是,如果您想要的东西在那里可用,我会建议先使用backports

Backports 由 Debian 维护,您可以获得它们的安全更新。


Sve*_*ven 3

构建自己的软件包是正确的方法(恕我直言)。根据软件包的 Debian 版本的年龄和变化,这可以像替换软件包描述中源 tarball 的文件名一样简单,在最坏的情况下,您仍然可以将其用作您自己版本的模板。