Tässä artikkelissa tehdään oma Debian metapaketti.

1. 1 Tehtävänanto

Lainaus kurssin ICT4TN003 Moodlesta:

Tee oma metapaketti.
Lisäksi vähintään kaksi seuraavista:

  • tee metapaketteja dependicer:illa
  • allekirjoita paketti (debsign)
  • tee pakettivarasto (reprepro)
  • tee paketti, joka asentaa tekemäsi skriptin (man equivs, Files)
  • (vaikea) tee paketti, joka vastaa kysymyksiin; esim. postfix, mysql-server tms asennuksessa (debconf-get-selections, pre-install script)

2. 2 Testiympäristö

Tein kotitehtävän VirtualBoxissa pyörivällä 32 bittisellä Ubuntu 11.10 käyttöjärjestelmällä. Virtuaalikoneessa 10 gigatavun .vdi kovalevy ja 1024mb muistia varattuna.

Isäntäkoneena Windows 7 SP1 64-bit kone: Intel Core i5 2500K prosessori, AsRock Z68 Pro3 Gen3, LGA1155, Intel Z68 emolevy, 8gb Kingston HyperX DDR3 1600MHz muistia, MSI:n AMD Radeon R6950 Twin Frozr II/OC, 2GB GDDR5 näytönohjain ja Samsung 128GB 830 Series SSD-kiintolevy.

3. 3 Tee oma metapaketti

Seurasin kurssin opettajan ohjeita http://terokarvinen.com/2011/create-deb-metapackage-in-5-minutes. Aloitin asentamalla tarvittavat ohjelmat ja kirjastot komennolla sudo apt-get install equivs. Aloitin luomalla työhakemiston jotta en tee kotihakemistoon sotkua, komensin mkdir jannen-hh2012 ja siirryin hakemistoon komennolla cd jannen-hh2012.

Aloitin metapaketin tekemisen komennolla equivs-control jannen-hh2012.cfg joka ei palauttanut mitään, eli kaikki meni hyvin ja tuon tiedoston pitäisi nyt löytyä työhakemistosta. Metapaketti tehdään siis muokkaamalla valmista pohjaa. Toki sen voisi rakentaa kokonaan ilman equivs-control -komentoa itse, mutta pohjaa muokkaamalla pysytään varmemmin tismalleen oikeassa syntaksissa.

Muokkasin tiedostoa jannen-hh2012.cfg komentorivillä komennolla nano jannen-hh2012.cfg. Valitsemani pakettinimi on tietysti lainattu jo luullakseni unholaan jääneistä Mikrobitin Hyvi&Hyöty rompuista :)

Eli teen metapaketin jolla pystyy kätevästi asentamaan mielestäni tarpeellisia paketteja jotka Ubuntun vakiovalikoimasta puuttuvat. Valitsin listalle sekä huvia että hyötyä.

Poistin selkeyden vuoksi kaikki turhana pitämäni rivit, voisinhan luoda uuden pohjan equivs-controlilla jos unohdin jonkun tärkeän. Seuraavaksi yritin luoda itse pakettia komennolla equivs-build:

Näytti onnistuvan hyvin, ja työhakemistoon ilmestyikin komennon seurauksena tiedosto jannen-hh2012_0.01_all.deb. Ennen paketin testausta halusin kokeilla meneekö paketti lintianista läpi virheittä. Asensin lintianin komennolla sudo apt-get install lintian ja komensin sitten lintian jannen-hh2012_0.01_all.deb eikä komento palauttanut yhtään mitään. Paketin pitäisi siis olla kunnossa.

Kokeilin ensin paketin aukeamista graafisessa Ubuntu Software Center -ohjelmassa ja hyvin näkyi:

Unohdin vain sisältöä listatessani että riviä pitää vaihtaa pisteellä joka kerta, joten korjasin vielä cfg-tiedostoa sen verran ja ajoin equivs-buildin uudestaan. Vaikka lisäsin rivinvaihdot ja pisteet cfg-tiedostoon, näytti Software Center silti koko toisen kappaleen putkeen ilman rivinvaihtoja. No, ehkä kuvaus on rajoitettu kahteen kappaleeseen. En takerru nyt muotoseikkoihin, pitäähän jotain korjattavaa jäädä versioon 0.02 :)

Testasin varsinaista asennusta asentamalla ensin gdebi nimisen paketin, ja komentamalla sitten näin:

