Differences between revisions 26 and 62 (spanning 36 versions)
Revision 26 as of 2011-02-11 12:57:44
Size: 10552
Comment: typo
Revision 62 as of 2019-09-12 18:00:47
Size: 261
Editor: nodiscc
Comment: redirect redundant page, all info moved/clarified, discarded obsolete info
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
#redirect AptConfiguration
Line 2: Line 3:
~-[[DebianWiki/EditorGuide#translation|Translation(s)]]: [[it/AptPreferences|Italiano]] -~ ~-[[DebianWiki/EditorGuide#translation|Translation(s)]]: English - [[it/AptPreferences|Italiano]] - [[es/AptPreferences|Español]]- [[ru/AptPreferences|Русский]] - [[zh_CN/AptPreferences|简体中文]] -~
Line 4: Line 5:
This article try to explain how to use APT Preferences. At this moment, only pinning is documented here.


== Pinning ==

Before you consider 'pinning', you might want to check if the package you want has been [[Backports|backported]] to your release.

<!> When using apt-pinning, you must ensure compatibility of packages by yourself since Debian does not guarantee it. Note that apt-pinning is completely optional, and Debian does not encourage its use without thorough consideration.

''Pinning'' allows you to run certain packages from one version (stable, testing, unstable) without the necessity of upgrading your entire system. However, pulling in packages from "later" distributions are prone to pull in libraries as well, which might have you end up with a system that has the disadvantages of stable (old software), the disadvantages of unstable/testing (security support not as good as stable, bugs) without the advantages of either.

At its most basic level, ''pinning'' involves two files, {{{/etc/apt/sources.list}}} and {{{/etc/apt/preferences}}}.

An additional role is played by the ''target release'', which can be set in {{{apt.conf}}} (or in a {{{/etc/apt/conf.d/...}}} file and via the {{{apt}}} command line.

=== /etc/apt/sources.list ===
 #### testing #########
 deb http://ftp.us.debian.org/debian testing main contrib non-free
 #### unstable #########
 deb http://ftp.us.debian.org/debian unstable main contrib non-free

In this example, we're pulling from ''testing'' and ''unstable''. You could, of course, modify this to pull from ''stable'' as well.

=== /etc/apt/preferences ===
The 'preferences' file is where the actual ''pinning'' takes place. Here's an example:
 Package: *
 Pin: release a=testing
 Pin-Priority: 900
 Package: *
 Pin: release a=unstable
 Pin-Priority: 800

'''Package''' defaults to any, as specified by the asterisk. '''Pin''' specifies the release (''testing'' and ''unstable''). '''Pin-Priority''' specifies the priority level. 'apt-get' defaults to something along the lines of "highest package version wins". The above restructures this priority so that packages in ''testing'' are given a higher priority.

You should also refer to the apt_preferences(5) manpage.

=== Installing from unstable ===
Let's assume that we're running ''testing'' and we want to try enlightenment from ''unstable''. There are basically two methods for installing:
 # apt-get install enlightenment/unstable
 # apt-get -t unstable install enlightenment

The first will not attempt to upgrade any packages on your system, so if specific dependencies are not met, the install will fail. The second method '''will''' attempt to install/upgrade any dependencies. Of course, given the above example, 'apt-get' will ask you before proceeding.

=== Notes from JoshuaRodman ===

Personally, I found the common configuration of a higher priority Testing pin and a lower priority Unstable pin to be problematic. At times, testing packages will depend upon other packages which are not currently in testing (perhaps representing a small glitch in testing) which causes packages to be automatically pulled in from unstable. In the period of testing prior to stabilization for the Woody release, this caused me to end up with over 100 unstable packages installed without even realizing it.

As a a result, I use a more conservative "only if I say so" approach to a mixed distribution, with a Pin file like this:
  Package: *
  Pin: release a=testing
  Pin-Priority: 900
  Package: *
  Pin: release o=Debian
  Pin-Priority: -10

Thus all debian packages are defaulted to priority -10, while testing receives a 900 point bonus. This invokes the behaviors:

From {{{apt_preferences(5)}}}{{{
  500 < P <=990 :
        causes a version to be installed unless there is a version
        available belonging to the target release or the installed
        version is more recent
  P < 0 :
        prevents the version from being installed

'''Note that a priority above 1000 will allow even downgrades no matter the version of the prioritary package. This means that you can use priority 1001 for a stable source if you want to downgrade to the stable versions of the packages you have installed (let's say from testing) on the system.''' this is not recommended unless the number of changes are minimal

Installing packages with {{{apt-get install packagename/unstable}}} and {{{apt-get install -t unstable packagename}}} will both still work, but unstable packages will only be installed by these commands.

=== Notes from ZugSchlus ===
==== Disclaimer ====
This page has been written by ZugSchlus, who not even remotely grasps the concept of pinning. So, please take the words "probably", "needs to be verified" and similiar wordings literally, and document your findings (may they be "this page is right" or "this page is wrong", optionally "this page is wrong because") here.

==== Description of Package Selection Process ====
ToDo: This needs to be verified

 * Ignore packages that don't meet version criteria
 * Ignore packages lower versioned than current, unless their priority is > 1000
 * Install highest priority remaining package
 * In case of priority tie, take pinned package.
   * This step should probably be skipped if the pin doesn't match anything
 * In case of no pinned package, take highest version.
 * In case of several packages with the same version, apt-get picks the one from the distro listed first in sources.list

==== Examples of /etc/apt/preferences file ====
===== Example 1 =====
 Package: *
 Pin: release o=Debian,a=testing
 Pin-Priority: 900
 Package: *
 Pin: release o=Debian,a=unstable
 Pin-Priority: 300
 Package: *
 Pin: release o=Debian
 Pin-Priority: -1

Missing: Documentation what this preferences file does.

ZugSchlus tries to explain:

 * All packages from a distribution called testing are pinned to 900
 * All packages from a distribution called unstable are pinned to 300
 * All other packages from Debian are pinned at -1 and thus never installed.

Problem: This pin behaves differently depending on which target release is set in other parts of apt configuration. Hence, this example cannot really be documented without adding more information. A non-pinned package being part of the target release has default priority 990, while other non-pinned packages have a default priority of 500.

===== Example 2 =====
Objective: On an unstable system, pull dpatch from experimental.

A possible (and not completely correct) solution:

 * Have both unstable and experimental in {{{sources.list}}}
   * In absence of explicit pinning, experimental will be automatically pinned to priority 1. This is because experimental's Release file contains `NotAutomatic: yes`.
 * Pin the wanted packages to a value x with 100<x<500:{{{
 Package: dpatch
 Pin: release o=Debian,a=experimental
 Pin-Priority: 450
   * A value > 500 will always select a package from experimental, even preventing a higher numbered unstable package from being installed, and selecting "no package at all" ahead of all available packages if the distribution not containing that package is pinned higher.
   * Unfortunately, the Package field understands neither wildcards nor regular expressions. You need one pin stanza per package.
   * Pinning the package to 450 will probably not automatically update to the experimental package, but it will probably track the package in experimental as long as it stays higher-versioend than the one in unstable.
===== Example 3 =====
From Mihamina rakotomandimby

Suppose you have a personnal repository where you have a personnal version of Postfix. You want Apt to prefer you version over official ones.

You may set preferences by Origin

Package: *
Pin: origin www.rktmb.org
Pin-Priority: 610

Package: *
Pin: origin ftp.fr.debian.org
Pin-Priority: 600

==== Debugging ====
{{{apt-cache policy package}}} gives information about the selection process. Unfortunately, it is not widely known what the output means. The following is a try to interpret:
 $ apt-cache policy exim4-daemon-light
  Installed: 4.50-1
  Candidate: 4.50-1
  Package Pin: (not found)
  Version Table:
      4.50-4 555
        500 http://mirror sid/main Packages
  *** 4.50-1 555
        100 /var/lib/dpkg/status
      4.44-2 555
        500 http://mirror sarge/main Packages

The priority of each version/location is the number at the left of it. In this case, 500, 100, and 500. It is unclear what the number at the right of the version number means. Some people believe that it is just the last period that was specified for this package in {{{/etc/apt/preferences}}} for that package, while others said it is the actual pin priority being placed on the package.

ToDo: This section was written after taking a lot of more or less educated guesses. Would somebody with real knowledge of apt please verify?

=== Notes from Ryan B. ===
If you're wondering what the options are for release file preferences, based on this link:

we find:

Archive: ''archive''

Component: ''component''

Origin: ''Your Company''

Label: ''Your Company Debian repository''

Architecture: ''architecture''

Thus, the line: "Pin: release a=testing" would find archive values in the release file named "testing".

== References ==
 * {{{man 5 apt_preferences}}}
 * [[http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.en.html|Apt-Howto]] (Section 3.10) and AptPinning.

 * This link seems to have more detailed explanation:
 * [[DebianMan:5/apt_preferences|apt_preferences(5)]] manpage
 * [[http://jaqque.sbih.org/kplug/apt-pinning.html|Apt-Pinning for Beginners]] - a good reference, and heavily borrowed from.
 * [[http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.en.html#s-pin|APT HOWTO]] Section 3.10
 * http://www.argon.org/~roderick/apt-pinning.html
 * [[http://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_tweaking_candidate_version|Debian Reference on apt-pinning]]