<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.finiderire.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Vim est ton ami.</title>
  <link>http://www.finiderire.com/</link>
  <atom:link href="http://www.finiderire.com:82/feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Pour les codeurs qui ne perdent pas leur temps avec les IDE.</description>
  <language>fr</language>
  <pubDate>Tue, 21 May 2013 13:01:36 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Réussir son IUP avec Arch</title>
    <link>http://www.finiderire.com/post/2013/03/08/R%C3%A9ussir-son-IUP-avec-Arch</link>
    <guid isPermaLink="false">urn:md5:8ec796dd19dac3fcc90e82f5b8f7fe5f</guid>
    <pubDate>Thu, 14 Mar 2013 18:30:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>api</category><category>Arch</category><category>coding</category><category>Linux</category><category>pénible</category>    
    <description>&lt;p&gt;&lt;em&gt;IUP est une bibliothèque pour construire des IHM, fortement interfacée
avec Lua.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Je ne sais pas comment cela se passe avec votre distribution, mais avec
Arch, ce n'est pas la joie.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Notez que ce qui est décrit ici sera valable avec n'importe quelle
distribution, passé les considérations préalables sur AUR.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;IUP, qu'on ne présente plus.&lt;/h3&gt;
&lt;p&gt;En effet, on ne le présente plus, non pas à cause de sa renommée mondiale,
mais simplement à cause du fait que si vous lisez ceci, c'est que vous
connaissez déjà cette bibliothèque.&lt;/p&gt;
&lt;p&gt;Un petit lien pour les spammeurs qui se sont perdus en ces lieux: &lt;a href=&quot;http://www.tecgraf.puc-rio.br/iup/&quot;&gt;site d'IUP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;De quoi avons-nous besoin ?&lt;/h3&gt;
&lt;h5&gt;&lt;a href=&quot;http://www.tecgraf.puc-rio.br/im/&quot;&gt;IM&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Il s'agit d'un toolkit pour manipuler différents formats graphiques.&lt;/p&gt;
&lt;p&gt;La dernière version connue est la 3.8.1, celle disponible dans AUR est la
3.7.1.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;&lt;a href=&quot;http://sourceforge.net/projects/ftgl/develop&quot;&gt;ftgl&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Bon alors… &lt;em&gt;ft&lt;/em&gt; est pour &lt;em&gt;FreeType&lt;/em&gt; et &lt;em&gt;gl&lt;/em&gt; pour
&lt;em&gt;OpenGL&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Voilà donc d'une lib pour tracer du texte avec OpenGL. Mais à l'ancienne
(pas de core profile).&lt;/p&gt;
&lt;p&gt;Par chance, la dernière version peut se ramener avec pacman.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pacman -S ftgl&lt;/code&gt; , et n'en parlons plus!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;&lt;a href=&quot;http://www.tecgraf.puc-rio.br/cd/&quot;&gt;CD&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Une question me taraude à propos de &lt;em&gt;tecgraf&lt;/em&gt;. Le font-ils vraiment
exprès avec leurs noms de librairie ? Le but est-il d'être noyé dans les
moteurs de recherche ? Quoi qu'il en soit, encore une lib où il vaut mieux
avoir le lien direct.&lt;/p&gt;
&lt;p&gt;Cette fois, il s'agit de &lt;em&gt;Canvas Draw&lt;/em&gt;, qui s'appuie sur &lt;em&gt;IM&lt;/em&gt;
et &lt;em&gt;ftgl&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Comme son nom l'indique, le but est de tracer dans un canevas. Présenté
ainsi, cela ne semble pas très intéressant. Mais si j'ajoute que le canevas
peut-être aussi bien un buffer Win32, GDI+, X11 que PDF, Postscript ou SVG,
qu'en pensez-vous ?&lt;/p&gt;
&lt;p&gt;Ah ? Bon d'accord. Néanmoins, c'est un prérequis important pour IUP.
Pour ne pas changer, AUR n'est pas à jour: version 5.5 , alors que la version
5.6 est déjà disponible. Rhooo!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;&lt;a href=&quot;http://www.tecgraf.puc-rio.br/iup/&quot;&gt;IUP&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Celui que nous attendions tous, et qu'on ne présente plus (n'insistez
pas).&lt;/p&gt;
&lt;p&gt;Une dépendance exotique: la lib CD.&lt;/p&gt;
&lt;p&gt;Une version un peu ancienne dans AUR : 3.2 (la 3.7 est disponible).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Mauvaise méthode : s'acharner sur son PKGBUILD.&lt;/h3&gt;
&lt;p&gt;Je vous préviens, trafiquer les PKGBUILD depréciés et buggés de AUR n'est
qu'une sombre perte de temps.&lt;/p&gt;
&lt;p&gt;Dans le principe, il semble n'y avoir que le &lt;em&gt;pkgver&lt;/em&gt; à mettre à
jour.&lt;/p&gt;
&lt;p&gt;Dans la pratique, vous allez vous retrouver avec de mystérieux messages
d'erreur lors de la compilation, et des demi-paquets comme résultats.&lt;/p&gt;
&lt;p&gt;D'autre part, pour le paquet IUP, vous allez vous rendre compte que les
modifications du PKGBUILD sont tellement importantes que vous auriez plus vite
fait de le réécrire vous-même. Pour les courageux qui voudraient se lancer
là-dedans, voici une partie des modifications à faire (une partie seulement,
car je ne suis pas arrivé à mes fins avec cette méthode):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changer &lt;em&gt;pkgver&lt;/em&gt; avec la bonne version d'IUP.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter le support 64 bits: &lt;em&gt;arch=('i686' 'x86_64')&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;libcd mal nommée (remplacer &lt;em&gt;libcd&lt;/em&gt; par &lt;em&gt;cd&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;le patch du makefile est à commenter, sauf si vous gardez la version d'IUP
concernée pas le &lt;em&gt;pkgbuild&lt;/em&gt; (je ne le vous recommande pas).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;les modules à compiler (par exemple, enlevez &lt;em&gt;iupweb&lt;/em&gt; si vous n'avez
pas l'environnement de compilation pour &lt;em&gt;webkit&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et tout ça pour se planter à la compilation. Il est temps de passer à …&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La méthode root et artisanale.&lt;/h3&gt;
&lt;h5&gt;Les petits cochons seront bien gardés.&lt;/h5&gt;
&lt;p&gt;Nous allons installer tout ceci dans &lt;em&gt;~/local&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Cette méthode évite de casser votre système en polluant
&lt;em&gt;/usr/include/&lt;/em&gt;, &lt;em&gt;/usr/lib&lt;/em&gt; , etc…&lt;/p&gt;
&lt;p&gt;Si ce n'est pas déjà fait, il faut créer la hiérarchie &lt;em&gt;local&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;

~$ mkdir -p ~/local/bin ~/local/include ~/local/lib
~$ ls local
bin  include  lib

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;ftgl ? Une paille.&lt;/h5&gt;
&lt;p&gt;&lt;em&gt;ftgl&lt;/em&gt; a le bon goût d'être disponible dans pacman, dans la branche
&lt;em&gt;extra&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pacman -S ftgl&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;En avant avec IM.&lt;/h5&gt;
&lt;p&gt;Passons à la dépendance qui ne nécessite pas d'autres dépendances dans les
projets tecgraf. J'ai nommé &lt;em&gt;IM&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Chargez les sources et dépackez les dans un coin.&lt;/p&gt;
&lt;p&gt;Nous adaptons à Lua 5.2 &lt;em&gt;LUA_VER&lt;/em&gt; et &lt;em&gt;LUA_PFX&lt;/em&gt; dans
&lt;em&gt;config_lua_module&lt;/em&gt; (à ne faire bien sûr que si vous utilisez la
5.2).&lt;/p&gt;
&lt;pre&gt;

#Current Lua Version
LUA_VER=5.2
LUA_PFX=52

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Ensuite, nous modifions le path dans &lt;em&gt;tec_uname&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Le tout est de s'intercaler subtilement. Voici la partie à modifier:&lt;/p&gt;
&lt;pre&gt;

ComputeSystemPaths()
{
  if [ $TEC_SYSARCH == x64 ]; then
    if [ -d /usr/lib64 ]; then
      TEC_SYSTEM_LIB=/usr/lib64
    else
      TEC_SYSTEM_LIB=/usr/lib
    fi
  else
    TEC_SYSTEM_LIB=/usr/lib
  fi

  TEC_SYSTEM_INC=/usr/include

  #ajout subtil pour forcer $HOME/local
  TEC_SYSTEM_LIB=$HOME/local/lib
  TEC_SYSTEM_INC=$HOME/local/include
  #fin de l'ajout subtil

  TEC_LUA_LIB=$TEC_SYSTEM_LIB/lua/$LUA_VER
}

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Vous pouvez tester les modifications avec ce script:&lt;/p&gt;
&lt;pre&gt;

#!/bin/bash
# pour tester tec_uname

source ./tec_uname

ComputeTecUname
ComputeSystemPaths

PrintInfo
echo &amp;quot;TEC_LUA_LIB : $TEC_LUA_LIB&amp;quot;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Il est temps de compiler : allez dans le répertoire &lt;em&gt;src&lt;/em&gt; et
lancez un &lt;code&gt;make -j 5 do_all&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ne compilez pas le Makefile depuis la racine, ou vous obtiendrez en sortie
de make un mystérieux &lt;em&gt;&lt;a href=&quot;http://www.finiderire.com/post/2013/03/08/do_all&quot; title=&quot;do_all&quot;&gt;do_all&lt;/a&gt; Error
2&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pour installer &lt;em&gt;IM&lt;/em&gt;, pas besoin de &lt;code&gt;sudo&lt;/code&gt; comme suggéré
par les scripts. Nous installons dans notre home sans avoir besoin des droits
root :&lt;/p&gt;
&lt;pre&gt;

~/sources/im/$ ./config_lua_module
~/sources/im/$ ./install
~/sources/im/$ ./install_dev

&lt;/pre&gt;
&lt;p&gt;Notez qu'il faudra peut-être rendre exécutable ces scripts avant de les
lancer. (&lt;code&gt;chmod 755 …&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Vous savez quoi ? Tout n'est pas copié dans &lt;em&gt;~/local/lib&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Il faut vraiment tout faire soi même… rendez-vous dans le répertoire où les
libs furent compilées, et copiez celles absentes de votre
&lt;em&gt;~/local/lib&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Continuons avec CD.&lt;/h5&gt;
&lt;p&gt;Chargez les sources et dépackez les dans un coin.&lt;/p&gt;
&lt;p&gt;Le principe reste le même que pour &lt;em&gt;IM&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Changement des versions, et insertion du path &lt;em&gt;$HOME/local/…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;La compilation et l'installation utilisent les mêmes scripts.&lt;/p&gt;
&lt;p&gt;(attention à faire le &lt;code&gt;make&lt;/code&gt; depuis &lt;em&gt;src&lt;/em&gt;, comme indiqué
précédemment).&lt;/p&gt;
&lt;p&gt;N'étant pas payé à la ligne, je vous invite donc à vous reporter à la partie
précédente pour les manœuvres à effectuer.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Terminons avec IUP.&lt;/h5&gt;
&lt;p&gt;Chargez les sources, les exemples et la doc, et … vous connaissez la
chanson.&lt;/p&gt;
&lt;p&gt;Faites les modifications dans &lt;em&gt;config_lua_module&lt;/em&gt; et
&lt;em&gt;tec_uname&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Il va peut-être vous falloir également modifier quelques cibles du makefile.
Par exemple, si vous n'avez pas le sdk webkit installé, il faudra enlever cette
cible de la rêgle &lt;em&gt;do_all&lt;/em&gt; : &lt;em&gt;iup_web&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ce qui dans mon cas a donné (j'ai aussi enlevé la windozerie):&lt;/p&gt;
&lt;pre&gt;

do_all: iup iupcd iupcontrols iupgl iup_pplot iup_mglplot iupim iupimglib iuptuio ledc iupview iuplua5 iupconsole

&lt;/pre&gt;
&lt;p&gt;Alors attention, car vous allez devoir vous y prendre à deux fois. Pour
terminer la compilation, il faudra installer partiellement la lib.&lt;/p&gt;
&lt;p&gt;Lancez la compilation et l'installation, de la même facon que pour
&lt;em&gt;IM&lt;/em&gt; et &lt;em&gt;CD&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Tout comme pour &lt;em&gt;IM&lt;/em&gt;, il manque quelques libs (toujours les bindings
Lua). Veillez donc à copier les libs manquantes, afin que les liens symboliques
pour Lua servent à quelque chose, et que nous puissions achever la
compilation.&lt;/p&gt;
&lt;p&gt;Modifiez ensuite &lt;em&gt;srclua5&lt;/em&gt; et enlevez les références à lua51.&lt;/p&gt;
&lt;p&gt;Exemple:&lt;/p&gt;
&lt;pre&gt;

iuplua:
#       @$(TECMAKE_CMD) USE_LUA51=Yes
        @$(TECMAKE_CMD) USE_LUA52=Yes

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Relancez make.&lt;/p&gt;
&lt;p&gt;Installez.&lt;/p&gt;
&lt;p&gt;J'ai également copié ce qui ressemblait fort à des helpers dans
&lt;em&gt;~/local/lib/lua/5.2/&lt;/em&gt;. Par &lt;em&gt;helpers&lt;/em&gt;, j'entends les fichiers
&lt;em&gt;*.lua&lt;/em&gt; que l'on trouve dans le répertoire &lt;em&gt;srclua5&lt;/em&gt; de IUP. Je
ne leur ai pas trouvé d'utilité pour l'instant, les exemples d'IUP n'ont pas
besoin d'eux.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le présent, c'est maintenant !&lt;/h3&gt;
&lt;p&gt;Et sur ces entrefaits, il est temps de lancer le petit &lt;em&gt;Hello World&lt;/em&gt;
traditionnel, que l'on ne présente plus non plus.&lt;/p&gt;
&lt;p&gt;Si votre prudence naturelle vous incite à ignorer les docs, voilà de quoi
satisfaire à l'exercice imposé:&lt;/p&gt;
&lt;pre&gt;

#!/usr/bin/env lua

package.cpath = package.cpath .. &amp;quot;;/home/jseb/local/lib/lua/5.2/?.so&amp;quot;
require &amp;quot;iuplua&amp;quot;

dlg = iup.dialog{iup.label{title=&amp;quot;Goodbye, World!&amp;quot;}; title=&amp;quot;test&amp;quot;}
dlg:show()

if (not iup.MainLoopLevel or iup.MainLoopLevel()==0) then
    iup.MainLoop()
end

&lt;/pre&gt;
&lt;p&gt;N'oubliez pas d'adapter le &lt;em&gt;package.cpath&lt;/em&gt; à votre config.&lt;/p&gt;
&lt;p&gt;Vous pouvez également tester les très nombreux exemples fournis sur le site
tecgraf (dans une archive dédiée).&lt;/p&gt;
&lt;p&gt;Pour tester les exemples, je vous conseille d'exporter cette variable, qui
vous évitera de modifier tous les sources avec
&lt;em&gt;package.cpath&lt;/em&gt; :&lt;/p&gt;
&lt;pre&gt;

export LUA_CPATH=$HOME/local/lib/lua/5.2/?.so

&lt;/pre&gt;
&lt;p&gt;Certains exemples ne fonctionneront peut-être pas, car ils nécessitent
d'autres packages. Ainsi, &lt;code&gt;glcanvas.wlua&lt;/code&gt; nécessite la lib
&lt;em&gt;luagl&lt;/em&gt;. À vous de voir.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Une dernière chose: les exemples Lua ont l'attribut exécutable, mais il vous
faudra les lancer en précisant l'interpréteur Lua. Celui-ci n'est pas précisé
dans la script, et si vous ne précisez pas l'interpréteur, le shell pense avoir
affaire à un script shell. Je ne sais pas pourquoi j'écris ça, si vous êtes
arrivés jusque ici, je ne vous apprends rien.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;GUI moquait&lt;/h3&gt;
&lt;p&gt;IUP a la réputation d'être une bibliothèque particulièrement ardue à
compiler. Effectivement, elle est à la hauteur de sa réputation.&lt;/p&gt;
&lt;p&gt;Tout cela mériterait quelques beaux PKGBUILD.&lt;/p&gt;
&lt;p&gt;Ce qui est laissé à titre d'exercice au lecteur.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2013/03/08/R%C3%A9ussir-son-IUP-avec-Arch#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2013/03/08/R%C3%A9ussir-son-IUP-avec-Arch#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/724026</wfw:commentRss>
      </item>
    
  <item>
    <title>Nvidia, Arch : un grand coup sur l'ABS</title>
    <link>http://www.finiderire.com/post/2013/02/04/NVidia%2C-Arch-%3A-un-grand-coup-sur-l-ABS</link>
    <guid isPermaLink="false">urn:md5:8ee9b47a2d2b4ad951476668b82e863a</guid>
    <pubDate>Tue, 05 Feb 2013 20:18:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
            
    <description>&lt;p&gt;&lt;em&gt;Si vous avez une carte graphique NVidia et que vous utilisez leur driver
proprio, ceci pourrait vous intéresser.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Il vous faudra aussi être un utilisateur de Arch pour tirer pleinement
parti de la quintessence cosmique de ce billet.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Dans le cas contraire, vous pouvez arrêtez de lire immédiatement et
retourner faire tourner glxgears avec Nouveau, sur votre Debian.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;MàJ 10/04/2013&lt;/strong&gt; : le nouveau paquet
nvidia-libgl&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Nvidia et la sauvagerie&lt;/h3&gt;
&lt;h5&gt;Les blobs sont sur la plage&lt;/h5&gt;
&lt;p&gt;Si vous avez une carte video Nvidia dans votre PC, voire même un chipset de
la même marque, vous utilisez forcément le driver proprio. À part bien sûr les
afficionados de la 2D avec Nouveau.&lt;/p&gt;
&lt;p&gt;C'est comme ça. Et si vous n'êtes pas d'accord avec ce qui précède, vous
tournez avec un chipset Intel ou vous attendez comme le Messie la venue d'un
driver open-source correct pour votre ATI (AMD aura probablement déposé le
bilan avant ce jour lointain, mais splendide).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Mais pourquoi de la sauvagerie ?&lt;/h5&gt;
&lt;p&gt;Vous êtes un adepte des kernel customs.&lt;/p&gt;
&lt;p&gt;La sauvagerie n'est pas là, le kernel custom n'a rien de mauvais en soit.
C'est même une nécessité pour le support de TuxOnIce (aka «l'hibernation qui
fonctionne») ou encore les drivers critiques dans le noyau (comme le RAID par
exemple, au lieu d'un chargement via une image des modules placée dans un
ramdisk au boot).&lt;/p&gt;
&lt;p&gt;Cependant, qui dit kernel custom, dit également fin du support Nvidia par
votre distribution.&lt;/p&gt;
&lt;p&gt;Vous pourriez bien sûr utiliser un des affreux noyaux disponibles dans AUR,
mais soyons sérieux cinq minutes. À part vous faire perdre votre temps, ceux-ci
ne servent pas à grand chose, tant il vrai que d'un cas qui se veut général,
ils n'arriveront jamais à vos particularités.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Haine vidia&lt;/h5&gt;
&lt;p&gt;Ne me cachez rien. Vous vous êtes retrouvés à installer les drivers Nvidia
directement à partir d'une archive chargée de leur site.&lt;/p&gt;
&lt;p&gt;Et de ce choix douteux (ne nous voilons pas la face) est né un insurmontable
chaos rampant qui explose maintenant à la face de notre innocence perdue.&lt;/p&gt;
&lt;p&gt;Pour Arch, en ce début d'année 2013, le diagnostic est simple. Vous souffrez
de ces problèmes si vous avez encore des fichiers dans &lt;em&gt;/usr/lib64&lt;/em&gt; qui
est censé être vide.&lt;/p&gt;
&lt;pre&gt;

$~ ls /usr/lib64

libcuda.so            libnvidia-cfg.so.310.19       libOpenCL.so
libcuda.so.1          libnvidia-compiler.so.310.19  libOpenCL.so.1
libcuda.so.310.19     libnvidia-encode.so           libOpenCL.so.1.0
libGL.la              libnvidia-encode.so.1         libOpenCL.so.1.0.0
libGL.so              libnvidia-encode.so.310.19    libvdpau_nvidia.so
libGL.so.1            libnvidia-glcore.so.310.19    libvdpau.so
libGL.so.310.19       libnvidia-ml.so               libvdpau.so.1
libnvcuvid.so         libnvidia-ml.so.1             libvdpau.so.310.19
libnvcuvid.so.1       libnvidia-ml.so.310.19        libvdpau_trace.so
libnvcuvid.so.310.19  libnvidia-opencl.so.1         tls
libnvidia-cfg.so      libnvidia-opencl.so.310.19    vdpau
libnvidia-cfg.so.1    libnvidia-tls.so.310.19

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Une vérification rapide confirme qu'il y a quelque chose de pourri au
royaume des paquets.&lt;/p&gt;
&lt;pre&gt;

~$ for i in /usr/lib64/lib*; do pacman -Qo &amp;quot;$i&amp;quot;; done
error: No package owns /usr/lib64/libcuda.so
error: No package owns /usr/lib64/libcuda.so.1
error: No package owns /usr/lib64/libcuda.so.310.19
error: No package owns /usr/lib64/libGL.la
error: No package owns /usr/lib64/libGL.so
error: No package owns /usr/lib64/libGL.so.1
error: No package owns /usr/lib64/libGL.so.310.19
error: No package owns /usr/lib64/libnvcuvid.so
error: No package owns /usr/lib64/libnvcuvid.so.1
error: No package owns /usr/lib64/libnvcuvid.so.310.19
 (...)
error: No package owns /usr/lib64/libvdpau.so.310.19
error: No package owns /usr/lib64/libvdpau_trace.so

&lt;/pre&gt;
&lt;p&gt;Cette vérification sommaire met en évidence l'installation sauvage du driver
Nvidia.&lt;/p&gt;
&lt;p&gt;Outre le fait que ce n'est pas propre (et un driver proprio, c'est propre
peut-être ? Ipso facto on s'en tape), ceci peut tuer votre Arch, ce qui
est déjà plus gênant.&lt;/p&gt;
&lt;p&gt;Exagération ? Pas de bol ?&lt;/p&gt;
&lt;p&gt;Pas de bol: la présence de /usr/lib64, un reliquat d'Arch où vous l'avez
compris ne subsiste que votre installation barbare de Nvidia, va empêcher
l'installation du nouveau filesystem Arch (paquet
&lt;em&gt;filesystem-2013.01-3&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/usr/lib64&lt;/em&gt; est censé être un lien vers &lt;em&gt;/usr/lib&lt;/em&gt;, et non
pas un répertoire rempli de fichiers.&lt;/p&gt;
&lt;p&gt;Si vous passez outre en forçant la mise à jour , qui est couplée avec un
changement de &lt;em&gt;libc&lt;/em&gt; (pour que la fête soit complète), vous flinguez
votre Arch.&lt;/p&gt;
&lt;p&gt;Pour remédier à cela, nous allons faire le ménage, qui passe notamment par
la préparation d'un paquet Nvidia format distrib, adapté au kernel
customisé.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Préparer un vrai paquet Nvidia&lt;/h3&gt;
&lt;p&gt;Lancez la commande &lt;code&gt;abs&lt;/code&gt; pour mettre à jour la liste des
&lt;em&gt;PKGBUILD&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Copiez &lt;em&gt;/var/abs/extra/nvidia/&lt;/em&gt; à un endroit où vous allez préparer
le paquet.&lt;/p&gt;
&lt;p&gt;Vous allez devoir modifier les fichiers &lt;em&gt;PKGBUILD&lt;/em&gt; et
&lt;em&gt;nvidia.install&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Vous aurez besoin de votre version de noyau, obtenue avec &lt;code&gt;uname
-r&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;

~/abs/nvidia$ uname -r
3.6.0+

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;nvidia.install&lt;/h5&gt;
&lt;p&gt;Dans &lt;em&gt;nvidia.install&lt;/em&gt;, remplacez la valeur de &lt;em&gt;EXTRAMODULES&lt;/em&gt;
avec la chaine obtenue avec &lt;code&gt;uname -r&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Par exemple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Valeur originale: &lt;code&gt;EXTRAMODULES='extramodules-3.7-ARCH'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Valeur après remplacement: &lt;code&gt;EXTRAMODULES='3.6.0+'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;PKGBUILD&lt;/h5&gt;
&lt;p&gt;Remplacer la valeur de &lt;em&gt;_extramodules&lt;/em&gt; avec la chaine obtenue par
&lt;code&gt;uname -r&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Il va également surement falloir éditer les dépendances. Je n'ai laissé que
ceci pour &lt;em&gt;depends&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;

depends=()                                                                  
#makedepends=('linux-headers&amp;gt;=3.7' 'linux-headers&amp;lt;3.8')

&lt;/pre&gt;
&lt;p&gt;C'est à dire rien. Les entêtes sont plus sources d'ennuis qu'autre chose, vu
que nous allons utiliser celles de notre kernel (ça peut servir comme
indication si votre kernel est vraiment ancien et qu'il est temps de mettre à
niveau).&lt;/p&gt;
&lt;p&gt;Il y avait bien nvidia-utils, mais nous retrouverions dans la situation dite
de la poule et de l'œuf: lequel installer en premier ? (il semble qu'il
n'y a pas ou plus de dépendance vers le paquet &lt;em&gt;nvidia&lt;/em&gt; lors de
l'installation de &lt;em&gt;nvidia-utils&lt;/em&gt;. Vous pourriez donc le laisser si vous
avez peur d'oublier son installation subséquente.)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;makepkg&lt;/h5&gt;
&lt;p&gt;Et voila, plus qu'à lancer &lt;code&gt;makepkg&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si vous suivez la doc Arch, la victoire semble à portée de main.&lt;/p&gt;
&lt;p&gt;Seulement, la doc Arch est rédigée par d'incurables optimistes vivants dans
une sorte de pays de Cocagne, où les plus beaux jambons sont toujours à portée
de main. Dans notre monde imparfait, pour rester dans l'analogie, vous vous
trouvez au sommet du mat, prêt à vous saisir de la plus belle pièce, quand
soudain vous vous mettez à glisser inexorablement tandis que vos bras battent
frénétiquement et stupidement l'air.&lt;/p&gt;
&lt;p&gt;Adieu veau, vache, jambon et paquet Arch.&lt;/p&gt;
&lt;p&gt;Mais ce n'est pas grave, nous avons l'habitude, et ce n'est que partie
remise. Voyons voir…&lt;/p&gt;
&lt;pre&gt;

==&amp;gt; Starting build()...
cat: /usr/lib/modules/3.6.0+/version: No such file or directory
==&amp;gt; ERROR: A failure occurred in build().
    Aborting...

&lt;/pre&gt;
&lt;p&gt;Ce couillon de &lt;code&gt;makepkg&lt;/code&gt; cherche un fichier nommé
&lt;em&gt;version&lt;/em&gt; qui n'existe pas.&lt;/p&gt;
&lt;p&gt;Voyons voir avec un noyau Arch officiel ce qu'il est censé y trouver…&lt;/p&gt;
&lt;pre&gt;

/usr/lib/modules$ find -name &amp;quot;version&amp;quot;
./extramodules-3.6-ARCH/version
/usr/lib/modules$ cat extramodules-3.6-ARCH/version 
3.6.11-1-ARCH

&lt;/pre&gt;
&lt;p&gt;Ok. Donc &lt;code&gt;uname -r&lt;/code&gt; , one more time. Quelque chose m'échappe dans
cette façon multiple d'acquérir la même information.&lt;/p&gt;
&lt;p&gt;Je pourrais modifier les fichiers de config de &lt;code&gt;makepkg&lt;/code&gt;, mais
autant passer root et faire (dans &lt;em&gt;/usr/lib/modules&lt;/em&gt;) …&lt;/p&gt;
&lt;pre&gt;

/usr/lib/modules# uname -r &amp;gt;$(uname -r)/version

&lt;/pre&gt;
&lt;p&gt;Afin de lui donner ce qu'il désire.&lt;/p&gt;
&lt;p&gt;Voila, nous relançons &lt;code&gt;makepkg&lt;/code&gt; et cette fois-ci, nous obtenons
un beau paquet nommé &lt;em&gt;nvidia-313.18-2-x86_64.pkg.tar.xz&lt;/em&gt; .&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;h5&gt;Module kernel.&lt;/h5&gt;
&lt;p&gt;Je vous quitte un instant, le temps de passer sous une console pour
installer mon paquet tout frais démoulé.&lt;/p&gt;
&lt;p&gt;N'oubliez pas que pour vos paquets hors circuit officiel, il faut utiliser
&lt;em&gt;-U&lt;/em&gt; et non pas le traditionnel &lt;em&gt;-S&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;

~# pacman -U /home/vousmême/abs/nvidia/nvidia-313.18-2-x86_64.pkg.tar.xz

&lt;/pre&gt;
&lt;p&gt;Et voilà.&lt;/p&gt;
&lt;p&gt;Vous aurez peut-être besoin d'enlever les anciens paquets relatifs à nvidia,
selon la façon dont vous massacrâtes votre installation.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La suite de façon classique&lt;/h5&gt;
&lt;p&gt;Vous pouvez continuer de façon conventionnelle avec les paquets officiels
Arch.&lt;/p&gt;
&lt;p&gt;Comme nous avons utilisé une base ABS pour le driver kernel, ceux-ci seront
à niveau.&lt;/p&gt;
&lt;pre&gt;

~# pacman -S vdpau

~# pacman -S nvidia-utils

&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt; ce n'est pas fini! Depuis peu (j'écris ceci en
avril 2013), les libs de &lt;em&gt;nvidia-utils&lt;/em&gt; sont installées dans
&lt;code&gt;/usr/lib/nvidia&lt;/code&gt;. Vos programmes ne vont donc plus les trouver.&lt;/p&gt;
&lt;p&gt;Résistez à l'envie d'ajouter une entrée dans &lt;em&gt;/etc/ld.so.conf&lt;/em&gt;, et
installez plutôt le nouveau paquet : &lt;em&gt;nvidia-libgl&lt;/em&gt;. Il contient
des symlinks vers la libGL ainsi que la libglx.&lt;/p&gt;
&lt;p&gt;Il sera peut-être nécessaire de relancer X ensuite.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;nvidia-utils&lt;/em&gt; n'installe que la partie 64 bits des utilitaires
(libGL et compagnie).&lt;/p&gt;
&lt;p&gt;Pour la partie 32 bits, il vous faut le repo &lt;em&gt;multilib&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Si ce n'est pas déjà fait, décommentez ou ajoutez les lignes suivantes dans
&lt;em&gt;/etc/pacman.conf&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;

[multilib]
Include = /etc/pacman.d/mirrorlist

&lt;/pre&gt;
&lt;p&gt;Et vous pouvez dès lors procéder avec:&lt;/p&gt;
&lt;pre&gt;

pacman -S lib32-nvidia-utils

&lt;/pre&gt;
&lt;p&gt;À vous les jeux proprios compilés pour la couche d'émulation 32 bits
d'Ubuntu. Vous n'avez pas honte ? Mettons que je n'ai rien vu (j'ai
intégré ceci dans la doc uniquement par souci d'exhaustivité).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Un peu de nettoyage&lt;/h3&gt;
&lt;p&gt;Si au cours des installations des paquets le linker (&lt;code&gt;ld&lt;/code&gt;) râle à
propos de bibliothèques dupliquées, il s'agit des scories laissées par
l'installation sauvage des drivers.&lt;/p&gt;
&lt;p&gt;Dans ce cas, il faut noter les noms, et passer un coup de &lt;code&gt;pacman
-Qo&lt;/code&gt; pour trouver quel fichier n'est pas rattaché à un paquet. Pour tous
ces fichiers orphelins, une seule solution: &lt;code&gt;rm&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Normalement, vous devriez vous retrouver à effacer l'intégralité de
&lt;em&gt;/usr/lib64&lt;/em&gt;. À ne pas confondre avec &lt;em&gt;/lib64&lt;/em&gt; qui est aux
dernières nouvelles un alias vers &lt;em&gt;/usr/lib&lt;/em&gt;.Tout comme
&lt;em&gt;/usr/lib64&lt;/em&gt; est un alias vers &lt;em&gt;/usr/lib&lt;/em&gt;. (pour faire court,
toutes les libs sont maintenant dans &lt;em&gt;/usr/lib&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Attention à ne rien effacer sans vérifier auparavant que le fichier ne vient
pas d'un paquet Arch. Il est vrai que tant que vous vous limitez aux fichiers
Nvidia, vous ne risquez pas grand chose (à part lire ce blog depuis
&lt;code&gt;lynx&lt;/code&gt; à votre prochain reboot).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;IgnorePKG dans pacman.conf&lt;/h3&gt;
&lt;p&gt;Pour ne pas avoir à recommencer la manipulation à chaque changement mise à
jour globale (&lt;code&gt;pacman -Su&lt;/code&gt;), vous pouvez mettre ces paquets en
&lt;em&gt;ignore&lt;/em&gt; dans &lt;em&gt;pacman.conf&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;

IgnorePkg   = nvidia nvidia-utils lib32-nvidia-utils 

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Vu de loin, cela semble très bien. En effet, un &lt;code&gt;pacman -Su&lt;/code&gt; va
ignorer toute la partie nvidia, et vous resterez avec vos vieux drivers (de
toutes façons, à part avec une carte très récente, il ne faut pas rêver. Au
bout d'un an, plus rien n'est ajouté pour votre modèle dans le gros blob
nvidia).&lt;/p&gt;
&lt;p&gt;Attention cependant si vous compilez un nouveau noyau perso, et qu'entre
temps un nouveau &lt;em&gt;nvidia-utils&lt;/em&gt; est sorti.&lt;/p&gt;
&lt;p&gt;En effet, dans ce cas vous allez réinstaller votre paquet &lt;em&gt;nvidia&lt;/em&gt;.
Mais le &lt;em&gt;pacman -S nvidia-utils&lt;/em&gt; va ramener une version plus récente du
driver, et vous allez vous retrouver désynchronisé par rapport à votre
désormais obsolète driver kernel.&lt;/p&gt;
&lt;p&gt;Vous pouvez tout mettre à niveau en repackageant un nouveau driver nvidia
correspondant au niveau de version des nvidia-utils.&lt;/p&gt;
&lt;p&gt;Ou encore, vous pouvez réinstaller les anciens paquets (que vous trouverez
mis en cache dans &lt;em&gt;/var/cache/pacman/pkg/&lt;/em&gt;). Vous pouvez installer ces
paquets de la même façon que votre paquet personnel, c'est à dire en utilisant
&lt;em&gt;pacman -U&lt;/em&gt; en lieu et place de &lt;em&gt;pacman -S&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le calme est revenu sur l'ensemble de la distrib&lt;/h3&gt;
&lt;p&gt;Fini la gruikerie.&lt;/p&gt;
&lt;p&gt;Là j'avoue, je l'avais un peu cherché quand même.&lt;/p&gt;
&lt;p&gt;«Il faut savoir reconnaître ses torts afin de taper plus fort sur ceux qui
ne le font pas.» (A. Einstein)&lt;/p&gt;
&lt;p&gt;(ou était-ce Socrate ?)&lt;/p&gt;
&lt;p&gt;(peut-être Napoléon…)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2013/02/04/NVidia%2C-Arch-%3A-un-grand-coup-sur-l-ABS#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2013/02/04/NVidia%2C-Arch-%3A-un-grand-coup-sur-l-ABS#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/718254</wfw:commentRss>
      </item>
    
  <item>
    <title>Installation du diablotin</title>
    <link>http://www.finiderire.com/post/2009/04/01/Installation-du-diablotin</link>
    <guid isPermaLink="false">urn:md5:8a5e9b45f4e657d5a4ecdef304be93df</guid>
    <pubDate>Thu, 20 Dec 2012 19:18:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>FreeBSD</category>
        <category>FreeBSD</category>    
    <description>&lt;p&gt;&lt;em&gt;Vous ne rêvez pas, je monte un serveur en FreeBSD.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Le desktop attendra encore un peu, le temps que Lennart ait transformé tout
l'écosystème Linux en une gigantesque Red Hat.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Je ne compte pas pondre un billet indigeste, et je vais dans un premier
temps me contenter d'une approche prudente de notre candidat
fourchu.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Où trouver des informations&lt;/h3&gt;
&lt;h5&gt;L'indispensable&lt;/h5&gt;
&lt;p&gt;Ce billet n'est qu'un court résumé de l'excellent &lt;em&gt;FreeBSD Handbook&lt;/em&gt;
, disponible gratuitement sur le site de FreeBSD.&lt;/p&gt;
&lt;p&gt;Il est assez épais (plus de 1000 pages), mais du coup assez complet. Sa
lecture est plus que recommandée, mon objectif ici étant principalement de
résumer les particularités de BSD par rapport à Linux.&lt;/p&gt;
&lt;p&gt;Je vous conseille de le lire en anglais, vous aurez la version la plus à
jour.&lt;/p&gt;
&lt;p&gt;Lisez le avant de poser une question sur IRC ou sur les forums. Je sais
qu'on dit ça pour toutes les docs, mais là, vous allez sentir la différence si
vous ne le faites pas.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/index.html&quot;&gt;Cliquez
ici pour la doc html.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;ftp://ftp.freebsd.org/pub/FreeBSD/doc/&quot;&gt;Pour une lecture hors-ligne
ou dans d'autres langues.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le dispensable&lt;/h5&gt;
&lt;p&gt;Si vous voulez un vrai livre en papier, «FreeBSD 7.0, le guide complet» de
Michael W. Lucas (Pearson) est un bon moyen de débuter.&lt;/p&gt;
&lt;p&gt;Il s'agit de la traduction de «Absolute FreeBSD, 2nd edition».&lt;/p&gt;
&lt;p&gt;Le livre est sommairement traduit, mais il se lit malgré tout facilement, et
contient une bonne base pour démarrer facilement.&lt;/p&gt;
&lt;p&gt;La partie technique n'est pas très pointue et ne remplacera pas le handbook.
Par contre, après lecture, vous comprendrez mieux l' «esprit» un peu
particulier de la communauté BSD.&lt;/p&gt;
&lt;p&gt;Attention, ce livre couvre la version 7 de FreeBSD. Il y a eu pas mal de
changements depuis, notamment dans la gestion des packages.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Tester avec le live-cd (pour les méfiants)&lt;/h3&gt;
&lt;p&gt;Vous hésitez encore ? Comme je vous comprends.&lt;/p&gt;
&lt;p&gt;Vous pouvez tester avec un shell à partir du CD. Le choix est proposé après
la séquence de boot (test ou installation).&lt;/p&gt;
&lt;p&gt;Si vous désirez modifier la configuration par défaut, vous aurez besoin de
quelques manipulations. En effet, &lt;code&gt;/etc&lt;/code&gt; n'est pas monté en ram et
reste sur le CD.&lt;/p&gt;
&lt;h5&gt;Ramdisk pour &lt;code&gt;/etc&lt;/code&gt;&lt;/h5&gt;
&lt;p&gt;Par défaut, &lt;code&gt;/etc&lt;/code&gt; est en lecture seule. Cela empêche toute
modification des fichiers de config, notamment le démarrage du dæmon
&lt;code&gt;sshd&lt;/code&gt;. (les clés de la session ne peuvent pas être écrites, et
&lt;code&gt;sshd&lt;/code&gt; ne démarrera donc pas).&lt;/p&gt;
&lt;p&gt;Ceci permet de modifier les fichiers dans /etc en remontant ce répertoire en
ram.&lt;/p&gt;
&lt;pre&gt;

mkdir /tmp/ramdisk
mdmfs -s 256M md10 /tmp/ramdisk
cp -a /etc/* /tmp/ramdisk
umount /dev/md10
mount /dev/md10 /etc

&lt;/pre&gt;
&lt;p&gt;La commande &lt;code&gt;mdmfs&lt;/code&gt; sert à configurer et monter un système de
fichier en RAM. Par défaut ce système de fichiers est formaté en UFS (le
formatage standard FreeBSD).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mdmfs&lt;/code&gt; utilise le driver md (&lt;code&gt;man 4 md&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;On peut tester immédiatement le bon fonctionnement en démarrant le dæmon
&lt;code&gt;sshd&lt;/code&gt;: &lt;code&gt;/etc/rc.d/sshd onestart&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Activer l'interface réseau&lt;/h5&gt;
&lt;p&gt;Maintenant que nous avons lancé &lt;code&gt;sshd&lt;/code&gt;, il est temps d'activer
l'interface réseau.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/rc.d/netif start&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ce qui active sur ma machine les interfaces: &lt;strong&gt;lo0&lt;/strong&gt; et
&lt;strong&gt;em0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dhclient em0&lt;/code&gt; : pour obtenir une IP sur mon interface
ethernet.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installons d'abord (nous réfléchirons ensuite)&lt;/h3&gt;
&lt;h5&gt;Insertion du CD&lt;/h5&gt;
&lt;p&gt;J'ai utilisé l'image d'installation FreeBSD 9.0. Pour la récupérer, je vous
fais confiance, si vous lisez ce blog, vous êtes de grandes personnes.&lt;/p&gt;
&lt;p&gt;Pas grand chose à dire sur l'installation en elle même. Belle interface
ncurses, qui me rappelle ma vieille Slackware, snif. Cela dit, c'est toujours
mieux que la nouvelle «interface» d'installation de Arch. Sans vouloir être
blessant.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Partitionnement&lt;/h5&gt;
&lt;p&gt;J'ai utilisé le partitionnement automatique, qui m'a paru très bien. À part
vouloir partager le disque entre plusieurs OS, vous ne devriez pas avoir besoin
de faire un partitionnement manuel.&lt;/p&gt;
&lt;p&gt;À noter que le partitionnement automatique utilise GPT à la place de MBR.
Vous ne devrez donc surtout pas pas utiliser &lt;code&gt;fdisk&lt;/code&gt; pour gérer
votre disque, mais bien &lt;code&gt;gpart&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Voici le schéma de partitionnement, choisi automatiquement par
l'installateur:&lt;/p&gt;
&lt;pre&gt;

ada0 232GB GPT
  ada0p1   64Kb (freebsd-boot)
  ada0p2  228Gb (freebsd-ufs)  /
  ada0p3    4Gb (freebsd-swap) none

&lt;/pre&gt;
&lt;p&gt;Vous allez lire ici et là de longues dissertations sur un partitionnement
très pointu, avec une partitions pour &lt;em&gt;/usr&lt;/em&gt;, une pour &lt;em&gt;/var&lt;/em&gt;,
une pour &lt;em&gt;/tmp&lt;/em&gt; (voire même celle-ci montée en ram), une cuillère pour
&lt;em&gt;/papa&lt;/em&gt; … ASSEZ ! Mettez tout sur la même partition, et montez
éventuellement d'autres disques à partir de votre root.&lt;/p&gt;
&lt;p&gt;Cela dit, vous faites comme vous voulez, mais ce n'est pas la peine de se
compliquer inutilement la vie, les difficultés viendront bien assez vite. De
toutes façons, à part ventiler les données volumineuses sur plusieurs disques
(à l'époque où le tera-octet coûte 50€ ?), cela n'a aucun intérêt. Quand un
disque claque, ce n'est pas avoir créé plein de partitions dessus qui servira à
quoi que ce soit. Monter un RAID me parait plus judicieux (couplé bien entendu
à des sauvegardes régulières et dans les rêgles de lard GRUIIIIIK!)&lt;/p&gt;
&lt;p&gt;Et maintenant, quelques mots à propos du partitionnement sauce FreeBSD.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nom des disques&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;da&lt;/em&gt; = disque dur &lt;code&gt;scsi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;ad&lt;/em&gt; = disque dur &lt;code&gt;atapi&lt;/code&gt; ou &lt;code&gt;sata&lt;/code&gt;
(contrairement à Linux où le SATA est nommé comme du SCSI).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;ada&lt;/em&gt; = disque dur &lt;code&gt;sata&lt;/code&gt; (avec le nouveau driver).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Système de fichier&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sur FreeBSD 9, le système de fichiers par défaut est &lt;em&gt;ufs2&lt;/em&gt;.
&lt;code&gt;newfs&lt;/code&gt; sert à créer des systèmes de fichier.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Vocabulaire spécifique aux partitions en MBR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;slice&lt;/em&gt; = c'est une partition au sens habituel (MS-Windows,
Linux).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;partition&lt;/em&gt; = c'est un segment dans la &lt;em&gt;slice&lt;/em&gt; BSD.&lt;/p&gt;
&lt;p&gt;Exemples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;ada0s1&lt;/em&gt; : premier disque dur, première partition primaire. Pas
de numéro de partition, c'est donc un formatage MS-Windows ou Linux (si
MS-Windows, surement le &lt;em&gt;C:&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;ada0s5&lt;/em&gt; : premier disque dur, première partition logique dans
la partition étendue. Pas de numéro de partition, donc c'est un formatage
MS-Windows ou Linux.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;ada0s1a&lt;/em&gt; : premier disque dur, première partition primaire,
premier segment dans cette partition (&lt;em&gt;&lt;q&gt;s1&lt;/q&gt;&lt;/em&gt; est le slice,
&lt;em&gt;&lt;q&gt;a&lt;/q&gt;&lt;/em&gt; est le numéro de partition au sens BSD).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Vocabulaire spécifique aux partitions en GPT&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En partitionnement GPT, tout est beaucoup plus simple: la limitation MBR à
quatre partitions primaires n'existe plus.&lt;/p&gt;
&lt;p&gt;Nous avons droit à 128 slices par disque, ce qui devrait suffire à tout le
monde.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;À table&lt;/h5&gt;
&lt;p&gt;Ensuite, vous sélectionnez les groupes de paquets que vous désirez
installer, et c'est parti. Comme il n'y a plus rien à faire avant un certain
temps, vous pouvez vaquer à vos occupations.&lt;/p&gt;
&lt;p&gt;(un peu plus tard)&lt;/p&gt;
&lt;p&gt;Et voilà, c'est installé. Plus qu'à choisir un mot de passe pour root,
configurer son/ses interface(s) réseau, et reboot.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Particularités à connaître (ou: «fini Linux, fiston»)&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Déplacement dans le buffer d'une console.&lt;/h5&gt;
&lt;p&gt;Le déplacement dans un buffer n'utilise pas &lt;q&gt;shift+PageUp/Down&lt;/q&gt;, comme
sous Linux.&lt;/p&gt;
&lt;p&gt;À la place, utilisez &lt;strong&gt;Arrêt Défil&lt;/strong&gt; , qui activera le
défilement de l'affichage.&lt;/p&gt;
&lt;p&gt;Les touches du curseur, ou PageUp / PageDown assureront le déplacement dans
le buffer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Arrêt Défil&lt;/strong&gt; à nouveau pour revenir dans le mode normal.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ordre des paramètres.&lt;/h5&gt;
&lt;p&gt;Sous BSD, l'ordre des paramètres est important. Ils suivent directement la
commande.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ls / -lha&lt;/em&gt; fonctionnait sous Linux, mais pas sous BSD.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ls -lha /&lt;/em&gt; fonctionnera partout (oh non, nous allons devoir réécrire
tous nos scripts!)&lt;/p&gt;
&lt;p&gt;Notez que &lt;code&gt;find&lt;/code&gt; garde son comportement : les paramètres se
trouveront toujours à la fin, et ne suivront pas la commande.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Clavier en français sous la console&lt;/h5&gt;
&lt;p&gt;Il faut utiliser les &lt;em&gt;capabilities&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Éditer le fichier /etc/login.conf et ajouter:&lt;/p&gt;
&lt;pre&gt;

    french|French Users Accounts:\
    :charset=UTF-8:\
    :lang=fr_FR.UTF-8:\
    :tc=default:

&lt;/pre&gt;
&lt;p&gt;Ce fichier doit être hashé pour être reconnu par le système. On procède
ainsi (en root):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cap_mkdb /etc/login.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Une fois la «capabilitie» ajoutée, il faut la préciser dans le fichier
password.&lt;/p&gt;
&lt;p&gt;Pour éditer ce fichier, il faut utiliser la commande &lt;code&gt;vipw&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ajoutez le nom de la «capabilitie» après les informations de groupe&lt;/p&gt;
&lt;p&gt;jseb:$rTfM1337a$42Lee7WtF666B0fH.:1001:1001:&lt;strong&gt;french&lt;/strong&gt;:0:0:User
&amp;amp;:/home/jseb:/bin/tcsh&lt;/p&gt;
&lt;p&gt;Et pour ne plus avoir à le faire pour les autres utilisateurs, on peut
parait-il ajouter dans &lt;em&gt;/etc/adduser.conf&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;defaultclass = french&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ceci n'a pas fonctionné sur mon système et les nouveaux utilisateurs doivent
toujours être ajoutés dans le groupe «french» avec vipw. Peut-être un paramètre
à préciser à &lt;code&gt;adduser&lt;/code&gt;, une lecture sommaire de la page man dédiée
ne m'en a pas appris plus. Ayant très peu d'utilisateurs sur mes machines,
j'avoue ne pas avoir cherché plus loin.&lt;/p&gt;
&lt;p&gt;Si vous ne l'avez pas déjà fait à l'installation, précisez dans
&lt;code&gt;rc.conf&lt;/code&gt; la disposition du clavier:&lt;/p&gt;
&lt;pre&gt;

keymap=&amp;quot;fr.iso.acc.kbd&amp;quot;

&lt;/pre&gt;
&lt;p&gt;Et pour avoir changer la disposition clavier de façon ponctuelle:
&lt;code&gt;kbdcontrol -l fr.iso.acc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Particularités de tcsh&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Avoir &lt;code&gt;less&lt;/code&gt; comme pager&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Par défaut, les pages man sont lues avec &lt;code&gt;more&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;more&lt;/code&gt; sous FreeBSD permet d'avancer, de reculer, mais quitte à
la fin. Ahah! Démasqué! C'est un &lt;code&gt;less&lt;/code&gt; en mode compatibilité avec
&lt;code&gt;more&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il suffit donc de changer la variable d'environnement &lt;em&gt;PAGER&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Oubliez &lt;code&gt;export&lt;/code&gt; , le shell par défaut est &lt;code&gt;tcsh&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;set&lt;/code&gt; ne vous aidera pas beaucoup non plus.&lt;/p&gt;
&lt;p&gt;La bonne méthode est &lt;code&gt;setenv PAGER less&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Un prompt qui ressemble à quelque chose&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;

set prompt=&amp;quot;%n@%/%# &amp;quot;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;De la couleur avec ls&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rajouter dans &lt;code&gt;~/.cshrc&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;

setenv CLICOLOR yes
setenv LSCOLORS &amp;quot;GeHxcxdxgxegedabagacad&amp;quot;

&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;man csh&lt;/code&gt; pour les codes couleurs de LSCOLORS. Pour colorier par
extension, il vous faudra la version GNU de &lt;code&gt;ls&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Avoir une touche DELETE qui supprime&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rajouter dans &lt;code&gt;~/.cshrc&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;

bindkey &amp;quot;\e[3~&amp;quot; delete-char

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Changer de shell&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vous êtes allergique à &lt;em&gt;tcsh/csh&lt;/em&gt;, et vous voulez revenir à cette
vieille daube de &lt;em&gt;bash&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pourquoi ne pas faire une tentative avec &lt;em&gt;zsh&lt;/em&gt; ? Quoi qu'il en
soit, voici de quoi changer de coquille.&lt;/p&gt;
&lt;p&gt;Attention au changement de shell pour le compte root ! (ceci ne
concerne que les afficionados des partitions multiples).&lt;/p&gt;
&lt;p&gt;Si le shell de remplacement se trouve dans &lt;em&gt;/usr&lt;/em&gt;, il y a un risque.
En cas de problème, si &lt;em&gt;/usr&lt;/em&gt; ne se trouve pas sur la partition racine,
root ne pourra pas se logger!&lt;/p&gt;
&lt;p&gt;Cela étant, vous avez deux méthodes pour changer de shell&lt;/p&gt;
&lt;p&gt;(dans tous les cas, vous devriez autoriser votre shell dans le fichier
&lt;em&gt;/etc/shells&lt;/em&gt; )&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lancer &lt;strong&gt;chsh&lt;/strong&gt; . Ex: &lt;code&gt;chsh -s /usr/local/bin/bash
root&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ou&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'invoquer depuis le fichier &lt;strong&gt;.cshrc&lt;/strong&gt; . &lt;em&gt;csh&lt;/em&gt; est le
shell par défaut, il se lancera et invoquera ensuite le shell désiré.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Connaître son système&lt;/h5&gt;
&lt;p&gt;Vous avez toute une panoplie de commandes pour avoir des renseignements sur
votre système.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uname -a&lt;/code&gt; : version et release de votre FreeBSD.
&lt;ul&gt;
&lt;li&gt;voir également &lt;code&gt;/var/run/dmesg.boot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dmesg&lt;/code&gt; : messages du noyau (donc matériel detecté au boot
et drivers chargés).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;env&lt;/code&gt; / &lt;code&gt;setenv&lt;/code&gt; : vos variables d'environnement
pour le shell.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kenv&lt;/code&gt; : afficher les paramètres du kernel en cours
d'exécution.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;systat&lt;/code&gt; : vous permet de collecter des informations sur la
charge système, les processus, les interfaces réseaux. C'est très puissant (
&lt;code&gt;man systat&lt;/code&gt; ).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Mise à jour du système&lt;/h3&gt;
&lt;p&gt;Après une installation depuis un media un peu ancien (version 9.0 pour ma
part), il peut être souhaitable (voire nécessaire) de procéder immédiatement à
un upgrade du système.&lt;/p&gt;
&lt;p&gt;Les upgrades système ne font pas appel aux commandes de gestion des paquets,
et sont donc à part.&lt;/p&gt;
&lt;p&gt;Il faut utiliser &lt;code&gt;freebsd-update&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Cette commande permet de faire une mise à jour binaire (pas de sources
nécessaires).&lt;/p&gt;
&lt;p&gt;Il est également possible de faire une mise à jour à partir des sources,
mais cela semble moins évident (voir &lt;code&gt;make world&lt;/code&gt; dans le handbook,
mais cette méthode semble largement dépréciée).&lt;/p&gt;
&lt;p&gt;À noter que si vous n'êtes pas dans votre bac à sable, il est plus prudent
de faire une sauvegarde entière du système avant de vous lancer dans ce genre
de mise à jour.&lt;/p&gt;
&lt;pre&gt;

freebsd-update fetch install

&lt;/pre&gt;
&lt;p&gt;Cette commande fait les mises à jour pour la release installée (9.0 pour
moi).&lt;/p&gt;
&lt;p&gt;Elle récupère (&lt;em&gt;fetch&lt;/em&gt;) les mises à jour et les installe dans la
foulée. Vous pourriez bien sûr le faire en deux étapes (fetch, puis
install).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;

freebsd-update upgrade -r 9.1-RC1
freebsd-update install
shutdown -r now
freebsd-update install #cette fois, pour userland
shutdown -r now #c'est pas vrai, faut encore rebooter ?!

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Cette série de commande change de release. Attention, à l'heure où j'écris
cela, la 9.1 est encore expérimentale, comme en témoignent les lettres «RC»
(&lt;em&gt;release candidate&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;À part ça, il semble qu'il faille rebooter deux fois.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;

freebsd-update IDS

&lt;/pre&gt;
&lt;p&gt;Cette commande récupère un fichier de checksums sur un serveur officiel
(c'est souhaitable), et vérifie que les fichiers du système correspondent. Très
cool pour vérifier que vous n'êtes pas rooté.&lt;/p&gt;
&lt;p&gt;Bien entendu, dans la configuration de base, les fichiers que vous avez
modifié vont générer une alerte.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Troubeulchoutine&lt;/h3&gt;
&lt;h5&gt;root et password&lt;/h5&gt;
&lt;p&gt;Vous voulez changer le password de root, utilisez la commande
&lt;q&gt;passwd&lt;/q&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;N'utilisez pas&lt;/strong&gt; &lt;q&gt;chpass&lt;/q&gt; pour éditer le mot de passe!
Le champs &lt;em&gt;Password&lt;/em&gt; attend un hash, et non pas un mot de passe en
clair! Vous ne pourriez plus vous relogger en root.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mot de passe root perdu&lt;/h5&gt;
&lt;p&gt;Booter en &lt;em&gt;single user&lt;/em&gt; (menu 4 du boot pour FreeBSD 7.1)&lt;/p&gt;
&lt;p&gt;Remounter la partition racine en RW : &lt;code&gt;mount -u /&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Mounter tous les systèmes de fichiers: &lt;code&gt;mount -a&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Lancer la commande &lt;em&gt;passwd root&lt;/em&gt; et entrez votre nouveau mot de
passe.&lt;/p&gt;
&lt;p&gt;Rebootez.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Alors, ils mangent des enfants chez #freebsd ?&lt;/h3&gt;
&lt;p&gt;Si vous avez bien lu la doc, vous serez bien accueilli, et vous obtiendrez
une réponse à vos légitimes questions de Linuxien.&lt;/p&gt;
&lt;p&gt;La prochaine fois, je vous parle de la gestion des paquets. Croyez-moi, cela
vaut bien un billet à part.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2009/04/01/Installation-du-diablotin#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2009/04/01/Installation-du-diablotin#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/383539</wfw:commentRss>
      </item>
    
  <item>
    <title>SSD - nouveau disque, nouveaux problèmes</title>
    <link>http://www.finiderire.com/post/2011/11/29/SSD-nouveau-disque%2C-nouveaux-probl%C3%A8mes</link>
    <guid isPermaLink="false">urn:md5:441db11750b036405b5cc7f360ba28bf</guid>
    <pubDate>Sun, 24 Jun 2012 17:01:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;br /&gt;
&lt;em&gt;Je suis depuis peu l'heureux utilisateur d'un portable équipé d'un disque
SSD.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Voici comment l'utiliser avec Linux de façon optimale.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Les manipulations se feront depuis une Arch.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;GPT et UEFI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT&lt;/strong&gt; : remplace le partitionnement classique avec MBR
(limite: 4 partitions).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UEFI&lt;/strong&gt; : remplace ou complète (selon les constructeurs)
le BIOS. Même principe, plus de fonctionnalités (y compris de vous interdire
l'accès à votre machine au boot).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Mais j'ai déjà installé Linux !&lt;/h3&gt;
&lt;h5&gt;Snif, format et réinstalle ?&lt;/h5&gt;
&lt;p&gt;Mais non, on peut s'en tirer. Et on va en profiter pour taper quelques
commandes pas forcément disponibles à l'installation.&lt;/p&gt;
&lt;p&gt;D'un autre côté, nous n'aurions pas eu besoin de taper ces commandes pour
préparer un disque vierge.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Identification du hardware&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lshw&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
J'en profite pour ouvrir une parenthèse et parler d'un paramètre de
&lt;code&gt;lspci&lt;/code&gt; qui permet de connaître les modules rattachés à un
device:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lspci -k&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Sauver ce qui a déjà été installé à l'aide d'une clé usb&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Clé usb montée sur &lt;em&gt;/mnt/clef&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Disque remonté sur &lt;em&gt;/mnt/disk&lt;/em&gt; (cf plus bas)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#~ mount -o bind / /mnt/disk
#~ tar czpCf /mnt/disk /mnt/clef/mondisque.tar.gz .

&lt;/pre&gt;
&lt;p&gt;Explications du tar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;czp&lt;/strong&gt; : &lt;strong&gt;c&lt;/strong&gt;réer l'archive,
comprime&lt;strong&gt;z&lt;/strong&gt; les données, &lt;strong&gt;p&lt;/strong&gt;réserver les
permissions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cf /mnt/disk&lt;/strong&gt; : &lt;strong&gt;C&lt;/strong&gt; permet de chrooter
sur le répertoire /mnt/disk (on restaurera ainsi /sbin et non pas
/mnt/disk/sbin).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;/mnt/clef/mondisque.tar.gz&lt;/strong&gt; : archive à créer
(argument du flag &lt;strong&gt;-f&lt;/strong&gt; vu ci dessus et indiqué au dessus pour
des raisons de lisibilité, alors qu'il serait mieux à côté de cette option,
mais avec &lt;code&gt;tar&lt;/code&gt; on ne fait pas toujours ce que l'on veut.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.&lt;/strong&gt; : partir de /mnt/disk&lt;/li&gt;
&lt;li&gt;Si vous avez de la place sur la clé usb, enlevez le flag
&lt;strong&gt;-z&lt;/strong&gt; , la copie sera dix fois plus rapide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et voila, si vous aviez installé un Linux, vous voila prêt pour tout effacer
et le récupérer rapidement ensuite.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Partitionnement avec gptfdisk&lt;/h3&gt;
&lt;h5&gt;Le GPT, qu'est-ce donc ?&lt;/h5&gt;
&lt;p&gt;GPT remplace le MBR.&lt;/p&gt;
&lt;p&gt;Il y a en plus des subtilités selon que votre carte mère a un bios classique
ou le support UEFI.&lt;/p&gt;
&lt;p&gt;Les cartes mères récentes n'ont plus de BIOS, mais un UEFI («support
firmware étendu») qui remplace celui-ci, avec les mêmes missions.&lt;/p&gt;
&lt;h5&gt;Préparation des outils&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Boot sur un media d'installation&lt;/li&gt;
&lt;li&gt;Activer le réseau. Au hasard: &lt;code&gt;dhcpcd eth0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mettre à jour la liste des paquets: &lt;code&gt;pacman -Sy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Charger &lt;em&gt;gptfdisk&lt;/em&gt;, pour le partitionnement: &lt;code&gt;pacman -S
gptfdisk&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Avec une distrib récente, &lt;em&gt;gptfdisk&lt;/em&gt; sera présent sur le media
d'installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Schéma de partitionnement et boot futur&lt;/h5&gt;
&lt;p&gt;Nous sommes obligés d'abandonner grub qui ne supporte pas le partitionnement
gpt.&lt;/p&gt;
&lt;p&gt;Pour ma part, j'ai choisi &lt;em&gt;grub2&lt;/em&gt;, qui m'a l'air d'être le choix le
moins pire.&lt;/p&gt;
&lt;p&gt;Les bios non-UEFI nécessitent la création d'une partition de 2 Mo au début
du disque.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cette partition sera utilisée par grub2 pour stocker des informations.&lt;/li&gt;
&lt;li&gt;Le Dell 6420 a l'air d'avoir un firmware bâtard, entre le bios et l'uefi.
Dans le doute, et après avoir lu des choses très méchantes sur son support
optimus+uefi, j'ai activé l'option &lt;em&gt;legacy&lt;/em&gt;. J'ai donc créé la partition
nécessaire à grub2.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attention, car avec un partitionnement GPT utilisé &lt;strong&gt;sans&lt;/strong&gt;
UEFI, vous ne pourrez plus installer un MS-Windows sans grosses bidouilles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il vous faudra rajouter des partitions dans le mbr (cela s'appelle un
&lt;em&gt;hybrid mbr&lt;/em&gt; quand c'est utilisé en parallèle avec le gpt).&lt;/li&gt;
&lt;li&gt;http://www.rodsbooks.com/gdisk/hybrid.html&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Utilisation de gdisk&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;A conventional GPT disk contains a protective MBR with a single partition,
of type 0xEE (EFI GPT), defined. This partition spans the entire size of the
disk or 2 TiB, whichever is smaller. The intent is to keep GPT-unaware OSes and
utilities from trying to modify the disk.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gdisk&lt;/code&gt; remplace &lt;code&gt;fdisk&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lancez &lt;code&gt;gdisk&lt;/code&gt; sur votre device (ex: &lt;em&gt;/dev/sda&lt;/em&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si votre disque est au format MBR (livré partitionné à l'ancienne), une
conversion automatique sera appliquée.&lt;/li&gt;
&lt;li&gt;Vous devez valider la conversion (avec &lt;strong&gt;w&lt;/strong&gt;) et quitter.&lt;/li&gt;
&lt;li&gt;Sinon, vous pouvez créer une nouvelle table de partition GPT avec la
commande &lt;strong&gt;o&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ensuite, vous pouvez commencer à créer des partitions avec
&lt;strong&gt;n&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nous commençons par la partition de 2 Mo, réservée à &lt;em&gt;grub2&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cette partition ne doit pas forcément être la première, mais elle doit se
trouver sous les deux premiers téraoctets (ce qui nous laisse un peu de marge
pour les disques SSD).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;numéro de partition : &lt;strong&gt;1&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Premier secteur : validez, l'alignement sera automatique.&lt;/li&gt;
&lt;li&gt;Dernier secteur : &lt;strong&gt;+2M&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Hex code ou GUID : &lt;strong&gt;EF02&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ensuite, partition Linux (data)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Même principe que ci-dessus.&lt;/li&gt;
&lt;li&gt;Hex code : &lt;strong&gt;8300&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et enfin, partition swap pour l'hibernation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hex code : &lt;strong&gt;8200&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est fini. On écrit les modifications et on quitte.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;w&lt;/strong&gt; (pour ceux qui n'ont pas suivi)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voilà, il ne reste plus qu'à formater les partitions à la manière habituelle
(&lt;code&gt;mkfs.ext4 /dev/sda2 -L linux_root&lt;/code&gt; par exemple).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Support Kernel de GPT&lt;/h5&gt;
&lt;p&gt;Si vous compilez vos noyaux vous-même, vous aurez besoin d'activer cette
option:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FS/Partitions : cocher &lt;em&gt;PARTITION_ADVANCED&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Une fois cette option activée, choisissez : &lt;em&gt;EFI GUID Partition
support&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans le cas contraire, vous allez vous taper un kernel panic lors du mount
de votre partition Linux.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le Kernel Panic indiquera qu'il n'a trouvé que &lt;q&gt;sda1&lt;/q&gt; (si vous n'avez
qu'un disque, sinon ça sera un autre device bien sûr).&lt;/li&gt;
&lt;li&gt;Ce device correspond en réalité à l'unique partition visible sous le
système de partitionnement MBR (en d'autres termes, sda1 est la partition de
protection MBR créée par GPT).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation et configuration de GRUB2&lt;/h3&gt;
&lt;p&gt;Avec la partition linux ssd sur : &lt;code&gt;mount /dev/sda2
/mnt/dest&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;

# modprobe dm-mod
# mount -o bind /dev /mnt/dest/dev
# mount -t proc /proc /mnt/dest/proc
# mount -t sysfs /sys /mnt/dest/sys
# chroot /mnt/dst bash
# pacman -Sy
# pacman -S grub2-bios
# tar cpzf vieux_grub.tar.gz /boot/grub 
# mv /boot/grub /boot/vieuxgrub
# grub_bios-install --boot-directory=/boot --no-floppy --recheck /dev/sda
# grub-menulst2cfg /boot/vieuxgrub/menu.lst.pacsave /boot/grub/grub.cfg

&lt;/pre&gt;
&lt;p&gt;Le module &lt;em&gt;dm_mod&lt;/em&gt; (device mapper) a l'air requis.&lt;/p&gt;
&lt;p&gt;Sans lui, &lt;em&gt;grub-probe&lt;/em&gt; semble avoir du mal à détecter les disques et
les partitions. Il est nécessaire de le charger &lt;strong&gt;avant&lt;/strong&gt; le
chroot.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Sauf que ça ne boote pas&lt;/h5&gt;
&lt;p&gt;Cette commande est insuffisante&lt;/p&gt;
&lt;pre&gt;

# grub-menulst2cfg /boot/vieuxgrub/menu.lst.pacsave /boot/grub/grub.cfg

&lt;/pre&gt;
&lt;p&gt;En effet, mes partitions sont décalées depuis la création de la première
(dédiée à grub).&lt;/p&gt;
&lt;p&gt;On peut tester l'ajustement des indices avec l'option &lt;strong&gt;e&lt;/strong&gt;
depuis grub, au boot.&lt;/p&gt;
&lt;p&gt;Ensuite, il convient bien sûr de modifier de façon permanente
&lt;em&gt;/boot/grub/menu.cfg&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
J'ai également eu un problème de nommage des partitions. n'avais pas mis le
même label quand je les ai recréées.&lt;/p&gt;
&lt;p&gt;Il suffit de les renommer:&lt;/p&gt;
&lt;pre&gt;

# e2label /dev/sda2 arch_root
# mkswap /dev/sda3 -L arch_swap

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Support du TRIM&lt;/h3&gt;
&lt;pre&gt;

tune2fs -o discard /dev/sda2

&lt;/pre&gt;
&lt;p&gt;Vous pouvez également le préciser dans &lt;em&gt;/etc/fstab&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;notez le flag &lt;em&gt;discard&lt;/em&gt; dans les options de montage de la partition
&lt;em&gt;arch_root&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;le flag &lt;em&gt;noatime&lt;/em&gt; est expliqué juste en dessous, un peu de
patience…&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

LABEL=arch_root / ext4 defaults,noatime,discard 0 1
LABEL=arch_swap swap swap defaults 0 0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Astuces diverses&lt;/h3&gt;
&lt;h5&gt;L'option de montage &lt;em&gt;noatime&lt;/em&gt;&lt;/h5&gt;
&lt;p&gt;Dans /etc/fstab :&lt;/p&gt;
&lt;pre&gt;

/dev/sda2 /home ext4 defaults,noatime,discard 0 1

&lt;/pre&gt;
&lt;p&gt;Notez l'utilisation judicieuse de &lt;em&gt;discard&lt;/em&gt;, déja évoqué ci-dessus
(pédagogie, répétition inutile ou boucle infinie dans les explications ?
Je vous laisse seuls juges).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ramdisk pour /tmp&lt;/h5&gt;
&lt;p&gt;Certaines sources vous conseillent de faire un ramdisk pour y monter
&lt;em&gt;/tmp&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ce n'est pas très avisé, car &lt;em&gt;/tmp&lt;/em&gt; n'a pas une taille prévisible. On
peut y trouver aussi bien quelques fichiers de 10Ko que la grosse archive de
4Go que vous êtes en train de déplier avec midnight-commander.&lt;/p&gt;
&lt;p&gt;À moins d'avoir vraiment beaucoup de ram, ce n'est donc pas conseillé.&lt;/p&gt;
&lt;p&gt;Maintenant que vous voila prévenus, voici comment opérer:&lt;/p&gt;
&lt;pre&gt;

none    /tmp    tmpfs   nodev,nosuid,noatime,size=768M,mode=1777        0       0

&lt;/pre&gt;
&lt;p&gt;À noter qu'il me semble que l'installation de base Arch propose une ligne de
ce style dans son &lt;em&gt;/etc/fstab&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Compiler en ram&lt;/h5&gt;
&lt;p&gt;Il est tentant, mais dangereux de compiler dans un ramdisk.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tentant, pour les temps d'accès rapides.&lt;/li&gt;
&lt;li&gt;dangereux, car c'est un coup à perdre toutes ses sources en cas de plantage
de la machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On peut décider de transiger, et de ne placer que certains fichiers dans le
ramdisk.&lt;/p&gt;
&lt;p&gt;Pour ma part, il s'agit des fichiers &lt;em&gt;.gch&lt;/em&gt;, qui correspondent à la
précompilation des fichiers includes par gcc.&lt;/p&gt;
&lt;p&gt;En C++ notamment, la lecture des fichiers include peut prendre un temps non
négligeable (ce point a déja été abordé dans un autre billet, disponible dans
la même collection chez les meilleurs fournisseurs d'accès).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Il n'est quand même pas bien gros ce disque&lt;/h3&gt;
&lt;h5&gt;L'espace s'étiole&lt;/h5&gt;
&lt;p&gt;Le principal inconvénient du SSD vient de son prix au gigaoctet.&lt;/p&gt;
&lt;p&gt;Vu les capacités, on ne gaspille pas.&lt;/p&gt;
&lt;p&gt;Or, un &lt;code&gt;df -h /&lt;/code&gt; après l'installation des choses essentielles
apporte son lot d'interrogations:&lt;/p&gt;
&lt;pre&gt;

~$ df -h /
Sys. fich.     Taille Util. Dispo Uti% Monté sur
/dev/root        231G  4,2G  215G   2% /

&lt;/pre&gt;
&lt;p&gt;Un rapide calcul mental nous confirme que 231-4.2 devrait être plus proche
de 227 que des 215 affichés.&lt;/p&gt;
&lt;p&gt;Diantre, 12Go de perdus, mais que se passe t-il ?!&lt;/p&gt;
&lt;p&gt;Journalisation, inodes, arrondissement des clusters... toutes les hypothèses
défilent dans notre esprit perplexe.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Bon alors c'est le journal et les inodes ?&lt;/h5&gt;
&lt;pre&gt;

~# dumpe2fs /dev/sda2
dumpe2fs 1.41.14 (22-Dec-2010)
Filesystem volume name:   arch_root
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Default mount options:    discard
Filesystem state:         clean
Filesystem OS type:       Linux
Inode count:              15335424
Block count:              61341696
Reserved block count:     3067084
Free blocks:              59292798
Free inodes:              15165485
First block:              0
Block size:               4096
Inode size:               256
Taille du journal:         128M

&lt;/pre&gt;
&lt;p&gt;Je me suis permis de couper un peu la sortie.&lt;/p&gt;
&lt;p&gt;Si on calcule la place &lt;strong&gt;maximale&lt;/strong&gt; nécessaire à la gestion du
disque (journal + inodes), on obtient:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(128×1024×1024) + (15335424 * 256) = 134217128 + 3 925 868 544 = environ 4
Go.&lt;/li&gt;
&lt;li&gt;Donc potentiellement, on n'aura jamais plus que (231-4) Go utilisables sur
le disque, dans l'éventualité où tous les inodes sont occupés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je refais le calcul avec les inodes occupés actuellement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour connaître le nombre d'inodes occupés, on peut bien sûr faire &lt;em&gt;Inode
count&lt;/em&gt; moins &lt;em&gt;Free inodes&lt;/em&gt;. On peut aussi utiliser la commande:
&lt;code&gt;df -i&lt;/code&gt; et regarder la colonne &lt;em&gt;IUsed&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# df -i /
Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/root      15335424 169465 15165959    2% /

&lt;/pre&gt;
&lt;p&gt;Multiplions ce nombre par la place prise par un inode, et ajoutons la place
prise par le journal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour les valeurs ci-dessus, ce sont &lt;strong&gt;169 mo&lt;/strong&gt; qui
disparaissent pour les besoins de la gestion de la partition.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le journal et les inodes ne gonflent pas l'occupation de manière
déraisonnable.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Où sont donc passés les giga restants, et qui est le vrai
coupable ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sachant que &lt;code&gt;df&lt;/code&gt; tient compte de l'arrondi des clusters (la
taille de tout fichier est arrondie au multiple de &lt;em&gt;block size&lt;/em&gt; le plus
proche), cette hypothèse est également fausse.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;&amp;lt;balance&amp;gt;C'est root le coupable !&amp;lt;/balance&amp;gt;&lt;/h5&gt;
&lt;p&gt;Le coupable ne peut rester plus longtemps ignoré.&lt;/p&gt;
&lt;p&gt;Et quand je parle de root, je ne parle pas de ce slash innocent à la base de
votre arborescence, mais bien de la forme de vie carbonée assise devant l'écran
et lisant cet article.&lt;/p&gt;
&lt;p&gt;Oui, vous: root , et je le prouve.&lt;/p&gt;
&lt;p&gt;Regardez cette ligne:&lt;/p&gt;
&lt;pre&gt;

Reserved block count:     3067084

&lt;/pre&gt;
&lt;p&gt;En multipliant cette valeur par la taille d'un bloc (4096), nous obtenons
12562776064.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Soit pas loin de &lt;strong&gt;12 Go&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Le voila, notre espace &lt;q&gt;perdu&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La valeur &lt;em&gt;reserved block count&lt;/em&gt; correspond à un espace alloué
uniquement pour les besoins de root.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ainsi, même si les utilisateurs ne peuvent plus remplir le disque, on ne se
retrouve pas dans une situation difficile où même root ne peut plus
intervenir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cela étant dit… combien de personnes utilisent ce portable déja… ah oui je
me souviens, c'est moi.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Fini de trimer&lt;/h3&gt;
&lt;p&gt;À ce stade, il ne devrait pas y avoir grand choses de plus à faire pour
assurer la bonne marche du SSD.&lt;/p&gt;
&lt;p&gt;Vous pouvez maintenant profiter de taux de transferts et de temps d'accès
proprements ahurissants. Du moins, pour ceux d'entre-vous qui ne sont pas déja
blasés et partis sur autre chose à configurer…&lt;/p&gt;
&lt;p&gt;…Optimus par exemple. Mais ceci est une autre histoire.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2011/11/29/SSD-nouveau-disque%2C-nouveaux-probl%C3%A8mes#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2011/11/29/SSD-nouveau-disque%2C-nouveaux-probl%C3%A8mes#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/652553</wfw:commentRss>
      </item>
    
  <item>
    <title>D'un Z qui veut dire Z80</title>
    <link>http://www.finiderire.com/post/2012/05/10/D-un-Z-qui-veut-dire-Z80</link>
    <guid isPermaLink="false">urn:md5:fa0452b33d18575a34113d86602994e6</guid>
    <pubDate>Mon, 21 May 2012 22:48:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>détente</category><category>msx</category>    
    <description>&lt;p&gt;&lt;em&gt;Les outils GNU sont d'une richesse insoupçonnée. J'en veux pour preuve
l'amateur de vieux micros qui va trouver avec eux tous les outils nécessaires à
un développement serein.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Notez que je prends pour exemple le MSX, mais les principes sont aisément
transposables.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Avertissement&lt;/h3&gt;
&lt;p&gt;Lorsque j'ai écrit ce billet, je me suis posé la question de son contenu. En
effet, il reprenait mes notes, et donc mes différents essais.&lt;/p&gt;
&lt;p&gt;Fallait-il tout reprendre afin de garder le cheminement original ? Ou
risquais-je de perdre le lecteur en route ? Un billet synthétique qui va
droit à la solution, ou des techniques inutiles ici, mais qui pourront
reservir ?&lt;/p&gt;
&lt;p&gt;J'ai finalement décidé que les gens qui lisent ceci sont des hobbystes qui
savent ce qu'ils risquent. J'ai coupé les branches vraiment mortes, et gardé le
reste.&lt;/p&gt;
&lt;p&gt;Les parties que les gens pressés peuvent passer sont indiquées, mais j'ai la
faiblesse de croire qu'il vaut mieux lire l'intégralité.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Quel assembleur pour votre Z80 ?&lt;/h3&gt;
&lt;p&gt;Un &lt;a href=&quot;http://www.finiderire.com/post/2010/08/16/Ce-sont-les-vacances%3A-en-avant-toute-vers-le-retro-!&quot;&gt;
précédent billet&lt;/a&gt; a détaillé les principaux assembleurs disponibles pour le
Z80.&lt;/p&gt;
&lt;p&gt;Il en sortait qu'il n'y avait pas grand chose à en tirer. Développés par des
gens plus ou moins inspirés , ils peinent à convaincre.&lt;/p&gt;
&lt;p&gt;De trop rares exceptions tirent leur épingle du jeu, comme &lt;em&gt;WLA DX&lt;/em&gt;,
dont le développement est arrêté.&lt;/p&gt;
&lt;p&gt;Vous pouvez charitablement oublier le reste.&lt;/p&gt;
&lt;p&gt;Heureusement, il reste une piste que je n'avais pas exploré la première
fois. Elle consiste à utiliser l'assembleur GNU et lui adjoindre un backend
Z80.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;L'assembleur GNU et le Z80&lt;/h3&gt;
&lt;p&gt;L'assembleur GNU est une valeur sûre. Il est développé par des gens
compétents, et ne vous lachera pas en rase campagne. Et il ne coûte rien, alors
pourquoi se priver ?&lt;/p&gt;
&lt;p&gt;L'assembleur GNU (et son linker) sont inscrits dans le projet &lt;a href=&quot;http://www.gnu.org/software/binutils/&quot;&gt;binutils&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L'assembleur est remarquablement générique. Il compilera sans problème du
code pour pratiquement tout les processeurs existants, y compris bien sûr le
Z80.&lt;/p&gt;
&lt;p&gt;L'avantage de la généricité est qu'entre les différentes plate-formes
matérielles, le fonctionnement général des outils ne change pas. À part bien
sûr quelques options supplémentaires pour supporter les spécificités
matérielles.&lt;/p&gt;
&lt;p&gt;Dans le cas du Z80, il s'agira surtout de la déclaration de bloc de données
et des opcodes non documentés….&lt;/p&gt;
&lt;p&gt;L'assembleur supporte également le R800. Le R800 est un descendant du Z80,
né trop tard dans un monde trop vieux.&lt;/p&gt;
&lt;p&gt;Vous trouverez &lt;a href=&quot;http://sourceware.org/binutils/docs/as/Z80_002dDependent.html&quot;&gt;ici&lt;/a&gt; la
liste complète des spécificités Z80 concernant l'assembleur.&lt;/p&gt;
&lt;p&gt;La seule difficulté est d'obtenir le support Z80 dans binutils, ce qui n'est
pas le cas par défaut.&lt;/p&gt;
&lt;p&gt;Un simple backend (&lt;em&gt;étage de sortie&lt;/em&gt; en bon français) produisant du
Z80 suffit. Par chance, GNU fournit ce backend dans le tronc officiel.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Compilation du back end Z80 sous Arch-Linux&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : pour les utilisateurs de MS-Windows, j'ai
compilé une version adaptée au Z80 , à l'aide de mingw. Vous la trouverez sur
le site &lt;a href=&quot;http://www.msxvillage.fr&quot;&gt;MSX Village&lt;/a&gt;. Pensez tout de même
à passer à Linux un de ces jours.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Récupérer les sources avec ABS&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: ceci ne concerne que les utilisateurs Arch Linux.
Autrement, vous pouvez simplement charger les sources depuis le site GNU.&lt;/p&gt;
&lt;p&gt;Pour Arch-Linux, le mieux est de partir du build ABS : (pour moi :
&lt;em&gt;core/binutils 2.22-4 (base-devel)&lt;/em&gt; )&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cp -r /var/abs/core/binutils/ .&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Vérifiez dans le PKGBUILD que vous avez la même version.&lt;/p&gt;
&lt;pre&gt;

 pkgver=2.22
 pkgrel=4
 date=20111227

&lt;/pre&gt;
&lt;p&gt;Dans le cas contraire, lancez la commande &lt;code&gt;abs&lt;/code&gt; pour mettre à
niveau l'arbre abs. À noter que la correspondance de version entre le binutils
Z80 et celui de votre version est facultative, et ne vise qu'à préserver une
certaine cohérence sur votre système.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Dépacker les sources récupérées:&lt;/h5&gt;
&lt;pre&gt;

makepkg --nocheck --nobuild

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nocheck&lt;/code&gt; est à utiliser en connaissance de cause. Il empêche la
vérification des dépendances du paquet. Dans le cas présent, cela évite
d'installer &lt;em&gt;dejagnu&lt;/em&gt;, qui est un framework pour des tests unitaires.
Ici, il ne sert à rien.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nobuild&lt;/code&gt; empêche la construction du paquet. Les paramètres par
défaut n'ont pas le support Z80, et je ne souhaitais pas faire un paquet Arch
des binutils obtenus. Si vous êtes courageux, vous pouvez personnaliser le
PKGBUILD pour vous éviter une copie à la main des binaires obtenus, et garder
un suivi de version pour les outils.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pourquoi n'ai-je pas fait de paquet pour la distribution ?&lt;/p&gt;
&lt;p&gt;Les fichiers sont indépendants les uns des autres, et il vaut mieux ne pas
tout mélanger avec l'installation «officielle» de binutils.&lt;/p&gt;
&lt;p&gt;Un simple ajustement du &lt;code&gt;$PATH&lt;/code&gt; suffira.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Compilation des sources&lt;/h3&gt;
&lt;h5&gt;Quelques mots sur BFD&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: pour les curieux.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;BFD&lt;/em&gt; est nécessaire pour construire la majorité des utilitaires de
binutils.&lt;/p&gt;
&lt;p&gt;C'est une bibliothéque qui s'occupe de la partie bas niveau. Elle crée une
abstraction vers le hardware pour utiliser un objet commun à toutes les
plateformes. &lt;em&gt;BFD&lt;/em&gt; ne fait pas qu'envoyer de l'opcode. Fini les
problèmes avec l'endianess, la taille d'un mot qui change selon les cpu. Il
s'utilise même pour le debug sur les coredumps.&lt;/p&gt;
&lt;p&gt;Un listing du répertoire source achève de convaincre le dubitatif. Nous y
trouvons une impressionnante collection de plateformes supportées, ainsi que
les formats de sortie les plus divers : elf32/64 bien sûr, mais aussi
coff, pe, et de façon générale, tout l'exotisme du silicium.&lt;/p&gt;
&lt;p&gt;Prenons le fichier «cpu-z80.c». Une rapide inspection confirme que le z80 et
son avatar r800 sont supportés. On a les modes «strict» et «full» pour le z80,
qui correspondent surement au support des opcodes documentés ou non.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;GAS : l'assembleur GNU.&lt;/h5&gt;
&lt;p&gt;Alors là, mauvaise nouvelle pour le génération des targets.&lt;/p&gt;
&lt;p&gt;La doc le dit elle-même: «There is no convenient way to generate a list of
all available hosts» , ce qui se traduit par «débrouillez-vous».&lt;/p&gt;
&lt;p&gt;Heureusement, l'aide du configure donne quelques indications, notamment sur
le fait que les noms des hosts et des cibles sont stockés dans le script
«config.sub».&lt;/p&gt;
&lt;p&gt;Nous allons donc jouer un peu avec celui-ci.&lt;/p&gt;
&lt;p&gt;Sur ma machine, il est installé ici:
&lt;code&gt;/usr/share/libtool/config/config.sub&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Le nommage utilise un schéma tripartite de type:
&lt;code&gt;ARCHITECTURE-VENDOR-OS&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Heureusement, des alias sont prévus, on peut les découvrir a l'entrée
&lt;code&gt;$basic_machine&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Comme je l'espérais très fort, il existe un alias z80. En explorant un peu,
nous trouvons aussi m68000 (m68k fonctionne également). Je vous laisse chercher
pour les autres architectures.&lt;/p&gt;
&lt;p&gt;Comme nous le supposons également, avec ces deux choix «VENDOR» et «OS»
prennent une valeur générique (intitulée sobrement «unknown» ou «none»).&lt;/p&gt;
&lt;p&gt;Ex: &lt;code&gt;~/abs/binutils/src/binutils/gas$ sh
/usr/share/libtool/config/config.sub z80-unknown-none&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;(même topo pour le 68000: m68k-unknown-none )&lt;/p&gt;
&lt;p&gt;Bon. En réalité, la bonne cible pour z80 est «z80-coff» (le triplet
ci-dessus ne fonctionnant pas, il m'a fallu tatonner un peu).&lt;/p&gt;
&lt;p&gt;Pourquoi pas «z80-elf» ? Vous auriez pu tout aussi bien le choisir. Le
format des objets n'a aucune importance, car il y a peu de chance pour tomber
sur une plateforme z80 comprenant elf ou coff.&lt;/p&gt;
&lt;p&gt;Il faudra donc ruser pour faire du fichier objet un fichier exécutable sur
la plateforme cible.&lt;/p&gt;
&lt;p&gt;En résumé, les options à passer à configure:&lt;/p&gt;
&lt;pre&gt;

--prefix=$HOME/binutils
--exec-prefix=$HOME/binutils
--target=z80-coff

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Ces options permettent d'éviter de polluer votre filesystem, et de faire
l'installation dans votre home (pas besoin d'être root).&lt;/p&gt;
&lt;p&gt;L'installation se fait avec le classique «make install» après la
compilation.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Après le configure, lançons la compilation:&lt;/p&gt;
&lt;p&gt;«make -jn+1» , avec 'n' représentant le nombre de threads sur votre machines
(cores*ht). Par exemple «make -j5» sur un core i5 (4 cores + 1). Ceci
parallélise la compilation et accélère grandement son déroulement.&lt;/p&gt;
&lt;p&gt;Vous pouvez avoir une erreur, dûe à un flag un peu exigeant sur un fichier
peu utilisé (et donc avec moins de chance d'être corrigé immédiatement dans les
sources).&lt;/p&gt;
&lt;p&gt;Si vous êtes dans ce cas (make qui s'arrête en erreur), relancez make pour
repérer le fautif (un warning qui se transforme en erreur)&lt;/p&gt;
&lt;p&gt;Je suis évidemment tombé sur ce cas de figure, sinon je n'insisterai pas
aussi lourdement.&lt;/p&gt;
&lt;p&gt;Dans mon cas, il m'a fallu exécuter dans le répertoire «gas»:&lt;/p&gt;
&lt;pre&gt;

gcc -DHAVE_CONFIG_H -I.  -I. -I. -I../bfd -I./config -I./../include -I./.. -I./../bfd -DLOCALEDIR=&amp;quot;\&amp;quot;votre chemin à vous le locale dir qu'il faudra adapter&amp;quot;&amp;quot;  -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -MT tc-z80.o -MD -MP -MF .deps/tc-z80.Tpo -c -o tc-z80.o `test -f 'config/tc-z80.c' || echo './'`config/tc-z80.c

&lt;/pre&gt;
&lt;p&gt;(par rapport à la compilation avec make, nous enlevons simplement le flag
&lt;code&gt;-Werror&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Ensuite, nous retournons à la racine de binutils, et nous relançons
&lt;code&gt;make&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Une fois la compilation terminée et les binutils en ligne, n'oubliez pas
d'ajuster le $PATH sur le répertoire contenant les programmes z80-coff-*&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Exécution des objets&lt;/h3&gt;
&lt;p&gt;Nous pouvons maintenant assembler notre programme de test (cf le listing
ci-dessous).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/test/z80-coff-as -als hello_world.asm&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;

GAS LISTING hello_world.asm                     page 1


   1 0000 FE             db $fe
   2 0001 00C0 1AC0      dw debut,fin,debut
   2      00C0 
   3               
   4 0007 0000 0000      ORG $C000
   4      0000 0000 
   4      0000 0000 
   4      0000 0000 
   4      0000 0000 
   5               
   6                    debut:
   7 c000 210D C0        LD HL,LABEL
   8 c003 7E            AFF: LD A,(HL)
   9 c004 23             INC HL
  10 c005 A7             AND A
  11 c006 C8             RET Z
  12 c007 CDA2 00        CALL $A2 ; HFDA4 ;CHPUT
  13 c00a 18F7           JR AFF
  14 c00c C9             RET
  15 c00d 5465 7374     LABEL: DEFB &amp;quot;Test chput&amp;quot;,13,10,0
  15      2063 6870 
  15      7574 0D0A 
  15      00
  16                    fin:
  17                     END

GAS LISTING hello_world.asm                     page 2


DEFINED SYMBOLS
                            *ABS*:0000000000000000 fake
     hello_world.asm:6      .text:000000000000c000 debut
     hello_world.asm:16     .text:000000000000c01a fin
     hello_world.asm:15     .text:000000000000c00d LABEL
     hello_world.asm:8      .text:000000000000c003 AFF

NO UNDEFINED SYMBOLS

&lt;/pre&gt;
&lt;p&gt;Nous n'en avons pas tout à fait fini, mais au moins, le code z80 se compile
correctement.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Dumpons maintenant l'objet obtenu.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/test$ hexdump -C hello_world.out&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;

00000000  5a 80 03 00 00 00 00 00  e6 c0 00 00 0c 00 00 00  |Z...............|
00000010  00 00 04 11 2e 74 65 78  74 00 00 00 00 00 00 00  |.....text.......|
00000020  00 00 00 00 1a c0 00 00  8c 00 00 00 a6 c0 00 00  |................|
00000030  00 00 00 00 04 00 00 00  20 00 00 00 2e 64 61 74  |........ ....dat|
00000040  61 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |a...............|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060  40 00 00 00 2e 62 73 73  00 00 00 00 00 00 00 00  |@....bss........|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000080  00 00 00 00 00 00 00 00  80 00 00 00 fe 00 c0 1a  |................|
00000090  c0 00 c0 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0000c080  00 00 00 00 00 00 00 00  00 00 00 00 21 0d c0 7e  |............!..~|
0000c090  23 a7 c8 cd a2 00 18 f7  c9 54 65 73 74 20 63 68  |#........Test ch|
0000c0a0  70 75 74 0d 0a 00 01 00  00 00 06 00 00 00 00 00  |put.............|
0000c0b0  00 00 01 00 53 43 03 00  00 00 06 00 00 00 00 00  |....SC..........|
0000c0c0  00 00 01 00 53 43 05 00  00 00 06 00 00 00 00 00  |....SC..........|
0000c0d0  00 00 01 00 53 43 01 c0  00 00 06 00 00 00 00 00  |....SC..........|
0000c0e0  00 00 01 00 53 43 2e 66  69 6c 65 00 00 00 00 00  |....SC.file.....|
0000c0f0  00 00 fe ff 00 00 67 01  66 61 6b 65 00 00 00 00  |......g.fake....|
0000c100  00 00 00 00 00 00 00 00  00 00 64 65 62 75 74 00  |..........debut.|
0000c110  00 00 00 c0 00 00 01 00  00 00 06 00 66 69 6e 00  |............fin.|
0000c120  00 00 00 00 1a c0 00 00  01 00 00 00 06 00 4c 41  |..............LA|
0000c130  42 45 4c 00 00 00 0d c0  00 00 01 00 00 00 06 00  |BEL.............|
0000c140  41 46 46 00 00 00 00 00  03 c0 00 00 01 00 00 00  |AFF.............|
0000c150  06 00 2e 74 65 78 74 00  00 00 00 00 00 00 01 00  |...text.........|
0000c160  00 00 03 01 1a c0 00 00  04 00 00 00 00 00 00 00  |................|
0000c170  00 00 00 00 00 00 2e 64  61 74 61 00 00 00 00 00  |.......data.....|
0000c180  00 00 02 00 00 00 03 01  00 00 00 00 00 00 00 00  |................|
0000c190  00 00 00 00 00 00 00 00  00 00 2e 62 73 73 00 00  |...........bss..|
0000c1a0  00 00 00 00 00 00 03 00  00 00 03 01 00 00 00 00  |................|
0000c1b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 04 00  |................|
0000c1c0  00 00                                             |..|
0000c1c2

&lt;/pre&gt;
&lt;p&gt;Nous avons assemblé au format &lt;strong&gt;COFF&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il est inconnu du MSX, qui bien entendu n'est pas fait pour ces subtilités
modernes.&lt;/p&gt;
&lt;p&gt;Nous voulons nous débarasser des headers et récupérer uniquement
l'assemblage du fichier source. En d'autres termes, nous voulons le contenu de
la section &lt;strong&gt;.TEXT&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le stub MSX est contenu dans le source, et fera office de header.&lt;/p&gt;
&lt;p&gt;Pour isoler une section, nous avons deux possibilités:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avec &lt;em&gt;objcopy&lt;/em&gt;, nous pouvons nous débarasser des sections COFF
inutiles:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;~/test$ objcopy -O binary hello_world.out hello_world.bin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/test$ hexdump -C hello_world.bin&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;

00000000  fe 00 c0 1b c0 00 c0 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0000c000  21 0d c0 7e 23 a7 c8 cd  a2 00 18 f7 c9 48 65 6c  |!..~#........Hel|
0000c010  6c 6f 20 57 6f 72 6c 64  0d 0a 00                 |lo World...|
0000c01b

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une autre possibilité est d'utiliser le linker binutils z80.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;~/test$ z80-coff-ld.bfd hello_world.out -o hello_world.bin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Nous constatons que ces deux possibilités souffrent du même problème :le
linker utilise comme adresse d'origine 0x100 (souvenir des .com).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/test$ hexdump hello_world.bin -C&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;

00000000  fe 00 c1 1b c1 00 c1 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0000c000  21 0d c1 7e 23 a7 c8 cd  a2 00 18 f7 c9 48 65 6c  |!..~#........Hel|
0000c010  6c 6f 20 57 6f 72 6c 64  0d 0a 00                 |lo World...|

&lt;/pre&gt;
&lt;p&gt;Nous voyons bien au début: 0xc100 au lieu de l'attendu: 0xc000&lt;/p&gt;
&lt;p&gt;Le linker peut, grâce à l'utilisation d'une configuration ld, faire beaucoup
mieux que cela.&lt;/p&gt;
&lt;p&gt;Pour l'instant, nous nous cantonnerons à utiliser objcopy. L'utilisation du
linker, beaucoup plus pratique, sera abordée ensuite.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Solution sans script ld&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : les allergiques aux commandes Unix peuvent
passer directement au script ld.&lt;/p&gt;
&lt;p&gt;Revenons au fichier produit par objcopy.&lt;/p&gt;
&lt;p&gt;Il est presque parfait, mais nout avons toujours du padding entre l'entête
(les 7 premiers octets) et la section de code, qui commence à 0xc000.&lt;/p&gt;
&lt;p&gt;Nous voudrions plutôt cela:&lt;/p&gt;
&lt;pre&gt;

00000000  fe 00 c0 1b c0 00 c0 21  0d c0 7e 23 a7 c8 cd a2  |.......!..~#....|
00000010  00 18 f7 c9 48 65 6c 6c  6f 20 57 6f 72 6c 64 0d  |....Hello World.|
00000020  0a 00                                             |..|

&lt;/pre&gt;
&lt;p&gt;Avec quelques commandes shell, nous pouvons arriver facilement au résultat
ci-dessus.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créer avec le fichier de sortie hello_world.exe en copiant les 7 premiers
octets, qui font office de stub :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;~/test$ dd if=hello_world.bin of=hello_wo.exe count=7 bs=1&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ensuite, nous avons deux possibilités pour trouver l'offset à passer pour
arriver sur le code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1) lire la valeur de l'offset du code dans le fichier source:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;skip=$(awk 'BEGIN { FS=&amp;quot;$&amp;quot; }; /ORG/ { print strtonum(&amp;quot;0x&amp;quot;$2) }'
hello_world.asm)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;2) ou bien, trouver cette valeur en lisant le header du fichier binaire:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;skip=$(od -d -t d1 hello_world.bin --skip=1 -N 2)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la sortie se fait en décimal (-d)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;le type de la sortie est défini comme char (-t d1)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;on lit deux éléments (-N 2)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;on passe le premier octet (--skip=1) pour arriver sur l'adresse du symbole
«debut».&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

   1 0000 FE              db $fe
   2 0001 00C0 1AC0 00C0  dw debut,fin,debut

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Une fois la valeur skip récupérée, nous ajoutons le code au
header :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dd if=hello_world.bin of=hello_wo.exe skip=&amp;quot;$skip&amp;quot; bs=1 oflag=append
conv=notrunc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Et voila :&lt;/p&gt;
&lt;p&gt;~/test$ hexdump -C hello_wo.exe&lt;/p&gt;
&lt;pre&gt;

00000000  fe 00 c0 1b c0 00 c0 21  0d c0 7e 23 a7 c8 cd a2  |.......!..~#....|
00000010  00 18 f7 c9 48 65 6c 6c  6f 20 57 6f 72 6c 64 0d  |....Hello World.|
00000020  0a 00                                             |..|

&lt;/pre&gt;
&lt;p&gt;Nous pouvons en faire un script pour aller plus vite la prochaine fois. Ce
script est donné à titre d'illustration et ne permet que de compiler un seul
fichier source à la fois.&lt;/p&gt;
&lt;p&gt;J'ai rapidement laissé tomber, pour revenir à l'utilisation du linker que
nous allons voir dans la prochaine section.&lt;/p&gt;
&lt;p&gt;~/test$ cat compile.sh&lt;/p&gt;
&lt;pre&gt;

#!/bin/bash
#paramètre: source.asm &amp;quot;options_gas&amp;quot;
#Attention, les paramètres doivent être entre guillemets si il y en a
#           plusieurs séparées par des espaces.

#exemple: ./compile.sh foo.asm &amp;quot;-als -Wup&amp;quot;

#à changer selon l'emplacement de binutils
install_root=&amp;quot;$HOME&amp;quot;/binutils


#pas besoin de toucher au reste, normalement
src=$1
if [ &amp;quot;$src&amp;quot; == &amp;quot;&amp;quot; ]; then
   echo &amp;quot;Usage:&amp;quot;
   echo &amp;quot;  $0 source.asm&amp;quot;
   exit
fi

options_gas=&amp;quot;$2&amp;quot;

install_bins=&amp;quot;$install_root&amp;quot;/z80-coff/bin/
GAS=&amp;quot;$install_bins&amp;quot;as
OCP=&amp;quot;$install_bins&amp;quot;objcopy


base=&amp;quot;$(basename $src .asm)&amp;quot;

#si besoin est, tronque la destination en 8.3
dst=&amp;quot;$(echo $base | cut -c1-8 )&amp;quot;.exe
log=&amp;quot;$base&amp;quot;.log
out_gas=&amp;quot;$base&amp;quot;.out
out_ocp=&amp;quot;$base&amp;quot;.bin


echo compilation de &amp;quot;$src&amp;quot; &amp;quot; -&amp;gt; $out_gas&amp;quot;
&amp;quot;$GAS&amp;quot; &amp;quot;$src&amp;quot; $options_gas -o &amp;quot;$out_gas&amp;quot;  &amp;gt; &amp;quot;$log&amp;quot;
if [ $? -ne 0 ]; then exit; fi 

echo conversion de &amp;quot;$out_gas&amp;quot; &amp;quot; -&amp;gt; $out_ocp&amp;quot;
&amp;quot;$OCP&amp;quot; -O binary &amp;quot;$out_gas&amp;quot; &amp;quot;$out_ocp&amp;quot;
if [ $? -ne 0 ]; then exit; fi 

echo création exécutable avec &amp;quot;$out_ocp&amp;quot; &amp;quot; -&amp;gt; $dst&amp;quot;
dd if=&amp;quot;$out_ocp&amp;quot; of=&amp;quot;$dst&amp;quot; count=7 bs=1 2&amp;gt;/dev/null
skip=$(od -d -t d1 &amp;quot;$out_ocp&amp;quot; --skip=1 -N 2  | awk 'NR==1 { print $2 }') 
dd if=&amp;quot;$out_ocp&amp;quot; of=&amp;quot;$dst&amp;quot; skip=&amp;quot;$skip&amp;quot; bs=1 oflag=append conv=notrunc 2&amp;gt;/dev/null

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Pour tester, j'utilise OpenMSX qui est mon émulateur MSX favori.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;openmsx -machine Philips_NMS_8255 -diska /home/jseb/test/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Une fois l'invite du basic obtenue dans l'émulateur, entrez les deux
commandes:&lt;/p&gt;
&lt;pre&gt;

files

bload &amp;quot;a.msx&amp;quot;,r

&lt;/pre&gt;
&lt;p&gt;Mais tout ceci est bien compliqué…&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La meilleure solution pour un exécutable: le script ld&lt;/h5&gt;
&lt;p&gt;Nous allons créer un exécutable en utilisant le linker.&lt;/p&gt;
&lt;p&gt;Voici comment procéder:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enlever la directive «.ORG» du source assembleur&lt;/li&gt;
&lt;li&gt;Ajouter des sections (plus propre pour le linker)&lt;/li&gt;
&lt;li&gt;Compiler : &lt;code&gt;z80-coff-as -als foo.asm -o foo.out&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

   1                    .section .stub
   2 0000 FE                db $fe
   3 0001 0000 1B00         dw debut,fin,debut
   3      0000 
   4                    
   5                    ; ne PAS utiliser la directive .ORG
   6                    ; .ORG $C000
   7                    
   8                    .section .mycode
   9                    ; par défaut, la section de code s'appelle .text
  10                    debut:
  11 0000 210D 00        LD HL,LABEL
  12 0003 7E            AFF: LD A,(HL)
  13 0004 23             INC HL
  14 0005 A7             AND A
  15 0006 C8             RET Z
  16 0007 CDA2 00        CALL $A2 ; HFDA4 ;CHPUT
  17                    ; call outside
  18 000a 18F7           JR AFF
  19 000c C9             RET
  20 000d 4865 6C6C     LABEL: DEFB &amp;quot;Hello World&amp;quot;,13,10,0
  20      6F20 576F 
  20      726C 640D 
  20      0A00 
  21                    fin:
  22                     END

DEFINED SYMBOLS
                            *ABS*:0000000000000000 fake
             foo.asm:10     .mycode:0000000000000000 debut
             foo.asm:21     .mycode:000000000000001b fin
             foo.asm:20     .mycode:000000000000000d LABEL
             foo.asm:12     .mycode:0000000000000003 AFF

&lt;/pre&gt;
&lt;p&gt;Notez la section &lt;code&gt;.stub&lt;/code&gt; dans le source ci-dessus.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Vérification du contenu des sections: &lt;code&gt;z80-coff-objdump -s
foo.out&lt;/code&gt;@&lt;/p&gt;
&lt;pre&gt;

foo.out:     file format coff-z80

Contents of section .stub:
 0000   fe00001b 000000                      .......         
Contents of section .mycode:
 0000   210d007e 23a7c8cd a20018f7 c948656c  !..~#........Hel
 0010   6c6f2057 6f726c64 0d0a00             lo World...     

&lt;/pre&gt;
&lt;p&gt;Nous voyons pour la section «.stub» que l'origine est à 0x0 pour l'instant.
C'est au linker qu'il incombera la tâche de recalculer les adresses.&lt;/p&gt;
&lt;p&gt;Nous pouvons linker, pour l'instant sans utilisation d'un script ld.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'origine sera donc à 0x100 (origine par défaut pour ce linker)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Option -M : en plus du link, affiche le mapping mémoire:&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z80-coff-ld foo.out -o foo.exe -M&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

Memory Configuration

Name             Origin             Length             Attributes
*default*        0x0000000000000000 0xffffffffffffffff

Linker script and memory map

LOAD foo.out
                0x0000000000000100                . = 0x100
                0x0000000000000100                __Ltext = .

.text           0x0000000000000100        0x0
 *(.text)
 .text          0x0000000000000100        0x0 foo.out
 *(text)
                0x0000000000000100                __Htext = .

.data           0x0000000000000100        0x0
                0x0000000000000100                __Ldata = .
 *(.data)
 .data          0x0000000000000100        0x0 foo.out
 *(data)
                0x0000000000000100                __Hdata = .

.bss            0x0000000000000100        0x0
                0x0000000000000100                __Lbss = .
 *(.bss)
 .bss           0x0000000000000100        0x0 foo.out
 *(bss)
                0x0000000000000100                __Hbss = .
OUTPUT(foo.exe binary)

.stub           0x0000000000000100        0x7
 .stub          0x0000000000000100        0x7 foo.out

.mycode         0x0000000000000107       0x1b
 .mycode        0x0000000000000107       0x1b foo.out

&lt;/pre&gt;
&lt;p&gt;On voit (dans OUTPUT) que les seules sections trouvées furent «.stub» et
«.mycode».&lt;/p&gt;
&lt;p&gt;ld a donc linké ces sections à la suite, en l'absence d'autres instructions
(c'est ce qu'on appelle un «script de link implicite»).&lt;/p&gt;
&lt;p&gt;Pour linker correctement, il faut utiliser ce script ld , que nous
spécifierons à «ld» avec l'option «-T».&lt;/p&gt;
&lt;pre&gt;

OUTPUT_FORMAT(binary)
SECTIONS
     {
       .stub 0xC000 - 7 : { *(.stub) }
       .code : { *(.mycode) }

     }

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z80-coff-ld foo.out -o foo.exe -T nom_du_script_ld&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;C'est fini&lt;/h3&gt;
&lt;p&gt;Par manque de temps (et un aussi un peu de motivation), je ne pense pas
revenir sur la programmation d'ordinosaures.&lt;/p&gt;
&lt;p&gt;J'ai quand même décidé de publier ces notes, en espérant que quelqu'un
pourra en faire bon usage.&lt;/p&gt;
&lt;p&gt;J'ai encore quelques autres notes du même acabit dans mes tiroirs. Je les
publierai peut-être un jour, mais ne retenez pas votre respiration. &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2012/05/10/D-un-Z-qui-veut-dire-Z80#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2012/05/10/D-un-Z-qui-veut-dire-Z80#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/680780</wfw:commentRss>
      </item>
    
  <item>
    <title>IRC: Wee ou non ?</title>
    <link>http://www.finiderire.com/post/2011/12/11/IRC%3A-Wee-ou-non</link>
    <guid isPermaLink="false">urn:md5:3e21c8abc9d1ebfe182b2b208a7a5afb</guid>
    <pubDate>Sun, 25 Dec 2011 19:29:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Linux</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Vous connaissez tous IRC, et principalement Freenode, l'auberge
espagnole du Logiciel Libre.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pour le client à utiliser, c'est une autre histoire…&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pendant des années, j'ai utilisé Irssi. Et puis, un jour…&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Un jour j'en ai eu marre d' Irssi.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Irssi est le choix par défaut des utilisateurs Linux pour IRC.&lt;/li&gt;
&lt;li&gt;Il faut dire que la concurrence n'est (n'était) pas brillante,&lt;/li&gt;
&lt;li&gt;Pourtant, on ne peut pas dire que Irssi soit le parangon du client
IRC.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Irssi la branche sur laquelle il est assis&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Irssi présente de nombreux défauts, ou tout du moins de sérieuses
limitations:
&lt;ul&gt;
&lt;li&gt;son horrible fichier de configuration (colorer différement la barre de
stats du buffer actif fut un vrai défi).&lt;/li&gt;
&lt;li&gt;un scripting limité à Perl.&lt;/li&gt;
&lt;li&gt;une ergonomie discutable (la configuration par défaut est
inutilisable).&lt;/li&gt;
&lt;li&gt;une documentation incomplète et incompréhensible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;C'est vrai, il y a d'autres clients IRC&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;BitchX : ha-ha-ha, je vous laisse essayer (il y en a qui
aiment…).&lt;/li&gt;
&lt;li&gt;XChat : qu'il est de bon ton de dénigrer, mais qui a le mérite d'être
simple. On en fait vite le tour, cependant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Voici WeeChat&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Certe, je débarque: ce logiciel existe depuis un certain temps.
&lt;ul&gt;
&lt;li&gt;2005 pour les premières versions exploitables.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il est cependant toujours développé, et comprend de nombreux avantages par
rapport à Irssi.
&lt;ul&gt;
&lt;li&gt;Une doc claire et complète, et en français qui plus est.&lt;/li&gt;
&lt;li&gt;Une configuration aisée. Toutes les modifications sont applicables sans
relancer WeeChat, et peuvent être sauvées depuis celui-ci.&lt;/li&gt;
&lt;li&gt;Une prise en main rapide.&lt;/li&gt;
&lt;li&gt;Scripting avec Lua! Yäh ! Ftaghn Cthulhu Lua ! Et pour le reste
d'entre-vous, il y a aussi la possibilité de scripter en Python, en Perl, en
Ruby ou en TCL.&lt;/li&gt;
&lt;li&gt;Possibilité d'utiliser un client différent du client ncurses proposé par
défaut (pour ceux qui ont honte d'installer XChat).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Premier contact avec WeeChat&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vous retrouverez dans la doc tout ce que je n'ai évidemment pas &lt;a href=&quot;http://www.weechat.org/files/doc/stable/weechat_quickstart.fr.html&quot;&gt;sorti de
nulle part&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Comment qu'ça s'installe ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Boudiou: &lt;code&gt;pacman -S weechat&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Ne vous laissez pas impressionner par le numéro de version (en ce moment:
0.3.6).&lt;/li&gt;
&lt;li&gt;C'est du vrai logiciel libre pleinement fonctionnel, et qui ne cherche pas
à en mettre plein la vue avec une numérotation stratosphérique des
versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Déroulement d'une session typique&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Quelques commandes de base devraient vous sortir d'affaire, sans rien avoir
à configurer pour commencer.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Commençons par lancer WeeChat:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat-curses&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/connect irc.freenode.org&lt;/code&gt; : c'est une connexion
temporaire, nous verrons plus loin comment la rendre permanente.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/join archlinux-fr&lt;/code&gt; : notez la barre des nicks sur le
côté. C'est bien, mais ça prend de la place. Mais comme c'est un élément
d'interface, c'est désactivable.&lt;/li&gt;
&lt;li&gt;À ce stade, il peut être utile de savoir comment se déplacer dans les
fenêtres: &lt;strong&gt;ALT + flèches curseur&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Par défaut, une fenêtre affiche un seul buffer. Par la suite, vous pourrez
afficher plusieurs buffers dans une fenêtre avec les commandes &lt;em&gt;split&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/window splith&lt;/code&gt; : splitte horizontalement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/window splitv&lt;/code&gt; : coupe verticalement.&lt;/li&gt;
&lt;li&gt;Utilisez &lt;strong&gt;F7&lt;/strong&gt; et &lt;strong&gt;F8&lt;/strong&gt; pour naviguer dans les
splits.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/window zoom&lt;/code&gt; : permet de sortir d'un split (raccourci:
&lt;strong&gt;alt+z&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;N'oubliez pas … &lt;code&gt;/help&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Et pour une commande particulière: &lt;code&gt;/help commande&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Raccourcis clavier&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;En reprenant l'exemple de &lt;strong&gt;F7&lt;/strong&gt; et &lt;strong&gt;F8&lt;/strong&gt; pour
naviguer dans les splits, on prend conscience de l'impérieuse nécessité de
configurer son clavier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alt+k (touche)&lt;/strong&gt; donne la touche et la commande associée.
&lt;ul&gt;
&lt;li&gt;Ex: &lt;strong&gt;Alt+k F8&lt;/strong&gt; affichera: &lt;code&gt;meta2-19~ window
-1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ceci nous permet de passer au split précédent.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;De même, nous pouvons obtenir facilement le code de la combinaison
alt+curseur bas:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Alt+k Alt+curseur bas&lt;/code&gt; : meta-meta2-B&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Armés de ces informations, nous n'avons plus qu'à associer alt+curseur bas
(par exemple) comme nouveau raccourci à &lt;code&gt;window -1&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/key bind meta-meta2-B /window -1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour la flèche du curseur haut associée à alt, je propose de
désactiver/activer la barre des pseudos.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/key bind meta-meta2-A /bar toggle nicklist&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;À vous de voir pour le reste…
&lt;ul&gt;
&lt;li&gt;Sachez que vous pourrez être amené à éditer directement le fichier de
configuration contenant les raccourcis.&lt;/li&gt;
&lt;li&gt;Mais uniquement en cas d'erreur bloquante, ou trop compliquée à corriger à
coup de &lt;em&gt;/key bind&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Bref, rien de tout cela ne devrait vous arriver. Le fichier est
&lt;em&gt;.weechat/weechat.conf&lt;/em&gt; , section &lt;em&gt;key&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Configuration de WeeChat&lt;/h3&gt;
&lt;h5&gt;Une simplicité biblique&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/set config.section.option valeur&lt;/code&gt; : pour modifier un
élément de configuration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/set config.*&lt;/code&gt; : pour voir un sous-ensemble de la
configuration (&lt;code&gt;set&lt;/code&gt; pour tout voir).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/help config.section.option&lt;/code&gt; : raison d'être d'une option
précise.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/save&lt;/code&gt; : sauve dans un fichier de config l'état actuel de
la configuration (la sauvegarde est automatique dans le fichier utilisé par
WeeChat).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/reload&lt;/code&gt; : recharge la configuration, au cas où vous
préféreriez modifier de façon externe les fichiers concernés (en cas de blocage
par exemple).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/plugin&lt;/code&gt; : voir les extensions chargées (vous devez avoir
au minimum l'extension &lt;em&gt;irc&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Exemple: définir une connexion&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons paramétrer une connexion permanente, dont les paramètres seront
sauvegardés dans la configuration.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/server add fn irc.freenode.org&lt;/code&gt; : défini un alias
&lt;em&gt;fn&lt;/em&gt; pour freenode, pour référencer la connexion.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/set irc.server.fn.nicks VotrePseudo&lt;/code&gt; : si il est
différent du login, utilisé par défaut. On peut préciser plusieurs pseudos, au
cas où le premier serait indisponible sur ce serveur (déja utilisé par exemple,
ou interdit).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/set irc.server.fn.command &amp;quot;/msg nickserv identify
xxxxx&amp;quot;&lt;/code&gt; : si vous voulez vous authentifier automatiquement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;save&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Et par la suite, pour vous connecter rapidement à freenode en rappellant la
connexion sauvée:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/connect fn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pour retrouver rapidement la liste des serveurs déja paramétrés:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/server list&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La peinture facile&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;WeeChat possède des facilités pour la gestion des couleurs.&lt;/li&gt;
&lt;li&gt;Tapez &lt;code&gt;/color&lt;/code&gt; pour passer dans le buffer des couleurs.
&lt;ul&gt;
&lt;li&gt;Vous y trouverez les paires de couleurs utilisées, ainsi que la palette
utilisable dans votre terminal (avec &lt;strong&gt;alt+c&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je passe sur la syntaxe pour envoyer des kikoos multicolorés dans les
buffers. Vous la trouverez dans la doc.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons maintenant nous intéresser à la colorisation de
l'interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Comme vous le savez, un &lt;code&gt;/set&lt;/code&gt; peut être suivi d'un joker
&lt;ul&gt;
&lt;li&gt;Pour avoir tous les paramètres liés aux couleurs: &lt;code&gt;/set
weechat.color.*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avec ces informations, nous pourrions personnaliser les différents éléments
de l'interface.&lt;/li&gt;
&lt;li&gt;Pour faire original, je vais simplement changer quelques couleurs peu
lisibles sur le fond de mon terminal.
&lt;ul&gt;
&lt;li&gt;C'est extrèmement aisé, grâce au buffer &lt;em&gt;color&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez sans doute remarqué que le nom des intervenants dans un chat est
affiché avec des couleurs très variées.
&lt;ul&gt;
&lt;li&gt;Les couleurs dépendens de cette variable de configuration, qui a pour
valeur par défaut:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weechat.color.chat_nick_colors =
&amp;quot;cyan,magenta,green,brown,lightblue,default,lightcyan,lightmagenta,lightgreen,blue&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le choix d'une couleur sur un pseudo se fait grace à un hash sur
celui-ci.&lt;/li&gt;
&lt;li&gt;Pour modifier la couleur de son propre pseudo, on utilise la variable
&lt;code&gt;weechat.color.chat_nick_self&lt;/code&gt; (et pour les conversations en privé,
vous avez également &lt;code&gt;weechat.color.chat_nick_other&lt;/code&gt; ).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour avoir la liste des codes couleurs utilisables, on a deux possibilités:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/color&lt;/code&gt; dans weechat, puis &lt;strong&gt;alt+c&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ou depuis un terminal: &lt;code&gt;weechat-curses -c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Je préfère utiliser &lt;code&gt;/color&lt;/code&gt; , suivi d'un &lt;strong&gt;e&lt;/strong&gt;
pour afficher la représentation des couleurs utilisées actuellement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;On peut rentrer des noms de couleurs, ou bien directement les codes
couleurs obtenus ci-dessus. On peut également préciser des attributs.&lt;/li&gt;
&lt;li&gt;On peut également utiliser &lt;code&gt;/color alias&lt;/code&gt; pour nommer un code
couleur dans WeeChat.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ouvrez une fenêtre une fenêtre splittée, tapez des commandes de couleur
dans l'une, et regardez le résultat dans le buffer &lt;code&gt;color&lt;/code&gt; visible
dans l'autre.
&lt;ul&gt;
&lt;li&gt;Par exemple:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/set weechat.color.chat_nick_colors =
&amp;quot;118:091,232:105,238:219,234:216,152:090,10:20,255:091,118:009&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Les scripts&lt;/h3&gt;
&lt;h5&gt;Lest scripts s'utilisent par le biais des extensions&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Un script Weechat n'appelle pas directement les fonctions de l'API
WeeChat.&lt;/li&gt;
&lt;li&gt;Le script passe par un wrapper qui appelle ensuite l'API. Il y a un wrapper
par langage de script.&lt;/li&gt;
&lt;li&gt;Ces wrappers font partie des &lt;strong&gt;extensions&lt;/strong&gt; (terminologie
WeeChat).&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;extensions&lt;/strong&gt; se controlent avec la commande
&lt;code&gt;plugin&lt;/code&gt; (&lt;code&gt;/help plugin&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;L'avantage de cette façon de procéder est que les différences entre
langages de scripts deviennent minimes. L'inconvénient est qu'il faut écrire un
wrapper pour chaque langage concerné, puisque l'accès direct à l'API WeeChat
n'est pas la méthode conseillée (bien que l'on puisse surement utiliser quelque
chose comme FFI du projet LuaJIT, mais cela sort largement de notre
propos).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Installation d'un script existant&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Avant d'écrire un script, commençons par en installer un.&lt;/li&gt;
&lt;li&gt;J'ai choisi le &lt;em&gt;bip&lt;/em&gt;, pour ne rien rater sur IRC.&lt;/li&gt;
&lt;li&gt;À propos, avez-vous remarqué l'angoisse diffuse instillée par la
possibilité de plus être joignable vingt-quatre heures sur vingt-quatre ?
Ou pire, de &lt;em&gt;rater un appel&lt;/em&gt; ?
&lt;ul&gt;
&lt;li&gt;Les marchands de téléphones ont fondé leur business là dessus.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous trouverez le script Perl qui fait bipper dans le dépot WeeChat
consacré aux scripts.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.weechat.org/files/scripts/beep.pl&quot;&gt;bipper en
Perl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vérifier que l'extension Perl est chargée:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/plugin list&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si ce n'est pas le cas, c'est probablement parce que Perl n'est pas
installé (et on vous comprend).
&lt;ul&gt;
&lt;li&gt;Il faudra donc installer Perl, et charger l'extension (pas besoin de
quitter WeeChat) : &lt;code&gt;/plugin load perl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour charger le script:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/perl load ~/.weechat/perl/beep.pl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tous les scripts sont référencés ici:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.weechat.org/scripts/&quot;&gt;http://www.weechat.org/scripts/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Écriture d'un script minimaliste à l'aide de Lua&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.weechat.org/files/doc/stable/weechat_scripting.fr.html&quot;&gt;Une
introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vous aurez également besoin du &lt;a href=&quot;http://www.weechat.org/files/doc/stable/weechat_plugin_api.fr.html&quot;&gt;guide de
référence de l'API C de WeeChat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Où se trouve le wrapper Lua ?
&lt;ul&gt;
&lt;li&gt;Comme dit précédemment, vous ne chargerez &lt;strong&gt;pas&lt;/strong&gt; vous même le
wrapper avec un &lt;code&gt;require&lt;/code&gt; dans le script Lua. Vous allez devoir
passer par les &lt;strong&gt;extensions&lt;/strong&gt; WeeChat, qui dans ce cas consiste en
un wrapper Lua vers l'api C de WeeChat.&lt;/li&gt;
&lt;li&gt;Il faut charger votre script de cette façon depuis WeeChat: &lt;code&gt;/lua load
chemin/vers/script.lua&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Attention, pour décharger le script, il faudra passer le nom défini en tant
que &lt;em&gt;name&lt;/em&gt; dans la fonction &lt;code&gt;weechat.register&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Passons au script proprement dit. Il faut commencer par enregistrer son
script.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat.register(name, author, version, license, description,
shutdown_function, charset)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weechat.register(&amp;quot;test_lua&amp;quot;,&amp;quot;jseb&amp;quot;,&amp;quot;0.1&amp;quot;,&amp;quot;beerware&amp;quot;,&amp;quot;pas de desc&amp;quot;,
nil, &amp;quot;utf-8&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;On peut tenter une sortie dans le buffer &lt;em&gt;core&lt;/em&gt; de WeeChat (celui
qui affiche les messages du programme).
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat.print (&amp;quot;&amp;quot;,&amp;quot;ça marche&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Notez que le &lt;em&gt;print&lt;/em&gt; intégré à Lua, qui écrit sur la sortie
standard, est fonctionnel, mais ne vous attendez pas à ce que la sortie suive
la logique de votre script. Comme l'exécution du script est séquentielle, vous
aurez déja la sortie de vos &lt;em&gt;print&lt;/em&gt;, puis la reconstruction de l'écran.
Cette méthode est donc déconseillée, hormis pour des messages de diagnostics
pour le debug (et autant utiliser &lt;code&gt;weechat.print&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le script sera exécuté une seule fois, et ensuite il faudra le recharger
pour recommencer le traitement. Il peut donc être plus pratique d'ajouter une
commande à WeeChat en créant un &lt;em&gt;hook&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Nous allons utiliser la fonction de l'API &lt;em&gt;hook_command&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;Nous pourrions également programmer une temporisation
(&lt;code&gt;weechat.hook_timer&lt;/code&gt;) ou une commande batch (lancée en fond avec
&lt;code&gt;weechat.hook_procees&lt;/code&gt; et qui permet peut être l'écriture de
coroutines, même si à mon avis &lt;code&gt;weechat.hook_timer&lt;/code&gt; sera plus
adaptée pour cela).&lt;/li&gt;
&lt;li&gt;Pour le transformer en commande, il faut utiliser
&lt;code&gt;weechat.hook_command&lt;/code&gt;, en précisant le nom de la commande, son mode
d'emploi (pour &lt;code&gt;/help&lt;/code&gt; et le nom de la fonction callback dans le
script).&lt;/li&gt;
&lt;li&gt;À noter que les paramètres de la fonction callback seront imposés: buffer
où a été lancée la commande, paramètres de la commande et data (non utilisé
dans le script, tout passe dans la variable qui contient les paramètres).&lt;/li&gt;
&lt;li&gt;Description dans l'API de &lt;a href=&quot;http://www.weechat.org/files/doc/stable/weechat_plugin_api.fr.html#_weechat_hook_command&quot;&gt;
hook_command&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que le script est enregistré et transformé en commande, il ne
reste plus qu'à transformer en majuscule la chaine passée en paramètre.
&lt;ul&gt;
&lt;li&gt;J'utilise pour cela une fonction de la classe &lt;em&gt;string&lt;/em&gt; de Lua, qui
malheureusement ne fonctionne qu'avec les caractères ascii et ne mettra donc
pas en majuscule les accents. J'aurais bien utilisé la fonction
&lt;code&gt;weechat_string_toupper&lt;/code&gt;, mais elle n'est pas disponible en dehors
de l'api et semble d'après l'exemple de la doc ne pas convertir non plus les
accents.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour afficher dans le buffer en cours, j'utilise une petite astuce. Je
demande l'exécution de la commande irc &lt;code&gt;say&lt;/code&gt; dans le buffer en
cours.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat.command(buffer,&amp;quot;/say &amp;quot;..la_chaine_en_majuscules)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il aurait été tentant d'utiliser cette commande:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;weechat.print(buffer,str_up)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;mais elle ne ferait qu'afficher la chaine en majuscules dans le buffer
actuel, et vos interlocuteurs ne la verrait pas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici le listing complet du script:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~/.weechat/lua$ cat hello.lua 
#!/usr/bin/env lua

--pour faire un /lua reload, il faut soit que le script soit dans autoload, soit spécifier son nom (celui déclaré dans weechat.register, pas le nom de fichier). Autrement, il sera bien déchargé, mais jamais recharge.                        

function hurler_fx(data, buffer, args)
  local str_up = args:upper()
  weechat.command(buffer,&amp;quot;/say &amp;quot;..str_up)
end

--weechat.register(name, author, version, license, description, shutdown_function, charset)
weechat.register(&amp;quot;test_lua&amp;quot;,&amp;quot;auteur&amp;quot;,&amp;quot;0.1&amp;quot;,&amp;quot;noware&amp;quot;,&amp;quot;pas de desc&amp;quot;, nil, &amp;quot;utf-8&amp;quot;)

hook = weechat.hook_command (&amp;quot;hurler&amp;quot;, &amp;quot;script pour hurler dans un buffer&amp;quot;,
                             &amp;quot;[chaine à hurler]&amp;quot;, &amp;quot;la chaine que vous souhaitez hurler&amp;quot;,&amp;quot;&amp;quot;,
                             &amp;quot;hurler_fx&amp;quot;,&amp;quot;&amp;quot;)

weechat.print (&amp;quot;&amp;quot;,&amp;quot;le script est chargé&amp;quot;)

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;À tester depuis weechat avec :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

/lua load lua/hello.lua 
/hurler et maintenant, tout le monde va m'écouter

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NB&lt;/strong&gt; : je décline toute responsabilité en cas de
&lt;em&gt;kick&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Terriblement t'efficace (nanananana nanana)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;J'espère vous avoir convaincu de tenter un essai avec WeeChat.&lt;/li&gt;
&lt;li&gt;Pour en savoir en plus, je vous renvois à l' &lt;strong&gt;&lt;a href=&quot;http://www.weechat.org/doc/&quot;&gt;excellente documentation&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=Cjrh4nka6dU&quot;&gt;Bon t'chat , lol
!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Je remercie FlashCode, l'auteur de WeeChat, pour son excellent soft, et
pour avoir bien voulu répondre à quelques-unes de mes questions… sur son canal
IRC, bien entendu &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;irc.freenode.org : #weechat-fr&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2011/12/11/IRC%3A-Wee-ou-non#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2011/12/11/IRC%3A-Wee-ou-non#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/654693</wfw:commentRss>
      </item>
    
  <item>
    <title>Des cookies à accepter sans hésiter !</title>
    <link>http://www.finiderire.com/post/2011/11/22/Des-cookies-%C3%A0-accepter-sans-h%C3%A9siter-%21</link>
    <guid isPermaLink="false">urn:md5:63fb2781d25dc365bb5304cbd4ae5d37</guid>
    <pubDate>Thu, 24 Nov 2011 20:44:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Cuisine</category>
        <category>cuisine</category>    
    <description>&lt;p&gt;&lt;br /&gt;
&lt;em&gt;Bonne nouvelle, j'ai enfin réussi à calibrer ma recette de
cookies.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Afin d'en faire profiter l'humanité, voici le résultat de longs mois
d'expérimentations (c'est pour cela que je ne postais plus rien et que j'ai
pris vingt kilos).&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Ces cookies là, je vous le garantis, ce ne sont pas les cookies pourris de
votre navigateur internet.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Merci à Marie pour la relecture, les suggestions, et les photos.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;h5&gt;Un magnifique spécimen: le Cookus-chocolatus-classicus&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;http://www.finiderire.com/public/images/cookie1.JPG&quot;&gt;&lt;img src=&quot;http://www.finiderire.com/public/images/.cookie1_m.jpg&quot; alt=&quot;cookus classicus&quot; title=&quot;cookus classicus, nov. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Ingrédients&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;200g de farine.&lt;/li&gt;
&lt;li&gt;1 sachet de levure chimique (bicarbonate).&lt;/li&gt;
&lt;li&gt;1 sachet de sucre vanillé.
&lt;ul&gt;
&lt;li&gt;le sucre vanillé est facultatif, mais c'est meilleur avec.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;70g de cassonade
&lt;ul&gt;
&lt;li&gt;ou 60g de sucre en poudre si vraiment vous n'avez pas de cassonade.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;60g de chocolat en morceaux.
&lt;ul&gt;
&lt;li&gt;ou 60g de pépites de chocolat, ça vous évitera de le faire vous-même.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;60g de raisins secs.&lt;/li&gt;
&lt;li&gt;60 à 80g de noisettes grillées, selon vos goûts.&lt;/li&gt;
&lt;li&gt;1 œuf.&lt;/li&gt;
&lt;li&gt;5 cuillères à soupe d'huile de noix.
&lt;ul&gt;
&lt;li&gt;qui correspondent à environ 100g. de beurre, si vous n'avez pas
d'huile.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5cl d'eau (environ un tiers de verre à moutarde).
&lt;ul&gt;
&lt;li&gt;ceci &lt;strong&gt;uniquement&lt;/strong&gt; si vous utilisez de l'huile. L'eau est
utilisée pour compenser la différence beurre/huile. Il y a de l'eau dans le
beurre, contrairement à l'huile.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 pincée de sel. Ne l'oubliez pas!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Pré-requis&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cette recette nécessite un peu de patience.&lt;/li&gt;
&lt;li&gt;Elle nécessite également quelques ingrédients que vous pourrez préparer à
l'avance afin de gagner du temps le moment venu.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Les noisettes&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Décortiquez et coupez les noisettes en deux.&lt;/li&gt;
&lt;li&gt;Faites revenir à la poêle, sans matière grasse.&lt;/li&gt;
&lt;li&gt;Quand les noisettes en contact avec la poêle commencent à brunir,
remuez-les pour répartir la cuisson.&lt;/li&gt;
&lt;li&gt;Une fois toutes les noisettes brunies, retirez du feu et laissez refroidir.
&lt;ul&gt;
&lt;li&gt;Pendant que les noisettes refroidissent, que diriez-vous de commencer le
découpage du chocolat ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Frottez les noisettes entre vos doigts et retirez la pellicule qui se
détache la plupart du temps.&lt;/li&gt;
&lt;li&gt;Les noisettes grillées peuvent se conserver quelques semaines dans un bocal
en verre.
&lt;ul&gt;
&lt;li&gt;Dans le cas d'un stockage dépassant quinze jours, goûtez une noisette avant
de les utiliser.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Les pépites de chocolat&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le moment idéal pour opérer est pendant le refroidissement des
noisettes.&lt;/li&gt;
&lt;li&gt;Découpez les carreaux de chocolat en morceaux à l'aide d'un couteau bien
aiguisé, sur une planche à découper.
&lt;ul&gt;
&lt;li&gt;Avec mon chocolat, j'obtiens neuf morceaux pour chacun des carreaux. Ne
vous coupez pas les doigts non plus et restez raisonnables.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Préparation&lt;/h3&gt;
&lt;h5&gt;Dans un saladier&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Mélangez farine, levure, sucre vanillé &lt;strong&gt;et&lt;/strong&gt; la pincée de
sel.&lt;/li&gt;
&lt;li&gt;Ajoutez à la farine les noisettes grillées, les raisins secs et les pépites
de chocolat.&lt;/li&gt;
&lt;li&gt;Mélangez bien le tout, pour répartir les ingrédients,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Dans un bol&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si vous n'aviez pas d'huile, faites fondre le beurre à feu très doux et en
remuant pendant toute la durée de l'opération.&lt;/li&gt;
&lt;li&gt;Mesurez les 70g de cassonade, et ajoutez un œuf. Mélangez le tout.&lt;/li&gt;
&lt;li&gt;Si vous utilisez de l'huile, ajoutez l'eau. Mélangez bien.&lt;/li&gt;
&lt;li&gt;Ajoutez l'huile ou le beurre, et mélangez jusqu'à obtenir une indistincte
mélasse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Merge (bol, saladier)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Versez en trois étapes le contenu du bol dans le saladier, en remuant
continuellement.&lt;/li&gt;
&lt;li&gt;Quand le mélange présente une agglomération certaine, et qu' il devient
difficile à manœuvrer, continuez le pétrissage à la main.&lt;/li&gt;
&lt;li&gt;Stoppez quand vous obtenez une boule de pate homogène, dont les morceaux ne
se décollent plus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le grand cylindre&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Découpez une feuille de plastique transparent alimentaire.&lt;/li&gt;
&lt;li&gt;Placez la boule de pâte sur cette feuille, en l'étirant en rouleau.&lt;/li&gt;
&lt;li&gt;Refermez la feuille sur la pâte. Une fois bien emballée, faites la rouler
sur votre plan de travail, de façon à lui donner un aspect circulaire.&lt;/li&gt;
&lt;li&gt;Placez le tout au réfrigérateur 1/2h, ou 10mn au congélateur. Cela va
donner une certaine tenue à la pâte, afin de faciliter son découpage
ultérieur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Cuisson&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Découpez la pâte en cylindres de 1 ou 2cm d'épaisseur.&lt;/li&gt;
&lt;li&gt;N'hésitez pas à rassembler le morceau en un monticule cylindrique bien
aggloméré, en poussant la circonférence extérieure de vos petits doigts
vigoureux.&lt;/li&gt;
&lt;li&gt;Placez les cylindres (ou monticules, selon votre degré de finesse) de façon
espacée sur du papier cuisson.&lt;/li&gt;
&lt;li&gt;Mettre le tout sur une plaque (ou une grille si comme moi, vous n'avez
toujours pas de plaque).&lt;/li&gt;
&lt;li&gt;Faites cuire 1/4h dans un four préchauffé à 180°.&lt;/li&gt;
&lt;li&gt;Renouvellez l'opération découpage/disposition/cuisson jusqu'à épuisement du
stock ou de votre patience.&lt;/li&gt;
&lt;li&gt;Le secret du gourmand : la pâte se congèle très bien, pour une
utilisation ultérieure !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Dégustation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Là, je crois que les explications ne sont plus nécessaires !&lt;/li&gt;
&lt;li&gt;Je n'accepte aucune responsabilité quand à une éventuelle prise de
poids.&lt;/li&gt;
&lt;li&gt;Une dernière photo pour achever de convaincre les plus indécis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.finiderire.com/public/images/cookie4.JPG&quot;&gt;&lt;img src=&quot;http://www.finiderire.com/public/images/.cookie4_m.jpg&quot; alt=&quot;cookies miam&quot; title=&quot;cookies miam, nov. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2011/11/22/Des-cookies-%C3%A0-accepter-sans-h%C3%A9siter-%21#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2011/11/22/Des-cookies-%C3%A0-accepter-sans-h%C3%A9siter-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/650978</wfw:commentRss>
      </item>
    
  <item>
    <title>Enfin RAID!</title>
    <link>http://www.finiderire.com/post/2010/04/27/Better-RAID-than-dead</link>
    <guid isPermaLink="false">urn:md5:f8d610a87640f278df7b7d6c98f8a32f</guid>
    <pubDate>Sun, 16 Oct 2011 19:51:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Sous ce titre ne se cache pas l'annonce de la fermeture du blog. Que
nenni! Lisez plutôt la suite, et tant pis pour la fausse joie.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Que feriez-vous si vous preniez possession de trois disques identiques
?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Mais non! Vous ne les revendriez pas sur Ebay !&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Vous vous monteriez un RAID, bien sûr !&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;em&gt;Remerciements particuliers à Frédéric Jolliton, qui m'a donné un sérieux
coup de main.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Dis papa, le serveur il est tout RAID&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bon pas besoin d'en faire une tartine, ni d'expliquer les différentes
formes de RAID.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ici, je parlerai de deux type de RAID (RAID1 et RAID5), avec trois disques.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAID1&lt;/strong&gt; : C'est du mirroring. Chaque disque réplique
complètement les autres.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAID5&lt;/strong&gt; : Chaque disque perd 33% de sa capacité, afin
d'être en mesure de reconstruire un disque tombé en panne. Il faut bien sûr que
deux disques soient en état de marche pour reconstruire le troisième.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour ceux qui veulent tout savoir
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.archlinux.org/index.php/Installing_with_Software_RAID_or_LVM&quot;&gt;excellent
article de la doc Arch-Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;La doc Arch aborde également le problème du MBR sur les disques modernes,
et qui pourrait vous intéresser si vous installer un MS-Windows en RAID. Ceci
ne sera pas abordé dans ce billet qui est déja suffisement long comme ça.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La route est droite mais la pente est RAID&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Il y a différentes façons d'envisager le RAID.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;RAID matériel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le RAID matériel se matérialise (haha) sous la forme d'une carte
d'extension qui supportera des disques SCSI , IDE ou SATA.&lt;/li&gt;
&lt;li&gt;Les disques sont reconnus dès le boot par la carte, et le support est
transparent pour l'OS qui verra les disques tels que le controleur RAID lui
présente.&lt;/li&gt;
&lt;li&gt;Pas de bol, c'est souvent associé à du matériel bien propriétaire, avec des
disques bien spécifiques. Malheur à vous si vous osez utiliser un disque qui
n'est pas absolument identique!&lt;/li&gt;
&lt;li&gt;Bien entendu, les disques de votre array ne seront plus disponibles à la
vente au moment où ils auront besoin d'être remplacés.&lt;/li&gt;
&lt;li&gt;Les processeurs sont aujourd'hui largement plus puissants que les chipsets
intégrés des cartes RAID (sauf cartes couteuses pour usages bien spécifiques,
voir ci-dessous).&lt;/li&gt;
&lt;li&gt;N'espérez pas récupérer vos disques avec un controleur RAID différent de
celui d'origine.&lt;/li&gt;
&lt;li&gt;Bref, aucun intêret, si ce n'est pour des cas bien spécifiques. Par
exemple, dans le cas de grosses unités RAID montées sur une dizaine de disques.
Le bus de la carte RAID sera plus efficace.&lt;/li&gt;
&lt;li&gt;En réalité, le seul intêret est que le RAID matériel rassure le windozien,
pour qui le &lt;q&gt;RAID logiciel&lt;/q&gt; évoque la prise en charge foireuse par le bios
buggé de sa carte mère &lt;em&gt;Asuxxtoc&lt;/em&gt;. Le pauvre homme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;RAID logiciel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pas besoin de matériel coûteux.&lt;/li&gt;
&lt;li&gt;Le kernel Linux est tout a fait adapté au RAID logiciel, et la mise en
oeuvre ne pose pas de problèmes particuliers.&lt;/li&gt;
&lt;li&gt;On peut mélanger les disques (différents modèles ou constructeurs).
&lt;ul&gt;
&lt;li&gt;C'est même mieux de procéder ainsi, car on considère que les disques de
même série vont avoir tendance à tomber en panne... en même temps. C'est
d'ailleurs ce qu'on appelle la loi des séries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On peut également mélanger différentes interfaces. Pour mon test, j'avais
un disque en IDE, et deux en SATA. (je vous rassure, en prod c'est fait
proprement. Les budgets pour la recherche, ce n'est plus ce que c'était, ma
bonne dame.)&lt;/li&gt;
&lt;li&gt;Vous n'êtes même pas obligés d' utiliser des disques de même taille. Il
faut bien sûr qu'ils aient une taille suffisante pour contenir la/les
partition(s) RAID.&lt;/li&gt;
&lt;li&gt;En résumé, le RAID logiciel est tellement mieux pour les serveurs (je ne
parle pas des grosses fermes de disques) qu'à part pour les fatigués de
naissance et les pusillanimes, il s'impose de lui même.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Arch : mise en place d'un RAID logiciel&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Situation de départ&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez trois disques qui n'ont jamais servis, et vous souhaitez
installer une machine sous Arch.&lt;/li&gt;
&lt;li&gt;Il faut donc commencer par s'occuper de la mise en place du RAID.&lt;/li&gt;
&lt;li&gt;Vous venez de booter sur le CD d'installation de Arch, et le curseur de la
ligne de commande clignote impatiemment…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Partionnement&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez utiliser &lt;code&gt;cfdisk&lt;/code&gt; pour partitionner votre disque, en
général disponible par défaut lors des installations.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici mon schéma de partionnement, avec trois disques sata
(sda,sdb,sdc) :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]1&lt;/strong&gt; :
&lt;strong&gt;/boot&lt;/strong&gt; (agrégé en raid1, partition bootable)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]2&lt;/strong&gt; :
&lt;strong&gt;/&lt;/strong&gt; (agrégé en raid5)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]3&lt;/strong&gt; :
&lt;strong&gt;swap&lt;/strong&gt; (non agrégé, hors raid)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Note: la partition &lt;strong&gt;/boot&lt;/strong&gt; sera marquée avec le flag
&lt;em&gt;bootable&lt;/em&gt; sur &lt;strong&gt;chacun&lt;/strong&gt; des disques.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pas la peine de faire trois fois de suite un &lt;code&gt;cfdisk&lt;/code&gt; avec les
mêmes paramètres.
&lt;ul&gt;
&lt;li&gt;Partionnez le premier disque, puis copiez le partitionnement sur les deux
autres (assurez-vous d'opérer sur des disques vides).&lt;/li&gt;
&lt;li&gt;Avec &lt;code&gt;sfdisk&lt;/code&gt; (et non plus &lt;code&gt;cfdisk&lt;/code&gt;), nous allons
dupliquer les données.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sfdisk -d /dev/sda &amp;gt; partitions&lt;/code&gt; : pour dumper les
infos de partitionnement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sfdisk /dev/sdb &amp;lt; partitions&lt;/code&gt; : pour écrire sur le
second disque le partitionnement du premier.&lt;/li&gt;
&lt;li&gt;Vous pouvez vérifier le partitionnement: &lt;code&gt;fdisk -l /dev/sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour info, le dump est une simple description ascii:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

[root@archiso arch]# sfdisk -d /dev/sda
# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=       63, size= 48821472, Id=83, bootable
/dev/sda2 : start= 48821535, size=923833890, Id=83
/dev/sda3 : start=972655425, size=  4112640, Id=82
/dev/sda4 : start=        0, size=        0, Id= 0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;création des arrays&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous utilisons &lt;strong&gt;mdadm&lt;/strong&gt;, couteau suisse du Raid.&lt;/li&gt;
&lt;li&gt;La lecture de sa manpage n'est pas conseillée, elle est obligatoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour créer une array en RAID-1 (partition &lt;strong&gt;/boot&lt;/strong&gt;):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mdadm --create /dev/md1 --level=1 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1 --metadata=0.90

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour créer une array en RAID-5 (partition &lt;strong&gt;/&lt;/strong&gt;) :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mdadm --create /dev/md2 --level=5 --raid-devices=3 /dev/sda2 /dev/sdb2 /dev/sdc2

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour vérifier que tout s'est bien passé, deux possibilités:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat /proc/mdstat&lt;/code&gt; : le strict minimum.&lt;/li&gt;
&lt;li&gt;Pour avoir plus de détails:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm -q --detail /dev/md[1-2]

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans tous les cas, vous allez voir que les différents disques sont en train
de se synchroniser, sauf si vous avez créé des arrays minuscules (dans ce cas,
il y a des chances pour que ce soit déja fini).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un exemple de sortie de /proc/mdstat pendant la reconstruction de l'array
en RAID-5 (un gros morceau):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

Personalities : [raid1] [raid6] [raid5] [raid4] 
md2 : active raid5 sdc2[3] sdb2[1] sda2[0]
      923833728 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [=&amp;gt;...................]  recovery =  9.1% (42417280/461916864) finish=64.2min speed=108744K/sec
      
md1 : active raid1 sdc1[2] sdb1[1] sda1[0]
      24410624 blocks [3/3] [UUU]

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez bien sûr utiliser votre RAID pendant la reconstruction (sinon,
le RAID n'aurait pas grand intêret).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Montage du RAID&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A noter que cette partie pourra vous resservir hors installation, en cas de
gros pépin par exemple.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Schéma du partitionnement RAID&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour chacun des disques:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]1&lt;/strong&gt; :
&lt;strong&gt;/boot&lt;/strong&gt; (agrégé en raid1 sur /dev/md1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]2&lt;/strong&gt; :
&lt;strong&gt;/&lt;/strong&gt; (agrégé en raid5 sur /dev/md2)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sd&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[a-c&quot; title=&quot;[a-c&quot;&gt;[a-c&lt;/a&gt;]3&lt;/strong&gt; :
&lt;strong&gt;swap&lt;/strong&gt; (non agrégé, hors raid)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Assemblage des partitions RAID&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Normalement, un &lt;em&gt;modprobe&lt;/em&gt; sur les modules RAID n'est pas nécessaire
(ces modules seront chargés lors de la première utilisation de &lt;em&gt;mdadm&lt;/em&gt;).
&lt;ul&gt;
&lt;li&gt;Au cas où, voici la liste des modules impliqués : md_mod et
raid&lt;a href=&quot;http://www.finiderire.com/post/2010/04/27/[456&quot; title=&quot;[456&quot;&gt;[456&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avant de pouvoir mounter le RAID, il faut l'assembler (uniquement si vous
venez de rebooter sur un système ne prenant pas encore en charge le RAID au
moment du boot).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#Assemblage de la partition boot
[root@archiso ~]# mdadm --assemble /dev/md1 /dev/sda1 /dev/sdb1 /dev/sdc1
mdadm: /dev/md1 has been started with 3 drives.

#Assemblage de la partition home
[root@archiso ~]# mdadm --assemble /dev/md2 /dev/sda2 /dev/sdb2 /dev/sdc2
mdadm: /dev/md2 has been started with 3 drives.

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Formatage des partitions&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Rappel : md1 correspond à la représentation d'un disque complet.
&lt;ul&gt;
&lt;li&gt;On peut rapprocher ce nom de device de sda , qui représente également la
totalité du disque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ici, on veut utiliser le disque complet, donc on formate sans partitionner
le device RAID. Exemple:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkfs.ext4 /dev/md1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;attention au flag &lt;strong&gt;HUGE_FILE&lt;/strong&gt; lors du formatage , il peut
poser problème plus tard et est relativement inutile pour l'instant
&lt;ul&gt;
&lt;li&gt;pour les problèmes possibles, voir la section &lt;em&gt;premier boot&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;HUGE_FILE permet le support de fichiers de plus de 2 teraoctets (nous ne
sommes pas prêt d'y arriver, tout comme &lt;q&gt;640Kb should be enough for
everyone&lt;/q&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Montage des partitions.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Je n'ai monté que la première partition (root) qui servira à contenir le
système.
&lt;ul&gt;
&lt;li&gt;La partition &amp;quot;home&amp;quot; n'a pas d'intêret pour l'instant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#Montage des partitions
[root@archiso ~]# mount /dev/md1 /mnt

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ajout du swap&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le swap est réparti sur les trois disques.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;mkswap /dev/sda3&lt;/code&gt; : à faire pour les 3 partitions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On utilise la même priorité pour les 3 partitions de swap (avec &lt;strong&gt;-p
0&lt;/strong&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;swapon -p 0 /dev/sda3 /dev/sdb3 /dev/sdc3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A noter que le swap n'est donc pas en RAID, donc en cas de claquage d'un
disque, il peut se passer des choses bizarres. Le swap ne sert pratiquement
plus de nos jours, mis à part pour l'hibernation. Je préférais vous prévenir
afin que vous agissiez en connaissance de cause. Faites le chez vous les
enfants, mais ne venez pas vous plaindre ensuite!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation et configuration du système&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Il faut maintenant installer les paquets.&lt;/li&gt;
&lt;li&gt;Dans le cas d'une Arch, il vous faudra au minimum &lt;strong&gt;base&lt;/strong&gt;.
Pour le reste, c'est vous qui voyez.&lt;/li&gt;
&lt;li&gt;Ça y est ? Tous les paquets sont installés ?&lt;/li&gt;
&lt;li&gt;Nous allons poursuivre la configuration en gardant à l'esprit que votre
disque n'est pas encore à la racine, mais simplement mounté dans un tmpfs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Création de la config mdadm&lt;/h5&gt;
&lt;pre&gt;

mv /mnt/etc/mdadm.conf /mnt/etc/mdadm.conf.old
mdadm --examine --scan &amp;gt;&amp;gt; /mnt/etc/mdadm.conf

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Attention à bien écrire dans le /etc du mount, et non pas dans celui monté
en RAM pour l'installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Gardez précieusement le fichier &lt;em&gt;mdadm.conf&lt;/em&gt; original. Il vous
servira plus tard pour compléter la configuration (adressse mail pour le
monitoring, etc..)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;le double &lt;q&gt;&amp;gt;&amp;gt;&lt;/q&gt; pour la redirection dans &lt;em&gt;mdadm.conf&lt;/em&gt;,
c'est uniquement dans le cas où vous referiez la manip avec un fichier qui a
déja servi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Autres fichiers à éditer&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez éditer ces fichiers depuis le menu d'installation de Arch.
&lt;ul&gt;
&lt;li&gt;Il s'agit du menu &amp;quot;Install Packages&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Editez au minimum &lt;em&gt;rc.conf&lt;/em&gt; pour avoir les locales en français au
démarrage.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;locale.gen&lt;/em&gt; : décommenter la locale choisie dans rc.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si vous voulez utiliser un ramdisk pour charger les modules RAID (plutôt
que de recompiler un noyau avec ledit support), c'est le moment de modifier:
&lt;em&gt;/etc/mkinitcpio.conf&lt;/em&gt; .
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;mkinitcpio&lt;/em&gt; se lance depuis un environnement chrooté, mais Arch se
charge fort bien de cette tâche lorsque vous quittez le menu d'édition des
fichiers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La configuration de &lt;em&gt;pacman&lt;/em&gt; fera l'objet d'un billet à part.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;N'oubliez pas de changer le mot de passe root.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Sortie de l'installeur&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez quitter l'installeur.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;N' &lt;strong&gt;installez pas&lt;/strong&gt; Grub depuis le menu Arch. Nous allons le
faire depuis le shell, dès que nous aurons chrooté le RAID.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation de GRUB&lt;/h3&gt;
&lt;h5&gt;Chroot du RAID&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il nous faut maintenant chrooter pour continuer l'installation&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

[root@archiso ~]# mount -o bind /dev /mnt/dev
[root@archiso ~]# mount -t proc none /mnt/proc
[root@archiso ~]# chroot /mnt /bin/bash

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;GRUB sur le premier disque&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;L' opération est détaillée pour le premier disque.
&lt;ul&gt;
&lt;li&gt;Elle sera à refaire pour chacun des disques, afin de pouvoir booter avec
n'importe quel disque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous installerons GRUB sur les autres disques après le premier boot.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il nous faut commencer par ramener les fichiers de GRUB au bon endroit.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cp -a /usr/lib/grub/i386-pc/* /boot/grub/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un petit coup d'oeil à &lt;em&gt;/boot/grub/menu.lst&lt;/em&gt; afin de nous assurer
que les paramètres par défaut sont corrects...
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;root&lt;/em&gt; est sur &lt;em&gt;/dev/sda3&lt;/em&gt;. Ce qui est faux. Correction, avec
remplacement par &lt;em&gt;/dev/md1&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Un autre problème que vous pourriez rencontrer: vous n'avez fait qu'une
seule partition racine, avec /boot inclus dedans. Dans ce cas, le noyau est
dans &lt;strong&gt;/boot&lt;/strong&gt;, et non pas dans &lt;strong&gt;/&lt;/strong&gt; .&lt;/li&gt;
&lt;li&gt;Voici ma config grub:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

timeout   5
default   0
color light-blue/black light-cyan/blue

title  Arch Linux  [/boot/vmlinuz26]
root   (hd0,0)
kernel /boot/vmlinuz26 root=/dev/md1 ro md=1,/dev/sda1,/dev/sdb1,/dev/sdc1
initrd /boot/kernel26.img

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensuite, nous invoquons grub avec ... &lt;code&gt;grub&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et sous l'interface, nous rendons le premier disque bootable&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

grub&amp;gt; root (hd0,0)
grub&amp;gt; setup (hd0)
grub&amp;gt; quit

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Avant de rebooter&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Assurez vous d'avoir changé le password de root, sinon vous ne pourrez pas
utiliser ce compte.&lt;/li&gt;
&lt;li&gt;Vous pouvez aussi créer un utilisateur : &lt;code&gt;adduser -m toto&lt;/code&gt;
puis &lt;code&gt;passwd toto&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Support par Linux au boot&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Support par modules
&lt;ul&gt;
&lt;li&gt;Par défaut, votre noyau de distrib a tous les drivers possibles compilés en
modules (le noyau serait trop gros avec les drivers compilés en dur).&lt;/li&gt;
&lt;li&gt;Il faudra donc utiliser une image montée en ram juste après le chargement
du noyau, pour utiliser les modules RAID.&lt;/li&gt;
&lt;li&gt;Je ne détaille pas cette option ici, mais j'ai préparé un billet que je
posterai bientôt pour les gens intéressés.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Support dans le kernel
&lt;ul&gt;
&lt;li&gt;Le plus facile est de se compiler un kernel avec le support RAID
built-in.&lt;/li&gt;
&lt;li&gt;L'inconvénient est que l'on perd le noyau fourni par sa distribution. Sauf
si bien sûr on crée un paquet avec le noyau nouvellement compilé.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Premier boot : alors ça, c'est RAID!&lt;/h3&gt;
&lt;h5&gt;Montage en lecture seule des devices RAID (md&lt;em&gt;x&lt;/em&gt;)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le boot semble bien se passer, tout va très bien Madame la Marquise ...
sauf qu'on déplore un tout petit rien.&lt;/li&gt;
&lt;li&gt;Les partitions md0 et md1 sont montées en lecture seule
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EXT4-fs (md0) : Filesystem with huge files cannot be mounted
RDWR without CONFIG_LBDAF&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mais à part ça, Madame la Marquise, tout va très bien, tout va très
bien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Résolution 1 : bête et méchante.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez rebooter sur votre CD d'install, ré-assembler le RAID, et
recompiler un noyau avec l'option CONFIG_LBDAF
&lt;ul&gt;
&lt;li&gt;Cette option sert à supporter les fichiers de plus de 2 Tera-octets.&lt;/li&gt;
&lt;li&gt;Vu que mon RAID est composé de 3*40Go, ceci parait un peu inutile ... nous
allons enquêter un peu plus sur ce message.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Résolution 2 : un poil de réflexion.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons inspecter les systèmes de fichiers (cette erreur ne concernant
pas le RAID).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Reboot avec le CD d'install, et ré-assemblage du RAID. Mais cette fois, pas
de recompilation du noyau!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tune2fs -l /dev/md1&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;nous voyons le flag &lt;strong&gt;HUGE_FILE&lt;/strong&gt; , qui provoque le
problème.&lt;/li&gt;
&lt;li&gt;répéter l'opération pour md2 (normalement, c'est la même chose si vos
partitions ont été créées de la même façon).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons enlever le flag HUGE_FILE
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tune2fs -O ^HUGE_FILE /dev/md1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si nécessaire, répéter l'opération sur les autres unités RAID.&lt;/li&gt;
&lt;li&gt;vérifier que les opérations ont été répercutées (ex: &lt;code&gt;tune2fs -l
/dev/md1&lt;/code&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Lancer un &lt;code&gt;e2fsck&lt;/code&gt; sur les devices RAID (ex: &lt;code&gt;e2fsck
/dev/md1&lt;/code&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si tout est ok, reboot !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Dernières opérations après reboot&lt;/h3&gt;
&lt;h5&gt;GRUB sur le disques supplémentaires&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il ne nous reste plus qu'à installer GRUB sur les disques restants, afin
d'avoir trois disques identiques et substituables.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Relancez grub et tapez ces commandes:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

grub&amp;gt; device (hd0) /dev/sdb
grub&amp;gt; root (hd0,0)
grub&amp;gt; setup (hd0)
grub&amp;gt; device (hd0) /dev/sdc
grub&amp;gt; root (hd0,0)
grub&amp;gt; setup (hd0)
grub&amp;gt; quit

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Sauvegarde de la structure des disques&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Afin de reconstruire rapidement un disque raid, il est utile de sauvegarder
sa structure.
&lt;ul&gt;
&lt;li&gt;Il faudra bien sûr un disque de taille identique ou supérieure pour
restaurer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

 sfdisk --dump /dev/sda &amp;gt;sfdisk_sda
 sfdisk --dump /dev/sdb &amp;gt;sfdisk_sdb
 sfdisk --dump /dev/sdc &amp;gt;sfdisk_sdc

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;A mettre en lieu sûr. La partition raid devrait faire l'affaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour restaurer, il vous suffira de pratique l'opération inverse.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sfdisk /dev/sda &amp;lt; sfdisk_sda&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Base de monitoring&lt;/h3&gt;
&lt;h5&gt;/proc/mdstat&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On commence par utiliser les processus.&lt;/li&gt;
&lt;li&gt;Pour l'admin, un &lt;code&gt;cat /proc/mdstat&lt;/code&gt; suffit.
&lt;ul&gt;
&lt;li&gt;ce n'est pas très pratique pour les scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le strict minimum peut être obtenu facilement:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

cat /proc/mdstat | awk '/^md[0-9]/ { dev=$1 } /\[[U_]+\]/ { match($0,/\[[U_]+\]/,state); print dev &amp;quot;:&amp;quot; state[0] }'

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;à adapter selon ce que vous souhaitez en faire.
&lt;ul&gt;
&lt;li&gt;par exemple, cette sortie pourrait être lue avec beuglement de la machine
en cas de détection d'un disque en rade.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mdadm&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On peut utiliser tout simplement &lt;code&gt;mdadm&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Il suffit de le placer en mode &lt;em&gt;monitor&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mdadm -F -m toto@foo.com --scan -1 -t

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Signification des flags:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-F&lt;/strong&gt; : mode monitor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-m&lt;/strong&gt; : précise le mail où envoyer le rapport.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scan&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-1&lt;/strong&gt; : une seule itération et sort (sans ce flag, lancé
en daemon).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-t&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour recevoir des emails en cas d'alerte, vous avez un paramètre dans
&lt;em&gt;mdadm.conf&lt;/em&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MAILADDR moi@bigcorp.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;RAID is dead (ou: RAID en rade)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant, simulons une panne afin de nous assurer que tout est
d'équerre.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Où sont les disques ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour commencer, il faut repérer les ports SATA pour retrouver les disques
facilement dans le boitier.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Explorons un peu les devices pour retrouver tout ça:
&lt;ul&gt;
&lt;li&gt;/sys/block/sda/device -&amp;gt; ../../../0:0:0:0&lt;/li&gt;
&lt;li&gt;qui pointe en fait vers&lt;/li&gt;
&lt;li&gt;/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous en déduisons:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1f.2&lt;/strong&gt; : controleur sata de sda.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;target&lt;/strong&gt; : donne le port pour sda.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour faire plus court: &lt;code&gt;readlink -f /sys/block/sda/device&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;résultat de readlink sur sda, sdb, sdc :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

sda: /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0
sdb: /sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:1/0:0:1:0
sdc: /sys/devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un coup d'oeil sur la carte mère..
&lt;ul&gt;
&lt;li&gt;Sur l'epoxy de la carte mère, il est sérigraphié un libellé à côté de
chaque port sata: &lt;em&gt;sata-a&lt;/em&gt;, &lt;em&gt;sata-b&lt;/em&gt;… jusqu'à &lt;em&gt;sata-d&lt;/em&gt;
pour ma part.&lt;/li&gt;
&lt;li&gt;Ces ports sont reliés à des disques. Une étiquette sur le cordon sata côté
disque indique: hd0, hd1, hd2.&lt;/li&gt;
&lt;li&gt;Nous en déduisons assez logiquement que le nommage du controleur sata suit
la même progression.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;host0&lt;/em&gt; pour les deux premiers, logique au vu du branchement
physique.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;q&gt;Logique&lt;/q&gt; et &lt;q&gt;Informatique&lt;/q&gt; ne riment que dans le dictionnaire.
&lt;ul&gt;
&lt;li&gt;Nous pouvons vérifier notre théorie en débranchant le premier disque,
machine éteinte.&lt;/li&gt;
&lt;li&gt;Ensuite, nous rallumons la machine en bootant sur le media d'installation
ou sur un live-CD (surtout pas sur votre OS à ce stade!).&lt;/li&gt;
&lt;li&gt;Il ne reste plus qu'à vérifier, en faisant la manipulation ci-dessus. Vous
devriez retrouver facilement l'emplacement physique du disque déconnecté.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tout ceci devrait faciliter le remplacement d'un disque grillé, sans avoir
besoin de l'horrible méthode &lt;em&gt;essai/erreur&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Simulation d'une panne soft&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Les possibilités ne manquent pas, avec option &lt;em&gt;électrocution&lt;/em&gt; pour
les aventuriers de tous les dangers.
&lt;ul&gt;
&lt;li&gt;Pour commencer, j'ai choisi la méthode douce: marquage d'une partition raid
en &lt;em&gt;fail&lt;/em&gt;, et retrait de celle-ci.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Marquage en fail:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# mdadm -f /dev/md1 /dev/sda1
mdadm: set /dev/sda1 faulty in /dev/md1

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retrait de la partition:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# mdadm -r /dev/md1 /dev/sda1
mdadm: hot removed /dev/sda1 from /dev/md1

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vérification du retrait de sda1 de md1
&lt;ul&gt;
&lt;li&gt;La première partition est arrêtée: &lt;strong&gt;_UU&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md2 : active raid5 sdb2[1] sdc2[2] sda2[0]
      923833728 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid1 sdc1[2] sdb1[1]
      24410624 blocks [3/2] [_UU]

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remise en route du raid
&lt;ul&gt;
&lt;li&gt;Auparavant, nous créons un gros fichier sur md1, juste pour rire.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dd if=/dev/urandom of=garbage count=1M bs=1K&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et nous ajoutons sda1 à l'array md1
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mdadm -a /dev/md1 /dev/sda1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ça bosse ? Un petit coup d'oeil à mdstat&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# mdadm -a /dev/md1 /dev/sda1
mdadm: re-added /dev/sda1

# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md2 : active raid5 sdb2[1] sdc2[2] sda2[0]
      923833728 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

md1 : active raid1 sda1[3] sdc1[2] sdb1[1]
      24410624 blocks [3/2] [_UU]
      [&amp;gt;....................]  recovery =  1.2% (293632/24410624) finish=2.7min speed=146816K/sec

unused devices: &amp;lt;none&amp;gt;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Simulation d'une panne hard&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Cette fois, c'est du sérieux. Terminé les marquages &lt;em&gt;fail&lt;/em&gt;, place au
tournevis.&lt;/li&gt;
&lt;li&gt;Éteignons la machine, et retirons le disque correspondant à
&lt;strong&gt;sda&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Nous en plaçons un autre en &lt;q&gt;remplacement&lt;/q&gt;.
&lt;ul&gt;
&lt;li&gt;Nous avons vu plus haut comment repérer les disques dans le boitier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Bien entendu, nous n'avons pas pu sortir proprement de l'array raid le
disque &lt;q&gt;grillé&lt;/q&gt;.
&lt;ul&gt;
&lt;li&gt;Il faut donc rebooter sur un live CD, pour reconstruire l'array.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pas de bol, le nouveau disque inséré est identifié comme étant sdb (les
joies de udev).
&lt;ul&gt;
&lt;li&gt;En situation critique, il faudrait donc au plus deux reboots (et les fsck
afférents) pour trouver un disque grillé.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dans mon test de restauration, le disque de remplacement avait une capacité
très inférieure aux autres disques. Cela ne gêne pas pour du raid soft, et je
me suis contenté de reconstruire la partition système.
&lt;ul&gt;
&lt;li&gt;Opérons un fdisk sur un disque faisant partie de l'array, afin de récupérer
les valeurs &lt;q&gt;start&lt;/q&gt; et &lt;q&gt;end&lt;/q&gt; de la ppartition système. Ensuite, nous
re-créons la partition sur le disque de remplacement, en utilisant bien sûr les
mêmes valeurs.&lt;/li&gt;
&lt;li&gt;Il y a encore plus simple: si vous aviez sauvé les valeurs de vos
partitions raid avec &lt;em&gt;sfdisk&lt;/em&gt;, vous pouvez faire l'opération inverse
pour initialiser le nouveau disque (il faut cependant qu'il soit de capacité
identique ou supérieure aux disques déja présents).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une fois le disque de remplacement paramétré, nous pouvons assembler le
raid.
&lt;ul&gt;
&lt;li&gt;Nous commençons par intégrer les deux disques corrects.&lt;/li&gt;
&lt;li&gt;C'est un assemblage en mode dégradé (d'où le paramètre &lt;q&gt;--run&lt;/q&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --assemble --run /dev/md1 /dev/sda1 /dev/sdc1

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Normalement, nous obtenons: &lt;em&gt;mdadm: /dev/md1 has been started with 2
drives (out of 3)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Un &lt;code&gt;cat /proc/mdstat&lt;/code&gt; donne plus de précisions&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

md1: active raid1 sda1[0] sdc1[2]
     24410624 blocks [3/2] [U_U]

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il ne nous reste plus qu'à ajouter le disque de remplacement à
l'array:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --add /dev/md1 /dev/sdb1
~# cat /proc/mdstat # indique que le recovery est en cours.

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le mount du disque RAID est possible, pour vérifier que tout est bien là.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mount /dev/md1 /mnt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Attention à éditer mdadm.conf et /etc/fstab sur votre array, si vous n'avez
pas restauré toutes les partitions!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Rebootons sur notre RAID remis en état.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voilà.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si vous avez fait un test et que vous désirez remettre l'ancien disque,
enlevé uniquement durant le test:
&lt;ul&gt;
&lt;li&gt;bootez sur un live CD.&lt;/li&gt;
&lt;li&gt;agrégez le raid sur les deux disques synchronisés dans le raid.&lt;/li&gt;
&lt;li&gt;ajoutez le disque (même procédure que ci-dessus).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une astuce pour finir. Vous pouvez très bien faire:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#ici, /dev/sdb1 n'a pas encore été remis dans l'array

~# mdadm --assemble /dev/md1 /dev/sd1 /dev/sdb1 /dev/sdc1
mdadm: /dev/md1 assembled from 2 drives - need all 3 to start it
       (use --run to insist).

~# mdadm --run /dev/md1
mdadm: started /dev/md1

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;code&gt;cat /proc/mdstat&lt;/code&gt; montre que sdb est manquant.
&lt;ul&gt;
&lt;li&gt;Il ne reste qu'à ajouter sdb1 à md1, et c'est reparti!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Mais je serai RAID avant qu'il n'ait fini !&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez sans doute remarqué que la reconstruction d'une array pouvait
prendre un certain temps.&lt;/li&gt;
&lt;li&gt;Heureusement, il y a moyen d'accélérer les choses.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous ne voulez rien synchroniser, car vous avez juste déplacé un disque de
port SATA sur la carte mère. Ceci peut arriver dans le cas d'un changement de
cable par exemple, cable qui sera trop court. Dans ce cas, votre troisième
disque contient déja toutes les données et vous n'avez pas besoin de le
reconstruire.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt; cette option n'est valable que si vous n'avez
pas encore monté le RAID que vous voulez reconstruire. &lt;strong&gt;Si vous avez
booté sur le RAID ou monté vos disques RAID&lt;/strong&gt;, c'est fichu, cette option
n'est plus valable.&lt;/li&gt;
&lt;li&gt;Faites un resync du &lt;q&gt;nouveau&lt;/q&gt; disque avec l'option
&lt;code&gt;——assume-clean&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un cas plus classique de grande lenteur.
&lt;ul&gt;
&lt;li&gt;Dans un cas plus réaliste, c'est à dire si vous ajoutez un disque neuf,
vous serez obligé de tout reconstruire. Mais même dans ce cas, vous pouvez
également accélérer les choses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# cat /proc/sys/dev/raid/speed_limit_min
1000
~# cat /proc/sys/dev/raid/speed_limit_max 
200000

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ceci signifie que pour chaque disque, la limite minimale de reconstruction
est de 1mo par seconde. Et la limite haute est de 200mo/s.&lt;/li&gt;
&lt;li&gt;La limite basse est vraiment peu élevée. On peut l'augmenter.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

echo 20000 &amp;gt; /proc/sys/dev/raid/speed_limit_min
 
OU
 
sysctl -w dev.raid.speed_limit_min=20000
 
&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Nous passons ainsi à un objectif de 20mo/s.
&lt;ul&gt;
&lt;li&gt;Ces modifications sont temporaires. Il faudrait placer le &lt;em&gt;sysctl&lt;/em&gt;
dans un fichier de démarrage pour les rendre résistantes au reboot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous disposons également de l'option &lt;q&gt;bitmap&lt;/q&gt;, qui accélère la
reconstruction.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --grow --bitmap=internal /dev/md0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une fois l'array reconstruite, il faut désactiver l'option.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --grow --bitmap=none /dev/md0

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une autre option susceptible d'accélérer les choses est de &lt;em&gt;mounter&lt;/em&gt;
les partitions avec l'option &lt;code&gt;noatime&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Cette option n'est pas spécifique au RAID, mais elle accélérera les
transactions sur les partitions journalisées avec EXT4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fstab&lt;/strong&gt; : &lt;code&gt;/dev/md1 / ext4 defaults,noatime 0
1&lt;/code&gt; (partition root)&lt;/li&gt;
&lt;li&gt;suivi d'un &lt;code&gt;mount / -o remount&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;puis d'un controle avec &lt;code&gt;cat /proc/mounts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un petit exemple de vitesse avec ces paramètres modifiés (speed_limit_min
et bitmap):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~# mdadm --grow --bitmap=internal /dev/md1

~# mdadm -a /dev/md1 /dev/sdc5

# cat /proc/mdstat 

Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] 
md1 : active raid5 sdc5[3] sda5[0] sdb5[1]
      1718745088 blocks level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [&amp;gt;....................]  recovery =  0.5% (4840064/859372544) finish=150.8min speed=94402K/sec
      bitmap: 3/7 pages [12KB], 65536KB chunk

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Better RAID than dead&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sur ce, j'arrête les jeux de mots faciles. Avant que tout cela ne ressemble
au style des admins BSD.&lt;/li&gt;
&lt;li&gt;Merci d'avoir pris le temps de lire ce long billet (oserais-je parler
d'article ?). J'ai passé encore plus de temps à l'écrire.&lt;/li&gt;
&lt;li&gt;Dernière chose: j'ai utilisé mes notes provenant de l'installation de deux
machines. Il se peut que certains devices vers la fin ne correspondent plus à
ceux du début. J'ai tout relu et corrigé, bien sûr, mais certains détails ont
pu m'échapper.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/04/27/Better-RAID-than-dead#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/04/27/Better-RAID-than-dead#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/512067</wfw:commentRss>
      </item>
    
  <item>
    <title>RTFM</title>
    <link>http://www.finiderire.com/post/2011/03/14/RTFM</link>
    <guid isPermaLink="false">urn:md5:2e00a1c38130a2b2414b4358417b9e06</guid>
    <pubDate>Tue, 15 Mar 2011 00:17:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>FreeBSD</category><category>Linux</category><category>vim</category>    
    <description>&lt;p&gt;&lt;em&gt;RTFM! Qui n'a jamais entendu cette injonction, tant laconique que
définitive, à la suite d'une innocente question ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Alors on lance man... et les pages de manuel s'accumulent dans les
terminaux.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Mais il existe une solution.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Dans tous les moments de la vie, Vim est votre ami.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Apprendre à lire&lt;/h3&gt;
&lt;h5&gt;man, classique&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;man&lt;/code&gt; est lancé depuis le terminal actif, puis fermé pour
utiliser la commande.
&lt;ul&gt;
&lt;li&gt;Bien entendu, juste après la fermeture, la moitié des paramètres est déja
oubliée.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;man, séparé&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous utilisez un autre terminal, et vous lancez &lt;code&gt;man&lt;/code&gt; au sein de
celui-ci.
&lt;ul&gt;
&lt;li&gt;Le terminal principal reste libre, et vous gardez le manuel ouvert à
l'endroit qui vous intéresse.&lt;/li&gt;
&lt;li&gt;Cette façon de faire est un peu meilleure, mais les terminaux ont tendance
à se multiplier, voire s'empiler (sous X).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;man avec Vim&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vim possède depuis plusieurs années déja le support des &lt;em&gt;tabs&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;Chaque &lt;em&gt;tab&lt;/em&gt; correspond à une zone de saisie différente au sein de
Vim.&lt;/li&gt;
&lt;li&gt;A ne pas confondre avec le mode splitté de la zone de saisie (&lt;code&gt;:help
split&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Très pratique pour l'édition multiple de sources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour tester les tabs:
&lt;ul&gt;
&lt;li&gt;Lancez Vim.&lt;/li&gt;
&lt;li&gt;Et en mode commande: &lt;code&gt;:tabnew&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour avoir la liste de toutes les possibilités associées aux &lt;em&gt;tabs&lt;/em&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:help tabs&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser les &lt;em&gt;tabs&lt;/em&gt; afin d'ouvrir chaque nouvelle page
de man dans un nouveau tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Contrôle de Vim à distance&lt;/h3&gt;
&lt;h5&gt;Tout cela est bien beau...&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous allez me dire (et vous aurez bien raison) que tout cela est bien
beau.&lt;/li&gt;
&lt;li&gt;Et vous ajouterez (toujours avec raison) qu'encore faudrait-il avoir la
possibilité de contrôler une instance de Vim depuis le shell.&lt;/li&gt;
&lt;li&gt;Comme vous vous en doutez, on peut. A la seule condition que Vim ait été
compilé avec l'option &lt;strong&gt;clientserver&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Le paquet officiel de Arch comporte cette option. Utilisateurs Ubuntu, ne
pleurez pas, vous bénéficiez du même traitement de faveur.&lt;/li&gt;
&lt;li&gt;Les vrais mecs sous Gentoo n'ont plus qu'à recompiler avec le bon flag.
Quand aux Slackers, ils ont d'autres soucis: Pango vient de se téléscoper Cairo
après une mise à jour douteuse, et plus rien ne fonctionne.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Vim! Lève toi et marche!&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il faut lancer Vim en mode serveur, avec un nom d'instance pour le repérer
par la suite:
&lt;ul&gt;
&lt;li&gt;Afin de bien appuyer le propos, &lt;em&gt;finiderire&lt;/em&gt; est utilisé comme nom
d'instance.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim --servername finiderire&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et ensuite, on ouvre un fichier dans l'instance &lt;em&gt;finiderire&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gvim --servername finiderire&lt;/code&gt; &lt;code&gt;--remote-tab
/etc/passwd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A noter l'option &lt;code&gt;--remote-tab-silent&lt;/code&gt; qui ne provoquera pas
d'avertissement de Vim si l'instance est créée en même que l'ouverture de la
tab.
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser cette option pour notre pager, afin d'éviter de tester
l'existence de l'instance pour la première ouverture.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour tout voir sans rien payer:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:help remote&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Communication man/Vim&lt;/h3&gt;
&lt;h5&gt;MANPAGER&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$MANPAGER&lt;/code&gt; est une variable d'environnement du shell qui permet
d'indiquer quel pager utiliser pour ouvrir une page man.
&lt;ul&gt;
&lt;li&gt;Il faudra penser à l'initialiser avec le nom et l'emplacement de notre
script, une fois celui-ci au point.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour le moment, nous lançons &lt;code&gt;man&lt;/code&gt; avec l'option &lt;code&gt;-P&lt;/code&gt;
qui a une priorité supérieur à &lt;code&gt;$MANPAGER&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Pour avoir le comportement par défaut de man (ouverture dans le terminal de
la page de manuel):&lt;/li&gt;
&lt;li&gt;&lt;code&gt;man -P &amp;quot;less -s&amp;quot; ls&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Les opérations à réaliser&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On commence par récupérer la sortie de man avec un simple cat:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;man -P &amp;quot;cat &amp;quot; ls &amp;gt;/tmp/man.$$&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Récupération de la page dans Vim:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gvim --servername finiderire&lt;/code&gt; &lt;code&gt;--remote-tab-silent
/tmp/man.$$&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Effacement du fichier temporaire:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rm /tmp/man.$$&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Script final&lt;/h3&gt;
&lt;h5&gt;Voici un script plus complet.&lt;/h5&gt;
&lt;pre&gt;

#!/bin/bash

pageman=/tmp/$$.man

rm -f /tmp/*.man

cat | col -b -x &amp;gt; $pageman

man_asked=/tmp/&amp;quot;$(head -1 $pageman | sed 's/\(^[^\ \(]\+\).*/\1/')&amp;quot;.man
mv &amp;quot;$pageman&amp;quot; &amp;quot;$man_asked&amp;quot;

gvim -R -c 'set ft=man nomod nolist nonumber guioptions=&amp;quot;-T -m&amp;quot;' -font &amp;quot;Terminus (TTF) 12&amp;quot; -c 'map q :q!&amp;lt;CR&amp;gt;' --servername finiderire --remote-tab-silent $man_asked

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Et voici les explications&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Effacer les anciens fichiers man en entrée du script.
&lt;ul&gt;
&lt;li&gt;On ne peut pas le faire en sortie du script, car il n'y aurait plus rien
dans Vim.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rm -f /tmp/*.man&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Formatter la sortie de man.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cat | col -b -x &amp;gt; $pageman&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Récupérer le nom de la page de manuel demandée.
&lt;ul&gt;
&lt;li&gt;Cela sert à générer le nom du fichier, afin d'afficher le nom de la
commande dans la tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

 man_asked=/tmp/&amp;quot;$(head -1 $pageman | sed 's/\(^[^\ \(]\+\).*/\1/')&amp;quot;.man

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Et le gros morceau: le lancement de Vim.
&lt;ul&gt;
&lt;li&gt;passer en &lt;q&gt;read-only&lt;/q&gt; : &lt;code&gt;-R&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;indiquer que le type de fichier est une page man, pour la coloration
syntaxique: &lt;code&gt;set ft=man&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;diverses commandes pour désactiver les préférences du .vimrc :
&lt;code&gt;nomod nolist nonumber&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;supprimer la toolbar et le menu pour gagner de la place:
&lt;code&gt;guioptions=&amp;quot;-T -m&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;changer la fonte par défaut: &lt;code&gt;font &amp;quot;Terminus (TTF) 12&amp;quot;&lt;/code&gt;. Cette
fonte est disponible dans les paquets Arch.&lt;/li&gt;
&lt;li&gt;permettre de quitter la page avec un simple appui sur la touche
&lt;strong&gt;q&lt;/strong&gt; : &lt;code&gt;map q :q!&amp;lt;CR&amp;gt;&lt;/code&gt;. Et si vous
modifiâtes par erreur le buffer, vous sortirez sans confirmation.&lt;/li&gt;
&lt;li&gt;Et enfin, ouvrir la page man dans l'instance &lt;em&gt;finiderire&lt;/em&gt;, dans une
&lt;em&gt;tab&lt;/em&gt; portant le nom de la commande demandée.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N'oubliez pas d'ajouter dans votre &lt;code&gt;.bashrc&lt;/code&gt; (pour les
utilisateurs de bash, bien sûr)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export MANPAGER=/path/vers/votre/script&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Améliorations possibles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Dans ce script, j'utilise &lt;em&gt;gvim&lt;/em&gt;, qui est la version X de Vim.
&lt;ul&gt;
&lt;li&gt;Vim peut également être lancé avec ou sans l'option &lt;q&gt;-g&lt;/q&gt;, selon que
vous désirez ou non la version X.&lt;/li&gt;
&lt;li&gt;En d'autres termes, &lt;code&gt;gvim&lt;/code&gt; est un alias pour &lt;code&gt;vim
-g&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Vous pourrez donc modifier le script pour lancer en mode console vim, et
passer en mode gvim si l'environnement graphique est détecté.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une autre amélioration possible serait de nommer les tabs sans l'astuce du
&lt;code&gt;mv&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Vous pouvez initialiser Vim en précisant le nom du tab : &lt;code&gt;:help
setting-guilabel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;C'est d'ailleurs la façon la plus propre de procéder. Je n'ai découvert
cette possibilité qu'après avoir écrit le script, à la relecture de ce
billet.&lt;/li&gt;
&lt;li&gt;Cette modification est donc laissée à titre d'exercice au lecteur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une modification sympathique serait d'intercepter le double clic de la
souris, qui surligne un mot sous Vim, afin de lancer la page man
correspondante.
&lt;ul&gt;
&lt;li&gt;Vous pouvez bien sûr d'ores et déja faire &lt;code&gt;:!man foo&lt;/code&gt; depuis Vim
pour ouvrir la manpage &lt;em&gt;foo&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Il serait cependant plus agréable de le faire d'un simple (double)
clic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;RTFM, RTFB&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Si d'aventure vous goûtez au &lt;strong&gt;RTFM!&lt;/strong&gt; sur un forum,
consolez-vous en pensant que ça arrive même aux meilleurs.
&lt;ul&gt;
&lt;li&gt;Et si vraiment vous êtes vexé, consolez-vous en pensant que vous avez
désormais le plus beau pager de la galaxie pour lire les pages man.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voilà.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et n'oubliez pas, RTFB !
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Read The Finest Blog&lt;/em&gt;, bien entendu.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2011/03/14/RTFM#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2011/03/14/RTFM#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/594352</wfw:commentRss>
      </item>
    
  <item>
    <title>Unison : o c mal</title>
    <link>http://www.finiderire.com/post/2010/10/21/Unison-%3A-o-c-mal</link>
    <guid isPermaLink="false">urn:md5:d30a0a54e41e2d72f9af6aebad625b51</guid>
    <pubDate>Wed, 08 Dec 2010 22:43:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Gentoo</category><category>Linux</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Les habitués de mon blog et de ma rigueur langagière doivent déja frémir
en voyant ce titre !&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Est-il devenu fou ? Le blog a t-il été piraté ? Cède t-il aux
sirènes du jeunisme triomphant ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Nenni ma foi, et je ne puis que vous encourager à
poursuivre.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Justifications&lt;/h3&gt;
&lt;h5&gt;De l'origine d'Unison&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Unison est écrit en OCaml, langage fort respectable à mi chemin entre le
procédural et le fonctionnel.&lt;/li&gt;
&lt;li&gt;La communauté OCamlienne est pour l'essentiel française. Elle se situe pour
la plupart dans les locaux de l'INRIA. Elle communique en anglais via le
channel IRC éponyme sur Freenode.&lt;/li&gt;
&lt;li&gt;OCaml est pour le moment en phase de transition majeure. Le temps que les
platres soient essuyés, méfiez-vous de la version 3.12 .&lt;/li&gt;
&lt;li&gt;Par ricochet, Unison recontre quelques problèmes (distribution Arch Linux)
avec OCaml. D'où le titre.
&lt;ul&gt;
&lt;li&gt;A noter que ce problème ne touche pas Gentoo. Utilisateurs de Arch,
continuez à lire. Utilisateurs de Gentoo, continuez à compiler.&lt;/li&gt;
&lt;li&gt;En fait, ça fonctionne sous Gentoo car OCaml 3.12 n'est pas encore en
stable dans portage, donc les problèmes ne sont pas encore apparus.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Description des symptomes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Unison existe en trois versions, du moins sous Linux:
&lt;ul&gt;
&lt;li&gt;texte (pratique pour tester, mais peu agréable à l'usage).&lt;/li&gt;
&lt;li&gt;gtk (moche).&lt;/li&gt;
&lt;li&gt;gtk2 (la version par défaut).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La version texte fonctionne toujours, c'est celle à privilégier pour
vérifier le bon fonctionnement d'une connexion distante.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le sujet a déja été abordé dans ce fabuleux blog, rappelons simplement que
la communication peut se faire en clair ou avec SSH.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le script qui esquive le problème&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Unison va devoir être lancé via un script&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Contenu du script:&lt;/h5&gt;
&lt;pre&gt;

~$ cat ./unison2.32
mon_host=desktop_jseb_arch
unison_local=unison-gtk2
#unison_local=unison-gtk

echo &amp;quot;lancement de Unison avec ces paramètres :&amp;quot;
echo &amp;quot;UNISONLOCALHOSTNAME=$mon_host $unison_version&amp;quot;
UNISONLOCALHOSTNAME=$mon_host ltrace -L $unison_local -servercmd=unison-2.32 -contactquietly

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Quelques explications&lt;/h5&gt;
&lt;p&gt;Le &amp;quot;contactquietly&amp;quot; permet d'avoir le focus sur le terminal, plutot que sur
une inutile boite de dialogue.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le patch de Jérome Vouillon&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;https://bugs.archlinux.org/task/20877?getfile=5824
&lt;ul&gt;
&lt;li&gt;J'ai eu du mal à le trouver, je le joins en fichier à ce billet par
précaution.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Soyons fou, à l'unison&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Si ça continue, je vais créer un tag Unison.&lt;/li&gt;
&lt;li&gt;Et assurer le SAV également.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
          <enclosure url="http://www.finiderire.com/public/patchs/jvouillon.patch"
      length="788" type="text/plain" />
    
    
          <comments>http://www.finiderire.com/post/2010/10/21/Unison-%3A-o-c-mal#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/10/21/Unison-%3A-o-c-mal#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/556183</wfw:commentRss>
      </item>
    
  <item>
    <title>Chauds les marrons! La duplication sans chataignes</title>
    <link>http://www.finiderire.com/post/2010/11/16/Chauds-les-marrons%21-La-duplication-sans-chataignes</link>
    <guid isPermaLink="false">urn:md5:09aebc437862e8e2aad9823ffda976ba</guid>
    <pubDate>Wed, 24 Nov 2010 19:48:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Vous avez installé Linux sur un disque, tout est bien configuré, et
parfait dans le meilleur des mondes.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Seulement voila: vous avez décidé de répliquer votre installation sur un
plus gros disque. Ou pourquoi pas, un plus petit (SSD).&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Contrainte supplémentaire: vous voulez le faire à chaud, pour bénéficier de
votre environnement (et continuer à surfer pendant l'opération).&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La grande réplication&lt;/h3&gt;
&lt;h5&gt;Ce que nous avons&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Un disque dur &lt;strong&gt;/dev/sda&lt;/strong&gt; avec deux partitions ext4, et une
partition swap.
&lt;ul&gt;
&lt;li&gt;Les partitions ext4 contiennent respectivement &lt;strong&gt;/&lt;/strong&gt; et le
contenu de &lt;strong&gt;/home&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La partition swap est utilisée pour l'hibernation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ce que nous voudrions que cela devienne&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous venons de monter un second disque dur, reconnu comme
&lt;strong&gt;/dev/sdb&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Ce disque va servir à répliquer le premier disque dur.&lt;/li&gt;
&lt;li&gt;Il est partitionné avec deux partitions ext4, et une partition de
swap.&lt;/li&gt;
&lt;li&gt;Ses partitions n'ont bien sûr pas la même taille que le premier (le but
n'est pas de faire une réplication à l'identique, mais bien de gagner de la
place!).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;En résumé&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous voulons copier &lt;strong&gt;sda&lt;/strong&gt; vers &lt;strong&gt;sdb&lt;/strong&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sda1 = /&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sda2 = /home&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Procédons !&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Nous venons de booter sur le disque servant de base à la réplication
(&lt;em&gt;sda&lt;/em&gt;).
&lt;ul&gt;
&lt;li&gt;Pour l'instant, sdb ne contient rien (je pars toutefois du principe que
fdisk est déja passé par là).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Formatage des partitions sur sdb&lt;/h5&gt;
&lt;pre&gt;

mkfs.ext4 /dev/sdb1 -L arch_root
mkfs.ext4 /dev/sdb2 -L arch_home

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Il est important de nommer les partitions (argument &lt;strong&gt;-L&lt;/strong&gt;),
car cela permet ensuite de se passer des noms de devices.
&lt;ul&gt;
&lt;li&gt;fstab utilisera les noms de partitions pour le mount.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Montage des partitions de destination&lt;/h5&gt;
&lt;pre&gt;

mount /dev/sdb1 /media/hd
mkdir /media/hd/home
mount /dev/sdb2 /media/hd/home

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;A adapter selon vos goûts (et votre schéma de partitionnement) bien
entendu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Re-montage de la partition système en cours d'utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pourquoi re-monter une partition forcément déja montée, puisqu'en cours
d'utilisation ?
&lt;ul&gt;
&lt;li&gt;Parce qu'on ne peut pas faire un &lt;code&gt;cp -a / /media/hd&lt;/code&gt;
directement.&lt;/li&gt;
&lt;li&gt;En effet, il y aurait copie récursive lorsque &lt;q&gt;cp&lt;/q&gt; arriverait sur
&lt;em&gt;/media/hd&lt;/em&gt; du premier disque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut donc remounter &lt;strong&gt;/&lt;/strong&gt; avec:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mount -o bind / /mnt/root

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;le but du &lt;q&gt;mount -o bind&lt;/q&gt; est de donner accès a la partition root
brute (sans aucun mount, ni /proc monté).&lt;/li&gt;
&lt;li&gt;Elle reste bien sûr montée sur / par ailleurs (fort heureusement).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La copie peut débuter&lt;/h5&gt;
&lt;pre&gt;

cp -a /mnt/root/* /media/hd/

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Comme dit précédemment, ça ne copie pas &lt;em&gt;/home&lt;/em&gt;. Il est toujours
monté à son emplacement d'origine.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons donc le copier à son tour.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

cp -a /home/* /media/hd/home/
(puis, eventuellement:)
chown jseb.jseb /media/hd/home/jseb

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Cooooopie, c'est fiiiiini ...&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Avant de démonter, nous créons un fichier à la racine du nouveau disque
pour le repérer plus facilement dans grub.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

touch /media/hd/nouveau_disque

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Cette astuce va nous permettre de ne pas commettre d'impair avec grub.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On peut ensuite démonter les partitions.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

umount /media/hd/home
umount /media/hd

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Fignolagisation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cet horrible néologisme qui raye l'émail n'avait que pour but de réveiller
les lecteurs assoupis pendant la copie.
&lt;ul&gt;
&lt;li&gt;En effet, tout n'est pas fini: nous voulons que ce disque soit bootable, et
que l'hibernation soit toujours fonctionnelle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Avez-vous vérifié que la partition destination système avait le flag
&lt;q&gt;bootable&lt;/q&gt;, au fait ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;fstab&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Tout d'abord, occupons nous du fstab présent sur le disque de
destination.&lt;/li&gt;
&lt;li&gt;Si vous n'avez pas changé les noms et les emplacements de vos points de
montage, vous pouvez laisser telles les entrée concernées.&lt;/li&gt;
&lt;li&gt;Il vous faudra cependant au moins modifier l'entrée pour la swap, dont l'id
va changer.&lt;/li&gt;
&lt;li&gt;Vous devriez avoir quelque chose dans ce genre (j'ai isolé ce qui nous
intéresse, le vrai fstab est plus long):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

LABEL=arch_root / ext4 defaults 0 1
LABEL=arch_home /home ext4 defaults 0 1
#pour monter automatiquement le swap d'après son UUID (et non plus le premier trouvé dans l'ordre d'énumération des devices)
UUID=5e6d9679-16dc-48f7-889b-2c7181c01e15 swap  swap defaults          0      0

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Quelques explications à propos du swap et son identification par l'UUID.
&lt;ul&gt;
&lt;li&gt;Si on reboote avec l'ancien disque branché, et que le swap n'a pas été
précisé dans la config, le premier trouvé (quel que soit le device) sera
utilisé.&lt;/li&gt;
&lt;li&gt;On ne peut pas utiliser les lettres de device (sda, sdb ..) pour indiquer
où se trouve le swap, car le nommage est dynamique et ne tombera pas forcément
sur le device précisé dans la config.&lt;/li&gt;
&lt;li&gt;Il faut utiliser l'UUID de la nouvelle partition de swap, obtenu avec
&amp;quot;mkswap&amp;quot;.&lt;/li&gt;
&lt;li&gt;Si vous n'avez pas noté l'UUID du disque au moment de la création du swap,
vous pourrez le retrouver ici: &lt;em&gt;/dev/disk/by-uuid&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Configuration du pingouin gelé&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Les fichiers de configuration de &lt;em&gt;TuxOnIce&lt;/em&gt; se trouvent généralement
ici: &lt;em&gt;/etc/hibernate/&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dans &lt;em&gt;tuxonice.conf&lt;/em&gt;, vous devriez ajouter l'uuid de votre nouveau
swap.
&lt;ul&gt;
&lt;li&gt;Ceci évitera l'utilisation du swap de votre ancien disque, si celui-ci est
trouvé en premier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

SuspendDevice swap:UUID=5e6d9679-16dc-48f7-889b-2c7181c01e15

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ne modifiez pas l'emplacement du swap pour l'hibernation dans la
configuration du kernel, cela ne concerne pas TuxOnIce.
&lt;ul&gt;
&lt;li&gt;Donc pas la peine de recompiler un noyau.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;grub&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Contenu potentiel de &lt;em&gt;menu.lst&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

# /boot/grub/menu.lst:

title  2.6.36-ToI JSeb
root   (hd0,0)
#kernel /boot/vmlinuz26 root=/dev/disk/by-label/arch_root ro VGA=ask
kernel /boot/vmlinuz26 root=/dev/disk/by-label/arch_root ro resume=swap:UUID=5e6d9679-16dc-48f7-889b-2c7181c01e15 VGA=ask
initrd /boot/kernel26.img

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;On remarquera que le root pointe sur mon premier disque.&lt;/li&gt;
&lt;li&gt;La copie s'est faite vers sdb (dans l'ordre des énumérations).
&lt;ul&gt;
&lt;li&gt;Ce n'est pas grave: sdb devient tout simplement sda.&lt;/li&gt;
&lt;li&gt;Vu que les devices ne sont pas utilisés dans la suite du boot (repérage par
nom de partition et par UUID pour le swap), tout fonctionne.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensuite, lancez grub en root.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

grub&amp;gt; find /nouveau_disque
 (hd1,0)

grub&amp;gt; root (hd1,0)
 Filesystem type is ext2fs, partition type 0x83

grub&amp;gt; setup (hd1)

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;A noter l'astuce du &lt;em&gt;find&lt;/em&gt;, sur le fichier précédemment créé à la
racine.
&lt;ul&gt;
&lt;li&gt;Ceci permet de repérer à coup sûr le disque.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voila, grub est installé sur le MBR.
&lt;ul&gt;
&lt;li&gt;pour installer sur sdb1 , ce que certains préfèrent , il aurait fallu
faire:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setup (hd1,0)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;C'est dans la boite&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Que dire de plus ?&lt;/li&gt;
&lt;li&gt;reboot ! Et croisez les doigts, on ne sait jamais.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/11/16/Chauds-les-marrons%21-La-duplication-sans-chataignes#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/11/16/Chauds-les-marrons%21-La-duplication-sans-chataignes#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/562468</wfw:commentRss>
      </item>
    
  <item>
    <title>Arch, le kernel et la marmotte</title>
    <link>http://www.finiderire.com/post/2010/11/09/Arch%2C-le-kernel-et-la-marmotte</link>
    <guid isPermaLink="false">urn:md5:8951e7c237145cbd1375657cb4784128</guid>
    <pubDate>Thu, 11 Nov 2010 19:34:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Vous venez de compiler un noyau personnalisé pour votre Arch.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Vous pourriez le copier à la main - et perdre le suivi de version des
paquets Arch.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Que fait la marmotte avec le beau noyau de Arch ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Elle l'emballe dans le paquet!&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La saison des marmottes&lt;/h3&gt;
&lt;h5&gt;kernel perso&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous voulons donc nous compiler un noyau personnalisé, et l'empaqueter
proprement.&lt;/li&gt;
&lt;li&gt;Afin d'ajouter un peu d'intérêt à la chose, nous allons aborder un cas que
les noyaux génériques de Arch ne couvrent pas.
&lt;ul&gt;
&lt;li&gt;Il s'agit d'ajouter au noyau le patche &lt;em&gt;TuxOnIce&lt;/em&gt;, afin de permettre
l'hibernation.&lt;/li&gt;
&lt;li&gt;Dans AUR, il y a bien un &lt;em&gt;build&lt;/em&gt; s'occupant de cette tâche. Il ne
fonctionne hélas pas du tout. Je vous laisse vous référer aux rapports de bugs
Arch pour plus de précisions (c'est à dire que vous apprendrez qu'il est urgent
d'attendre une nouvelle version du noyau).&lt;/li&gt;
&lt;li&gt;Les impatients devront donc compiler eux-même leur noyau. C'est ce que nous
allons faire, et nous en profiterons au passage pour expérimenter une ou deux
nouvelles pratiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez tous une carte 3D ? Sous Linux, NVidia est malheureusement
le passage obligé. Nous ajouterons donc la création d'un paquet contenant les
derniers drivers propriétaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dans ce billet, je n'aborde que les grandes lignes des manipulations
générales, et je n'entre dans les détails que pour les spécificités Arch.
&lt;ul&gt;
&lt;li&gt;Par exemple, si vous ne savez pas patcher les sources du kernel avec
&lt;em&gt;TuxOnIce&lt;/em&gt;, lisez la documentation du site web du projet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Et la marmotte ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Je viens de voir passer la marmotte, et elle trainait un gros édredon. Il
ne va pas falloir trop compter sur elle.&lt;/li&gt;
&lt;li&gt;En d'autres termes, vous allez devoir faire le paquet vous même.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Préparation&lt;/h3&gt;
&lt;h5&gt;Récupération des sources&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Récupérez le dernier noyau stable sur &lt;em&gt;kernel.org&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;Pour l'instant, il s'agit du &lt;strong&gt;2.6.36&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Les sources sont placées dans /usr/src.
&lt;ul&gt;
&lt;li&gt;Certaines personnes vous diront de les mettre dans votre home. Ignorez
les.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;N'oubliez pas de faire un lien symbolique &lt;strong&gt;/usr/src/linux&lt;/strong&gt;
pointant vers votre répertoire de sources kernel.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ln -s linux-2.6.36 linux&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Récupérez le patch de &lt;em&gt;TuxOnIce&lt;/em&gt;, et placez le dans le répertoire du
kernel à préparer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Configuration du kernel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Commencez par patcher le kernel avec &lt;em&gt;TuxOnIce&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;patch -p1 &amp;lt; tuxonice.patch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Supprimez les reliques et scories éventuelles. A faire même si vous venez
de désarchiver les sources.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make mrproper&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ensuite, il s'agit de choisir soigneusement les options du noyau (n'oubliez
pas l'hibernation, ça serait bête)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make menuconfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Si vous voulez hiberner en utilisant le swap, pas la peine de préciser
l'emplacement de celui-ci dans les options touchant à l'hibernation du kernel
(cela ne concerne pas &lt;em&gt;TuxOnIce&lt;/em&gt;, mais le support interne du noyau pour
l'hibernation. Son utilisation est déconseillée.).&lt;/li&gt;
&lt;li&gt;La configuration part dans les fichier &lt;q&gt;.config&lt;/q&gt;, qui est effacé à
chaque &lt;code&gt;make mrproper&lt;/code&gt;. N'oubliez pas de le sauver sous un autre
nom, on ne sait jamais.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Définition du paquet Arch&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;makepkg&lt;/strong&gt; utilise deux fichiers de configuration, qui seront
nommés ainsi pour l'occasion:
&lt;ul&gt;
&lt;li&gt;PKGBUILD : pour la construction du paquet.&lt;/li&gt;
&lt;li&gt;kernel26.install : pour l'installation du paquet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;J'ai repris les deux fichiers du wiki Arch (mes modifications sont
mineures) :
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.archlinux.org/index.php/Kernel_Compilation_From_Source&quot;&gt;un peu de
lecture qui ne fera pas de mal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;PKGBUILD&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous n'aurez pas grand chose à modifier.
&lt;ul&gt;
&lt;li&gt;En fait, je n'ai modifié que le nom du paquet, et le numéro de version du
kernel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

pkgname=kernel26-jseb
basekernel=2.6.36
pkgver=2.6.36

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;kernel26.install&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;J'ai simplement changé ces deux lignes:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

KERNEL_VERSION=&amp;quot;2.6.36&amp;quot;
LOCAL_VERSION=&amp;quot;&amp;quot;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Compilation&lt;/h3&gt;
&lt;h5&gt;Pour les sensibles avec plusieurs coeurs&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si vous avez un processeur multicoeur, ne lancez pas directement
&lt;strong&gt;makepkg&lt;/strong&gt; .
&lt;ul&gt;
&lt;li&gt;Faites plutôt un &lt;strong&gt;make -j n+1&lt;/strong&gt; , où &lt;strong&gt;n&lt;/strong&gt; est
le nombre de cpu disponibles (qu'il s'agisse de CPU physiques, de cores, ou de
threads).&lt;/li&gt;
&lt;li&gt;Par exemple, pour un quad-core classique: &lt;code&gt;make -j 5&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;pour un Xeon 5520 (quad-core, deux threads par core): &lt;code&gt;make -j
9&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Les insensibles peuvent commencer ici&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Lancez &lt;code&gt;makepkg&lt;/code&gt; qui va créer le paquet.
&lt;ul&gt;
&lt;li&gt;Si vous avez préparé la compilation comme décrit ci dessus, ça sera rapide:
GCC n'aura plus qu'à linker les fichiers objets.&lt;/li&gt;
&lt;li&gt;Dans le cas contraire, il faudra être plus patient. Mais si vous n'avez pas
inclus n'importe quoi dans le noyau, la compilation ne devrait pas dépasser dix
minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Installation du noyau&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pacman -U chemin/du/paquet/kernel-bidule.xz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ajoutez à la config de &lt;strong&gt;grub&lt;/strong&gt; une entrée pour votre nouveau
noyau, puis rebootez.&lt;/li&gt;
&lt;li&gt;Ca boote encore ? Parfait!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Test de l'hibernation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vérifiez que l'hibernation fonctionne depuis la console:
&lt;ul&gt;
&lt;li&gt;n'oubliez pas d'installer le script d'hibernation si ce n'est déja
fait:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pacman -S hibernate-script&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Après vous être assuré que la méthode employée est bien le suspend2disk,
vous pouvez lancer la commande &lt;code&gt;hibernate&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Je ne détaille pas non plus la configuration de TuxOnIce, la doc est fort
bien faite et il n'y a pas grand chose à raconter.&lt;/li&gt;
&lt;li&gt;Assurez-vous toutefois d'activer la compression.&lt;/li&gt;
&lt;li&gt;Si vous utilisez le swap pour le suspend2disk, plus besoin de préciser
l'emplacement en paramètre du noyau, dans grub.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il ne reste plus qu' à installer le driver nvidia pour pouvoir lancer
X.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Haine vidia&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Les drivers proprios nvidia, c'est toujours un grand moment d'émotion.
&lt;ul&gt;
&lt;li&gt;Ne nous plaignons pas, ils fournissent des drivers corrects, eux (suivez
mon regard, je ne vise personne).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Simplifions-nous la vie&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pour éviter d'y passer trop de temps, je me suis contenté de récupérer le
build de &lt;em&gt;nvidia-ice&lt;/em&gt; (situé dans AUR).
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;yaourt -G nvidia-ice&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il n'y a pas grand chose à modifier dans &lt;strong&gt;PKGBUILD&lt;/strong&gt; :
&lt;ul&gt;
&lt;li&gt;la version du kernel.&lt;/li&gt;
&lt;li&gt;les dépendances : j'ai enlevé la dépendance sur le kernel, mais
j'aurais pu tout aussi bien modifier le nom. Votre avis peut varier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#!# pkgname=nvidia-ice
pkgname=nvidia-jseb

#!#_kernver='2.6.35-ice'
_kernver='2.6.36'

 (...)

#!#depends=(&amp;quot;kernel26-ice&amp;quot; &amp;quot;nvidia-utils=${pkgver}&amp;quot;)
depends=(&amp;quot;nvidia-utils=${pkgver}&amp;quot;)

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Même principe pour &lt;strong&gt;nvidia-ice.install&lt;/strong&gt; : modifier la
variable &lt;code&gt;KERNEL_VERSION&lt;/code&gt; si nécessaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je voudrais vous en dire plus, mais j'ai effacé mon répertoire de build
après avoir déplacé le paquet (un réflexe idiot).
&lt;ul&gt;
&lt;li&gt;Je pense toutefois qu'il n'y avait pas grand chose de plus à raconter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour finir, lancez &lt;code&gt;makepkg&lt;/code&gt; dans le répertoire contenant le
pkgbuild.
&lt;ul&gt;
&lt;li&gt;Si tout s'est bien déroulé, vous avez un magnifique paquet nvidia prêt à
être installé avec:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pacman -U votre_driver_nvidia.xz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Test final (préparez l'oreiller)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vous devriez maintenant être sous X.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une console root, un &lt;code&gt;hibernate&lt;/code&gt; ...&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;C'est terminé. Et ça marche!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Retirons-nous sur la pointe des pieds, afin de ne pas réveiller la marmotte
qui a commencé son hibernation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/11/09/Arch%2C-le-kernel-et-la-marmotte#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/11/09/Arch%2C-le-kernel-et-la-marmotte#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/560496</wfw:commentRss>
      </item>
    
  <item>
    <title>Back to the basic: un vent d'été de novembre</title>
    <link>http://www.finiderire.com/post/2010/11/05/Back-to-the-basic%3A-un-vent-d-%C3%A9t%C3%A9-de-novembre</link>
    <guid isPermaLink="false">urn:md5:6fe1f0c405d6b7dba3ca4fd8bda5092d</guid>
    <pubDate>Fri, 05 Nov 2010 19:15:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>détente</category><category>msx</category>    
    <description>&lt;p&gt;&lt;em&gt;En ce moment, il fait chaud, et pourtant nous sommes début
novembre.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Les bizarreries de la météo (blizzard, vous avez dit blizzard
?).&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Celà m'a fait penser qu'il restait un article de cet été non
posté.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Plutôt qu'attendre l'année prochaine, le voici.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Prenez celà comme le dernier soupir d'un bel été qui n'est plus que
souvenir, avant la rentrée dans l'hiver froid, impitoyable, interminable!
MUHAHAHAAAA!&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;MàJ 6 nov. 2010&lt;/strong&gt; : &lt;em&gt;quelques précisions sur le partage
de fichiers avec le système hôte.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Foin des considérations météorologiques&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;La dernière fois, nous parlions du développement sur vieux micro avec un
cross assembler.&lt;/li&gt;
&lt;li&gt;Cette fois-ci, pour nous reposer un peu, nous allons parler basic.&lt;/li&gt;
&lt;li&gt;Mais oui, le &lt;strong&gt;basic&lt;/strong&gt; : beginner awfully silly idiotic
code. Enfin, un truc dans dans ce goût là.&lt;/li&gt;
&lt;li&gt;Il y a vingt ans, les courageux précurseurs n'avaient souvent que ça à se
mettre sous la dent.&lt;/li&gt;
&lt;li&gt;Me croirez-vous si je vous dit que certaines personnes ne s'en sont jamais
remises et continuent à le pratiquer ?&lt;/li&gt;
&lt;li&gt;Afin de vous sensibiliser aux arcanes de ce qui touche désormais à la
psychiatrie, je vous ai concocté une façon plus humaine d'aborder le
problème.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;OpenMSX members only&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Attention, c'est pour OpenMSX, mais ça doit être transposable facilement à
BlueMSX.&lt;/li&gt;
&lt;li&gt;En fait, je suis même persuadé que BlueMSX est capable lui aussi d'écrire
des fichiers dans le système de fichiers de l'ordinateur hôte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le basic MSX&lt;/h3&gt;
&lt;h5&gt;tokens&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le basic du MSX est tokenisé. Quand on sauve un programme basic, les
instructions apparaissent sous la forme d'un code hexa, qui représente une
instruction. C'est ce qu'on appelle un token.&lt;/li&gt;
&lt;li&gt;Cela permet de gagner de la place dans le fichier et en mémoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;On peut sauver depuis le basic un fichier au format ascii (c'est à dire
sans les tokens), avec:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;save &amp;quot;foo.bas&amp;quot;,a&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;code&gt;&amp;quot;,a&amp;quot;&lt;/code&gt; est important, c'est ce qui signale qu'on veut de
l'ascii.
&lt;ul&gt;
&lt;li&gt;Autrement, on n'aurait qu'une bouillie binaire représentant les
tokens.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour le charger, toujours depuis le basic bien sûr:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;load &amp;quot;foo.bas&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Création d'un programme basic en dehors du MSX&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;On peut donc charger des fichiers ascii contenant des instructions basic.
&lt;ul&gt;
&lt;li&gt;Attention à ne pas oublier les numéros de ligne quand on tape le programme
dans un éditeur externe!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut que les lignes se terminent par le CR/LF propre à MS-Dos.
&lt;ul&gt;
&lt;li&gt;Le jeu de caractère ne doit pas être trop évolué (pas d'UTF-8).
&lt;em&gt;Latin1&lt;/em&gt; fait l'affaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Si vous tapez vos sources depuis MS-Windows, pas de problèmes de ce côté
là, cet OS fait partie de la famille des CR/LF. En digne héritier de
MS-Dos.&lt;/li&gt;
&lt;li&gt;Si vous utilisez un OS de conception plus moderne (Unix sous toutes ses
saveur par exemple) il faudra convertir vos LF en CR/LF.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici l'automatisation de la manoeuvre pour Vim, l'éditeur des gens qui
font pas semblant. Ajoutez ceci dans le &lt;strong&gt;.vimrc&lt;/strong&gt; :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

autocmd BufNewFile,BufRead *.[Bb][Aa][Ss] set ff=dos fileencoding=latin1

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ceci fonctionnera avec les fichiers qui ont une extension &amp;quot;.bas&amp;quot; (peu
importe la casse, il y a la regexp pour ça).&lt;/li&gt;
&lt;li&gt;Les fichiers seront automatiquement sauvés avec le format de fin de ligne
MS-Dos, et dans un charset que le MSX comprend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Communication simplifiée avec le système hôte&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Les utilisateurs d'émulateurs se compliquent souvent la vie avec tout un
système d'émulation de disquettes ou de disque dur.&lt;/li&gt;
&lt;li&gt;Le plus simple (quand la machine et l'émulateur le permettent, ce qui est
le cas ici) est de partager ses fichiers avec le système hôte.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par exemple, pour partager &lt;em&gt;/home/jseb/msx/coding&lt;/em&gt; avec le msx
émulé :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

openmsx -machine nms8245 -diska /home/jseb/msx/coding

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;La commande &lt;em&gt;files&lt;/em&gt; depuis l'écran de saisie basic du MSX permet de
lister les fichiers partagés entre le système hôte et le MSX émulé.
&lt;ul&gt;
&lt;li&gt;Toutes les manipulations de fichier habituelles sont bien sûr possibles
depuis le msx (&lt;em&gt;load&lt;/em&gt;, &lt;em&gt;save&lt;/em&gt; , &lt;em&gt;bload&lt;/em&gt; ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le paramètre &lt;em&gt;machine nms8245&lt;/em&gt; est là car je n'utilise pas tout le
temps la même machine, et qu'il n'y en a pas de configuré par défaut.
&lt;ul&gt;
&lt;li&gt;Selon votre configuration, vous pouvez vous en passer (si le &lt;em&gt;cbios&lt;/em&gt;
démarre par défaut, vous n'avez pas de machine de configurée).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;L'utilitaire &lt;strong&gt;diskmanipulator&lt;/strong&gt; de OpenMSX est à réserver aux
manipulations d'iso de disquettes.
&lt;ul&gt;
&lt;li&gt;Il est idéal pour transférer les fichiers vers un vrai msx, et s'utilise
depuis la console d'OpenMSX.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Les numéros de lignes&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Reste le problème des numéros de lignes pour le basic.&lt;/li&gt;
&lt;li&gt;Ces vieux basic imposent une référence permanente aux séquences
d'instructions. Cette référence est symbolisée par des numéros de lignes, sans
autre rêgle qu'une progression constante et croissante.&lt;/li&gt;
&lt;li&gt;Taper du code en commençant chaque ligne par un numéro croissant, c'est
pénible.
&lt;ul&gt;
&lt;li&gt;Sans parler des erreurs de renumérotations!&lt;/li&gt;
&lt;li&gt;Et que faire quand on n'a plus de numéros de lignes disponibles, et qu'on
voudrait encore insérer une ligne dans cet ensemble ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le script magique&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Voici un script qui permet de numéroter un programme basic de 10 en
10.&lt;/li&gt;
&lt;li&gt;Les lignes commençant avec un numéro de ligne sont renumérotées, et quand
il n'y n'y a pas de numéro de ligne, il est ajouté. En prime, les espaces et
tabulations inutiles de début de ligne sont supprimées.&lt;/li&gt;
&lt;li&gt;Les lignes vides sont ignorées.&lt;/li&gt;
&lt;li&gt;Les références à des lignes existantes sont bien sûr traitées, sous réserve
que les lignes référencées soient déja numérotées.
&lt;ul&gt;
&lt;li&gt;On peut donc se contenter de numéroter ces lignes uniquement lors de la
saisie.&lt;/li&gt;
&lt;li&gt;Le cas de &amp;quot;on k goto&amp;quot; suivi de plusieurs numéros de lignes est traité.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Les cas de lignes contenant des sauts multiples est traité.
&lt;ul&gt;
&lt;li&gt;On peut en effet rencontrer des constructions barbares de ce type:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gosub 20 : goto 10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Beurk certes, mais le cas est géré.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Attention, si vous utilisez MS-Windows: vérifiez vos terminaisons de lignes
pour éventuellement adapter le script si vos outils écrivent un 0xD 0xA comme
terminateur. Ceci dépendra des choix par défaut de votre environnement
d'origine: depuis un shell émulant Unix, ou depuis un programme utilisant
directement l'api MS-Windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#!/bin/bash
# ce script vient de www.finiderire.com
# le blog pour les gens qui en ont dans le chausson.

if [ x&amp;quot;$1&amp;quot; == x&amp;quot;&amp;quot; ]; then
   echo $0 &amp;quot;[fichier à renuméroter]&amp;quot;
   exit 1;
fi

#simple précaution, un accident est très vite arrivé
cp &amp;quot;$1&amp;quot; &amp;quot;$1&amp;quot;.bak 

#conversion au format Unix \n (Dos \r\n pose problème à awk)
#également, espacement des nombres séparés par virgule (cas de &amp;quot;on goto&amp;quot;)
sed 's/\r$//;s/\([0-9]\)\ *,\ *\([0-9]\)/\1 , \2/g' &amp;lt; &amp;quot;$1&amp;quot; &amp;gt; &amp;quot;$1&amp;quot;.tmp
mv &amp;quot;$1&amp;quot;.tmp $1

#pour l'astuce de la relecture du fichier, voir awk/multipass.awk
awk 'NR!=FNR &amp;amp;&amp;amp; !reset { l=0; reset=1; } #renumérote de zéro (2nde passe)

     #enlever espaces et tabs de début de ligne, si pas de numérotation
     NR!=FNR { sub (/^[\t\ ]+/,&amp;quot;&amp;quot;,$0) }

     #renumérotation des goto/gosub (la seconde passe sert à ça)
     NR!=FNR &amp;amp;&amp;amp; tolower($0) ~ /.*go(to|sub).*/ {
        for (i=1; i&amp;lt;=NF; i++) {
           #si pattern go(to|sub) détecté, prochaine colonne est un nbr
           if ($i ~ /.*go(to|sub).*/) { next_is_nbr=1 }
           # si on avait un goto/gosub juste avant ...
           if ($i ~ /[0-9]+/ &amp;amp;&amp;amp; next_is_nbr) {
              $i = t[$i] #récupère index sur nouveau label
              if ( $i == &amp;quot;&amp;quot; ) $i=&amp;quot;NaN&amp;quot; #si problème
              if ( $(i+1) != &amp;quot;,&amp;quot; ) next_is_nbr=0; #cas de &amp;quot;on k goto ...&amp;quot;
           }
        }
     }

     #passe 1 et 2, on doit numéroter à chaque fois.
     /^[0-9]+/ { #un numéro de ligne est présent
     if (l || l==0) {l+=10} else {l=$1};
        l=l-(l%10);
        c=l;

      #par contre, on ne printe que lors de la passe 2
        if (NR!=FNR) {
           for (i=2; i&amp;lt;=NF; i++) { c=c &amp;quot; &amp;quot; $i; }
           print c
        } else {
        t[$1]=l; if ($1&amp;gt;max) max=$1
     }
    }
    

     /^[^0-9]/ &amp;amp;&amp;amp; !/^\n?$/ { #pas de numéro de ligne, ni de ligne vide
        l+=10; l=l-(l%10);
        #on ne printe que lors de la passe 2
        if (NR!=FNR) {
          print l &amp;quot; &amp;quot; $0;
        }
       }


#    END { print &amp;quot;énumération&amp;quot;; for (i=0; i&amp;lt;=max; i++) print i &amp;quot; &amp;quot;t[i] }
    ' &amp;quot;$1&amp;quot; &amp;quot;$1&amp;quot; &amp;gt; &amp;quot;$1&amp;quot;.tmp

#et on reconverti en \r\n, tout en supprimant les espaces désormais inutiles
sed 's/$/\r/;s/\([0-9]\) , \([0-9]\)/\1,\2/g' &amp;lt; &amp;quot;$1&amp;quot;.tmp &amp;gt; &amp;quot;$1&amp;quot;
rm &amp;quot;$1&amp;quot;.tmp

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;La compréhension du script est laissée à la sagacité du lecteur.
&lt;ul&gt;
&lt;li&gt;Pour les lecteurs dont la sagacité s'agace, il y a les commentaires
judicieusement placés devant ce qui mérite d'être commenté.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;C'est la fin de l'été, mais pour le reste ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Si vous en voulez encore, appuyez sur &amp;quot;commentaire&amp;quot; (1€ par appel).&lt;/li&gt;
&lt;li&gt;Mais même si vous en voulez encore, je vous préviens qu'il vous faudra être
fort.
&lt;ul&gt;
&lt;li&gt;Le manque de temps fait que je risque de me concentrer sur des billets plus
utiles pour les gens qui vivent dans la modernité.&lt;/li&gt;
&lt;li&gt;Et oui... finiderire pour les vieux trucs. Rendez-vous aux prochaines
vacances !&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Si vous avez simplement quelque chose à ajouter, ne vous privez pas. Et
fermez la porte en partant, le temps commence à fraichir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/11/05/Back-to-the-basic%3A-un-vent-d-%C3%A9t%C3%A9-de-novembre#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/11/05/Back-to-the-basic%3A-un-vent-d-%C3%A9t%C3%A9-de-novembre#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/559606</wfw:commentRss>
      </item>
    
  <item>
    <title>Git tari ? Oh!</title>
    <link>http://www.finiderire.com/post/2009/08/19/Git-tari-Oh%21</link>
    <guid isPermaLink="false">urn:md5:aca3fec6deacb3860d4353860308d221</guid>
    <pubDate>Sun, 03 Oct 2010 21:46:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>coding</category><category>Git</category><category>Linux</category><category>MS-Windows</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Un nouveau billet sur l'intarissable Git&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Et en avant la musique!&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt; : cet article a été écrit en collaboration avec
Frédéric Jolliton&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Résumé de l'épisode précédent&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;La configuration et les commandes de bases de Git ont déjà été abordées.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.finiderire.com/post/2008/04/22/Git-est-couvert&quot;&gt;C'est ici que ça se
passe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Cette fois, nous nous penchons sur l' utilisation de Git au quotidien.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;repo&lt;/strong&gt; sera l'abréviation de &lt;em&gt;repository&lt;/em&gt; dans la
suite du texte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Déterrons le SSH de guerre&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vous voulez héberger un repo Git.&lt;/li&gt;
&lt;li&gt;Si possible, vous souhaiteriez le repo Git hébergé ne nécessite pas un
énième binaire troué et des heures de configuration ?
&lt;ul&gt;
&lt;li&gt;Utilisez ssh, au moins il n 'y aura que ça à mettre à jour.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Vous ne le ferez qu'une fois&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Créez un groupe &lt;strong&gt;git&lt;/strong&gt; qui servira pour les droits d'accès de
vos utilisateurs.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;groupadd git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Créez un home pour le/les repo(s) à héberger.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkdir /home/git&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Modifiez les droits et les propriétaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

boss # chown votrelogin.git /home/git
boss # chmod 770 /home/git

boss # ls /home/git -lhd
drwxrwx--- 3 jseb git 4,0K aoû 19 17:50 /home/git

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Vous êtes le propriétaire de /home/git, et les utilisateurs abilités seront
dans le groupe git.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Éditez le fichier &lt;strong&gt;/etc/shells&lt;/strong&gt; et ajoutez une entrée avec
l'emplacement de &lt;em&gt;git-shell&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Ce fichier donne la liste des shells autorisés par le système.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;git-shell&lt;/em&gt; est un shell restreint qui permet uniquement
l'utilisation de git.&lt;/li&gt;
&lt;li&gt;Les utilisateurs que vous créerez utiliseront ce shell.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;A faire pour chaque utilisateur&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Notre utilisateur sera le fameux toto.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

useradd -d /home/git/ -G git -m -s /usr/bin/git-shell toto

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-d /home/git&lt;/strong&gt; : home de l'utilisateur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-G git&lt;/strong&gt; : il fait partie du groupe git.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-m&lt;/strong&gt; : créer le home si il n'existe pas déja (et y
copie /etc/skels/)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-s /usr/bin/git-shell&lt;/strong&gt; : shell restreint de
l'utilisateur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eventuellement, permettez à l'utilisateur d'utiliser ssh.
&lt;ul&gt;
&lt;li&gt;Ce n'est pas obligatoire, et dépend de votre config sshd.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sshd_config&lt;/strong&gt; : &lt;code&gt;AllowUsers toto&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si vous utilisez l'authentification interactive, n'oubliez pas de donner un
mot de passe à votre utilisateur.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Faire un test de login.
&lt;ul&gt;
&lt;li&gt;ssh doit vous envoyer paître.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ ssh toto@192.168.1.1
Password:
Last login: Thu Aug 20 19:23:37 CEST 2009 from 192.168.1.42 on ssh
fatal: What do you think I am? A shell?
Connection to 192.168.1.1 closed.

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;C'est normal, git-shell ne permets pas ce genre de choses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Création d'une repo bare&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Une repo &lt;em&gt;bare&lt;/em&gt;, c'est une repo dont vous ne verrez jamais le
contenu directement.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Elle sert juste à distribuer des fichiers entre les utilisateurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par exemple, les commandes &lt;em&gt;checkout&lt;/em&gt; ne fonctionneront pas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Côté serveur ssh&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;mkdir repo&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;cd repo&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;git init --bare&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ git init --bare
Initialized empty Git repository in /home/gitfoogit/

$ ls
config  description  HEAD  hooks  info  objects  refs

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;ls&lt;/em&gt; liste des fichiers qui sont normalement dans &lt;em&gt;.git&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Pas la peine de faire un &lt;code&gt;git branch -a&lt;/code&gt;, il n'y a pas de
branches.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Côté client&lt;/h5&gt;
&lt;pre&gt;

$ git remote add repo_remote ssh://jseb@192.168.1.1/home/git/repo

$ git push repo_remote mmap

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;On ajoute le serveur à la liste des repositories.
&lt;ul&gt;
&lt;li&gt;Par la suite, on y fera référence sous le nom de &lt;q&gt;repo_remote&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;repo_remote&lt;/em&gt; est donc le nom du serveur (voir
&lt;em&gt;.git/config&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une fois le serveur ajouté, on &lt;q&gt;pushe&lt;/q&gt; les modifications.
&lt;ul&gt;
&lt;li&gt;&lt;q&gt;mmap&lt;/q&gt; est le nom de la branche que j'ai poussé sur le serveur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Clonage par un utilisateur&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que les sources ont été pushées dans le repo, n'importe quel
utilisateur peut y accéder.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ git clone ssh://toto@192.168.1.1/home/git/repo
Initialized empty Git repository in /tmp/votre_repo/.git/
Password:
remote: Counting objects: 21, done.
remote: Compressing remote: objects: 100% (13/13), done.
remote: Total 21 (delta 7), reused 21 (delta 7)
Receiving objects: 100% (21/21), 432.15 KiB, done.
Resolving deltas: 100% (7/7), done.
Warning: Remote HEAD refers to nonexistent ref, unable to checkout.

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Le repo est &lt;strong&gt;presque&lt;/strong&gt; disponible pour toto.
&lt;ul&gt;
&lt;li&gt;La dernière ligne indique qu'aucune branche n'est disponible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons merger ce qui a été récupéré.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$ git branch -a
  origin/mmap

$ git merge origin/mmap

$ git branch -a
* master
  origin/mmap

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;La première commande récupère le nom de la branche qui a été clonée.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;origin&lt;/em&gt; est le nom par défaut du repo distant (voir
&lt;em&gt;.git/config&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La seconde effectue le &lt;em&gt;merge&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La troisième vérifie qu'une branche est maintenant disponible.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Éventuellement, on peut renommer la branche &lt;em&gt;master&lt;/em&gt; en
&lt;em&gt;mmap&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git branch -m master mmap&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le repo du guerrier&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;N'hésitez pas à poster vos méthodes et remarques, ainsi que tout ce qui
concerne votre utilisation de Git au quotidien.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il y aura surement d'autres billets sur Git, d'ailleurs je crée derechef le
tag.
&lt;ul&gt;
&lt;li&gt;Hop!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2009/08/19/Git-tari-Oh%21#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2009/08/19/Git-tari-Oh%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/427954</wfw:commentRss>
      </item>
    
  <item>
    <title>Vos plus belles recherches</title>
    <link>http://www.finiderire.com/post/2010/02/25/Vos-plus-belles-recherches</link>
    <guid isPermaLink="false">urn:md5:85c7b8dfcd0c46eeac813181427022a1</guid>
    <pubDate>Fri, 01 Oct 2010 20:48:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Et je tenais à vous dire (blablabla)</category>
            
    <description>&lt;p&gt;&lt;em&gt;Aujourd'hui, pour le bla-bla annuel, nous allons parler de
vous.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Cela fait déja deux ans que le billet annuel m'est consacré, il est temps
de changer.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Autrement, les mauvaises langues vont soutenir que ce blog ne parle que de
moi.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Merci Google.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mais comment parler de vous, mes chers visiteurs, alors que je ne vous
connais que par les quelques commentaires récoltés sur mes billets ?&lt;/li&gt;
&lt;li&gt;C'est bien simple, je vais m'inspirer des stats, et publier vos plus belles
recherches Google.&lt;/li&gt;
&lt;li&gt;Qui dit &lt;q&gt;plus belles&lt;/q&gt; doit comprendre &lt;q&gt;plus drôles&lt;/q&gt;. La majorité
des recherches sont assez sérieuses, et bien dans l'esprit de rigueur de ce
blog.&lt;/li&gt;
&lt;li&gt;Mais il reste les perles, les OVNIs, les erreurs !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Nos grands gagnants par catégorie&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le puni.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;enlever cette version de Windows n'est
pas authentique&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Nous avons affaire à un apprenti pirate qui s'est complètement trompé de
site. Ici, Monsieur, nous ne piratons pas Windows. Nous apprenons à nous en
passer.&lt;/li&gt;
&lt;li&gt;A noter que la requête émanait de &lt;em&gt;Bing&lt;/em&gt;, le moteur de recherche
Microsoft. Peut être l'apprenti pirate a t-il été transféré ici en guise de
punition ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le technicien de surfaces.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;recette du vim&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Pour le coup, j'ai appris quelque chose. Vim n'est pas seulement le
Meilleur Editeur du monde, mais également un produit nettoyant.&lt;/li&gt;
&lt;li&gt;La parité est loin d'être respectée sur Internet. Notre éditeur préféré a
un net avantage dans les moteurs de recherche, et il faut surement être patient
pour trouver la composition du produit de nettoyage.&lt;/li&gt;
&lt;li&gt;J'ai eu une typo dans une recherche, qui du coup devient amusante:
&lt;q&gt;ouvrir les fichier a la suie vim&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;Pour celui-ci, je peux répondre: &lt;code&gt;vim toto.{c,h}&lt;/code&gt; puis
&lt;code&gt;:ball&lt;/code&gt; dans Vim pour ouvrir tous les buffers. Enfin, je suppose que
c'est ce que voulait ce visiteur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le paranoïaque.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requete&lt;/strong&gt; : &lt;q&gt;test qui est ton ami&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Ce blog est ouvert à tout le monde, sans distinction de sexe, race,
religion ou famille politique.&lt;/li&gt;
&lt;li&gt;J'espère que ce visiteur à l'âme meurtrie aura trouvé réconfort et pardon
en ces pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le Jules.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;Je suis né pendant les ides de
mars&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Probablement une grosse déception pour le requêteur, qui est tombé sur mon
billet à propos des IDEs (écrit en mars, d'où le titre complet).&lt;/li&gt;
&lt;li&gt;Il voudra bien pardonner mon humour un peu particulier, qui contribue à
noyer le poisson de cette nouvelle Babel qu'est Internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;L'enthousiaste.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;le disc wouah&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Avec une faute d'orthographe en prime, mais nous pardonnerons volontiers un
enthousiasme (presque) communicatif.&lt;/li&gt;
&lt;li&gt;Celà dit, je n'ai aucune idée de ce que pouvait bien chercher ce visiteur.
Ni de ce qu'il a trouvé, d'ailleurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le paradoxe.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;aucun texte ne s'affiche dans
l'interface graphique&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Encore un qui veut le beurre, l'argent du beurre, et la main de la
cremière.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le bricoleur.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;plomberie facile&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;J'ai régulièrement cette requête, qui amène vers un texte sur le traitement
des fuites mémoires avec mtrace.&lt;/li&gt;
&lt;li&gt;Ces visiteurs ne reviennent jamais, sans doute morts noyés avant d'avoir eu
le temps de faire une seconde recherche.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;La valeur sûre.&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requête&lt;/strong&gt; : &lt;q&gt;problème accents doxygen&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;commentaire&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Cette requête revient depuis bientôt trois ans. Elle fait partie des
meubles, pour ainsi dire.&lt;/li&gt;
&lt;li&gt;Réjouissez vous, la réponse est dans ce blog. Je vous laisse admirer les
lieux, prenez votre temps, et revenez me voir.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La récursivité en action&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pour conclure, j'espère que vous n'êtes pas arrivé sur cette page en
faisant une des recherches citée dans ce billet.&lt;/li&gt;
&lt;li&gt;Merci de votre visite, et à l'année prochaine pour un nouveau bla-bla.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/02/25/Vos-plus-belles-recherches#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/02/25/Vos-plus-belles-recherches#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/489766</wfw:commentRss>
      </item>
    
  <item>
    <title>Installation en milieu hostile</title>
    <link>http://www.finiderire.com/post/2010/09/23/Installation-en-milieu-hostile</link>
    <guid isPermaLink="false">urn:md5:925ca0dd59a3cb1109b1c676fb932b54</guid>
    <pubDate>Thu, 23 Sep 2010 21:24:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Arch</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Certaines installations d'OS se font en milieu hostile.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Les réseaux au trafic douteux et à la sécurité incertaine ne sont pas
qu'une légende pour vendre des abonnements à MISC.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pourtant, les distributions Linux ont beaucoup de mal à s'installer sans
connexion réseau.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;AARRRHHH. Mais comment faire alors ?&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;MàJ 24/09/2010&lt;/strong&gt; : &lt;em&gt;ajout astuce ip link&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Pour qui ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ces notes ont été réalisées à partir d'une installation de Arch.&lt;/li&gt;
&lt;li&gt;Linux proposant peu ou prou les mêmes outils de base dans ses différentes
saveurs, vous devriez pouvoir adapter sans difficulté à une autre
distribution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Principe&lt;/h3&gt;
&lt;h5&gt;Définir un réseau séparé&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Vous placer sur un réseau séparé, c'est simple comme un
&lt;em&gt;ifconfig&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Là où tout cela se complique, c'est quand vous voudrez accéder à votre
passerelle depuis le réseau séparé.&lt;/li&gt;
&lt;li&gt;D'autre part, on voudrait quand même bien accéder à la machine en cours
d'installation avec ssh.&lt;/li&gt;
&lt;li&gt;Ces points légitimes étant soulevés, passons à la configuration du réseau
alternatif.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Topographie&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nous avons une machine que nous souhaitons installer.&lt;/li&gt;
&lt;li&gt;Nous avons une autre machine, déja installée et configurée, et avec une
adresse réseau de prod. Cette machine se connectera en ssh vers la machine à
installer. Elle servira également de passerelle internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;h5&gt;Mais où est eth0 ?!&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Une petite astuce pour commencer : vous pouvez avoir pas mal de cartes
réseau sur votre machine (4 pour ma part), et trouver celle qui a un cable
branché peut devenir un casse-tête.&lt;/li&gt;
&lt;li&gt;Un casse-tête, mais uniquement quand on ne connait pas la commande
&lt;strong&gt;ip link&lt;/strong&gt; . Haha! On fait moins le malin maintenant!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;On commence doucement&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le principe est donc de créer un réseau séparé du réseau habituel, le temps
de l'installation.
&lt;ul&gt;
&lt;li&gt;Nous allons donc nous placer sur le réseau 192.168.42.0. La machine à
installer aura l'adresse hote 42 :&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip addr add 192.168.42.42/24 dev eth0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ensuite, il faut intégrer la machine qui fera tourner le client ssh sur le
même réseau.
&lt;ul&gt;
&lt;li&gt;Cette machine va hériter de l'ip: 192.168.42.66&lt;/li&gt;
&lt;li&gt;Par ailleurs, elle est déjà présente sur le réseau &lt;q&gt;habituel&lt;/q&gt;
192.168.1.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip addr add 192.168.42.66/24 dev eth0&lt;/code&gt; : l'interface
réseau a maintenant &lt;strong&gt;deux&lt;/strong&gt; adresses IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Tentez un ping d'une machine vers l'autre.&lt;/li&gt;
&lt;li&gt;Ca fonctionne ? Bravo. Sinon, lisez la suite (de toutes façons, lisez
la suite).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Ca se complique (très légèrement)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;en cas de non réponse: vérifiez les paramètres de votre firewall (avec
tcpdump).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Éventuellement, ajouter dans les rêgles du firewall de la passerelle:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

 ## Pour la communication entre reseaux 192.168.42.0 et 192.168.1.0
  iptables -I FORWARD -s 192.168.1.0/24 -d 192.168.42.0/24 -j ACCEPT
  iptables -I FORWARD -d 192.168.1.0/24 -s 192.168.42.0/24 -j ACCEPT

 ## Pour rentrer sur la passerelle et acceder a ses services depuis le reseau 192.168.42.0
    iptables -A INPUT -i $INTERNAL_INTERFACE -s 192.168.42.0/24 -j ACCEPT

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Connexion par ssh&lt;/h3&gt;
&lt;h5&gt;Important&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Sur la machine à installer (bien entendu) , changez le mot de passe
root.&lt;/li&gt;
&lt;li&gt;En cas de problèmes, n'oubliez pas de lire les logs, en particulier
&amp;quot;auth.log&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;configuration sur la machine à installer&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Permettez le login root dans sshd_config , et l'authentification avec un
password tunnelé:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PermitRootLogin yes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PasswordAuthentication yes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ajoutez &lt;code&gt;sshd:192.168.42.0/255.255.255.0&lt;/code&gt; dans
/etc/hosts.allow.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Lancez le daemon sshd.
&lt;ul&gt;
&lt;li&gt;Sous Arch, on le lance comme ça:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/rc.d/sshd start&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Connectez-vous avec ssh depuis la passerelle.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Passerelle et resolv.conf&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que la connexion ssh est prête, il n'y a plus qu'à ajouter
l'accès internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Si la passerelle internet tourne sur la machine 42.66, c'est facile:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip r a via 192.168.42.66 dev eth0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ajoutez également dans &lt;em&gt;/etc/resolv.conf&lt;/em&gt; le(s) adresse(s) DNS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Poursuivez l'installation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant, il ne vous reste qu'à continuer de manière classique
l'installation.&lt;/li&gt;
&lt;li&gt;La tâche de ce billet s'achève donc ici, tandis que la votre commence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/09/23/Installation-en-milieu-hostile#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/09/23/Installation-en-milieu-hostile#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/548273</wfw:commentRss>
      </item>
    
  <item>
    <title>Ce sont les vacances: en avant toute vers le retro !</title>
    <link>http://www.finiderire.com/post/2010/08/16/Ce-sont-les-vacances%3A-en-avant-toute-vers-le-retro-%21</link>
    <guid isPermaLink="false">urn:md5:454d767a058e43207de8cab0b3bd3602</guid>
    <pubDate>Tue, 24 Aug 2010 01:03:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>détente</category><category>msx</category>    
    <description>&lt;p&gt;&lt;em&gt;Eh oui, ce sont les vacances... enfin, il parait.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Et vu qu'il pleut, vous lisez ce blog au lieu d'aller à la
plage.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Pire encore, vous lisez ce blog au bureau en pensant à vos collègues partis
à la plage.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Réjouissez-vous, je vous ai mitonné quelques loisirs récréatifs afin de
bronzer avec les radiations de votre moniteur.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Voici le premier épisode d'une petite série détente.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Retro-computing et MSX&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le retro computing ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ne me dites pas que vous n'avez jamais entendu parler du retro-computing!
&lt;ul&gt;
&lt;li&gt;Il s'agit de la madeleine de Proust pour les gens qui ont passé leur belle
jeunesse sur des micro-ordinateurs tels que MSX, Commodore, Atari,
Amstrad...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il y a des tas de moyen de s'amuser avec ces vieilleries, notamment par le
biais des émulateurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ces micros font certe pâle figure de nos jours, mais ils sont relativement
faciles à programmer, grâce à la doc abondante que l'on trouve sur internet.
&lt;ul&gt;
&lt;li&gt;Ils peuvent donc faire office de récréation mentale bien plus stimulante
qu'un bête sudoku, entre deux développements fatigants.&lt;/li&gt;
&lt;li&gt;On peut également pratiquer cette discipline simplement pour s'amuser. Mais
faire les choses pour s'amuser est assez mal vu de nos jours. Je vous laisserai
donc le choix de chercher d'autres justifications rationnelles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le MSX&lt;/h3&gt;
&lt;h5&gt;Pourquoi le MSX ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pourquoi programmer un MSX plutôt qu'un micro 32 bits de l'époque ?
&lt;ul&gt;
&lt;li&gt;Tout simplement parce que le MSX est relativement simple avec son Z80 (8
bits). Avec un peu d'expérience de la programmation et des architectures, vous
pouvez espérer avoir des résultats intéressants en moins d'une semaine. Si vos
vacances sont plus longues, vous vous amuserez donc encore plus.&lt;/li&gt;
&lt;li&gt;Les micros 32 bits (68000 par exemple) sont plus puissants, mais
nécessitent plus de connaissances et sortent un peu du cadre fixé par ce billet
(s'amuser avec des choses simples).&lt;/li&gt;
&lt;li&gt;D'autre part, le challenge est très présent. Avec un Z80 à 3,58Mhz, chaque
cycle compte!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Très bref historique du MSX&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Je vais vous présenter succintement le MSX.
&lt;ul&gt;
&lt;li&gt;Vous trouverez tout un tas d'articles sur le net, ainsi que des forums
spécialisés, y compris en français.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En deux mots, le MSX a été une tentative de standardisation de la
micro-informatique par les japonais (société Ascii Corporation), associés pour
l'occasion avec Microsoft (pour le basic).&lt;/li&gt;
&lt;li&gt;La norme MSX fut déclinée en plusieurs vagues:
&lt;ul&gt;
&lt;li&gt;le MSX (appellé plus tard MSX 1)&lt;/li&gt;
&lt;li&gt;le MSX 2.&lt;/li&gt;
&lt;li&gt;En France, ça s'arrête là avec l'abandon de la commercialisation des
modèles. Mais il y eu encore le MSX 2+, puis le MSX TurboR.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tous les MSX furent basés sur un socle technique commun (pour la
standardisation).&lt;/li&gt;
&lt;li&gt;Ils furent vendus par d'innombrables marques (Sanyo, Philips, Sony, Canon,
pour ne citer que les plus connues). Le microprocesseur était un Z80 pour toute
la gamme. Seuls les MSX Turbo-R embarquaient un Z80 et un R800 (le R800 était
un Z80 amélioré 16 bits, fonctionnant à 7 Mhz).&lt;/li&gt;
&lt;li&gt;Au sein de la norme, il y eu quelques évolutions, notamment musicales:
certaines cartouches de jeux étaient proposées avec un circuit sonore monté sur
la cartouche (le SCC). Le SCC étendait les capacités sonores du MSX à 8 voies.
D'autres extensions proposaient de la synthèse FM à un prix plutot
concurrentiel pour l'époque (cartouche FM PAC).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le MSX a péri face aux Amiga et autres Atari ST, supérieurs
techniquement.&lt;/li&gt;
&lt;li&gt;De cette période faste, il nous reste de beaux souvenirs, et la possibilité
de retrouver les programmes de l'époque grâce aux émulateurs.&lt;/li&gt;
&lt;li&gt;Il reste également quelques juteuses franchises, telles que &lt;em&gt;Metal
Gear&lt;/em&gt; ou &lt;em&gt;Castlevania&lt;/em&gt;, qui ont débuté sur MSX.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Au fait, que signifie MSX ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft SuXx ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Pour en savoir plus&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://fr.wikipedia.org/wiki/MSX&quot;&gt;Topo Wikipedia court et
clair&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wiki traduit à la hache du japonais, mais c'est une mine: &lt;a href=&quot;http://data.lullar.com/MSX&quot;&gt;Data Lullar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Mise en place des outils de développement&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La base&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser les outils modernes mis à notre disposition, avec
Linux en tant qu' OS hôte.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Les principes et scripts sont transposables assez facilement à MS-Windows.
&lt;ul&gt;
&lt;li&gt;Pour ce dernier, je vous conseille d'installer au plus vite un
environnement Posix.&lt;/li&gt;
&lt;li&gt;Vous avez le choix entre Cygwin et MSYS/Mingw (j'ai une petite préférence
pour ce dernier couple).&lt;/li&gt;
&lt;li&gt;Je signalerai par une note les adaptations à faire sous MS-Windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Choix de l'émulateur&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sous Unix, le choix est rapide: hors OpenMSX, point de salut.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.finiderire.com/post/2010/08/16/#&quot;&gt;http://openmsx.sourceforge.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sous MS-Windows, vous pouvez utiliser MSX Blue qui a très bonne réputation
(mais n'est pas multiplateformes).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je supposerai que OpenMSX est correctement installé, et qu'il tourne avec
un vrai bios MSX.
&lt;ul&gt;
&lt;li&gt;En effet, par défaut il tourne avec C-Bios, qui émule les fonctions Bios,
mais ne donne pas accès au basic.&lt;/li&gt;
&lt;li&gt;Ceci étant génant (le basic nous servira toujours un peu), mieux vaut un
vrai bios d'origine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La doc est ici: &lt;a href=&quot;http://openmsx.sourceforge.net/docs.php&quot;&gt;http://openmsx.sourceforge.net/docs.ph&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Choix de l'éditeur texte&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vim. Des questions ?
&lt;ul&gt;
&lt;li&gt;En fait, vous pouvez utiliser ce que vous voulez, même Emacs.&lt;/li&gt;
&lt;li&gt;Il faut juste que l'éditeur soit capable de traiter les fichier avec le
format de ligne &lt;q&gt;msdos&lt;/q&gt; (0xd 0xa).&lt;/li&gt;
&lt;li&gt;Vim et Emacs ont été porté sur les plateformes les plus exotiques. C'est
donc un investissement dont vous toucherez les intêrets pendant de longues
années.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Et le cross-assembler ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Le principe est d'utiliser un cross-compilateur sur votre système hôte, et
de fournir les fichiers compilés à l'émulateur.&lt;/li&gt;
&lt;li&gt;Ceci permet d'automatiser au maximum toutes les manipulations :
&lt;ul&gt;
&lt;li&gt;Le cycle édition / compilation / test / debuggage doit se faire
naturellement, et ne pas être soumis à des manipulations continuelles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons commencer par choisir un cross-assembler, l'automatisation du
cycle de production sera abordée par la suite.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;L'utilisateur MS-Windows utilise généralement tniASM.
&lt;ul&gt;
&lt;li&gt;Tout le monde aime ce cross-assembler, et son mainteneur est encore vivant
et présent sur IRC.&lt;/li&gt;
&lt;li&gt;Malheureusement, ce n'est pas porté sous Linux.&lt;/li&gt;
&lt;li&gt;On le trouve ici &lt;a href=&quot;http://tniasm.tni.nl&quot;&gt;http://tniasm.tni.nl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par contre , pour Linux... aie aie aie!
&lt;ul&gt;
&lt;li&gt;Je ne pensais pas avoir autant de mal avec les cross-assemblers Z80 sous
Linux.&lt;/li&gt;
&lt;li&gt;Sans plus attendre, passons au gros morceau.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Choix du cross-assembler Z80 pour Linux&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voici les résultat de plusieurs jours d'expérimentations.
&lt;ul&gt;
&lt;li&gt;J'ai volontairement omis les cross-assemblers qui me paraissaient vraiment
morts (ex: ZASM).&lt;/li&gt;
&lt;li&gt;Si j'en ai oublié des moins morts, merci de le signaler.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;ASmsx&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Je commence par celui dont je n'ai pas trouvé le site officiel.&lt;/li&gt;
&lt;li&gt;Les sources ne semblent pas disponibles, du moins dans les archives que
j'ai récupéré.&lt;/li&gt;
&lt;li&gt;Il semble même ne pas y avoir de version autre que MS-Windows.&lt;/li&gt;
&lt;li&gt;Il permet de réaliser facilement des ROMs avec les différents mappers
MSX.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Pasmo&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pasmo semble déconseillé.&lt;/li&gt;
&lt;li&gt;Il comporte quelques bizarreries, notamment la nécessité de commencer le
code par la directive &lt;q&gt;org&lt;/q&gt;. Ce qui donne &lt;q&gt;org $C000-7&lt;/q&gt; pour sauter
le stub qui vient ensuite.&lt;/li&gt;
&lt;li&gt;Mais certains projets l'utilisent, comme le C-BIOS.
&lt;ul&gt;
&lt;li&gt;J'ai discuté avec quelques personnes gravitant autour du projet C-BIOS, ça
n'a pas l'air d'être le fol enthousiasme. Plutôt un choix par défaut.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je n'ai donc pas évalué Pasmo, certain de trouver mieux ailleurs.
&lt;ul&gt;
&lt;li&gt;La suite de mes recherches me laisse à penser que je l'ai peut être éliminé
un peu vite.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Sjasm&lt;/h3&gt;
&lt;h5&gt;Grandeur et décadence de Sjasm&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Sjasm semble jouir d'un crédit assez étonnant dans la communauté msx.&lt;/li&gt;
&lt;li&gt;En fait, les anciennes versions étaient fonctionnelles, mais les plus
récentes sont une vraie catastrophe.&lt;/li&gt;
&lt;li&gt;Je vais développer, pour ne pas être accusé de taper sans raison sur un bon
produit, ou de ne rien comprendre à la programmation.&lt;/li&gt;
&lt;li&gt;Sjasm peut s'utiliser à partir d'un binaire (qui semble fonctionner), ou a
partir des sources.&lt;/li&gt;
&lt;li&gt;Je préfère compiler quand les sources sont disponibles, cela donne souvent
de meilleurs résultats.
&lt;ul&gt;
&lt;li&gt;Il s'agit ici de la version 0.42b8&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Compilation de Sjasm 0.42b8&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;make donne des erreurs (je passe charitablement sur les warnings),
notamment:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;datastructures.h:50: erreur: ‘memcpy’ was not declared in this
scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;(erreur répétée plusieurs fois dans ce même entête)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Explication: &lt;q&gt;memcpy&lt;/q&gt; est considéré comme une fonction membre de
&lt;q&gt;Data&lt;/q&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Data(byte *n_data,int n_size) : _data(0), _size(n_size),
_maxsize(n_size) { _resize(n_size); memcpy(_data,n_data,n_size); }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ce n'est bien sûr pas le cas. Habituellement, &lt;q&gt;memcpy&lt;/q&gt; est déclaré
dans &lt;q&gt;string.h&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;Faut-il faire un include de ce fichier au début de l'entête
fautif ?&lt;/li&gt;
&lt;li&gt;memcpy n'est utilisé que dans &lt;q&gt;datastructures.h&lt;/q&gt;, ainsi qu'un appel
dans &lt;q&gt;datastructures.cpp&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;voici son prototype: &lt;code&gt;void *memcpy (void *dest, const void *src,
size_t n);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;la véritable fonction &lt;q&gt;memcpy&lt;/q&gt; renvoie un pointeur sur
&lt;code&gt;*dest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;J'ai ajouté memcpy dans la classe &lt;q&gt;Data&lt;/q&gt; (au début avant même le
constructeur, dans les membres &lt;q&gt;public&lt;/q&gt; bien sûr) :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;void *memcpy (byte *dest, byte *src, size_t n);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;et je l'ai défini ainsi dans datastructures.cpp:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

void * Data::memcpy (byte *dest, byte *src, size_t n)
{
  for (int i=0; i&amp;lt;n; i++) dest[i]=src[i];
  return dest;
}

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Toujours dans datastructures.c, on a ensuite une référence inconnue à
memset (également déclaré dans &lt;q&gt;string.h&lt;/q&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;void *memset (void *s, int c, size_t n);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;comprendre: rempli *s 'n' fois avec c&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;* C'était la seule référence. J'ai remplacé par une simple boucle.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

//memset(_data+_size,0,nsize-_size);
 for (int i=0; i&amp;lt;nsize-_size; i++) _data[_size+i]=0;

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Erreur suivante:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;errors.cpp:58: erreur: ‘exit’ was not declared in this
scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;toujours un include à ajouter:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/code&gt; (et non pas &lt;q&gt;stdlib.h&lt;/q&gt;) dans
&lt;q&gt;errors.cpp&lt;/q&gt; (après le include &lt;code&gt;&amp;quot;sjasm.h&amp;quot;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et maintenant, il manque &lt;q&gt;stdio&lt;/q&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fileio.cpp:37: erreur: ‘fopen’ was not declared in this
scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;(puis ensuite fclose, fseek, ftell, fwrite. En gros, tout la bande des I/O
de stdio.h). On se demande à quoi sert de faire du C++ si c'est pour reprendre
toute la librairie standard du C.&lt;/li&gt;
&lt;li&gt;On inclut &lt;q&gt;#include &amp;lt;cstdio&amp;gt;&lt;/q&gt; (et non pas &lt;q&gt;stdio.h&lt;/q&gt;) juste
après le include &lt;q&gt;sjasm.h&lt;/q&gt; au début de fileio.cpp.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Erreur suivante: valeur absolue
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rawsource.cpp:449: erreur: ‘abs’ was not declared in this
scope&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;prototype dans &lt;q&gt;stdlib.h&lt;/q&gt; : &lt;code&gt;int abs (int j);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ca calcule une valeur absolue. Bon, on va le faire nous même.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

  int absolute=_offset%al;
  if (absolute&amp;lt;0) absolute=-absolute;
  if (_offset%al) _offset+=al-absolute; //abs(_offset%al);

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Celui là, il est joli: &lt;code&gt;reader.cpp:73: erreur: ‘malloc’ was not
declared in this scope&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;effectivement, il y a bien un malloc t: &lt;code&gt;if (b.length()+1&amp;gt;64)
bp=p=(char*)malloc(b.length()+1);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bon un &lt;q&gt;free&lt;/q&gt; doit trainer quelque part, au milieu des
&lt;q&gt;delete&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;Vérifions tout de suite (&lt;code&gt;grep free *&lt;/code&gt;). Ah tiens... non. memory
leak en perspective ?&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/code&gt; , après le &lt;code&gt;#include
&amp;quot;sjasm.h&amp;quot;&lt;/code&gt; (la routine quoi)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Allez , c'est le dernier:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

sjasm.cpp:134: erreur: ‘exit’ was not declared in this scope
sjasm.cpp:145: erreur: ‘exit’ was not declared in this scope

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Allez, include cstdlib again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Et voila. L'exécutable &lt;strong&gt;sjasm&lt;/strong&gt; est construit.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il compile bien au moins ? Petit test...&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ca a l'air de fonctionner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Patch pour Sjasm 0.42b8&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;J'ai donc écrit un patch que vous pourrez appliquer directement sur les
sources du 0.42b8 si le coeur vous en dit.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;diff -urNb sjasmsrc42b8 sjasmsrc42b8.jseb &amp;gt;sjasm42b8.patch&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Le résultat est un peu long pour être publié ici, je l'ai inclus sous forme
de fichier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour appliquer le patch:
&lt;ul&gt;
&lt;li&gt;Placez-vous dans le répertoire des sources de Sjasm, et copiez-y le
patch&lt;/li&gt;
&lt;li&gt;Lancez la commande &lt;em&gt;patch&lt;/em&gt; : &lt;code&gt;patch -p1 &amp;lt;
sjasm42b8.patch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une fois les fichiers patchés, vous pouvez lancer make (ne faites pas
attention aux warnings, je n'ai pas corrigé cette partie).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Sjasmplus&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Voyons voir Sjasmplus, qui est un fork d'une ancienne version de
Sjasm.&lt;/li&gt;
&lt;li&gt;Houlala, sur le site officiel, il y a un lien pour les &lt;q&gt;recommended text
editors&lt;/q&gt;.
&lt;ul&gt;
&lt;li&gt;Ok, ni Vim, ni Emacs, ni même Ultraedit. Ca commence bien. Je n'ai même pas
envie de reprendre les sources pour tout dire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Allez, courage.
&lt;ul&gt;
&lt;li&gt;Bon alors, il y a une stable, et une version de dev. La version de dev
n'inclue pas le scripting avec Lua.&lt;/li&gt;
&lt;li&gt;Je reprends la stable, on verra la version de dev plus tard,
éventuellement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La version stable est la 1.06 (3 aout 2006)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je lance la compilation.
&lt;ul&gt;
&lt;li&gt;A première vue, autant de warnings que chez son petit frère Sjasm.&lt;/li&gt;
&lt;li&gt;Ah, et voici les premières erreurs:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

Sjasm.cpp:167: erreur: ‘MAXPATHLEN’ was not declared in this scope
Sjasm.cpp:199: erreur: ‘zoekpad’ was not declared in this scope

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Là j'avoue, je n'ai pas trop cherché.
&lt;ul&gt;
&lt;li&gt;car c'est alors que je suis tombé sur &lt;strong&gt;ça&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

#ifdef WIN32
int main(int argc, char *argv[]) {
#else
int main(int argc, char **argv) {

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Il se faisait tard, j'ai laissé tomber.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je me demande à quoi pensait le type qui a écrit ça.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;z80-asm&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;z80-asm, avec un tiret dans le titre
&lt;ul&gt;
&lt;li&gt;Je précise pour le tiret, car il a un homonyme sans tiret (qui est le
prochain abordé).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;z80-asm semble complet : il inclut même un moniteur/debugger
&lt;q&gt;interactif&lt;/q&gt; à l'ancienne (dans un terminal avec interface façon ncurses).
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://wwwhomes.uni-bielefeld.de/achim/z80-asm.html&quot;&gt;http://wwwhomes.uni-bielefeld.de/achim/z80-asm.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le problème est sa rigidité syntaxique.
&lt;ul&gt;
&lt;li&gt;Il ne veut pas des instructions &lt;q&gt;db&lt;/q&gt; de mon programme de test.&lt;/li&gt;
&lt;li&gt;Il faut remplacer les &lt;q&gt;db&lt;/q&gt; par des &lt;q&gt;defb&lt;/q&gt;, les &lt;q&gt;dw&lt;/q&gt; par des
&lt;q&gt;defw&lt;/q&gt;, etc...&lt;/li&gt;
&lt;li&gt;Les strings ne sont admises qu'avec une déclaration defm (defb ne passera
pas).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour illustrer ce problème, cette déclaration sera refusée:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

LABEL: defb &amp;quot;Hello&amp;quot;,13,10,0

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Et il faudra l'écrire comme ceci:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

LABEL: defm 'Hello chput'
       defb 13,10,0 

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Attention, pour avoir l'aide, c'est &lt;q&gt;-h&lt;/q&gt;. Et non pas &lt;q&gt;--help&lt;/q&gt; ou
&lt;q&gt;-help&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;Si vous ne précisez pas de fichier de sortie, la syntaxe du programme sera
vérifiée, mais vous aurez le message: &lt;q&gt;No code generated&lt;/q&gt; même si vous
n'avez pas d'erreur.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par défaut, z80-asm rajoute un header qui empêche toute exécution par le
msx, et il prend au pied de la lettre la directive &lt;q&gt;org $c000&lt;/q&gt; en générant
un binaire de 48 Ko!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

jseb ~/msx $ hexdump -C test-z80-asm.bin
00000000  5a 38 30 41 53 4d 1a 0a  00 00 fe 00 c0 1b c0 00  |Z80ASM..........|
00000010  c0 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0000c000  00 00 00 00 00 00 00 00  00 00 21 0d c0 7e 23 a7  |..........!..~#.|
0000c010  c8 cd a2 00 18 f7 c9 48  65 6c 6c 6f 20 63 68 70  |.......Hello chp|
0000c020  75 74 0d 0a 00                                    |ut...|
0000c025

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Pour les informations sur le header, voir dans la doc: z80-file.5 (ou
&lt;q&gt;man z80-file&lt;/q&gt; si vous avez installé les pages man).
&lt;ul&gt;
&lt;li&gt;En gros, il faut enlever les 10 premiers octets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour comparaison, le même programme généré avec Sjasm.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

jseb ~/msx $ hexdump -C sjasm.bin
00000000  fe 00 c0 1b c0 00 c0 21  0d c0 7e 23 a7 c8 cd a2  |.......!..~#....|
00000010  00 18 f7 c9 48 65 6c 6c  6f 20 63 68 70 75 74 0d  |....Hello chput.|
00000020  0a 00                                             |..|
00000022

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Je n'ai pas trouvé la façon d'enlever l'entête dans le manuel de z80asm.
&lt;ul&gt;
&lt;li&gt;Du coup, je l'ai fait moi même avec un coup de dd.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dd if=test2.bin of=raw.bin ibs=1 skip=10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Mais ne vous fatiguez même pas à essayer. Le code ne s'exécutera bien sûr
pas dans l'émulateur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dommage, cet assembleur semblait un bon candidat, abstraction faite de sa
syntaxe rigide.
&lt;ul&gt;
&lt;li&gt;Le package possède également un moniteur, déja évoqué ci-dessus.&lt;/li&gt;
&lt;li&gt;Cela dit, rien ne vous empêche d'utiliser le moniteur et de compiler avec
un autre cross-assembler.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;z80asm&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Un bon petit cross-assembler, un peu limité mais à l'approche facile.&lt;/li&gt;
&lt;li&gt;Le nom ressemble fortement au précédent, et se différencie par l'absence de
tiret (ça devient subtil).
&lt;ul&gt;
&lt;li&gt;Mais cette fois, nous avons affaire à un produit plus utilisable&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il a été développé par un possesseur de msx: Bas Wijnen (son pseudo est
Sheveks)
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://savannah.nongnu.org/projects/z80asm&quot;&gt;http://savannah.nongnu.org/projects/z80asm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Bonne surprise, le code source compile sans erreurs ni warnings.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Certaines fonctionnalités sont absentes:
&lt;ul&gt;
&lt;li&gt;Exemple tiré du manuel: &lt;q&gt;rlc r,(ix+nn) and friends don't work&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Cela ne me parait pas bien grave, et il y a toujours possibilité de faire
une macro pour assembler directement l'instruction en écrivant les octets des
instructions avec une séquence db.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Côté directives, c'est le minimum syndical: defb/db, defwdw, ds/defs ,
include, if/else/endif.
&lt;ul&gt;
&lt;li&gt;Pas de macros ni de &lt;q&gt;incbin&lt;/q&gt; pour ajouter directement des fichiers
binaires.&lt;/li&gt;
&lt;li&gt;Pour &lt;q&gt;incbin&lt;/q&gt;, ce n'est pas bien grave. On peut transformer des
données binaires en db/dw, et les inclure avec la directive
&lt;q&gt;include&lt;/q&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La doc est ici: &lt;a href=&quot;http://www.nongnu.org/z80asm/&quot;&gt;http://www.nongnu.org/z80asm/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Mon programme de test a été assemblé sans problèmes, sans adaptations
syntaxiques, et a parfaitement fonctionné sous OpenMSX.&lt;/li&gt;
&lt;li&gt;Bien que limité, z80asm semble être un bon choix pour le programmeur pressé
de faire ses premiers programmes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;WLA DX : le meilleur pour la fin&lt;/h3&gt;
&lt;h5&gt;Des caractéristiques alléchantes&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;C'est un projet vivant avec des patches récents (aout 2010).&lt;/li&gt;
&lt;li&gt;Ce cross-assembler supporte d'autres processeurs que le Z80 (6502, 6510
...)
&lt;ul&gt;
&lt;li&gt;Pour ne rien vous cacher, la désignation complète est &lt;q&gt;Yet Another
GB-Z80/Z80/6502/65C02/6510/65816/HUC6280/SPC-700 Multi Platform Cross Assembler
Package&lt;/q&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A noter que la compilation et le link sont séparés, ce qui permet de linker
des objets entre eux, ou des libs.
&lt;ul&gt;
&lt;li&gt;Cette séparation des commandes parait aller de soi, mais elle est absente
des cross-assemblers que j'ai testé jusqu'à présent.&lt;/li&gt;
&lt;li&gt;Pour plus de détails, référez-vous aux sections &lt;q&gt;compiling&lt;/q&gt; et
&lt;q&gt;linking&lt;/q&gt; dans le README (section 9 et 10).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Les possibilités offertes par les directives disponibles sont
impressionantes.
&lt;ul&gt;
&lt;li&gt;Attention, il y a quelques pièges que je détaillerai plus loin.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La doc n'est pas toujours très claire, mais elle est complète.
&lt;ul&gt;
&lt;li&gt;Il ne faudra pas hésiter à faire quelques allers-retours dans la doc. Les
informations sont parfois un peu éparpillées.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Compilation de WLA DX&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Compilateur et linkers étant séparés, il va falloir procéder en deux
temps.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;La dernière version sur le site de Ville Helin (son auteur) est la 9.5
(aout 2008).
&lt;ul&gt;
&lt;li&gt;Les anciennes versions sont sur le site de l'auteur:&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.villehelin.com/wla.html&quot;&gt;http://www.villehelin.com/wla.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Depuis, il est hébergé sur sourceforge.
&lt;ul&gt;
&lt;li&gt;Le mieux est de récupérer les derniers commits avec subversion depuis le
repository:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;svn co https://wladx.svn.sourceforge.net/svnroot/wladx
wladx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut ensuite aller dans le répertoire &lt;q&gt;makefiles&lt;/q&gt;, et choisir celui
qui nous intéresse.
&lt;ul&gt;
&lt;li&gt;Dans notre cas, il s'agit bien sûr de &lt;q&gt;makefile.unix.z80&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Copier ce makefile dans le répertoire des sources du compilateur
(répertoire racine \&amp;quot;wladx\&amp;quot;).
&lt;ul&gt;
&lt;li&gt;Modifiez le pour virer le flag &lt;q&gt;-O3&lt;/q&gt; et mettre un &lt;q&gt;-O2&lt;/q&gt; à la
place.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make clean &amp;amp;&amp;amp; make -f makefile.unix.z80&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;code&gt;make clean&lt;/code&gt; est là au cas où une autre architecture aurait
été compilée auparavant.&lt;/li&gt;
&lt;li&gt;Ainsi, le define &lt;q&gt;-DZ80&lt;/q&gt; sera bien pris en compte.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pas de warnings inquiétants à signaler (n'oublions pas que les flags sont
assez durs: &lt;q&gt;-ansi -pedantic -Wall&lt;/q&gt; ! )
&lt;ul&gt;
&lt;li&gt;Lancez l'exécutable obtenu (wla-z80).&lt;/li&gt;
&lt;li&gt;La première ligne doit indiquer qu'il s'agit de la version Z80 :&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

/tmp/wladx$ ./wla-z80 

WLA Z80 Macro Assembler v9.5

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Si vous obtenez la ligne ci-dessus, le compilateur est prêt.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il reste à s'occuper du linker, qui lui est commun à tous les compilateurs
supportés par WLA.
&lt;ul&gt;
&lt;li&gt;Le linker se trouve dans le sous-répertoire &lt;q&gt;wlalink&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Il faut modifier &lt;q&gt;wlalink/makefile.unix&lt;/q&gt; sur deux points:
&lt;ul&gt;
&lt;li&gt;Remplacer &lt;code&gt;-O3&lt;/code&gt; par &lt;code&gt;-O2&lt;/code&gt; (comme pour le
compilateur).&lt;/li&gt;
&lt;li&gt;Remplacer &lt;code&gt;$(LD)&lt;/code&gt; par &lt;code&gt;$(CC)&lt;/code&gt; (sinon la compilation
plante lors du link sur la libc).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez maintenant faire un:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make clean &amp;amp;&amp;amp; make -f makefile.unix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;L'exécutable obtenu se nomme &lt;q&gt;wlalink&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

/tmp/wladx/wlalink$ ./wlalink                                                  e

WLALINK GB-Z80/Z80/6502/65C02/6510/65816/HUC6280/SPC-700 WLA Macro Assembler Linker v5.7

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Et voila, le linker est prêt également.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Test de WLA DX&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;WLA DX a une approche assez originale qui peut dérouter au premier
abord.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avant toutes choses, lecture (même rapide) obligatoire du README (91ko!)
qui fait office de documentation principale.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici un programme de démonstration adapté à WLA DX, avec quelques
explications.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
; test.asm - for testing WLA cross compiler.
; jseb @ finiderire . com

.MEMORYMAP
SLOTSIZE $FFFF
DEFAULTSLOT 0
SLOT 0 $0
.ENDME

.ROMBANKMAP
BANKSTOTAL 1
BANKSIZE $FFFF
BANKS 1
.ENDRO

.section &amp;quot;BANKHEADER&amp;quot;
  .db $fe
  .dw start,end,start; 
.ends

.BANK 0 SLOT 0
.ORG $C000 

start:
     LD HL,label
aff: LD A,(HL)
     INC HL
     AND A
     RET Z
     CALL $A2 ; CHPUT
     JR aff
     RET

label: .DB &amp;quot;Hello, World&amp;quot;,13,10,0
end: .equ $-1


&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Au début du programme, vous remarquez quelques directives:
&lt;ul&gt;
&lt;li&gt;.MEMORYMAP et .ROMBANKMAP&lt;/li&gt;
&lt;li&gt;Elles servent à définir la structure des roms. Ici, j'ai fait au plus
simple (un seul slot, une seule banque, la totalité de l'espace adressable par
un Z80 assigné sur le même slot).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;BANKHEADER est plus intéressant, et nécessaire pour écrire le stub de notre
programme.
&lt;ul&gt;
&lt;li&gt;les octets contenus dans BANKHEADER seront simplement ajoutés au début de
l'objet, et ne provoqueront pas de décalage dans le calcul d'adressage à la
compilation. Dans la doc, il est même précisé que c'est une option très utile
pour le MSX (tu m'étonnes).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;q&gt;.BANK 0 SLOT 0&lt;/q&gt; ne semble pas obligatoire, car notre cas est très
simple. Mais dans d'autre cas, il peut être utile de spécifier la BANK ou le
SLOT. J'ai donc laissé cette directive pour attirer votre attention sur son
existence.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A propos de BANK et de SLOT, la terminologie employée ici n'ait aucun
rapport avec le memory mapping du MSX , même si les mots sont identiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avant de nous lancer dans la compilation et le link, un gris piège est à
signaler:
&lt;ul&gt;
&lt;li&gt;&lt;q&gt;.equ&lt;/q&gt; est un alias pour &lt;q&gt;.define&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;c'est à dire: &lt;q&gt;.define : Assigns a number or a string to a
definition label.&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Dans l'exemple en dessous, on met donc start à zéro! Ce n'est pas le
comportement habituel qui serait d'assigner la valeur de start à exec.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exec: .equ start ;en réalité, met start à zéro !!&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Il semble qu'on ne puisse pas assigner de valeur à une étiquette en
utilisant la valeur d'une autre étiquette. Par contre, on peut faire ça:
&lt;code&gt;exec: .equ $C000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ce qui n'a pas un grand interet (voire même peut être dangereux si on
change la valeur de .ORG )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour la compilation :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wla-z80 -o test.asm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;le flag &lt;q&gt;-o&lt;/q&gt; sert à demander la génération d'un fichier objet.&lt;/li&gt;
&lt;li&gt;le nom du fichier objet est par défaut celui du fichier source avec
l'extension &lt;q&gt;.o&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour le link :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wlalink -b test.group test.bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;le flag &lt;q&gt;-b&lt;/q&gt; est important, car par défaut, c'est &lt;q&gt;-r&lt;/q&gt; qui est
utilisé. Et le flag &lt;q&gt;-r&lt;/q&gt; sert à créer une rom.&lt;/li&gt;
&lt;li&gt;Le fichier &lt;q&gt;test.group&lt;/q&gt; contient différents paramètres, dont le nom
des fichiers objets à utiliser pour le link (voir la doc).&lt;/li&gt;
&lt;li&gt;Ici, le fichier &lt;q&gt;test.group&lt;/q&gt; contient ceci:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

[objects]
test.o

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Il est réduit ici à sa plus simple expression.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voilà un tour rapide de WLA. Vous en savez assez pour lire la doc et
pouvoir m'expliquer comment générer une ROM avec ce compilateur!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Le cas des macro cross-assemblers&lt;/h3&gt;
&lt;h5&gt;macro quoi ?&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;q&gt;macro cross assembler&lt;/q&gt; est un cross compilateur classique, mais
qui fonctionne avec un système de macros.&lt;/li&gt;
&lt;li&gt;Les macros sont des regroupements d' instructions (ici, les mnémoniques),
sous une seule instruction afin de faciliter la lecture.&lt;/li&gt;
&lt;li&gt;Une macro sert à automatiser l'insertion d'un bloc d'instruction.&lt;/li&gt;
&lt;li&gt;Le support par le compilateur des macros peut être plus ou moins étendu:
&lt;ul&gt;
&lt;li&gt;Cela peut aller du simple remplacement de texte (comme une fonction inline)
à l'intégration de la gestion des opérateurs arithmétiques et logiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Notez qu'il existe bien sûr des macro assemblers dédiés à la plateforme
hôte. Ils ne sont donc pas cross-compilers.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Les macro-assemblers permettent d'introduire un peu de haut niveau dans le
monde aride de l'assembleur.
&lt;ul&gt;
&lt;li&gt;Le revers de la médaille peut être une génération de code bien foireuse,
surtout pour des projets amateurs peu suivis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Le macro cross-assembler AS&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;AS rentre dans le club très fermé décrit ci-dessus.&lt;/li&gt;
&lt;li&gt;Son support des macros est suffisament étendu pour justifier un traitement
à part.&lt;/li&gt;
&lt;li&gt;Vous le trouverez ici:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://john.ccac.rwth-aachen.de:8000/as/&quot;&gt;http://john.ccac.rwth-aachen.de:8000/as/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Voici un exemple de sa syntaxe&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

dbstr   macro   arg
        if      strlen(arg) &amp;gt; 1
         db     substr(arg, 0, strlen(arg) - 1)
        endif
        if      strlen(arg) &amp;gt; 0
         db     charfromstr(arg, strlen(arg) - 1) | 80h
        endif
        endm 

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Il m'a l'air ma foi fort intéressant...
&lt;ul&gt;
&lt;li&gt;mais j'avoue que je commence à me lasser de tous ces tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Mes choix de cross-assemblers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Il faut bien choisir, alors voici mes préférés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;WLA DX, le meilleur et le plus exigeant&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;WLA DX est de loin le meilleur cross compiler que j'ai pu tester. Il y a un
monde entre lui, et Sjasm par exemple.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ses avantages:
&lt;ul&gt;
&lt;li&gt;Le compilateur et le linker sont séparés, ce qui est une très bonne
chose.&lt;/li&gt;
&lt;li&gt;Il compile sans warning inquiétants, ni erreurs, avec des flags qui ne
pardonnent pourtant pas.&lt;/li&gt;
&lt;li&gt;La doc est bien fournie.&lt;/li&gt;
&lt;li&gt;Il est maintenu et réellement multi-plateformes, signe d'une bonne
conception.&lt;/li&gt;
&lt;li&gt;Le code est en C, preuve de bon goût (mieux vaut écrire du C rustique et
fonctionnel que du C++ qui compile à peine).&lt;/li&gt;
&lt;li&gt;Seule une relative complexité pourrait vous conduire à lui préférer z80asm
(celui de Sheveks).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Ses inconvénients:
&lt;ul&gt;
&lt;li&gt;Une façon de faire aux antipodes de la simplicité.&lt;/li&gt;
&lt;li&gt;Une doc pas toujours très claire.&lt;/li&gt;
&lt;li&gt;Nécessite surement un peu d'expérience en programmation pour être
apprécié.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;z80asm, rustique mais efficace&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Celui-ci est simple, mais n'a posé de problèmes ni à la compilation, ni à
l'utilisation.&lt;/li&gt;
&lt;li&gt;D'autres part, il a été développé spécifiquement pour être utilisé avec un
MSX.
&lt;ul&gt;
&lt;li&gt;Cependant, contrairement à ASmsx, il ne permet pas de créer facilement des
ROMs.&lt;/li&gt;
&lt;li&gt;Seuls quelques fichiers d'équivalences spécifiques aux MSX sont
fournis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sa rusticité (peu de directives disponibles) ne doit pas faire oublier sa
facilité d'emploi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Sjasm 0.42b8, le pari&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Avec Sjasm, vous avez un cross-assembler relativement séduisant sur le
papier.&lt;/li&gt;
&lt;li&gt;Ses sources font cependant assez peur, et le patch que je vous propose pour
le compiler ne corrige que les erreurs bloquants la compilation.&lt;/li&gt;
&lt;li&gt;Une fois que j'ai réussi à le compiler, mes programmes de tests sont passés
sans problèmes.&lt;/li&gt;
&lt;li&gt;A tester donc, pour les plus joueurs d'entre-vous.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Et pour les Windoziens, c'est tniASM&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;tniASM semble pas mal... pour MS-Windows.
&lt;ul&gt;
&lt;li&gt;je continue à tanner son auteur sur IRC pour une version OpenSource.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Fini pour aujourd'hui&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le prochain sujet abordé sera l'échange de données avec l'émulateur, et
l'édition facile d'un programme basic.&lt;/li&gt;
&lt;li&gt;D'ici là, vous avez le temps de digérer ce billet un peu long.
&lt;ul&gt;
&lt;li&gt;Vous pouvez même retourner sur la plage, le temps que j'écrive tout ça, les
nuages sont partis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Votre propre expérience des cross-assemblers m'intéresse! N'hésitez pas à
poster vos remarques et ajouts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
          <enclosure url="http://www.finiderire.com/public/patchs/sjasm42b8_patch.zip"
      length="2037" type="application/zip" />
    
    
          <comments>http://www.finiderire.com/post/2010/08/16/Ce-sont-les-vacances%3A-en-avant-toute-vers-le-retro-%21#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/08/16/Ce-sont-les-vacances%3A-en-avant-toute-vers-le-retro-%21#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/539917</wfw:commentRss>
      </item>
    
  <item>
    <title>Oukiléleclavier ? Oukellélasouris ? (ou: la bonne blague de Xorg)</title>
    <link>http://www.finiderire.com/post/2010/05/01/Oukil%C3%A9leclavier-Oukell%C3%A9lasouris-%28ou%3A-la-bonne-blague-de-XOrg%29</link>
    <guid isPermaLink="false">urn:md5:afb6042d2ed71447df41c784b28c528d</guid>
    <pubDate>Wed, 05 May 2010 18:47:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Gentoo</category><category>Linux</category><category>pénible</category>    
    <description>&lt;p&gt;&lt;em&gt;Je me suis aperçu qu'il manquait un tag à mes billets.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Comment caractériser toutes ces nuisances qui gachent la vie de l'honnête
administrateur système ?&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;J'inaugure dès à présent le tag &lt;q&gt;pénible&lt;/q&gt; avec Xorg&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Situation de départ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Le but était de faire 'une mise à jour de Xorg sous Gentoo.
&lt;ul&gt;
&lt;li&gt;Pour ma part, il s'agissait de passer le serveur Xorg de la version 1.3 à
la version 1.6.5.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Avis aux mécréants utilisateurs d'autres unixeries que Gentoo :
continuez à lire, ceci concerne au moins également FreeBSD et Arch-Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Echauffement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Installer Xorg implique souvent la mise à jour d'autres paquets.&lt;/li&gt;
&lt;li&gt;Avant même le passage au paquet &lt;em&gt;xorg-server&lt;/em&gt;, nous rencontrons une
erreur.&lt;/li&gt;
&lt;li&gt;La &lt;em&gt;libpciaccess&lt;/em&gt; (en update) essaie d'installer un exécutable
(&lt;em&gt;scanpci&lt;/em&gt;) mais refuse de remplacer la version précédente.
&lt;ul&gt;
&lt;li&gt;Cet exécutable provoque un conflit, car c'est un autre ebuild qui a
construit la version précédente.&lt;/li&gt;
&lt;li&gt;On ne peut donc pas le supprimer sans réfléchir, car cela risquerait de
casser l'autre ebuild.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Laissez tomber la méthode de résolution suggérée dans les messages, et
faites plutôt:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;equery b scanpci&lt;/code&gt; : vous obtenez le nom du paquet qui
contient l'ancienne version à remplacer.&lt;/li&gt;
&lt;li&gt;Il s'agissait du Xorg que vous tentez d'updater. Ma méthode (votre avis
peut varier) : &lt;code&gt;emerge -C xorg-server&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une fois ceci rêglé, vous pouvez relancer la mise à jour de
&lt;em&gt;xorg-server&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Plus de clavier, plus de souris&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pour le reste, la compilation, se passe plutôt bien.&lt;/li&gt;
&lt;li&gt;Un &lt;code&gt;emerge -va nvidia-drivers&lt;/code&gt; plus tard, Xorg démarre
enfin.&lt;/li&gt;
&lt;li&gt;Et là, plus de souris (huho) ni de clavier (haha).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Rendez moi mon clavier! (et ma souris aussi!)&lt;/h3&gt;
&lt;h5&gt;Sortie de Xorg&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Alors là, attention, c'est technique.
&lt;ul&gt;
&lt;li&gt;Appuyez pendant 5 secondes sur le bouton marche/arrêt du PC.&lt;/li&gt;
&lt;li&gt;Si vous avez ACPI dans le noyau avec un script sur le bouton marche/arrêt,
vous êtes sauvé et la solution déplorable de la ligne du dessus ne sera pas
nécessaire.&lt;/li&gt;
&lt;li&gt;Les heureux utilisateurs d'un réseau local pourront également faire un
&lt;em&gt;ssh&lt;/em&gt; sur la machine coincée. Beaucoup plus propre, mais nécessite un
cable réseau et un autre PC (et un daemon sshd sur la machine bloquée).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Divination avec les logs&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Après le reboot, et en supposant que vous n'avez pas eu de problème de
journalisation, vous vous retrouvez à nouveau devant la console.
&lt;ul&gt;
&lt;li&gt;Si vous n'avez pas de chance, X est relancé aussi sec. Dans ce cas, il va
falloir changer le niveau de démarrage de votre Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dans le log de Xorg, nous trouvons la source du problème (je ne vous montre
que la partie concernant le clavier, la même chose est observable pour la
souris):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

$~  less /var/log/Xorg.0.log
(II) LoadModule: &amp;quot;kbd&amp;quot;
(II) Loading /usr/lib/xorg/modules/input//kbd_drv.so
(II) Module kbd: vendor=&amp;quot;X.Org Foundation&amp;quot;
        compiled for 1.3.0, module version = 1.1.0
        Module class: X.Org XInput Driver
        ABI class: X.Org XInput driver, version 0.7
(EE) module ABI major version (0) doesn't match the server's version (4)
(II) UnloadModule: &amp;quot;kbd&amp;quot;
(II) Unloading /usr/lib/xorg/modules/input//kbd_drv.so
(EE) Failed to load module &amp;quot;kbd&amp;quot; (module requirement mismatch, 0)

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Parenthèse pour les paresseux&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si vous n'avez pas fait de mise à jour de Xorg depuis &lt;em&gt;vraiment&lt;/em&gt;
très longtemps, il se peut que vous ayez un autre problème.&lt;/li&gt;
&lt;li&gt;En effet, dans la config de Xorg, les devices ont changé de nom à un moment
donné.&lt;/li&gt;
&lt;li&gt;Vérifiez donc que votre clavier et votre souris ont bien le driver
convenable.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

Section &amp;quot;InputDevice&amp;quot;

    Identifier  &amp;quot;Keyboard1&amp;quot;
    Driver      &amp;quot;kbd&amp;quot;

(snip)
    Identifier  &amp;quot;Mouse1&amp;quot;
    Driver      &amp;quot;mouse&amp;quot;

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Je ne saurais en dire plus à ce sujet, car je n'ai que de vagues souvenirs
de ce problème.
&lt;ul&gt;
&lt;li&gt;De toutes façons, le problème a dû disparaitre de lui-même, depuis le
temps. (l'optimisme est rare de nos jours, sachons le cultiver.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Revenons à nos moutons&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il vous manque simplement deux mises à jour, oubliées par
&lt;em&gt;emerge&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emerge -va xf86-input-keyboard&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emerge -va xf86-input-mouse&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;A noter que le problème se posera probablement également avec votre
joystick, votre tablette graphique, et autres périphériques d'entrée.
&lt;ul&gt;
&lt;li&gt;Un simple &lt;code&gt;eix xf86-input&lt;/code&gt; vous en convaincra aisément.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Keyboard not found. Press F1 to continue.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;J'ai profité de mon clavier retrouvé pour écrire ce billet.&lt;/li&gt;
&lt;li&gt;Comme je ne vais pas non plus tout faire, je vous laisse écrire les
commentaires.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/05/01/Oukil%C3%A9leclavier-Oukell%C3%A9lasouris-%28ou%3A-la-bonne-blague-de-XOrg%29#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/05/01/Oukil%C3%A9leclavier-Oukell%C3%A9lasouris-%28ou%3A-la-bonne-blague-de-XOrg%29#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/513081</wfw:commentRss>
      </item>
    
  <item>
    <title>MPD : le stream était presque parfait</title>
    <link>http://www.finiderire.com/post/2010/04/27/MPD-%3A-le-stream-%C3%A9tait-presque-parfait</link>
    <guid isPermaLink="false">urn:md5:68cc9eb57ffae22afedbc3ec6cde04fa</guid>
    <pubDate>Wed, 28 Apr 2010 00:11:00 +0200</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Linuxeries</category>
        <category>Gentoo</category><category>Linux</category><category>tools</category>    
    <description>&lt;p&gt;&lt;em&gt;Aujourd'hui, ce sont mes aventures pour streamer de la musique avec
mpd.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Car mpd est beau, mpd est grand, mpd streame!&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Merci à Frédéric Jolliton pour le coup de main lors de la mise au point.
(et il a relu et clarifié, en plus)&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;MàJ 13 mai 2010&lt;/strong&gt; : gagner trois ko de bande passante
avec shh&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;MàJ 31 jan 2013&lt;/strong&gt; : faire un paquet Arch pour une
machine sans Xorg.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Résumé des épisodes précédents&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ce n'était pas forcément le plus intéressant, mais le premier billet est
ici:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.finiderire.com/post/2008/07/09/MPD-%3A-Musique-Par-le-Daemon&quot;&gt;MPD - musique par
le daemon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le streaming n'était pas le sujet de ce billet. Dans ma grande bonté, j'en
refais donc un complet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Comprenons-nous bien&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ce titre légèrement menaçant fait un peu vendeur de &lt;em&gt;savonnettes
dé-régulées&lt;/em&gt; cherchant à forcer l'entrée de votre habitation. Cette fois,
il ne s'agit que d' une nécessaire introduction à ce qu'est réellement
mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;De l'avantage du stream&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Pourquoi écouter un stream , et ne pas décoder en local ?
&lt;ul&gt;
&lt;li&gt;Vous ne compilerez qu'une fois le player.&lt;/li&gt;
&lt;li&gt;Vous ne dupliquez pas vos fichiers, vous n'avez pas besoin de les promener
sur une clé usb ou un disque externe.&lt;/li&gt;
&lt;li&gt;Vous allez faire l'envie de vos voisins (en général, cet argument suffit à
emporter la décision).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mpd n'est pas forcément ce que l'on croit&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;mpd est un player dont la sortie sonore se fait en &lt;strong&gt;local&lt;/strong&gt;
par défaut (c'est à dire, sur la machine où mpd est lancé).
&lt;ul&gt;
&lt;li&gt;Les clients de mpd, tels que &lt;strong&gt;ncmpc&lt;/strong&gt; ou
&lt;strong&gt;gmpc&lt;/strong&gt; (client Gnome) ne sont rien d'autre que des télécommandes
pour mpd.&lt;/li&gt;
&lt;li&gt;Aucun d'entre eux ne permet d'écouter un stream.&lt;/li&gt;
&lt;li&gt;Ils ne savent qu'envoyer des commandes au daemon mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;em&gt;client mpd&lt;/em&gt; est une télécommande ... donc cela signifie que seul
le PC faisant tourner le serveur est en mesure de sortir du son, et que tous
les clients associés à mpd ne servent qu'à contrôler celui-ci à distance ?
&lt;ul&gt;
&lt;li&gt;Exactement ! Je n'aurais su mieux le dire !&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mais mpd peut streamer&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Néanmoins, si les clients spécifiques à mpd ne peuvent que le contrôler,
mpd est capable de différents rendus.
&lt;ul&gt;
&lt;li&gt;Les sorties locales, avec la configuration OSS , Alsa ou ... &lt;q&gt;null&lt;/q&gt;
(qui est bien un rendu local)&lt;/li&gt;
&lt;li&gt;Des sorties streamées, avec entre autres un serveur shoutcast, ou son
serveur interne httpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser le serveur intégré à mpd, qui streame sans fioritures,
tel une web-radio.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Dès à présent, il est utile de préciser que nous allons utiliser deux
ports.
&lt;ul&gt;
&lt;li&gt;Le port de commande de mpd, sur lequel nous pouvons connecter un client, ou
lancer un &lt;code&gt;telnet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Le port utilisé par mpd pour servir le stream. Celui-ci n'est actif que
quand de la musique est jouée. Il est fermé dès que la musique est
stoppée.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Préparation et configuration de mpd&lt;/h3&gt;
&lt;h5&gt;Flags de compilation Gentoo&lt;/h5&gt;
&lt;pre&gt;

media-sound/mpd -alsa -ffmpeg mikmod musepack ogg vorbis lame

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Votre avis concernant ffmpeg pourra varier, mais j'ai préféré limiter les
temps de compilation sur une machine un peu limitée.&lt;/li&gt;
&lt;li&gt;J'ai bien sûr retiré toute référence à Alsa (OSS étant inactif par défaut),
vu que la machine hébergeant le serveur n'a même pas de carte son.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;PKGBUILD pour Arch&lt;/h5&gt;
&lt;p&gt;Arch a déja son paquet, qui contient un tas de dépendances qui vont faire
exploser votre serveur.&lt;/p&gt;
&lt;p&gt;Le mieux est de reprendre le PKGBUILD de ABS, pour obtenir les flags de la
distribution, et de l'adapter.&lt;/p&gt;
&lt;p&gt;Penser ensuite à bloquer les mises à jour de MPD dans pacman.conf.&lt;/p&gt;
&lt;p&gt;Voici les deux modifications que j'ai apporté au PKGBUILD :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;depends&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai viré tout un tas de trucs qu'il ne fallait surtout pas installer, car
invasif (trop de dépendances), ou inutile (jack), ou les deux (pulse, ahaha!).
J'ai enlevé &lt;em&gt;libmodplug&lt;/em&gt; après quelques hésitations, et je l'ai remplacé
par &lt;em&gt;mikmod&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Je me suis également permis d'ajouter le support Ogg-Vorbis.&lt;/p&gt;
&lt;pre&gt;

depends=('libmikmod' 'libmad' 'libid3tag' 'libogg' 'libvorbis')

&lt;/pre&gt;
&lt;p&gt;Il ne reste vraiment pas grand monde, mais ça devrait suffire.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;options de &lt;code&gt;./configure&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le massacre continue avec les options de configure. Hâtons nous de virer cet
horrible systemd, lastfm et autres soundcloud. Bon, ça ira plus vite si je vous
donne le nouveau.&lt;/p&gt;
&lt;pre&gt;

  ./configure \
    --prefix=/usr \
    --sysconfdir=/etc \
    --enable-httpd-output \
    --enable-id3 \
    --enable-mikmod \
    --disable-oss \
    --enable-vorbis

&lt;/pre&gt;
&lt;p&gt;La reconstitution du PKGBUILD est laissé à titre d'exercice au lecteur, je
me suis contenté ici de donner ce qui changeait, plutôt que de vous noyer sous
les inutiles détails de ce qui ne changeait pas.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Création des répertoires nécessaires&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;mpd peut être lancé par un utilisateur lambda.
&lt;ul&gt;
&lt;li&gt;Vous devriez mettre sa configuration dans le &lt;em&gt;home&lt;/em&gt; de celui-ci, et
ajuster le paramètre &lt;em&gt;user&lt;/em&gt; dans le fichier de configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Fichier de configuration&lt;/h5&gt;
&lt;p&gt;Voici mon fichier de configuration.&lt;/p&gt;
&lt;p&gt;Je n'ai pas inclu tout ce qui ne sert pas, reportez vous au fichier
&lt;q&gt;/etc/mpd.conf&lt;/q&gt; pour plus de précisions.&lt;/p&gt;
&lt;p&gt;Son nom et son emplacement dépend de l'utilisateur qui va lancer mpd.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;root : &lt;code&gt;/etc/mpd.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;un utilisateur : &lt;code&gt;/home/toto/.mpdconf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour vos essais, vous pouvez simplifier la situation en ne mettant pas de
mot de passe, par exemple.&lt;/p&gt;
&lt;pre&gt;

music_directory  &amp;quot;/home/toto/music&amp;quot;
playlist_directory  &amp;quot;/home/toto/mpd/playlists&amp;quot;
db_file  &amp;quot;/home/toto/mpd/database&amp;quot;
log_file  &amp;quot;/home/toto/mpd/mpd.log&amp;quot;
pid_file  &amp;quot;/home/toto/mpd/mpd.pid&amp;quot;
state_file  &amp;quot;/home/toto/mpd/state&amp;quot;

#ATTENTION : si vous ne lancez pas mpd en root, commentez «user»
#user  &amp;quot;toto&amp;quot;

bind_to_address  &amp;quot;0.0.0.0&amp;quot;
port  &amp;quot;1234&amp;quot;
password  &amp;quot;password@read,add,control,admin&amp;quot;
default_permissions  &amp;quot;&amp;quot; #pas de bras, pas de chocolat.

input {
        plugin &amp;quot;curl&amp;quot;
}

audio_output {
        type  &amp;quot;httpd&amp;quot;
       name  &amp;quot;My HTTP Stream&amp;quot;
        encoder  &amp;quot;lame&amp;quot;  # optional, vorbis or lame
        port  &amp;quot;5678&amp;quot;
        bitrate  &amp;quot;128&amp;quot;  # do not define if quality is defined
        format  &amp;quot;44100:16:1&amp;quot;
}
filesystem_charset &amp;quot;UTF-8&amp;quot;

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bind_to_address&lt;/strong&gt; : ne mettez &lt;strong&gt;surtout
pas&lt;/strong&gt; &lt;em&gt;localhost&lt;/em&gt; ou &lt;em&gt;127.0.0.1&lt;/em&gt; :
&lt;ul&gt;
&lt;li&gt;Cela provoquerait un bind de mpd sur l'interface loopback. Toute connexion
externe serait alors impossible.&lt;/li&gt;
&lt;li&gt;Cependant, vous pourrez toujours faire un tunnel ssh avec l'adresse
&amp;quot;127.0.0.1&amp;quot;&lt;/li&gt;
&lt;li&gt;A la place de 0.0.0.0 on peut mettre l'IP d'une carte réseau. Par exemple
pour une machine directement sur le net (avec une IP publique) on veut pas
forcément rendre mpd accessible. Alors qu'en mettant l'IP de la machine sur le
LAN (disons 192.168.1.1) ça ne sera accessible que sur le réseau local.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;default_permissions&lt;/strong&gt; : pour vos essais en connexion
anonyme (sans mot de passe), vous pouvez mettre les permissions à fond avec
&lt;q&gt;read,add,control,admin&lt;/q&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour pouvoir vous connecter si vous avez compilé mpd avec tcp_wrapper
(libwrap) , vous devrez peut-être ajouter dans &lt;em&gt;/etc/hosts.allow&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

mpd: ALL

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Premier lancement&lt;/h5&gt;
&lt;p&gt;Placez quelques fichiers musicaux dans le répertoire définit comme
&lt;em&gt;music_directory&lt;/em&gt; dans le fichier de configuration.&lt;/p&gt;
&lt;p&gt;Le premier lancement se fera en local, avec l'utilisateur configuré dans
mpd.conf&lt;/p&gt;
&lt;p&gt;Au passage, nous allons créer la base de données.&lt;/p&gt;
&lt;p&gt;Par la suite, la commande &lt;q&gt;update&lt;/q&gt; sera envoyée par un client mpd.&lt;/p&gt;
&lt;p&gt;Dans les anciennes versions, il suffisait de faire ceci:&lt;/p&gt;
&lt;pre&gt;

toto@serveur ~$ mpd --create-db

&lt;/pre&gt;
&lt;p&gt;Hélas, cette méthode ne fonctionne plus, que l'on soit simple utilisateur ou
root. Ne croyez pas la FAQ qui prétend que l'on peut créer la base avec
l'utilisateur root. Dans tous les cas, vous aurez cette erreur:&lt;/p&gt;
&lt;pre&gt;

/tmp# mpd --create-db

** (mpd:32740): CRITICAL **: option parsing failed: Unknown option --create-db

&lt;/pre&gt;
&lt;p&gt;Alors que faire ?&lt;/p&gt;
&lt;p&gt;D'autres sources conseillent de faire un &lt;code&gt;mpc update&lt;/code&gt;, mais
encore faudrait-il que &lt;em&gt;mpd&lt;/em&gt; soit lancé. Or, &lt;em&gt;mpd&lt;/em&gt; se plante au
démarrage puisque la base de données n'est pas là.&lt;/p&gt;
&lt;p&gt;Résistez également à la tentation de faire un &lt;code&gt;touch&lt;/code&gt; pour créer
la base à la main. Ça ne fonctionnera pas.&lt;/p&gt;
&lt;p&gt;La seule chose que j'ai trouvé a été de créer une config minimale dans
/etc/mpd.conf et de lancer mpd en tant que root. Ensuite, je l'ai tué et j'ai
récupéré le fichier &lt;em&gt;database.db&lt;/em&gt; à l'endroit où mpd l'avait créé
(j'avais tout mis dans /tmp).&lt;/p&gt;
&lt;p&gt;Alors pour info, il s'agit d'un stupide fichier texte. Le voici, si vous
rencontrez les mêmes problèmes, un copier/coller pourrait vous faire gagner du
temps.&lt;/p&gt;
&lt;p&gt;Le dump après le &lt;code&gt;cat&lt;/code&gt; vous donne le format binaire strict, au
cas où vous auriez des problèmes avec votre éditeur (rappel: sous Unix, une fin
de ligne est codée sur un seul octet: 0x0a).&lt;/p&gt;
&lt;pre&gt;

/etc# cat /tmp/database.db 
info_begin
format: 1
mpd_version: 0.17.3
fs_charset: UTF-8
tag: Artist
tag: ArtistSort
tag: Album
tag: AlbumArtist
tag: AlbumArtistSort
tag: Title
tag: Track
tag: Name
tag: Genre
tag: Date
tag: Composer
tag: Performer
tag: Disc
tag: MUSICBRAINZ_ARTISTID
tag: MUSICBRAINZ_ALBUMID
tag: MUSICBRAINZ_ALBUMARTISTID
tag: MUSICBRAINZ_TRACKID
info_end

/etc# hexdump /tmp/database.db  -C
00000000  69 6e 66 6f 5f 62 65 67  69 6e 0a 66 6f 72 6d 61  |info_begin.forma|
00000010  74 3a 20 31 0a 6d 70 64  5f 76 65 72 73 69 6f 6e  |t: 1.mpd_version|
00000020  3a 20 30 2e 31 37 2e 33  0a 66 73 5f 63 68 61 72  |: 0.17.3.fs_char|
00000030  73 65 74 3a 20 55 54 46  2d 38 0a 74 61 67 3a 20  |set: UTF-8.tag: |
00000040  41 72 74 69 73 74 0a 74  61 67 3a 20 41 72 74 69  |Artist.tag: Arti|
00000050  73 74 53 6f 72 74 0a 74  61 67 3a 20 41 6c 62 75  |stSort.tag: Albu|
00000060  6d 0a 74 61 67 3a 20 41  6c 62 75 6d 41 72 74 69  |m.tag: AlbumArti|
00000070  73 74 0a 74 61 67 3a 20  41 6c 62 75 6d 41 72 74  |st.tag: AlbumArt|
00000080  69 73 74 53 6f 72 74 0a  74 61 67 3a 20 54 69 74  |istSort.tag: Tit|
00000090  6c 65 0a 74 61 67 3a 20  54 72 61 63 6b 0a 74 61  |le.tag: Track.ta|
000000a0  67 3a 20 4e 61 6d 65 0a  74 61 67 3a 20 47 65 6e  |g: Name.tag: Gen|
000000b0  72 65 0a 74 61 67 3a 20  44 61 74 65 0a 74 61 67  |re.tag: Date.tag|
000000c0  3a 20 43 6f 6d 70 6f 73  65 72 0a 74 61 67 3a 20  |: Composer.tag: |
000000d0  50 65 72 66 6f 72 6d 65  72 0a 74 61 67 3a 20 44  |Performer.tag: D|
000000e0  69 73 63 0a 74 61 67 3a  20 4d 55 53 49 43 42 52  |isc.tag: MUSICBR|
000000f0  41 49 4e 5a 5f 41 52 54  49 53 54 49 44 0a 74 61  |AINZ_ARTISTID.ta|
00000100  67 3a 20 4d 55 53 49 43  42 52 41 49 4e 5a 5f 41  |g: MUSICBRAINZ_A|
00000110  4c 42 55 4d 49 44 0a 74  61 67 3a 20 4d 55 53 49  |LBUMID.tag: MUSI|
00000120  43 42 52 41 49 4e 5a 5f  41 4c 42 55 4d 41 52 54  |CBRAINZ_ALBUMART|
00000130  49 53 54 49 44 0a 74 61  67 3a 20 4d 55 53 49 43  |ISTID.tag: MUSIC|
00000140  42 52 41 49 4e 5a 5f 54  52 41 43 4b 49 44 0a 69  |BRAINZ_TRACKID.i|
00000150  6e 66 6f 5f 65 6e 64 0a                           |nfo_end.|
00000158

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;En cas d'erreur, ou de modification de la base, vous pouvez tuer le serveur
avec :
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kill $(pidof mpd)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Par la suite, vous pourrez utiliser les scripts Gentoo (ou de votre
distrib) pour demander le démarrage de mpd au boot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Test rapide avec telnet&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Plus qu'à tenter un telnet sur le port de votre serveur&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous pouvez trouver toutes les commandes comprises par mpd ici:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://mpd.wikia.com/wiki/MusicPlayerDaemonCommands&quot;&gt;commandes
mpd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

toto@serveur ~/.ncmpc $ telnet localhost 1234
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
OK MPD 0.15.0
status
volume: -1
repeat: 0
random: 0
single: 0
consume: 0
playlist: 3
playlistlength: 0
xfade: 0
state: stop
OK
close
Connection closed by foreign host.

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;status&lt;/em&gt; vous permettra d'obtenir rapidement confirmation du
fonctionnement de mpd.
&lt;ul&gt;
&lt;li&gt;Même si la simple réussite de la connexion telnet devrait suffire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour fermer proprement la session, utilisez &lt;em&gt;close&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;mpc dépanne certes bien...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que le daemon mpd fonctionne, il est temps de tester avec un
logiciel un peu plus évolué, et à distance.
&lt;ul&gt;
&lt;li&gt;Je vous conseille de rester sur le réseau local de mpd, ceci limitera les
ports à ouvrir dans le firewall, et vous pourrez toujours vous passer
d'authentification.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;L'informatique aime les acronymes, et les doublons aussi.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mpc&lt;/strong&gt; = music player &lt;strong&gt;client&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ne confondez pas avec les vieux fichiers &lt;em&gt;musepack&lt;/em&gt; (extension
&lt;em&gt;mpc&lt;/em&gt;) que l'on peut jouer avec mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;mpc&lt;/em&gt; est un utilitaire indispensable pour vous éviter des
&lt;code&gt;telnet&lt;/code&gt; rapidement saoulants sur le port du daemon mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Je vous laisse faire &lt;code&gt;man mpc&lt;/code&gt; , le fonctionnement est
trivial.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;...mais ncmpc est toujours le plus beau&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maintenant que tout semble bien tourner, il est temps de passer au client
qui ne nous quittera plus.&lt;/li&gt;
&lt;li&gt;Avec un nom à coucher dehors, &lt;strong&gt;ncmpc&lt;/strong&gt; est néanmoins le plus
agréable des clients mpd.&lt;/li&gt;
&lt;li&gt;Interprétation personnelle du nom:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nc&lt;/strong&gt; = &lt;em&gt;ncurses&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mpc&lt;/strong&gt; = &lt;em&gt;music player client&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Version dans Portage (avril 2010)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;0.14
&lt;ul&gt;
&lt;li&gt;un peu vieille, mais que voulez-vous ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Flags Gentoo&lt;/h5&gt;
&lt;pre&gt;

media-sound/ncmpc artist-screen colors help-screen key-screen lyrics-screen search-screen song-screen

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Beaucoup de possibilités dans les versions récentes de &lt;em&gt;ncmpc&lt;/em&gt; , y
compris la possibilité d'afficher les paroles des chansons.
&lt;ul&gt;
&lt;li&gt;J'ai activé toutes les options, ça ne mange pas de pain (ni de
ressources).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Erreur possible à la compilation de ncmpc&lt;/h5&gt;
&lt;pre&gt;

match.c:43: attention : implicit declaration of function ‘g_regex_match_simple’
match.c:45: erreur: ‘G_REGEX_CASELESS’ undeclared (first use in this function)

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Dans ce cas, il faut mettre à jour votre glib (pas la glibc , je parle bien
de la glib tout court) et recommencer l'emerge de ncmpc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Fichier de configuration de ncmpc&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il se trouve dans ~/ncmpc/config&lt;/li&gt;
&lt;li&gt;Celui-ci est donné juste pour information. Je n'ai pas encore pris le temps
de fignoler.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

port = 1234
password = &amp;quot;password&amp;quot;
scroll = yes
scroll-sep = &amp;quot; ***** &amp;quot;
enable-colors = yes
color background = black
color list = brightwhite

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Diagnostics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lancez la lecture d'un fichier avec mpc, ncmpc, telnet, ou ce que vous
voudrez.
&lt;ul&gt;
&lt;li&gt;Ceci doit produire l'envoi du stream sur le port défini pour &lt;em&gt;httpd&lt;/em&gt;
dans la configuration de mpd.&lt;/li&gt;
&lt;li&gt;Le port &lt;em&gt;stream&lt;/em&gt; ne sera ouvert que pendant la génération d'un
stream.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

toto@serveur ~$ netstat -pln | grep mpd
tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      3694/mpd
tcp        0      0 0.0.0.0:5678            0.0.0.0:*               LISTEN      3694/mpd

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Les ports utilisés sont ceux définis dans &lt;em&gt;mpd.conf&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Le port de commande de mpd est 1234.&lt;/li&gt;
&lt;li&gt;Le stream est joué sur 5678.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;La config du pauvre, mais qui marche tellement bien&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Et encore j'avais un titre plus long pour cette partie, mais il faut savoir
rester raisonnable.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Nous allons utiliser un tunnel ssh dans lequel nous ferons passer le flux.
&lt;ul&gt;
&lt;li&gt;Ceci nous évitera de partager nos disques avec la terre entière, ce qui
serait non seulement illégal, mais très consommateur en bande passante.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Tunnel ssh&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Ce n'est pas le sujet de ce billet, je vous donne donc la commande pour
créer un tunnel ssh.
&lt;ul&gt;
&lt;li&gt;Il y a pas mal d'explications à ce sujet un peu partout, les curieux
devraient trouver leur compte facilement.&lt;/li&gt;
&lt;li&gt;Sous MS-Windows, vous pouvez créer facilement des tunnels avec
&lt;em&gt;Putty&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;pour créer un tunnel ssh entre votre machine et le serveur mpd&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

ssh -C -L 5678:localhost:5678 a.b.c.d

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;5678&lt;/em&gt; : port configuré sur mpd pour exporter le stream httpd
(ce n'est &lt;strong&gt;pas&lt;/strong&gt; le port de commande de mpd)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;localhost&lt;/em&gt; : car vous allez vous connecter sur votre machine
pour la redirection de port.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;a.b.c.d&lt;/em&gt; : ip de la machine distante faisant tourner mpd.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En prime, vous récupérez un shell où vous pourrez lancer &lt;em&gt;ncmpc&lt;/em&gt;
pour controler &lt;em&gt;mpd&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;mpd&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Exporte le flux httpd.&lt;/li&gt;
&lt;li&gt;Les façons de le lancer ont été vues plus haut:
&lt;ul&gt;
&lt;li&gt;en user : &lt;code&gt;mpd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;au démarrage : voir la doc de votre distrib. Avec Gentoo, vous pourrez
utiliser &lt;code&gt;/etc/init.d/mpd start&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;ncmpc&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;à installer sur le serveur pour controler mpd
&lt;ul&gt;
&lt;li&gt;on peut également l'installer sur le client (dans ce cas, pensez à définir
un login/password et à ouvrir le port de commande mpd dans le firewall).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;mplayer&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Reçoit le stream et assure son rendu.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mplayer http://192.168.1.1:5678&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;192.168.1.1&lt;/em&gt; est l'ip de la machine faisant tourner
&lt;em&gt;mpd&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;5678&lt;/em&gt; est le numéro de port utilisé pour envoyer le stream.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Inconvénients de la config du pauvre (mais qui marche tellement bien)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Je ne vous le cache pas, il y a quelques inconvénients.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Overhead du tunnel&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Si vous êtes vraiment court côté débit, sachez qu'un flux à 128kbs (minimum
pour une qualité acceptable) vous pompe 16ko/s de bande passante.
&lt;ul&gt;
&lt;li&gt;Avec le tunneling, vous allez passer à environ 22ko/s de moyenne.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Je n'ai pas testé avec quelque chose de plus compliqué, à base de OpenVPN
par exemple.
&lt;ul&gt;
&lt;li&gt;Si quelqu'un l'a fait, qu'il n'hésite pas à partager son expérience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour gagner un peu de bande passante sur la session SSH, vous pouvez passer
l'option &lt;strong&gt;-N&lt;/strong&gt; à la connexion.
&lt;ul&gt;
&lt;li&gt;Cette option désactive le shell interactif et ne fait qu'établir le
tunnel.&lt;/li&gt;
&lt;li&gt;Vous ne pourrez donc plus controler la playlist directement, mais pour un
streaming tout simple, cela suffit. Vous gagnez environ trois Ko/s.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Latence&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;C'est inhérent au streaming. Pour assurer une liaison sans saccades, tout
est bufferisé.
&lt;ul&gt;
&lt;li&gt;Les modifications côté serveurs (changement de chanson, ou arrêt pur et
simple) mettront quelques secondes avant d'être répercutées à votre
client.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Quand à l'avance/retour rapide dans un morceau, mieux vaut oublier tout de
suite.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une idée pourrait être de réduire la taille du buffer , sur une liaison de
bonne qualité bien entendu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Allez, c'est pas si mal finalement&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;De toutes façons, vous n'auriez guère mieux avec un serveur shoutcast,
alors pourquoi se compliquer la vie ?&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Allez hop. Et profitez-en pour mettre Audacious à la poubelle avant de
sortir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/04/27/MPD-%3A-le-stream-%C3%A9tait-presque-parfait#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/04/27/MPD-%3A-le-stream-%C3%A9tait-presque-parfait#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/511820</wfw:commentRss>
      </item>
    
  <item>
    <title>La plomberie facile avec mtrace</title>
    <link>http://www.finiderire.com/post/2010/01/10/La-plomberie-facile-avec-mtrace</link>
    <guid isPermaLink="false">urn:md5:6d752c4492850d78a80cd8feced4d22c</guid>
    <pubDate>Mon, 22 Feb 2010 21:37:00 +0100</pubDate>
    <dc:creator>Jean-Seb</dc:creator>
        <category>Coding</category>
        <category>C</category><category>coding</category><category>debugging</category><category>GCC</category><category>Linux</category>    
    <description>&lt;p&gt;&lt;em&gt;Le C et les fuites mémoires, c'est comme une vieille complainte
sentimentale.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;Avec &lt;strong&gt;mtrace&lt;/strong&gt;, et sa couche maxi-absorbante, finissez-en
avec l'incontinence de vos programmes.&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;mtrace&lt;/strong&gt; n'est pas disponible en pharmacie, uniquement dans
les bonnes libc.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Ma mémoire prend la fuite!&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Je ne vous fait pas une tartine sur les problèmes de gestion mémoire en C.
&lt;ul&gt;
&lt;li&gt;Si vous avez approché un compilateur C un jour de votre vie, vous savez de
quoi je parle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Pour prévenir les problèmes de fuite mémoire, il existe plusieurs
méthodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Je ne fais rien&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Ne rigolez pas, un OS bien conçu est censé vous rendre la mémoire à la
sortie de votre programme.&lt;/li&gt;
&lt;li&gt;Bon alors, on fait comme ça ?
&lt;ul&gt;
&lt;li&gt;Non, on ne fait pas comme ça. On passe toujours un coup de balai avant de
quitter un programme, question de savoir-vivre et d'éducation.&lt;/li&gt;
&lt;li&gt;Il y a également le fait qu'on ne sait jamais vraiment où le programme
finira par tourner, ni si l'OS réussira réellement à récuperer
&lt;strong&gt;toute&lt;/strong&gt; la mémoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;J'écris mon gestionnaire mémoire&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Allez, on l'a tous fait un jour ou l'autre.
&lt;ul&gt;
&lt;li&gt;Ou comment finir avec un wrapper de malloc/free plus ou moins élaboré, qui
génère de jolies listes d'alllocations/libérations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ce n'est pas forcément une mauvaise idée. C'est surtout délicat à gérer
pour toutes sortes de raisons (je ne développe pas, si vous ne comprenez pas,
essayez de faire le votre).&lt;/li&gt;
&lt;li&gt;L'insensé tenant vraiment à explorer la Voie de l'Insomnie pourra toujours
commencer par : &lt;code&gt;man malloc_hook&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;J'utilise mtrace&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Et c'est la prise de conscience sur un titre judicieusement choisi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;mtrace, principe et utilisation&lt;/h3&gt;
&lt;h5&gt;Prérequis&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Une libc GNU.&lt;/li&gt;
&lt;li&gt;Un compilateur GNU.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Principe&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Le principe consiste à intercepter les appels à &lt;em&gt;malloc&lt;/em&gt; et à
&lt;em&gt;free&lt;/em&gt;, et à tenir registre des allocations/libérations de mémoire.&lt;/li&gt;
&lt;li&gt;Pour cela, vous initialiserez le wrapper de la libc avec
&lt;code&gt;mtrace()&lt;/code&gt; , et vous appellerez en sortie
&lt;code&gt;muntrace()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Utilisation&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Il suffit d'inclure &lt;code&gt;mcheck.h&lt;/code&gt; et vous pourrez utiliser les deux
fonctions requises.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mtrace&lt;/code&gt; : avant tout &lt;em&gt;malloc()&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;muntrace&lt;/code&gt; : après le dernier &lt;em&gt;free()&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Vous aurez également besoin d'une variable shell, pour indiquer où écrire
le fichier de log.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export MALLOC_TRACE = /path/to/log.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Une autre variable shell peut être utilisée: &lt;code&gt;MALLOC_CHECK&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Normalement, son usage est d'indiquer le niveau de log.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export MALLOC_CHECK = 2&lt;/code&gt; : fait planter le programme si
erreur malloc (je tenais à vous faire partager cette découverte).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Un script Perl (&lt;em&gt;mtrace&lt;/em&gt;) pour mettre en forme le fichier de
log.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;L'exemple tant attendu&lt;/h3&gt;
&lt;h5&gt;Source pour nos essais&lt;/h5&gt;
&lt;pre&gt;
/* mtrace.c */

#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;mcheck.h&amp;gt;

int main(void)
{
  mtrace();

  char *freed = malloc(1024);
  char *leaked = malloc(1024);

  if (freed) free(freed);

  muntrace();
  return 0;
}

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Pour compiler ce source, rien de spécial.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gcc -g -Wall mtrace.c -o mtrace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;N'oubliez pas &lt;strong&gt;-g&lt;/strong&gt; pour avoir les symboles dans la sortie de
&lt;em&gt;mtrace&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Et pour le lancer:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MALLOC_TRACE=&lt;q&gt;/tmp/mtrace.log&lt;/q&gt; ./mtrace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le prompt revient, pas de plantages, donc, pas de problèmes.&lt;/li&gt;
&lt;li&gt;Vraiment ?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5&gt;Utilisation du script Perl &lt;strong&gt;mtrace&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Tout d'abord, voyons à quoi ressemble le fichier log.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~test$ cat /tmp/mtrace.log 
= Start
@ ./mtrace:[0x40060f] + 0x1ea7460 0x400
@ ./mtrace:[0x40061d] + 0x1ea7870 0x400
@ ./mtrace:[0x400631] - 0x1ea7460
= End

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;De ce qui précède, on peut deviner aisément que le bloc mémoire situé à
0x1ea7870 n'a pas été libéré.
&lt;ul&gt;
&lt;li&gt;Nous allons cependant rendre plus parlant ce fichier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Le script &lt;strong&gt;mtrace&lt;/strong&gt; s'invoque avec en paramètres l'exécutable
à analyser (pour ses symboles), et le fichier log.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;

~test$ MALLOC_TRACE=&amp;quot;/tmp/mtrace.log&amp;quot; mtrace ./mtrace /tmp/mtrace.log 

Memory not freed:
-----------------
           Address     Size     Caller
0x0000000001cb6870    0x400  at /home/jseb/test/mtrace.c:12

&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Voila qui est plus parlant.
&lt;ul&gt;
&lt;li&gt;La ligne indiquée correspond au &lt;em&gt;malloc()&lt;/em&gt; sans &lt;em&gt;free()&lt;/em&gt;
correspondant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;mtrace n'est cependant pas Dieu le Père Tout Puissant&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;mtrace&lt;/em&gt; ne vous protégera bien sûr pas des écrasements mémoire
durant l'exécution de votre programme.&lt;/li&gt;
&lt;li&gt;De même, les problèmes de gestion mémoire ne seront pas détectés. Il peut
cependant vous signaler des &lt;em&gt;free&lt;/em&gt; multiples.&lt;/li&gt;
&lt;li&gt;Sa facilité d'emploi devrait toutefois inciter tout codeur un tant soit peu
consciencieux à l'utiliser.&lt;/li&gt;
&lt;li&gt;Une alternative consiste à laisser tomber &lt;code&gt;malloc&lt;/code&gt; et
&lt;code&gt;free&lt;/code&gt;, mais je laisse ça aux gens qui ont des problèmes de
mémoire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.finiderire.com/post/2010/01/10/La-plomberie-facile-avec-mtrace#comment-form</comments>
      <wfw:comment>http://www.finiderire.com/post/2010/01/10/La-plomberie-facile-avec-mtrace#comment-form</wfw:comment>
      <wfw:commentRss>http://www.finiderire.com/feed/atom/comments/474248</wfw:commentRss>
      </item>
    
</channel>
</rss>