jkw@ubuntu32-vb:~/jannen-hh2012$ sudo gdebi jannen-hh2012_0.01_all.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
Building data structures... Done
Building data structures... Done

Requires the installation of the following packages:
amarok  amarok-common  amarok-utils  cdparanoia  cdrdao  docbook-xsl  icoutils  k3b  k3b-data  kate-data  katepart  kde-runtime  kde-runtime-data  kdebase-runtime  kdelibs-bin  kdelibs5-data  kdelibs5-plugins  kdemultimedia-kio-plugins  kdoctools  kubuntu-debug-installer  libattica0  libcddb2  libclucene0ldbl  libdiscid0  libdlrestrictions1  libdvbpsi7  libebml3  libencode-locale-perl  libfile-listing-perl  libflac++6  libfont-afm-perl  libhtml-form-perl  libhtml-format-perl  libhtml-parser-perl  libhtml-tagset-perl  libhtml-tree-perl  libhttp-cookies-perl  libhttp-daemon-perl  libhttp-date-perl  libhttp-message-perl  libhttp-negotiate-perl  libio-socket-ssl-perl  libiodbc2  libiso9660-7  libk3b6  libkatepartinterfaces4  libkcddb4  libkcmutils4  libkde3support4  libkdecore5  libkdesu5  libkdeui5  libkdewebkit5  libkdnssd4  libkemoticons4  libkfile4  libkhtml5  libkidletime4  libkio5  libkjsapi4  libkjsembed4  libkmediaplayer4  libknewstuff3-4  libknotifyconfig4  libkntlm4  libkparts4  libkpty4  libkrosscore4  libktexteditor4  liblastfm0  libloudmouth1-0  liblwp-mediatypes-perl  liblwp-protocol-https-perl  libmatroska4  libmusicbrainz3-6  libnepomuk4  libnepomukquery4a  libnepomukutils4  libnet-http-perl  libnet-ssleay-perl  libntrack-qt4-1  libntrack0  libphonon4  libphysfs1  libplasma3  libpolkit-qt-1-1  libqapt-runtime  libqapt1  libqca2  libqjson0  libqt4-designer  libqt4-qt3support  libqtscript4-core  libqtscript4-gui  libqtscript4-network  libqtscript4-sql  libqtscript4-uitools  libqtscript4-xml  libqtwebkit4  libsdl-image1.2  libsdl-ttf2.0-0  libsolid4  libsoprano4  libssh-4  libstreamanalyzer0  libstreams0  libtag-extras1  libtar0  libthreadweaver4  libupnp3  libva-x11-1  libvcdinfo0  libvirtodbc0  libvlc5  libvlccore4  libwww-perl  libwww-robotrules-perl  libxcb-keysyms1  libxcb-randr0  libxcb-xv0  libxml2-utils  libxss1  nautilus-dropbox  neverball  neverball-common  neverball-data  ntrack-module-libnl-0  odbcinst  odbcinst1debian2  openssh-server  oxygen-icon-theme  phonon  phonon-backend-gstreamer  plasma-scriptengine-javascript  qapt-batch  shared-desktop-ontologies  soprano-daemon  ssh  ssh-import-id  virtuoso-minimal  virtuoso-opensource-6.1-bin  virtuoso-opensource-6.1-common  vlc  vlc-data  vlc-nox  vlc-plugin-notify  vlc-plugin-pulse
Jannen Hyvi&Hyöty 2012 metapaketti
Sisältää sekä huvia että hyötyä. Mukana seuraavat paketit:
.
gimp - kuvankäsittelyä
.
ssh - asentaa sekä ssh-clientin että serverin
.
vlc - paras videosoitin
.
nautilus-dropbox - dropbox, need i say more?
.
neverball - ihan huippu peli
.
amarok - paras mp3-soitin
.
k3b - paras polttosofta
Do you want to install the software package? [y/N]:y

Vastattuani kysymykseen myöntävästi, asentuivat kaikki tuo luetellut paketit onnistuneesti. Kirjastoja tarvitaan tuhottoman paljon koska amarok ja k3b ovat KDE:n ohjelmia, ja vlc:kin asentaa aika paljon eri tiedostomuotojen toistamiseen tarvittavia kirjastoja. En viitsi koko roskaa tähän kopioida, mutta viimeiseksi ilmoituksessa näkyi…

