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ä:
- Käyttöjärjestelmä: Debian 6.0
- RAM: 2048 Mb
- HDD: 20 Gb
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:
- Vaihtoehto 1 RSA
- Pituudeksi laitoin oletusavaimen 2048
- Avaimen kestoksi 1 vuosi
- Oma nimi+ sähköpostiosoite
- Salasanaksi salasana1 (käytä jotakin vahvempaa)
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:
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
- Howto: create “configuration packages” with equivs (http://ubuntuforums.org/showthread.php?t=726317)
- Creating your own Signed APT repository and Debian packages (http://blog.jonliv.es/2011/04/26/creating-your-own-signed-apt-repository-and-debian-packages/)
- Setting up your own APT repository with upload support (http://www.debian-administration.org/articles/286)
- Setting up a personal debian repository (http://ianlawrence.info/random-stuff/setting-up-a-personal-debian-repository)
- Tero Karvinen: Metapaketit-luento (http://www.terokarvinen.com)