Paketinhallintajärjestelmä

Paketinhallintajärjestelmä (, PMS) pitää kirjaa tietokoneeseen asennetuista pakettitiedostoista, jotka sisältävät tietokoneohjelmia ja muita tiedostoja. Järjestelmän avulla tietokoneen käyttäjä voi hakea pakettivarastoista tiedon uusimmista pakettiversioista ja voi päivittää ohjelmat halutessaan tai automaattisesti. 

Paketinhallintajärjestelmään kuuluu tietokoneohjelma, joka tekee pakettien asennus-, poisto- ja päivitystoimia, sekä tietokanta koneella olevien pakettien tiedoista ja versioista. Paketinhallintajärjestelmä automatisoi tietokoneohjelmien asennus-, päivitys- ja poistoprosessin tietokoneen käyttöjärjestelmässä. Järjestelmä osaa pakettien asennuksen ja poiston lisäksi myös muita ylläpitotehtäviä ja järjestelmä voi tehdä myös tiettyjä konfiguraatiotoimintoja automaattisesti asennuksen yhteydessä.

Ohjelmat voivat koostua yksittäisestä paketista tai useista toisistaan riippuvista paketeista. Lisäksi yksittäinen paketti voi sisältää useita toisiinsa liittyviä ohjelmia yhdessä paketissa. Paketeissa voi olla ohjelmatiedostojen lisäksi myös muuta tietoa kuten datatiedostoja, dokumentaatiota ja niin edelleen. Asennuksen yhteydessä paketinhallintajärjestelmän tehtävä on helpottaa käsittelemään toisistaan riippuvien pakettien kokoelmia.

Paketinhallintaohjelma osaa verrata paketinhallinnalla asennettujen pakettien versioita pakettivarastojen versioihin.
Jos pakettivarastossa on uudempi versio jostakin asennetusta paketista, se ehdottaa käyttäjälle paketin päivitystä. Käyttäjä on voinut määritellä myös, että päivitys tehdään aina automaattisesti. Paketinhallintaohjelma osaa katsoa pakettien riippuvuussuhteista, vaatiiko paketin uusi versio myös jonkun toisen paketin päivittämistä uudempaan tai kokonaan uuden paketin asennusta. Jos toinenkin paketti vaatii päivittämistä myös se otetaan mukaan päivitykseen.

Käyttöjärjestelmien lisäksi eräät ohjelmistopaketit sisältävät oman paketinhallintansa. Esimerkiksi Ruby käyttää RubyGem-paketteja, Rust sisältää Cargo-paketinhallintaohjelman ja Node.js sisältää npm-ohjelman pakettien asennukseen.

Historia 
Varhain Unixille tarkoitetut ohjelmat käännettiin itse lähdekoodeista, jota helpottamaan tulivat automaattiset käännöstyökalut (make, autoconf).

Sun Solaris sisälsi paketinhallintaohjelman pkg ainakin 2.x-versioista 1990-luvun alkupuolelta.

Ensimmäisen paketinhallintajärjestelmän Linuxille sanotaan olleen PMS, jonka versio 1.0 julkaistiin vuonna 1994 ja sitä käytettiin Bogus Linuxissa.
Paketinhallinnalla pystyi jo varhain päättelemään mitä osia käyttöjärjestelmästä asentaa ja siten säästää tilaa. Package Management System (PMS) oli Rik Faithin kirjoittama ja piti kirjaa asennetuista paketeista, sekä mahdollisti asennettujen pakettien poistamisen.

Syitä 
Ennen paketinhallintajärjestelmiä ohjelmia levitettiin tar-paketteina. Ongelmana oli, ettei jälkikäteen voinut hallita ohjelmistoa: käyttäjä ei voinut tietää ohjelman versiota ja päivittäminen oli vaikeaa koska tiedostot olivat levitettyinä ympäri järjestelmää. Lisäksi jos ohjelma riippui mistä tahansa toisesta ohjelmasta käyttäjän oli itse se käsin asennettava.