Selecting previously deselected package jannen-hh2012.
(Reading database ... 148526 files and directories currently installed.)
Unpacking jannen-hh2012 (from jannen-hh2012_0.01_all.deb) ...
Setting up jannen-hh2012 (0.01) ...

…josta päättelin että asennus sujui hyvin. Testasin toimivuuden pelaamalla hetken neverballia :) Joskin virtualboxin kautta toimiessa 3D-suorituskyky ei päätä huimannut.

Aikaa tähän osioon meni noin 40 minuuttia.

4. 4 Tee oma repository

Valitsin tämän lisätehtävän koska se tuntui mielenkiintoisemmalta kuin pakettien allekirjoitus tai vastaava. Aloitin lukemalla jo tehtävänannossa olleen linkin http://awaseconfigurations.wordpress.com/2011/11/05/setting-up-reprepro-repository/ ja rupesin etsimään kehoitettua reprepro työkalua. Komennolla apt-cache search reprepro selvisi, että työkalu on saatavilla ihan Ubuntun pakettivarastosta, joten asensin sen komennolla sudo apt-get install reprepro.

Lueskeltuani hetken reprepron manuaalia ja Googlen löytämää tutoriaalia http://www.jejik.com/articles/2006/09/setting_up_and_managing_an_apt_repository_with_reprepro/ loin kotihakemistooni hakemiston repo, joka saa toimia repositoryn päähakemistona. Loin hakemistoon alihakemiston conf ja sinne tiedoston distributions nanolla, ja sen sisällöksi asetin seuraavaa:

Yritin seuraavaksi lisätä tekemääni pakettia jannen-hh2012 repositoryyn:

Muutaman kerran piti yrittää, kun katsoin monesta eri ohjeesta näitä, ja osassa oli vanhoja nimiä asetuksille, joita reprepro ei sitten tunnistanut. Lopulta kuitenkin ilmeisesti onnistui kun ei mitään virhettä palautunut. Onnistunut conf/distributions tiedosto näytti tältä:

Nyt voisin testata repositoryn toimintaa mutta eihän sitä varmaan näy missään. Ei koneelle ole edes asennettu apachea.

Asensin Apachen komentamalla sudo apt-get install apache2 ja testasin toimivuuden:

Seuraavaksi pitäisi saada Apache osoittamaan repositoryn kansioon, mikä on nyt vähän hölmösti omassa kotikansiossani. Muokkasin apachen conffeja, tarkemmin sanottuna tiedostoa /etc/apache2/sites-enabled/000-default näin:

Ja sain apachen näyttämään juuri tuon /home/jkw/repo sisällön:

Kuten kuvasta näkyy, tuo komento* reprepro includedeb* loi työhakemistoon muut tarvittavat tiedostot ja hakemistorakenteen ihan automaattisesti. Repositoryn pitäisi nyt olla toimiva ja valmis! Testasin asiaa muokkaamalla tiedostoa /etc/apt/sources_list ja lisäämällä sinne viimeiseksi oman repositoryni:

Ja testatakseni löytyykö koko repositoryä, päivitin ne komennolla sudo apt-get update. Koska repositoryja on niin paljon, poistin alla olevasta tuloksesta epäoleelliset:

jkw@ubuntu32-vb:~/repo$ sudo apt-get update
Ign http://localhost oneiric InRelease
Ign http://localhost oneiric Release.gpg
Get:1 http://localhost oneiric Release [4,542 B]
Ign http://localhost oneiric/main TranslationIndex
Get:2 http://localhost oneiric/main i386 Packages [579 B]
Ign http://localhost oneiric/main Translation-en_US
Ign http://localhost oneiric/main Translation-en
Fetched 5,121 B in 0s (5,829 B/s)
Reading package lists... Done

Ei virheitä! Pitäisi toimia. Testasin vielä, löytääkö apt-cache paketin:

Hyvin toimii vaikka itse sanonkin. Eiköhän tämä ollut tässä.

Aikaa tähän osioon meni noin 60 minuuttia.

5.  5 Tee paketti, joka vastaa kysymyksiin

Päätin valita viimeiseksi lisätehtäväksi vaikeimman, tietysti yrityksenä paikkailla myöhässä palautetun viime viikon työn pisteitä :) Valitsin tehdä mysql-server paketin asennuksissa esitettäviin kysymyksiin automaattisesti vastaavan metapaketin, koska sille voisi joskus jopa olla jotain käyttöä.

