Apt pinning

From EIK wiki

Sissejuhatus

Apt on üks levinumaid tarkvara haldussüsteeme, mida kasutatakse põhiliselt Debiani-põhistes Linuxi distributsioonides. Apt hoiab kõikvõimalikku infot operatsioonisüsteemis oleva tarkvara kohta, sh kuidas on erinevad tarkvarad omavahel seotud (kuidas üks tarkvara sõltub teisest jms). Lisaks võimaldab Apt tsentraalselt tarkvara pakke paigaldada ja uuendada ja teeb seda nii, et kõik tarkvarapakid omavahel sobiks.

Apt pinning on üks Apti funktsioonidest, mis võimaldab valida erinevatest tarkvara varamutest ainult teatud pakke (ja ignoreerida teisi pakke, mis selles varamus on). See funktsioon on mõeldud kasutamiseks ainult edasijõudnutele, kuna sellega võib kaasneda probleeme, mida Apt ise lahendada ei saa. Pinningu abil on võimalik keelata ka tarkvarapakkide uuendamist. Pinning põhimõtteliselt võimaldab ka kasutada vanemates distributsioonides uuemate distributsioonide pakke, kuid tihti kaasnevad sellega suured sõltuvusprobleemid ja need pakid tuleb ümber kompileerida vastava distributsiooni jaoks.

Toome selles artiklis näite, kus lisame Ubuntu 11.10-le (Oneiric Ocelot) veebibrauseri Firefox 9.0, mille võtame tulevasest Ubuntu versioonist (12.04, Precise).

Varamu lisamine

Selleks, et Apt üldse teaks Firefox 9.0 pakist, tuleb lisada Apt-le varamu, kus see sees on. Antud juhul on Firefox 9.0 Beta järgmise Ubuntu (12.04, Precise) varamus. Selleks, et see varamu lisada, tuleb muuta faili /etc/apt/sources.list ning lisada sinna lõppu:

deb http://ee.archive.ubuntu.com/ubuntu/ precise main restricted
deb-src http://ee.archive.ubuntu.com/ubuntu/ precise main restricted

Kasutame käsku apt-get update, et Apt tõmbaks alla uuest varamust oleva info:

# apt-get update
Ign http://ee.archive.ubuntu.com oneiric InRelease
Ign http://ee.archive.ubuntu.com oneiric-updates InRelease
<lõigatud>
Hit http://ee.archive.ubuntu.com precise/main Translation-en         
Hit http://ee.archive.ubuntu.com precise/restricted Translation-en   
Hit http://security.ubuntu.com oneiric-security/universe Translation-en
Ign http://extras.ubuntu.com oneiric/main Translation-en_US
Ign http://extras.ubuntu.com oneiric/main Translation-en
Reading package lists... Done

NB! Enne kui pinning on täielikult seadistatud, ei ole praegu soovitatav uuendada masinas olevaid pakke (apt-get upgrade), kuna see kasutaks uuendamisel kõiki precise distributsiooni jaoks mõeldud pakke.

Nüüd kui uus varamu on paigaldatud, saaks juba põhimõtteliselt panna peale uue Firefoxi - probleem on aga see, et järgmise tarkvara uuendamisega võetakse kaasa ka kõik muud pakid, mis on Ubuntu Precise varamus. Siin tulebki kasutusele pinning.

Pinningu määramine

Pinning töötab Apt-s pakkide prioritiseerimise põhimõttel. Pakkide installimisel kaalub Apt kõiki variante ja määrab neile prioriteedi. Kui prioriteedid on määratud, siis valib Apt kõige kõrgema prioriteediga paki. Kui see valitud pakk on uuem kui praegu paigaldatud pakk, siis Apt paigaldab selle. Vaikimisi on juba paigaldatud pakil prioriteet 100 ja varamus oleva paki prioriteet 500.

Selleks, et Apt eelistaks olemasoleva distributsiooni pakke, tuleb Apt-le kirjeldada ära, milline on praegu paigaldatud distributsioon (vaikimisi seda ei ole). Selleks tuleb lisada /etc/apt/apt.conf.d/01ubuntu faili (võimalik, et seda faili ei eksisteeri, sel juhul tuleb see ise teha) järgmine rida:

