Fah*_*tha 35 debian apt backports
假设我想要一个比当前操作系统版本可用的软件版本更新的软件,我该怎么办?
需要考虑的情况:
Per让我们编译一份规范问答列表,这是为以下内容提供规范答案的地方。答案应该是社区维基。
Fah*_*tha 43
(如果您对此答案有任何疑问/意见,请添加评论。或者,如果您有足够的代表,您可以在聊天中 ping 我。)
假设您正在运行基于 Debian 的发行版的某个版本。您需要比可用版本更新的软件包版本。每个初学者尝试做的第一件事是直接在您的 Debian 版本上安装二进制包。这可能有效,也可能无效,具体取决于您运行的版本以及软件包的更新程度。一般来说,这个过程不会很好地工作。
例如,考虑一个人试图直接在稳定版上安装来自 testing/unstable 的二进制包的情况。这很可能不会顺利,除非当时测试/不稳定恰好非常接近稳定。原因与基于 Linux 的二进制发行版(如 Debian)的性质有关。此类操作系统严重依赖共享库,而这些依赖项通常与版本紧密相关;通常比必要的要多得多。Debian 目前没有一种使版本依赖关系“紧密”的好方法 - 一种简单的说法,即版本依赖关系与必要的一样严格。
这对用户意味着什么?例如,假设您尝试slrn从 Debian 不稳定安装到 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.
Run Code Online (Sandbox Code Playgroud)
尽管 产生了错误apt,但这里没有损坏的包。那么,出了什么问题?问题是编译libc6不稳定的版本与slrnDebian 稳定版上可用的版本不同(并且具有更高的版本号)。(libc6是 GNU C 库。C 库是任何类 Unix 操作系统的核心,而 GNU C 库是基于 Linux 的操作系统通常使用的版本。)
因此,不稳定slrn版本需要libc6比稳定版本更高的编号版本。请注意,因为一个包是针对更高版本的库编译的,所以不一定需要该库的更高版本,但情况往往如此。
语法
apt-get install slrn/unstable
Run Code Online (Sandbox Code Playgroud)
意思是:使用不稳定的,slrn但对于所有其他包,只使用稳定的版本。更准确地说,它使用优先级数字。详情请参阅man apt_preferences。
一个也可以做
apt-get install -t unstable slrn
Run Code Online (Sandbox Code Playgroud)
这更有可能奏效,但您通常不想这样做。为什么?
这意味着:暂时将所有处于不稳定状态的软件包与处于稳定状态的软件包一视同仁。因此slrn,如果它们具有更高的版本号,这将把不稳定的依赖项从不稳定中拉进来,并且通常会如此。出于已经解释的原因,这通常包括 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
Run Code Online (Sandbox Code Playgroud)
这将获得 git 的最新稳定版本,它具有比拉伸中包含的稳定版本更有用的新功能(例如,'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
Run Code Online (Sandbox Code Playgroud)
我们想向后移植1.0.1-10。
第1步:
注意:确保deb-src您要下载的源版本的行出现在您的/etc/apt/sources.list. 比如你要下载unstable版本slrn,就需要deb-srcunstable那一行,不然就不行。请注意deb,虽然apt-cache policy使用了该信息,但您不需要相应的行来下载源代码,因此如果您没有相应的deb行,则apt-cache policy不会向您显示相关版本。如果您确实有这些deb行,请不要忘记使用 in/etc/apt/preferences或类似条目固定较新版本。例如,/etc/apt/preferences像这样的条目(对于不稳定的)将起作用。
Package: *
Pin: release a=unstable
Pin-Priority: 50
Run Code Online (Sandbox Code Playgroud)
如果在 中添加行/etc/apt/sources.list,请不要忘记apt-get update之后运行。
下载slrn. 一个好地方是/usr/local/src/slrn。
apt-get source slrn=1.0.1-10
Run Code Online (Sandbox Code Playgroud)
第2步:
稍微更改版本号,以便将您的 backport 与上游版本区分开来。运行dch --bpo,它会自动向debian/changelog文件中添加一个具有适当版本号的条目,例如
slrn (1.0.1-10~bpo10+1) UNRELEASED; urgency=low
* Backport to buster.
-- User <user@domain> Sun, 02 Feb 2014 23:54:13 +0530
Run Code Online (Sandbox Code Playgroud)
第 3 步:
尝试构建源。如果构建所需的包不可用,则尝试将失败。将目录更改为源目录。debuild从devtools包装中使用。
cd slrn-1.0.1/
debuild -uc -us
Run Code Online (Sandbox Code Playgroud)
如果构建依赖得到满足,那么源将在源目录之上的级别构建并生成一些 deb;在这种情况下/usr/local/src/slrn。
第四步:
假设不满足构建依赖项。然后您需要尝试安装构建依赖项。这可能有效,也可能无效,因为依赖项可能不适用于您的版本,或者如果可用,可能在正确的版本中不可用。
注意:不幸的是,Debian 软件包要求构建依赖项的版本高于必要版本的情况并不少见。在 Debian 中没有自动的方法来检查这一点,而且通常包维护者并不关心,只要它适用于相应的版本/发行版。因此,对依赖版本持怀疑态度,并使用常识。例如,广泛使用的软件包(如 Python 和 GNU 工具)不会依赖于它们的依赖项的特定版本,无论 Debian 打包程序列出什么。
无论如何,您可以尝试安装它们
apt-get build-dep slrn=1.0.1-10
Run Code Online (Sandbox Code Playgroud)
如果成功,则再次尝试构建包(步骤 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
Run Code Online (Sandbox Code Playgroud)
使用的替代方法apt-get build-dep是手动安装这些,通过执行
apt-get install debhelper libslang2-dev ...
Run Code Online (Sandbox Code Playgroud)
如果您开始更改控制文件中的这些值,那么您应该切换到手动安装,因为那样apt-get build-dep将不再做正确的事情。
没有可用的更新版本软件的打包版本。可用的选项是打包更新的版本。
在许多情况下,人们可以将软件早期版本的包与较新的源代码结合使用。这种方法可能会遇到问题,特别是应用于早期版本软件的补丁可能不适用于这里,因此可能需要将它们与源重新同步。现在成为标准的 3.0(被子)源格式使用被子,补丁位于该debian/patches目录中。
但是,对这些问题的详细讨论超出了本文的范围。
一种始终有效的方法(不仅在 Debian 中)是自己编译必要的软件。(多年来我一直在 Debian 上这样做,无论是当我需要可用的更新版本时,还是当根本没有提供该软件时)。
我将本地编译的包存储在/use/localusing中stow,这允许我将与包相关的所有文件存储在子目录树中,然后创建到该树的符号链接。这使得管理已编译的软件包变得容易:安装的文件不会与 Debian 提供的文件冲突,而且我可以使用一个命令删除软件包。
编译和安装软件包的步骤some_software通常是以下步骤的变体:
将.tar文件等下载到/usr/local/src/.
创建一个文件/usr/local/packages/some_software,描述我在哪里下载该软件、它的用途、它是什么版本,并包含注释我必须做什么才能编译它(见下文)。
将文件内容解压.tar到/usr/local/tmp/some_software.
或者,如果从存储库进行编译,请在合适的子目录(例如)中检出存储库/usr/local/git/some_software,然后在那里进行编译,
cd进入这个目录,查看README等等INSTALL。
configure在大多数情况下,包中有一个自动工具脚本。使用./configure --prefix /usr/local/stow/some_software-versionso 文件进行调用会安装在此子目录中。否则,请阅读Makefile并找出如何设置已安装文件的路径。
编译用make.
安装与make install.
cd /usr/local/stow, 然后stow some_software-version
测试是否有效。
通常编译在第一次尝试时不起作用:软件包可能需要库和相应的包含文件,因此必须...-dev从 Debian 安装正确的软件包。或者可能会抱怨包的作者所使用gcc的不同版本没有抱怨的东西。gcc因此,有时人们必须阅读代码并修复这些问题,但这种情况并不经常发生。
| 归档时间: |
|
| 查看次数: |
24057 次 |
| 最近记录: |