Joni Junni

Linux palvelimena: deb-paketin teko ja repositoryn luominen

Categories: [school]
Tags: [linux], [debian], [linux-server-course], [deb], [lintian], [repository], [reprepro], [shell]

Tehtävän tarkoituksena on luoda yksinkertaiselle shell-skriptille deb-asennuspaketti, jotta sen voi helposti jaella pakettivaraston kautta ns. “orjakoneille”. Paketin luonnin jälkeen konfiguroidaan pakettivarasto (repository) paketin jakelua varten, allekirjoitetaan se sekä lisätään oma pakettivarasto orjakoneiden pakettivarastoihin.

Käytin harjoituksissa jo olemassa olevaa Debian-virtuaalikonetta seuraavilla spekseillä:

Shell-skriptin paketointi

Aloitin tekemällä kotihakemistoon hello-world.sh-nimisen esimerkkiskriptin komenolla

sudo nano hello-world.sh

Tiedoston sisään kirjoitin yksinkertaisen rivin joka tulostaa “Hello, world!” näytölle.

Skripti ei tässä tapauksessa tee mitään ihmeellistä, tulostaa vain “Hello, world!”-tekstin ruudulle ajettaessa. Hyödyllistä voisi olla paketoida esimerkiksi jokin yrityksen varmuuskopiointiskripti tms.

Paketointi onnistuu näppärästi equivs-työkalulla, joka löytyy vakiona ainakin Debianista ja Ubuntusta. Ensiksi asensin tarvittavat työkalut komennolla

sudo apt-get install equivs lintian

Tämän jälkeen tein kotihakemistoon “joni-hello-world”-nimisen hakemiston. Nimeä hakemisto yksilöllisesti, että samannimistä pakettia ei löydy jo järjestelmästä. Hyvä nimeämistapa on esimerkiksi “organisaationnimi-paketin-tarkoitus”. Hakemiston luomisen jälkeen siirrytään kyseiseen hakemistoon ja ajetaan siellä equivs-control, joka luo hakemistoon tyhjän asetustiedoston:

mkdir joni-hello-world
cd joni-hello-world
equivs-control joni-hello-world.cfg

Sitten avasin equivs-controlin luoman asetustiedoston ja muokkasin sinne omat tietoni. Huomattavaa on, että Files-riville pitää määritellä tuo skriptitiedoston polku mikä aikaisemmin luotiin parina kuten asetustiedostossa ohjeistetaan.

Tämän jälkeen kopioin skriptin paketin omaan hakemistoon joka luotiin aiemmin komennolla

cp ../hello-world.sh ./hello-world.sh

Kun asetustiedoston kohdat on määritelty ja poistettu kommenttimerkit muokatuilta riveiltä, voidaan ajaa paketointikomento equivs-build:

equivs-build joni-hello-world.cfg

Ja tämän jälkeen testataan lintianilla paketin toimivuus:

lintian joni-hello-world_1.0.2_all.deb

Jos lintian menee virheittä läpi, paketti on sääntöjen mukainen. Itselläni tuli muutama varoitus johtuen siitä että skripti laitettiin binäärihakemistoon tiedostopäätteen kera ja ilman man-sivuja:

Pakettivaraston luominen

Pakettivaraston (repositoryn) luomista varten koneella pitää olla Apache konfiguroituna. Tein /var/www-hakemiston alle hakemiston “apt” johon aion pakettivaraston tehdä sekä sen alle “conf”-hakemisto jossa sijaitsee asetustiedosto jonka luon myöhemmin.

sudo mkdir apt
sudo mkdir apt/conf
sudo apt-get install reprepro

Jälkimmäisellä komennolla asensin reprepron, joka on työkalu pakettivaraston luomiseen.

Asetustiedoston luominen

apt/conf-hakemiston alle loin asetustiedoston “distributions” johon syötin seuraavanlaiset rivit:

Origin: Joni Junni
Label: Oma repository
Suite: stable
Codename: squeeze
Version: 6.0
Architectures: i386 amd64
Components: main non-free contrib
Description: Mun oma repository
SignWith: yes

Tärkeimpiä rivejä tuossa ovat lähinnä codename, version, architectures, components sekä SignWith. Näiden perusteella orjakoneet määrittelevät ovatko pakettivaraston paketit niille sopivia. SignWith määrittelee että pakettivarasto tulee allekirjoittaa.

Avaimen luominen pakettivarastoa varten

Avaimen luonti tapahtuu komennolla

sudo gpg --gen-key

Kannattaa huomata että käytän tässä ohjeessa sudoa, koska määritin pakettivarastoni sijainniksi /var/www-hakemiston joka ei ole normaalin käyttäjän muokattavissa. Koska repreprota joutuu ajamaan sudona tästä syystä myös, on gpg-avain luotava sudona myöskin jotta reprepro suostuu allekirjoittamaan pakettivaraston.

Ohjelma kyselee sinulta tietoja avaimen luontia varten. Itse laitoin seuraavanlaiset asetukset:

Seuraavaksi exporttasin allekirjoitusavaimen komennolla

sudo gpg --armor --export *sähköpostiosoite* --output gpgkey.gpg.key

Ylempi komento ei jostakin syystä tee tiedostoa parametristä huolimatta, vaan tulostaa avaimen näytölle. Kopioin avaimen ja tallensin sen tuonnimiseen tiedostoon. Tämä tiedosto tallennetaan pakettivaraston yhteyteen jotta orjakoneet voivat varmistaa pakettivaraston oikeellisuuden.

Seuraavaksi ajetaan reprepro. Varmistetaan että ollaan siellä hakemistossa mihin repo halutaan luoda ja sen jälkeen ajetaan reprepro:

cd /var/www/apt
sudo reprepro -Vb . includedeb squeeze /home/joni/joni-hello-world/joni-hello-world_1.0.2_all.deb

Jos repreprop meni virheettä läpi, meillä on toimiva pakettivarasto:

Kuvassa selaimeen avattuna Apachen tarjoilema pakettivaraston juuri.

Pakettivaraston määrittely orjakoneille

Orjakoneille täytyy siis enään tuoda julkinen avain pakettivaraston autentikointia varten sekä lisätä pakettivaraston osoite /etc/sources.list-tiedostoon. Lisätään avain koneelle komennolla:

wget -O - http://srv-deb2/apt/gpgkey.gpg.key | sudo apt-key add -

Tämän jälkeen lisätään /etc/apt/sources.list-tiedostoon uusi rivi pakettivarastolle:

deb http://srv-deb2/apt/ squeeze main

Lopuksi testataan että pakettivarasto toimii ja paketti löytyy aptista:

sudo apt-get update
sudo apt-cache search joni

Ensimmäisellä komennolla päivitettiin aptin välimuisti jolloin se haki uuden pakettivaraston pakettilistauksen. Jälkimmäisellä haetaan aptista uuden paketin tiedot näytölle:

Viimeiselllä rivillä näkyy itse tehty paketti valmiina asennettavaksi. Asennus tapahtuu niinkuin minkä tahansa muunkin paketin komennolla

sudo apt-get install joni-hello-world

Lähteet