Paketinhallintajärjestelmät ratkovat hallintaongelmaa lisäämällä metatietoa itse ohjelman mukaan. Metatieto sisältää yksityiskohtaisen kuvauksen paketissa olevista tiedostoista, versionumeron, paketin kuvauksen, tiedon paketin tekijästä ja kehittäjän haluamaa lisätietoa. Metatieto sisältää myös tiedon myös riippuvuuksista, jotka tarvitaan jotta ohjelma voi toimia, sekä komentokielitiedostoja, jotka tekevät toimintoja kuten luovat hakemistoja, käyttäjätunnuksia tai käynnistävät palveluita.

Paketin asennukseen käytettävä ohjelma purkaa tiedostot paketista oikeisiin paikkoihin ja seuraa asennettuja paketteja. Ohjelma pystyy asentamaan, poistamaan, varmistamaan ja päivittämään paketteja sekä sillä voi kysyä tietoja asennetuista paketeista.

Paketinhallintajärjestelmä organisoi ja yksinkertaistaa ohjelmien asennusta ja hallintaa standardoimalla ja organisoimalla ohjelmistokokoelmien tuotannon ja käytön. Paketinhallintajärjestelmien tuoma rakenne istuu ohjelmien kehitykseen ja uudelleenkäytettävyyteen sekä integroituu IT-hallintaan.

Vaikutus 
Ian Murdockin mukaan paketinhallinta on suurin yksittäinen edistysaskel, jonka Linux on tuonut ohjelmistoteollisuuteen. Aiemmat käyttöjärjestelmät olivat suuria monoliittisia tuotteita ja sovellukset olivat suuria monoliittisia tuotteita niiden päällä. Murdockin mukaan käyttöjärjestelmien ja sovelluksien raja on hämärtynyt kun sovellukset asennetaan käyttöjärjestelmään integroiduilla työkaluilla ja itse sovellus integroituu käyttöjärjestelmän kanssa saumattomasti.

Toiminnot 
Tyypillisiä paketinhallinnan toimintoja ovat:

Päivitystiedostojen varmistus alkuperäisyyden varmistamiseksi (kryptografisella tiivisteellä).
Digitaalisten allekirjoitusten autentikointi pakkauksien alkuperäisyyden varmistukseksi.
Pakkausohjelmien lisäys pakattujen tiedostojen hallintaan.
Ohjelmien päivitys viimeisimpiin versioihin, tyypillisesti pakettivarastoista.
Pakkauksien ryhmittely tietokoneen käyttäjän epätietoisuuden eliminoimiseksi.
Riippuvuuksien hallinta, jotta päivitys päivittää kaikki muutkin ohjelmat, joiden päivitystä tämä päivitettävä ohjelma tarvitsee.

Paketinhallintaohjelma voi myös havaita, jos jotkin ohjelmat tai komponentit ovat tulleet tarpeettomiksi kun mikään muu paketti ei viittaa niihin.

Linuxin paketinhallinta 

Linuxin eri distribuutioille on olemassa useita paketinhallintaohjelmia.

 Arch Linux, Manjaro: pacman
 Red Hat Linux, Fedora, openSUSE: RPM, YUM, DNF
 Debian, Ubuntu: APT, apt-get, adept, aptitude, dpkg
 Gentoo Linux: Portage
 Slackware: pkgtool
 muita: apt-rpm, urpmi

BSD-jakeluissa käytetty pkgsrc on myös saatavilla Linuxille.

Homebrew on saatavilla sekä macOS:lle että Linuxille.

Flatpak, Snap ja AppImage ovat uudempia menetelmiä, joissa ohjelman tarvitsema ajonaikainen ympäristö on erillään varsinaisesta alustasta (isäntäjärjestelmästä).

Microsoft Windowsin paketinhallinta 
Windowsissa on päivityksien asentamiseen käytetty Windows Update ja ohjelmien asentamiseen käytetty Windows Installer.

Lähteet