<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/60"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/60/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/60/atom/feed</id>
  <updated>2008-10-01T14:05:46+02:00</updated>
  <entry>
    <title>Comprendre les paquets IPK</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/60" />
    <id>http://artisan.karma-lab.net/node/60</id>
    <published>2006-11-24T12:57:00+01:00</published>
    <updated>2008-10-01T14:05:46+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Zaurus" />
    <category term="Aucun" />
    <category term="OK" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
   <kbd>ipkg</kbd> est le gestionnaire de package utilisé sur toutes les ROM que j'ai eues entre les mains. C'est une version light de <kbd>dpkg</kbd> à ce que j'en ai compris (je ne suis pas sous debian). techniquement ce sont des archives tgz qui contiennent elles-mêmes des archives tgz <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
   <kbd>ipkg</kbd> est le gestionnaire de package utilisé sur toutes les ROM que j'ai eues entre les mains. C'est une version light de <kbd>dpkg</kbd> à ce que j'en ai compris (je ne suis pas sous debian). techniquement ce sont des archives tgz qui contiennent elles-mêmes des archives tgz <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Philosophie de base</h2>
	
<p>
  Comme tous les systèmes d'installation de logiciels dans le monde *nix, ipkg est bas sur un système de paquets et de sources. Les paquets sont des fichiers archive qui contiennent les binaires à installer pour une application donnée. Généralement dans le nom d'un tel fichier est indiqué le nom de l'application, son numéro de version, l'architecture pour laquelle elle a été compilée et éventuellement une notion de sous-paquet. 