Aloitin lukemalla netistä tiukkaa asiaa debconf-get-selectionsista ja debconf-set-selectionsista. Löysin ihan hyvältä näyttävän sivun http://serverfault.com/questions/19367/scripted-install-of-mysql-on-ubuntu koskien nimenomaan MySQL:n asennuksissa esitettäviä kysymyksiä.

5.1. 5.1 Manuaalinen testaus

Olin jo asentanut mysql-server-5.1 paketin metapaketilla mysql-server. Asentaessa pakettia asennus kysyi kahteen kertaan salasanaa tähän tyyliin:

Voidakseni testata valmiiksi asetettujen salasanojen toimivuutta, minun piti poistaa paketti mysql-server-5.1 (metapaketin poisto ei riitä). Tein poiston varmuudeksi vielä komennolla sudo apt-get purge mysql-server-5.1 jolloin kaikkien asetustiedostojenkin pitäisi poistua. Seuraavaksi yritin testata valmiiden salasanojen asetusta komentamalla sudo debconf-set-selections ja sitten antamalla seuraavalla rivillä varsinaisia asetettavia rivejä. Vähän nolosti jäin kiinni tuohon komentoon enkä osannut lopettaa sitä mitenkään muuten kuin Ctrl+C painikkeella, mutta silloin komento loppuu kesken eikä mitään oikeasti tallennu.

Testasin tämän yrittämällä mysql-server-5.1 asennusta ja se kysyi salasanaa.

5.2. 5.2 Suoraan scriptillä

Päätin kokeilla tehdä samaa scriptillä alussa linkittämäni lähteen ohjetta soveltamalla. Tarvittiin vain vähän muokkausta kun sain homman toimimaan. Piti lisätä scriptiin pari sudoa ja tietysti vaihtaa asetettava salasana ja MySQL:n versiot.

Annoin scriptille suoritusluvan komennolla chmod +x komento ja suoritin sen seuraavaksi:

Ja kuten kuvasta näkyy, ei asennus kysynyt salasanaa ollenkaan. Testasin vielä salasanan toimivuuden jo aiemmin asentamallani phpmysql -hallintatyökalulla, joka päästi minut hyvin juuri scriptissä asetetulla salasanalla sisään. Hienoa!

5.3. 5.3 Scripti metapaketin pre-install scriptiin

Nyt minulla on siis scripti, jonka ajamalla asetetaan debconffiin valmiit salasanat mysql-server-5.1:lle ja asennetaan mysql-server sekä mysql-server-5.1. Seuraavaksi metapaketin tekoon, tietysti scriptistä voi ottaa nyt itse paketin asennukset pois, metapaketin asentamallahan ne tulevat. Eli scripti vaan asettaa nuo arvot debconffiin ennen asennusta.

Aloitin luomalla pakettia varten työhakemisto tietokanta komentamalla mkdir tietokanta ja siirtymällä luomaani hakemistoon komennolla cd tietokanta. Seuraavaksi tein metapakettia varten cfg-tiedoston, laiskuuttani kopioin kohdassa 2 tekemäni jannen-hh-2012.cfg tiedoston jossa on vähemmän muokattavaa. Muokkasin tiedostoa nanolla:

Seuraavaksi loin deb-paketin komentamalla equivs-build tietokanta.cfg ja homma toimi ok. Nyt pitäisi keksiä miten saan scriptin ympättyä mukaan pakettiin. Olin tutustunut jo tunnilla equivs-build:n manuaalin Files -kohtaan, jossa kopioidaan tietty tiedosto asennuksen yhteydessä johonkin hakemistoon, joten perusidea oli selvillä. Olettaen siis että pre-install script on mitään samanlaista.

Pikaisella Googletuksella en löytänyt esimerkkiä Preinstin syntaksista, man equivs-build toki kertoi että se on Preinst:, joten päätin vaan kokeilla onneani kun mistään en saanut selville, voiko sen scriptin kirjoittaa suoraan control-tiedostoon vai annetaanko siinä vaan scriptin nimi/polku. No, jälkimmäinen tuntuu järkevämmältä joten kokeillaan. Tein pienemmän scriptin työhakemistoon:

Ja muokkasin control-tiedostoani:

Seuraavaksi tein deb-tiedoston uudestaan…

