我如何安装比Debian提供的软件更多的最新版本?


26

假设我想要的软件版本比当前版本的操作系统更新,该怎么办?

需要考虑的案例:

  1. 有适用于该版本OS的其他软件包的半官方/官方资源。例如,Debian的backports.org或Ubuntu的PPA。
  2. 没有适用于该操作系统版本的软件包的最新版本,但是适用于该操作系统的最新版本的更新版本。这是反向移植的标准情况。
  3. 没有可用的软件最新版本的打包版本。可用选项用于打包较新的版本。

Per 让我们编制一份规范的问答列表,旨在为以下问题提供规范的答案。答案可能应该做成社区Wiki。


这是高度特定于发行版的。最好使每个分配一个问题。
吉尔(Gilles)'所以

2
@Gilles问题不是特定于发行版的。我认为最好有一个问题,针对不同的分布情况给出答案。
Faheem Mitha 2014年

一个起作用和不起作用的例子:对于Debian 8,我想要MySQL 5.6。(但是通常MySQL 5.5仅可用于Debian 8安装。我需要5.6与我正在做的其他事情进行比较。)我试图安装5.6 backport,但是它被破坏了。某种重复文件正在加载的错误消息。我报告了,但是该怎么办?解决方案:我发现您可以直接从MySQL网站下载专门针对Debian 8的MySQL 5.6。那行得通,但是...请务必阅读[this]底部的替代方法(dev.mysql.com/doc/refman/5.6/en/linux-i
椭圆视图

Answers:


33

(如果您对此答案有疑问/评论,请添加评论。或者,如果您有足够的代表,则可以在聊天中ping我。)

从较新版本的Debian中直接安装二进制软件包-并非答案。

假设您正在运行某个基于Debian的发行版。您想要的软件包版本比可用的版本要新。每个初学者尝试做的第一件事就是直接在您的Debian版本上安装二进制软件包。这可能行不通,具体取决于您运行的版本以及软件包的最新版本。通常,此过程将无法正常工作。

例如,考虑一种情况,即试图直接从稳定版本测试/不稳定安装二进制软件包。除非那时测试/不稳定发生得非常接近稳定,否则这很可能不会顺利进行。原因与Debian等基于Linux的二进制发行版的性质有关。这样的操作系统在很大程度上依赖于共享库,并且这些依赖关系经常与版本密切相关。通常远远超出必要。Debian当前没有使“版本依赖性”变得“紧密”的好方法,这是一种简短的方式,可以说版本依赖性是完全必要的。

这对用户意味着什么?例如,假设您要尝试将slrnDebian不稳定版安装到Debian稳定版。看起来像什么?

# apt-get install slrn/unstable
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Selected version '1.0.1-10' (Debian:testing [amd64]) for 'slrn'
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 slrn : Depends: libc6 (>= 2.15) but 2.13-38+deb7u1 is to be installed
E: Unable to correct problems, you have held broken packages.

尽管产生了错误apt,但这里没有损坏的包装。那么,出了什么问题?问题在于,libc6不稳定版本的slrn编译版本与Debian稳定版本上可用的版本不同(并且版本号更高)。(libc6是GNU C库。C库是任何类Unix操作系统的中心,而GNU C库是基于Linux的操作系统通常使用的版本。)

因此,不稳定slrn版本需要libc6比稳定版本更高的编号版本。请注意,由于已针对更高版本的库编译了软件包,因此不一定需要该库的更高版本,但通常是这种情况。

语法

apt-get install slrn/unstable

意味着:使用不稳定slrn版本,但对于所有其他软件包,仅使用稳定版本。更确切地说,它使用优先级数字。有关man apt_preferences详细信息,请参见。

一个人也可以做

apt-get install -t unstable slrn

这更有可能起作用,但是您通常不想这样做。为什么?

这意味着:暂时将所有处于不稳定状态的程序包与处于稳定状态的程序包平等对待。因此slrn,如果它们具有更高的版本号,则通常会将它们从unstable中拉出unstable 的依赖项。由于已经说明的原因,通常将包括GNU C库。现在,这种方法通常会“成功”,因为依赖关系将通过定义得到满足(不稳定的slrn依赖关系在不稳定状态下会得到满足),但最终您会遇到混合使用各种版本库的程序包与它们的用途不同。这可能不会很好地结束。

答案是...支持!

那么,什么是正确的方法呢?它是在系统上重建Debian较新版本的源代码,通常称为“反向移植”。考虑以下情况:

对于该版本的Debian,有其他官方软件包的半官方/官方资源。

首先看的地方是Debian Backports,它是Debian backports的官方网站。

举一个具体的例子:

为您的发行版添加适当的backports行,并进行更新以找到新的软件包,然后从backports中显式安装某些东西(因为backports默认情况下处于禁用状态)。

echo "deb http://ftp.debian.org/debian stretch-backports main" | sudo tee /etc/apt/sources.list.d/stretch-backports.list
sudo apt-get update
sudo apt-get install -t stretch-backports git

这将获得最新的git稳定版本,它具有比Stretch随附的稳定版本有用的更新功能(例如“ include”,它允许您组合多个配置文件或更改〜/ work / projects / vs〜/ personal /的用户名项目/)。

另一个值得一看的地方是Ubuntu维护者的各种PPA。您可以搜索“ packagename PPA”。

没有适用于该操作系统版本的软件包的最新版本,但是具有适用于该操作系统的最新版本/发行版的更多最新版本。这是反向移植的标准情况。

反向移植意味着您在运行的版本上从Debian的更高版本重建Debian源代码。根据包装的不同,此过程可能很容易,也可能很复杂。这是如何执行此操作的概述。

初学者的简短反向移植教程

具体来说,我假设您正在运行当前的Debian稳定版,目前运行缓慢。我将以该包slrn为例。

首先,请注意,所有Debian打包文件都位于debian/源目录的子目录中。

第一步是检查是否有更新的版本。您可以使用进行此操作apt-cache policy

apt-cache policy slrn

slrn:
  Installed: 1.0.0~pre18-1.3
  Candidate: 1.0.0~pre18-1.3
  Version table:
     1.0.1-10 0
         50 http://debian.lcs.mit.edu/debian/ testing/main amd64 Packages
         50 http://debian.lcs.mit.edu/debian/ unstable/main amd64 Packages
 *** 1.0.0~pre18-1.3 0
        500 http://debian.lcs.mit.edu/debian/ wheezy/main amd64 Packages
        100 /var/lib/dpkg/status
     1.0.0~pre18-1.1 0
        500 http://debian.lcs.mit.edu/debian/ squeeze/main amd64 Packages

我们想退货1.0.1-10

步骤1:

注意:请确保deb-src您要下载的源版本的行显示在中/etc/apt/sources.list例如,如果您要下载的不稳定版本slrn,则需要deb-src用于不稳定的行,否则它将无法正常工作。请注意deb,尽管apt-cache policy使用了该信息,但您不需要相应的行即可下载源,因此,如果您没有相应的deb行,则apt-cache policy不会显示相关版本。如果您确实有这些deb行,请不要忘记使用中的条目/etc/apt/preferences或类似条目来固定较新的版本。例如,/etc/apt/preferences这样的条目(用于不稳定)将起作用。

Package: *
Pin: release a=unstable
Pin-Priority: 50

如果您在中添加行/etc/apt/sources.list,请不要忘记apt-get update稍后再运行。

下载的资源slrn。一个好地方是/usr/local/src/slrn

apt-get source slrn=1.0.1-10

第2步:

稍微更改版本号,以便将反向端口与上游版本区分开。运行dch -i,它将自动向该debian/changelog文件添加一个条目。然后,更改条目,使其看起来像这样。

slrn (1.0.1-10.username) UNRELEASED; urgency=low

  * Backport to wheezy.

 -- User <user@domain>  Sun, 02 Feb 2014 23:54:13 +0530

步骤3:

尝试构建源。如果构建所需的软件包不可用,则尝试将失败。将目录更改为源目录。debuilddevtools包装中使用。

cd slrn-1.0.1/
debuild -uc -us

如果满足构建依赖关系,那么源将在源目录上方的级别构建并产生一些deb。在这种情况下/usr/local/src/slrn

第四步:

假设不满足构建依赖关系。然后,您需要尝试安装构建依赖项。这可能行不通,因为相关性可能不适用于您的版本,或者如果可用,则在正确的版本中可能不可用。

注意:不幸的是,Debian软件包要求版本依赖的版本高于必要的版本并不少见。Debian中没有自动的方法来检查这一点,并且只要程序包维护者可以在相应的版本/发行版上运行,软件包维护者通常就不在乎。因此,对依赖版本持怀疑态度,并使用常识。例如,广泛使用的软件包(如Python和GNU工具)将不依赖于其依赖关系的非常特定的版本,无论Debian打包程序列出了什么。

无论如何,您都可以尝试安装它们

apt-get build-dep slrn=1.0.1-10

如果成功,则尝试再次构建软件包(步骤2)。如果失败,则需要进一步的工作。请注意,它debuild查看文件中的“ Build Dependencies” debian/control,并且您可以根据需要更改它们。因此,让我们现在谈谈。这是slrn的构建依赖关系。

Build-Depends: debhelper (>=9), libslang2-dev, libuu-dev,
 exim4 | mail-transport-agent, libgnutls-openssl-dev, po-debconf, autoconf,
 libcanlock2-dev, autotools-dev, dpkg-dev (>= 1.16.0), chrpath, dh-autoreconf, inn2-inews

使用的另一种方法是通过apt-get build-dep手动安装这些

apt-get install debhelper libslang2-dev ...

如果您开始更改控制文件中的这些值,则应切换到手动安装,否则apt-get build-dep将不再做正确的事。

没有可用的软件最新版本的打包版本。可用选项用于打包较新的版本。

在许多情况下,可以结合使用较早版本的软件和较新的资源来打包。这种方法可能会遇到问题,特别是应用于此软件早期版本的补丁可能不适用于此处,因此可能需要将其与源重新同步。3.0(被子)源格式(现已成为标准)使用被子,并且修补程序位于debian/patches目录中。

但是,对这些问题的详细讨论超出了本文的范围。


这实际上是分布通用的(只是可以以不同的方式调用较新内容的代码存储库,否则您将不得不从特殊位置获取内容)。检查您的发行指南。
vonbrand 2014年

2

不仅在Debian中,始终有效的一种方法是自己编译必要的软件。(无论是在我需要可用的较新版本时,还是在完全不提供该软件时,我在Debian上已经这样做了多年。)

我在本地存储编译的软件包中/use/local使用stow,这让我存储在一个子目录树相关的一个包中的所有文件,然后进行符号链接到该树。这使管理已编译的软件包变得容易:安装的文件不会与Debian提供的文件冲突,并且我可以使用一个命令删除软件包。

例如,编译和安装软件包的步骤some_software通常是以下步骤的变体:

  1. .tar文件等下载到/usr/local/src/

  2. 创建一个文件/usr/local/packages/some_software,该文件描述我在哪里下载了该软件,其功能,当前的版本,并包含注释,说明了我必须进行哪些操作才能对其进行编译(请参见下文)。

  3. .tar文件内容解压缩到中/usr/local/tmp/some_software

  4. 或者,如果从存储库进行编译,请在合适的子目录(例如/usr/local/git/some_software)中检出存储库,然后在此处进行编译,

  5. cd进入此目录,查看READMEINSTALL等等。

  6. 在大多数情况下,configure程序包中都有一个自动工具脚本。调用,./configure --prefix /usr/local/stow/some_software-version使文件安装在此子目录中。否则,请阅读Makefile并弄清楚如何设置已安装文件的路径。

  7. 用编译make

  8. 使用安装make install

  9. cd /usr/local/stow, 然后 stow some_software-version

  10. 测试它是否有效。

通常,第一次尝试时无法编译:软件包可能需要库和相应的包含文件,因此必须...-dev从Debian 安装正确的软件包。或者,您gcc可能会抱怨那些gcc使用该软件包的作者没有抱怨的其他版本的东西。因此,有时必须阅读代码并修复这些问题,但这并不会经常发生。


这个问题的目的(尽管可能尚不清楚)旨在描述如何为Debian安装软件包。也许我应该把这个问题弄清楚。是否stow创建Debian软件包?从手册页来看,它看起来并不像它。
Faheem Mitha

@FaheemMitha Stow不了解Debian软件包。它仅管理从一组单独的安装目录到单个目录的符号链接。
库萨兰达

@FaheemMitha:如果要将自编译的软件转换为Debian软件包,则必须像Debian软件包维护者一样自行打包。但是,如果您要成为唯一的用户,那就太麻烦了,将其安装/usr/local非常简单,并且stow有助于管理存储在此的文件。或换句话说:软件不必在Debian软件包中即可在Debian上使用。
dirkt

将软件打包为Debian软件包有一个很大的优势,即使仅在本地使用也是如此:如果您正确地描述了依赖项,则安装软件包将确保仍保持依赖项的安装……
Stephen Kitt

@StephenKitt:如果将课程打包软件正确地作为Debian打包是最好的解决方案。缺点是必须花费时间将其正确打包...
dirkt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.