APT::Default-Release "oneiric";

"oneiric" tuleneb Ubuntu 11.10 koodnimest (Oneiric Ocelot).

Kui Default-Release on määratud, siis annab Apt nendele pakkidele kõrgema prioriteedi (990), mis on mõeldud Oneiric Ocelot distributsioonile. Kuna muude varamude prioriteet on 500, siis nendest varamutest paigaldatakse pakk alles siis kui seda Oneiric Oceloti varamutes ei ole.

Nüüd tuleks ära määrata, et ainult Firefoxi pakk tuleb eelistusega võtta Ubuntu 12.04 varamust. Selle määramiseks tuleb tekitada fail /etc/apt/preferences ja lisada sinna sisse järgnevad read:

Package: firefox
Pin: release n=precise
Pin-Priority: 1000

See määrab ära, et "firefox" nimeline pakk, mis on "precise" distributsiooni jaoks, oleks prioriteediga 1000 (ehk kõrgem kui Oneiric Oceloti varamutes olevad pakkidel).

Kasutades apt-cache policy käsku, saame vaadata, millised versioonid on pakist olemas ja mis on nende prioriteedid:

# apt-cache policy firefox
firefox:
  Installed: 8.0+build1-0ubuntu0.11.10.3
  Candidate: 9.0~b3+build1-0ubuntu1
  Package pin: 9.0~b3+build1-0ubuntu1
  Version table:
     9.0~b3+build1-0ubuntu1 1000
        500 http://ee.archive.ubuntu.com/ubuntu/ precise/main i386 Packages
 *** 8.0+build1-0ubuntu0.11.10.3 1000
        990 http://ee.archive.ubuntu.com/ubuntu/ oneiric-updates/main i386 Packages
        990 http://security.ubuntu.com/ubuntu/ oneiric-security/main i386 Packages
        100 /var/lib/dpkg/status
     7.0.1+build1+nobinonly-0ubuntu2 1000
        990 http://ee.archive.ubuntu.com/ubuntu/ oneiric/main i386 Packages

Siit on näha, et praegu on paigaldatud Firefox 8.0, aga saaks paigaldada versiooni 9.0. Lisaks on kuvatud ka kõik erinevad versioonid ja nende varamud (/var/lib/dpkg/status varamu tähendab seda, et see on praegu paigaldatud). Varamute ees olev number näitab varamu üldist prioriteeti.

Paigaldamine

Nüüd kui oleme pinningu seadistanud, saame lihtsalt uuendada Firefoxi paki:

# apt-get upgrade firefox
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  firefox-gnome-support firefox-kde-support latex-xft-fonts
The following packages will be REMOVED:
  firefox-globalmenu
The following packages will be upgraded:
  firefox
1 upgraded, 0 newly installed, 1 to remove and 6 not upgraded.
Need to get 18.0 MB of archives.
After this operation, 1,086 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
Get:1 http://ee.archive.ubuntu.com/ubuntu/ precise/main firefox i386 9.0~b3+build1-0ubuntu1 [18.0 MB]
Fetched 18.0 MB in 16s (1,101 kB/s)                                                                                                                            
(Reading database ... 125846 files and directories currently installed.)
Removing firefox-globalmenu ...
(Reading database ... 125829 files and directories currently installed.)
Preparing to replace firefox 8.0+build1-0ubuntu0.11.10.3 (using .../firefox_9.0~b3+build1-0ubuntu1_i386.deb) ...
Unpacking replacement firefox ...
Processing triggers for man-db ...
Processing triggers for desktop-file-utils ...
Processing triggers for gnome-menus ...
Processing triggers for bamfdaemon ...
Rebuilding /usr/share/applications/bamf.index...
Setting up firefox (9.0~b3+build1-0ubuntu1) ...
Installing new version of config file /etc/apparmor.d/usr.bin.firefox ...
Installing new version of config file /etc/apport/blacklist.d/firefox ...
Please restart all running instances of firefox, or you will experience problems.

Samas, kui teeme üldist süsteemi uuendust (apt-get upgrade), siis näeme, et ühtegi pakki Precise varamust ei võeta:

# apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Package holding