…enkä saanut mitään herjoja! Nyt jännittää :) Poistin apt-get purgella sekä mysql-serverin että mysql-server-5.1:n ja sitten onkin totuuden hetki. Asennetaan paketti:

Jaahas. Asennus kysyi mysql salasanaa, ei siis toiminut. Mutta scripti kyllä käynnistyi, asennuksen jälkeen! Hups. Kyllä, olen valinnut scriptin suoritettavaksi ennen asennusta, en sen jälkeen. Olisikohan niin, että kun riippuvuuksissa on tuo mysql-server, niin se asennetaan ensin, ja vasta sitten asennetaan tietokanta -paketti (jota ennen scripti tosiaan kyllä käynnistyy). Tätä voin kiertää tietysti sillä, että otan mysql-serverin pois Dependsistä ja lisään sen asennuksen takaisin scriptiin. Ei ehkä täydellinen ratkaisu, mutta nyt klo 05.20 koko yön tätä tehtyäni (okei, tein toki välillä muutakin) en keksi muutakaan.

Poistin siis vielä molemmat mysql-server paketit ja oman pakettini, ja muokkasin tietokanta.cfg tiedostoa muotoon:

Ja scriptiä muotoon:

Vaihdoin siis vielä salasanan, jotta voin testata phpmyadminilla loggausta varmasti niin, että tuo scripti on asettanut sen salasanan. Sitten vielä equivs-build tietokanta.cfg ja:

Ei ole todellista! Eipä tietenkään toimi eikä voi toimia, koska eihän Linuxissa voi ajaa kahta dpkg/apt-get/gdebi komentoa samaan aikaan. Nyt tuo gdebi on käynnissä samanaikaisesti kun scripti yrittää ajaa apt-gettiä. Nyt menen kyllä nukkumaan ja jatkan huomenna :)

  Aikaa tähän osioon tähän asti, meni noin 3 tuntia josta tehokasta työaikaa varmaan 2 tuntia.

Pakollisen nukkumiseen tuhlatun ajan jälkeen palasin Virtualboxiin ja rupesin miettimään tätä lisää. Keksin kokeilla sellaista, että jätän Dependsin cfg-tiedostossa tyhjäksi, mutta laitan mukaan sekä ennen asennusta että asennuksen jälkeen ajettavat scriptit. Ennen asennusta tehdään vain nuo debconf-asetukset, ja jälkeen asennuksen asennetaan scriptillä mysql-server. Alla sama kuvina:

Tiedostojen muokkauksen jälkeen ajoin tietysti equivs-build tietokanta.cfg komennon päivittääkseni deb-paketin, ja sitten kokeillaan:

Eipä toimi ei. Eli scripti2 suoritetaan kyllä vasta kun paketti tietokanta on asennettu, mutta herjaa silti ettei pysty ajamaan koko apt-gettiä, varmastikin edelleen siksi että gdebi on yhä käynnissä. Tässä vaiheessa pää oli ihan tyhjä ideoista, ja yritin päästä eteenpäin lähinnä Googlen avulla, kävin tarkkaan läpi tälläiset sivut…

…mutta mistään ei tuntunut olevan apua. Monessa paikassa todettiin, että ei tarvitse tehdä deb-pakettia tähän, vaan asian voi hoitaa scriptillä. Tehtävänantona oli kuitenkin tämän homman hoitavan deb-paketin tekeminen, joten tästä ei ollut apua. Tottahan samaan lopputulokseen päästään vaikkapa tekemällä scripti joka ensin asettaa debconffit kohdalleen ja sitten asentaa mysql-serverin, peace of cake, mutta ongelmana tässä on nimenomaan se että deb-paketin pitäisi hoitaa tämä, eikä kahta apt-get/dpkg/gdebi prosessia voi olla käynnissä samanaikaisesti.

En valitettavasti löytänyt tähän mitään ratkaisua, mutta mielestäni käytin tähän sen verran aikaa ja pääsin pohdinnoissa ja kokeiluissa sen verran pitkälle, että lasken tämän kuitenkin tehdyksi lisätehtäväksi.

Aikaa tähän osioon meni sunnuntaina 12.2. noin 2 tuntia. Yhteensä koko tehtävään meni aikaa siis noin 6 tuntia, mukaan laskettuna tämän dokumentin kirjoittaminen ja lähteiden lukeminen jne.