</p>
<p>
  Dans le monde Zaurus, les paquets sont des fichiers .ipk. Sans rentrer dans le détail de leur structure, ce sont basiquement des archives tar compressées. Si l'on prend l'exemple d'abiword, son paquet ipk sera par exemple nommé <kbd>abiword-plugins_2.4.5_armv5tel.ipk</kbd>. <kbd>abiword</kbd> pour le nom de l'application, <kbd>2.4.5</kbd> pour sa version et <kbd>armv5tel</kbd> pour indiquer que ce paquet est compilé pour un processeur ARM (et marchera donc difficilement sur un PC <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/> 
</p>
<p>
  C'est le paquet "principal" d'AbiWord, celui qui contient le coeur de l'application. Mais il peut y avoir aussi des sous-paquets qui dépendent du paquet principal, par exemple <kbd>abiword-plugins-wikipedia_2.4.5_armv5tel.ipk</kbd> qui est le plugin wikipedia d'AbiWord 2.4.5.  
</p>
<p>
  Le concept de dépendance a son importance car si les paquets sont bien faits (les miens le sont rarement <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> ils contiennent une série d'informations qui indique s'ils dépendent d'un autre paquet. Ainsi, lorsque vous installez un logiciel A qui dépend de B qui lui-même dépend de C, l'installateur va télécharger les 3 paquets et les installer. Avouez que c'est un peu plus pratique que les installations à la mode Windows... La question que l'on se pose alors c'est "où l'installateur va chercher B et C" ? C'est là qu'interviennent les sources (les feeds en langage Zaurus). 
</p>
<p>
  Une feed est un dossier local ou distant contennant de nombreux paquets .ipk et un fichier nommé <kbd>Packages</kbd>. Ce fichier est en quelque sorte le botin de la feed, il contient la liste de tous les paquets .ipkg disponibles dans ce répertoire. Ainsi, il est facile pour l'installateur, une fois que nous lui avons proprement indiqué le chemin d'une feed, de télécharger ce fichier en premier lieu pour lui servir d'index. C'est grâce à lui qu'il est capable de résourdre les dépendances manquantes. Vous pouvez vous convaincre de l'existence de ce fichier "caché" en allant directement le regarder dans une feed standard de pdaXrom b121.
</p>
<p>
  Bien évidemment, un installateur digne de ce nom est capable de connaître un nombre illimité de sources différentes. Et s'il est très bien fait (ce qui n'est pas le cas d'ipkg <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>, il est capable de mettre à jour votre système avec les versions les plus récentes. 
</p>
<p>
  En bref, pour notre Zaurus, ipkg doit être configuré pour y ajouter toutes les sources/feed dont nous avons besoin. Ce qui n'est pas le cas lorsque pdaXrom vient d'être installé, malheureusement... 
</p>


	<a name='chapter_2'></a>
  <h2>Paramétrage de ipkg</h2>
	
<p>
   Même s'il existe un frontal graphique à <kdd>ipkg</kdd>, il est formateur de savoir l'utiliser en ligne de commande pour en comprendre le fonctionnement. Et la première chose qui va donc nous intéresser est de modifier la liste des feeds pour ajouter des sources nouvelles ou simplement réparer les sources éronnées.
</p>
<p>
 Le fichier de configuration d'ipkg est <kbd>/etc/ipkg.conf</kbd>. Prenez votre éditeur de texte préféré (vi évidement <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> et regardez à quoi il ressemble. Vous verrez deux sections distinctes. Tout d'abord la liste des feeds. Une ligne par source au format suivant :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  src NOM URL
  </div>
  
  </div>
</p>
<p>
  Le prefix <kbd>src</kbd> indique que ce qui suit est une feed. <kbd>NOM</kbd> est n'importe quel nom de votre choix, tant qu'il est utilisé une et une seule fois, par exemple <kbd>maSource</kbd>. <kbd>URL</kbd> est l'adresse du dossier contenant les fichiers .ipk et le fameux fichier Packages (voir plus haut). Comme je le disais, la feed peut être locale, en ce cas l'URL est de la forme <kbd>http://un.site.web/dossier/feed</kbd> ou local, en écrivant <kbd>file:///chemin/vers/ma/feed/locale</kbd>. Ce qui nous donne les deux exemples suivants, le premier est la feed standard de pdaXrom pour la béta 121 modèle CX00, le second une feed locale sur ma carte compact flash :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  src pdaXrom http://www.pdaxrom.org/download/1.1.0r121/Zaurus-Cxx00/feed<br />
src maFeed &nbsp;file:///mnt/cf/maFeed
  </div>
  
  </div>
</p>
<p>
  Une fois que les feeds sont configurées, nous pouvons regarder la deuxième section d'ipkg.conf concernant les destinations. En effet, la commande ipkg installe par défaut les applications à la racine. Mais pour des raisons évidentes de place, il est parfois intéressant de stoquer les grosses applications (kdepimpe, firefox, etc..) sur une carte SD par exemple. Le format de chaque ligne est le suivant :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  dest NOM CHEMIN
  </div>
  
  </div>
</p>
<p>
  Le prefix <kbd>dest</kbd> indique que ce qui suit est une destination d'installation. <kbd>NOM</kbd> est n'importe quel nom de votre choix, comme pour les feeds. Attention cependant, autant prendre un nom facile à taper car vous l'utiliserez à chaque fois que vous voulez installer quelque chose sur cette destination. <kbd>CHEMIN</kbd> est quant à lui le chemin local (interne au Zaurus) où ipkg doit installer le binaire. Cela peut être un autre dossier de la racine (ex. /opt pour les possesseurs de disque dur), une carte SD (/mnt/SD/mesInstallations), etc... 
</p>
<p>
  Une fois les modifications effectuées, vous pouvez sauver le fichier ipkg.conf et mettre à jour la base des paquets par la commande :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg update
  </div>
  
  </div>
</p>
<AR/p>
L'utilitaire va alors télécharger chaque fichier Packages de chaque feed que vous lui avez indiquée. Ensuite pour installer une application la syntaxe est la suivante :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg -dest DESTINATION <a target="blank" href="http://pwet.fr/man/linux/commandes/install"><span class="kw2">install</span></a> PAQUET
  </div>
  
  </div> 
</p>
<p>
Si l'argument <kbd>-dest DESTINATION</kbd> est ommis, c'est la première destination du fichier ipkg.conf qui sera utilisée (généralement la /). <kbd>PAQUET</kbd> quant à lui est le nom du paquet ipk à installer, sans numéro de version, architecture et .ipk à la fin. Par exemple pour installer AbiWord sur la carte SD :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg -dest SD <a target="blank" href="http://pwet.fr/man/linux/commandes/install"><span class="kw2">install</span></a> abiword
  </div>
  
  </div>
</p>


	<a name='chapter_3'></a>
  <h2>Fonctionnement d'ipkg</h2>
	
<p>
  Lorsque vous lancez un <kbd>ipkg update</kbd>, l'ensemble des fichiers Packages de chaque feed lue par ipkg est sauvée sous le nom de la feed que vous avez indiquée via <kbd>/etc/ipkg.conf</kbd> dans le dossier <kbd>/usr/lib/ipkg/lists</kbd>. 
</p>
<p>
  Quant vous lancez une installation, ipkg, écrit une entrée dans le fichier <kbd>/usr/lib/ipkg/status</kbd> indiquant le nom du paquet et la mention <kbd>not-installed</kbd>. C'est intéressant à savoir car si vous arrêtez une installation en cours de route (ou si vous essayer d'installer un paquet qui n'existe pas), cette entrée est conservée et du coup ipkg vous redemande à chaque appel s'il doit retenter l'installation. S'il s'agit d'une erreur, il suffit au préalable de modifier le fichier  <kbd>/usr/lib/ipkg/status</kbd> et d'enlever les enregistrements marqués <kbd>not-installer</kbd>. C'est le contenu de ce fichier qui est lu lorsque vous tapez <kbd>ipkg status</kbd>.
</p>
<p>
   Ensuite ipkg va écrire ses fichiers dans un dossier temporaire <kbd>tmp</kbd> placé en dessous du dossier de destination. Par exemple en /home/tmp (pour une destination par défaut) ou /mnt/sd/tmp (pour la destination SD). C'est important à savoir lorsqu'une install plante et que l'on doit virer les packets téléchargés et non installés. 
</p>
<p>
  Lorsque vous installez dans une destination qui n'est pas la racine, ipkg va tricher avec Linux en créant un lien symbolique entre le fichier réel (par exemple /mnt/car/usr/bin/monApplication) et le dossier où Linux s'attend à trouver un tel fichier (/usr/bin). 
</p>
<p>
  Enfin, une fois l'installation terminée, la liste, par paquet, des fichiers installés est stockée par ipkg dans le dossier <kbd>/usr/lib/ipkg/infos</kbd> sous le nom <kbd>nom_paquet.list</kbd>. Par exemple pour abiword, sera crée un fichier <kbd>/usr/lib/ipkg/infos/abiword.list</kbd>.  Il va aussi mettre à jour le fichier <kbd>/usr/lib/ipkg/status</kbd> en remplaçant <kbd>not-installed</kbd> par <kbd>installed</kbd>.
</p>



	<a name='chapter_4'></a>
  <h2>Utilisation de frontal graphique qpkg</h2>
	
<p>
  <kbd>ipkg</kbd> est un outil en ligne de commande qui dispose d'un frontal graphique nommé <kbd>qpkg</kbd>. Cet outil permet visuellement d'obtenir la liste des paquets disponibles, de rajouter des feeds et de faire des mises à jour. 
</p>
<p>  
  Pour plus de confort, il est aussi possible d'utiliser <kbd>qpkg</kbd>) via SSH avec redirection X11 (voir <a href="node/53">Installation du réseau USB</a>). Pratique pour voir les paquets en plein écran et se balader avec la roulette <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>



	<a name='chapter_5'></a>
  <h2>Créer son propre paquet IPK</h2>
	
<p>
  Pour distribuer notre magnifique binaire fraîchement compilée un peu de packaging s'impose. Il nous faut donc le mettre dans un fichier .ipk.
</p><!--break-->


	<a name='chapter_6'></a>
  <h2>Structure des fichiers ipk</h2>
	
<p>
  Un fichiers .ipk est une simple archives <kbd>tar</kbd> compressée par <kbd>gzip</kbd> qui contient elle-même 2 autres archives : <kbd>data.tar.gz</kbd> et <kbd>control.tar.gz</kbd>. 
</p>
<p>
  Le fichier <kbd>data.tar.gz</kbd> contient les fichiers à décompresser dans le Zaurus, à partir de la racine. Dans notre cas, il contiendra de tous les fichiers contenus dans le dossier <kbd>dist</kbd> que nous avons créé par <kbd>make install</kbd>.
</p>

<p>
  Le fichier <kbd>control.tar.gz</kbd> peut contenir quatre scripts et deux fichiers de contrôles.
</p>

<p>
  Les scripts sont optionnels et seront lancés au court de la vie du paquet :
  <dl>
    <dt>preinst</dt><dd>Exécuté avant la décompression</dd>
    <dt>postinst</dt><dd>Exécuté après la décompression</dd>
    <dt>prerm</dt><dd>Exécuté avant la désinstallation</dd>
    <dt>postrm</dt><dd>Exécuté après la désinstallation</dd>
  </dl>
</p>

<p>
  Les deux fichiers sont de contrôle quant à eux :
  <dl>
    <dt>control</dt><dd>
      Fichier obligatoire contenant la description du package. Dans le cas de xinetd, ce serait :
      
  <div class='code-block code-block-fragment'>
  <div class='container'>
  Package: xinetd&lt;strong&gt; (Le nom du paquet)&lt;/strong&gt;<br />
Installed-Size: 332K &lt;strong&gt;(La taille une fois installé)&lt;/strong&gt;<br />
Filename: ./xinetd_2.3.14_arm.ipk&lt;strong&gt; (Le nom du fichier ipk)&lt;/strong&gt;<br />
Version: 2.3.14 &lt;strong&gt;(La version du paquet)&lt;/strong&gt;<br />
Depends: &lt;strong&gt;(Les éventuelles paquets dont dépends ce paquet)&lt;/strong&gt;<br />
Priority: optional &lt;strong&gt;(Je n'en sais rien du tout)&lt;/strong&gt;<br />
Section: system &lt;strong&gt;(La catégorie du paquet)&lt;/strong&gt;<br />
Maintainer: Mukti &lt;strong&gt;(La personne en charge de la mise à jour de ce paquet)&lt;/strong&gt;<br />
Architecture: arm &lt;strong&gt;(L'architecture de ce paquet, ARM pour le Zaurus)&lt;/strong&gt;<br />
Description: xinetd has access control mechanisms, extensive logging capabilities, <br />
the ability to make services available based on time, can place limits on the number of <br />
servers that can be started, and has deployable defence mechanisms to protect against port <br />
scanners, among other things.
  </div>
  
  </div>
    </dl>
    <dt>conffiles</dt><dd>Optionnel. Une liste de fichier ne devant pas être écrasée lors d'une mise à jour</dd>
  </dl>
</p>


	<a name='chapter_7'></a>
  <h2>Préparation de la distribution</h2>
	
<p>
  Tout d'abord ne pas oublier que les Zaurus n'ont pas de ressources illimitées. Un des premiers travaux à faire dans le dossier <kbd>dist</kbd> est d'enlever tout ce qui ne sert "à rien" : documentations, exemples, tests, etc... jusqu'à obtenir quelque chose de minimum. 
</p>
<p>
  Une fois ceci fait, il faut créer dans <kbd>dist</kbd> un dossier <kbd>CONTROL</kbd> qui va contenir l'ensemble des fichiers de contrôle dont nous avons parlé plus haut et donc, au minimum, le fichier <kbd>control</kbd>. Pensez à bien renseigner ce fichier et y indiquer les dépendances avec d'autres paquets.
</p>

	<a name='chapter_8'></a>
  <h2>Création de l'ipk</h2>
	
<p>
  Le meilleur moyen pour fabriquer rapidement un fichier .ipk est d'utiliser l'utilitaire <kbd>mkipkg</kbd> fourni avec le cross-compiler. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  mkipkg dist
  </div>
  
  </div>
  pour produire le fichier .ipk correctement formé et vérifié. Il ne reste plus qu'à l'envoyer dans le Zaurus pour le tester.
</p>


	<a name='chapter_9'></a>
  <h2>Mettre de l'ordre dans les dépots</h2>
	
<p>
  ipkg est l'outil utilisé pour installer des paquets sur pdaXrom. C'est aussi lui qui est utilisé par qpkg, sa version graphique. Or, quelles que soient les versions de pdaXrom, le fichier de configuration d'ipkg est faux. Il faut donc commencer par le remettre en place...
</p>
<!--break-->
<p>Pour cela, en tant que root, utilisez <kbd>Office</kbd>/<kbd>Leafpad</kbd> ou plus simple <kbd>vi</kbd> et ouvrez le fichier <kbd>/etc/ipkg.conf</kbd> que vous remplacerez par le contenu suivant (décommentez ce qui correspond à votre version) :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  # à décommenter si vous êtes en béta 3<br />
# src main http://mail.pdaxrom.org/download/1.1.0beta3/Zaurus-Cxx00/feed/<br />
# src 7x0 http://mail.pdaxrom.org/contrib/1.1.0beta3/Zaurus-7x0-860/feed/<br />
<br />
# à décommenter si vous êtes en béta 3<br />
# src main &nbsp;http://mail.pdaxrom.org/download/1.1.0beta4/Zaurus-Cxx00/feed/<br />
# src karmaLab http://www.karma-lab.net/zaurus<br />
# src old http://mail.pdaxrom.org/download/1.1.0beta1/Zaurus-C1000-C3100/feed/<br />
<br />
# à décommenter si vous êtes en béta 121<br />
# src karmaLab http://www.karma-lab.net/zaurus/stable<br />
# src karmaLab-lab http://www.karma-lab.net/zaurus/not-tested<br />
# src main &nbsp;http://www.pdaxrom.org/download/1.1.0r121/Zaurus-Cxx00/feed<br />
# src other &nbsp;http://www.pdaxrom.org/download/1.1.0r121/Zaurus-7x0-860/feed<br />
# src old http://mail.pdaxrom.org/download/1.1.0beta1/Zaurus-C1000-C3100/feed<br />
# src beta4 http://mail.pdaxrom.org/download/1.1.0beta4/Zaurus-7x0-860/new/feed<br />
<br />
<br />
dest root /<br />
dest cf /mnt/cf<br />
dest sd /mnt/card<br />
dest net /mnt/net<br />
dest user /mnt/user<br />
dest ide /mnt/ide<br />
dest ide2 /mnt/ide2<br />
dest ide3 /mnt/ide3<br />
dest usbstorage /mnt/usbstorage<br />
dest tmpinst /home/tmp/ipkg/inst
  </div>
  
  </div>
  Sauvez puis fermez leafPad. Cette opération donne les bonnes sources de paquets à ipkg en ajoutant les deux sources de paquets de la béta 2. 
</p>
<p>
  Il faut maintenant mettre à jour la base de paquets soit en ligne de commande
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg update
  </div>
  
  </div> soit via <kbd>System Tools</kbd>/<kbd>Package Manager</kbd> et pressez le bouton <kbd>update</kbd> (le 2ième). Au bout d'un temps, les descriptions de paquet seront téléchargées.
</p>
    ]]></content>
  </entry>
</feed>