Pinningu abil on teha ka nn package holdingut, st määrata ära, et mingit pakki enam ei uuendataks. See on kasulik siis, kui on teada, et uuema versiooniga on mingi probleem.

Näiteks kui oleks vaja kindlasti, et sellel masinal oleks peal Firefox 7.0, siis tuleks kirjutada /etc/apt/preferences faili järgnevad read:

Package: firefox
Pin: version 7.0*
Pin-Priority: 1001

Kui määratud prioriteet on üle 1000, siis võtab Apt seda rangemalt ja vajadusel ka paigaldab vanema versiooni (ehk toimub nn downgrade) kui vaja.

Vaatame nüüd firefoxi paki versioone:

# apt-cache policy firefox
firefox:
  Installed: 9.0~b3+build1-0ubuntu1
  Candidate: 7.0.1+build1+nobinonly-0ubuntu2
  Package pin: 7.0.1+build1+nobinonly-0ubuntu2
  Version table:
 *** 9.0~b3+build1-0ubuntu1 1001
        500 http://ee.archive.ubuntu.com/ubuntu/ precise/main i386 Packages
        100 /var/lib/dpkg/status
     8.0+build1-0ubuntu0.11.10.3 1001
        990 http://ee.archive.ubuntu.com/ubuntu/ oneiric-updates/main i386 Packages
        990 http://security.ubuntu.com/ubuntu/ oneiric-security/main i386 Packages
     7.0.1+build1+nobinonly-0ubuntu2 1001
        990 http://ee.archive.ubuntu.com/ubuntu/ oneiric/main i386 Packages

Siit on nüüd näha, et praegu on paigaldatud versioon 9.0, aga kandidaat on 7.0 (ehk see peaks tegelikult peal olema).

Uuendame Firefoxi pakki:

# apt-get upgrade firefox
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be DOWNGRADED:
  firefox
0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 0 not upgraded.
Need to get 16.8 MB of archives.
After this operation, 1,549 kB disk space will be freed.
Do you want to continue [Y/n]? y
Get:1 http://ee.archive.ubuntu.com/ubuntu/ oneiric/main firefox i386 7.0.1+build1+nobinonly-0ubuntu2 [16.8 MB]
Fetched 16.8 MB in 15s (1,051 kB/s)                                                                                                                            
dpkg: warning: downgrading firefox from 9.0~b3+build1-0ubuntu1 to 7.0.1+build1+nobinonly-0ubuntu2.
(Reading database ... 151709 files and directories currently installed.)
Preparing to replace firefox 9.0~b3+build1-0ubuntu1 (using .../firefox_7.0.1+build1+nobinonly-0ubuntu2_i386.deb) ...
Unpacking replacement firefox ...
Processing triggers for man-db ...
Processing triggers for desktop-file-utils ...
Processing triggers for gnome-menus ...
Processing triggers for bamfdaemon ...
Rebuilding /usr/share/applications/bamf.index...
Setting up firefox (7.0.1+build1+nobinonly-0ubuntu2) ...
Installing new version of config file /etc/apparmor.d/usr.bin.firefox ...
Installing new version of config file /etc/apport/blacklist.d/firefox ...
Please restart all running instances of firefox, or you will experience problems.

Siit on näha, et Apt kohe hoiatab, et toimub paki downgrade ja paigaldatigi meile Firefox 7.0.

Nüüd kui toimub järgmine kord üldine tarkvara uuendamine, jäetakse Firefox uuendamata, isegi siis kui on uuem versioon väljas.

Kokkuvõte

Pinning võimaldab meil tarkvara pakkide versioone täpsemalt hallata ja enam ei pea olema kinni neis pakkides, mida vaikimisi pakutakse, vaid saab soovi korral võtta valitud pakid ka teistest varamutest. Pinningu abil saame määrata ära igale varamule oma prioriteedi ja sellega panna paika nö varamute järjekorra.

Kasutatud materjal

https://help.ubuntu.com/community/UbuntuBackports#Use_pinning_to_limit_the_backports_repository

http://www.argon.org/~roderick/apt-pinning.html

https://help.ubuntu.com/community/PinningHowto

http://linux.die.net/man/5/apt_preferences

Koostas

Taavi Sannik A21

2011 Tallinn