<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1130"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1130/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1130/atom/feed</id>
  <updated>2008-10-25T16:05:07+02:00</updated>
  <entry>
    <title>Les volumes et leurs alias</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1130" />
    <id>http://artisan.karma-lab.net/node/1130</id>
    <published>2008-10-13T12:47:00+02:00</published>
    <updated>2008-10-25T16:05:07+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="kernel" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Un point généralement assez irritant sous GNU/Linux lorsque l'on cherche à identifier précisément une partition issue d'un média amovible est que tout se passe comme si le kernel tirait le nom du périphérique aux dés. Le but ici est donc de se débrouiller pour que notre volume ait toujours le même nom sans aller torpiller UDEV, que chaque partition puisse avoir le sien, et, tant qu'à faire, qu'il soit compréhensible par un humain standard. 
</p>

    ]]></summary>
    <content type="html"><![CDATA[<p>
  Un point généralement assez irritant sous GNU/Linux lorsque l'on cherche à identifier précisément une partition issue d'un média amovible est que tout se passe comme si le kernel tirait le nom du périphérique aux dés. Le but ici est donc de se débrouiller pour que notre volume ait toujours le même nom sans aller torpiller UDEV, que chaque partition puisse avoir le sien, et, tant qu'à faire, qu'il soit compréhensible par un humain standard. 
</p>

<!--break-->

	<a name='chapter_1'></a>
  <h2>Une affaire d'alias</h2>
	
<p>
  Sous Linux, un disque, qu'il soit branché à chaud ou pas, est visible sous <kbd>/dev</kbd>. Il y a encore peu de temps le nommage était <kbd>/dev/hdX</kbd> si le disque était IDE (PATA) et <kbd>/dev/sdX</kbd> dans le cas contraire. Si le disque possédait des partitions, celle-ci prenaient le même nom suivi d'un chiffre indiquant son numéro. Aujourd'hui, après une récente unification de la gestion des disques PATA/SATA dans le kernel, qu'il soit USB, IDE ou SCSI, il apparaîtra en <kbd>/dev/sdX</kbd>. Le <kbd>X</kbd> est ici la base de notre problème car en fonction de l'ordre d'insertion des médias, cette lettre n'est à peu prés jamais la même. 
</p>
<p>
  La solution à notre problème réside en le fait qu'une partition formatée avec un système de fichier donné possède, outre ce nom, au moins deux attributs modifiables par l'utilisateur : un <kbd>label</kbd> et un <kbd>UUID</kbd>. 
</p>
<p>
 L'UUID est une suite de chiffre que l'on peut considérer comme unique et le label est une simple une chaîne de caractères. Pour un système FAT32 c'est le numéro de série (XXXX-YYYY) qui fait office est d'UUID.
 </p>
<p>
  Ces deux attributs sont utilisés par 
  <a target='_blank' href='http://fr.wikipedia.org/wiki/udev'>
  udev
  </a> pour créer automatiquement des alias des partitions permettant de s'affranchir du nommage pseudo aléatoire du kernel en utilisant des identifiants stables dans le temps. 
</p>
<p>
 Ainsi un même volume <kbd>/dev/sda3</kbd> ayant pour UUID <kbd>2e39c022-589c-11dd-a48a-7162f299b21d</kbd> et pour label <kbd>ma_partition</kbd>, va apparaître sous la forme d'un alias en <kbd>/dev/disk/by-uuid/2e39c022-589c-11dd-a48a-7162f299b21d</kbd> et d'un autre en <kbd>/dev/disk/by-label/ma_partition</kbd>. 
</p>


	<a name='chapter_2'></a>
  <h2>Modifications des attributs</h2>
	
<p>
  Chaque système de fichier a ses outils propres pour ce genre de travail. Pour lire les attributs d'un système EXT2/EXT3 nous utiliserons la commande <kbd>dumpe2fs</kbd> :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  dumpe2fs <span class="sy0">/</span>dev<span class="sy0">/</span>sda3
  </div>
  
  </div>
</p>
<p>
  Une autre commande (source <a class='external' target='_blank' href='/node/1130%2523comment-3253' >slc66</a>) permettant de liste l'ensemble des UUID de l'ensemble des volumes présents (y compris USB et FAT), extrêmement pratiques :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  blkid
  </div>
  
  </div>
</p>
<p>
   Cette commande a en plus le bon goût de donner pour chaque volume le système de fichier utilisé. 
</p>
<p>
 Ne reste maintenant plus qu'à utiliser la commande <kbd>tune2fs</kbd> pour changer ces valeurs. Tout d'abord, le label :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  tune2fs -L ma_partition <span class="sy0">/</span>dev<span class="sy0">/</span>sda3
  </div>
  
  </div>
</p>  
<p>
  Pour changer l'UUID, il faut déjà en générer un avec la commande <kbd>uuidgen</kbd> puis encore utiliser la commande <kbd>tune2fs</kbd> :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/uuidgen"><span class="kw2">uuidgen</span></a><br />
<span class="sy0">&gt;</span> dec3cbc6-0b42-11db-9e45-7542811b6ad4<br />
tune2fs -U dec3cbc6-0b42-11db-9e45-7542811b6ad4 <span class="sy0">/</span>dev<span class="sy0">/</span>sda3
  </div>
  
  </div>
</p>
<p>
  Pour donner le numéro de série <kbd>dec3cbc6-0b42-11db-9e45-7542811b6ad4</kbd> à la partition <kbd>sda3</kbd>, et ainsi pouvoir y accéder par un <kbd>/dev/disk/by-uuid/dec3cbc6-0b42-11db-9e45-7542811b6ad4</kbd>, il suffit de taper :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  tune2fs -U dec3cbc6-0b42-11db-9e45-7542811b6ad4 <span class="sy0">/</span>dev<span class="sy0">/</span>sda3
  </div>
  
  </div>
</p>
<p>
  Une fois ces modifications réalisée, il suffit de débrancher puis de rebrancher le disque (ou démonter/remonter les partitions s'il s'agit de disques IDE ou SATA), pour que notre <kbd>/dev/sda3</kbd> soit disponible sous le nom de <kbd>/dev/disk/by-uuid/dec3cbc6-0b42-11db-9e45-7542811b6ad4</kbd> ou beaucoup mieux <kbd>/dev/disk/by-label/ma_partition</kbd>. 
</p>
<p>
  Pour les disques en FAT32, vous pouvez soit changer ces attributs au formatage de la partition :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  mkdosfs -n truc_en_fat -i ABCD1234 <span class="sy0">/</span>dev<span class="sy0">/</span>sda4
  </div>
  
  </div>
</p>
<p>
  Soit passer par la commande <kbd>mlabel</kbd> du paquet <a class='external' target='_blank' href='http://mtools.linux.lu/' >mtools</a> (merci à <a class='external' target='_blank' href='/node/1130%2523comment-3251' >M@N</a> pour m'avoir aidé à debugger cette approche)) :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  mlabel -i <span class="sy0">/</span>dev<span class="sy0">/</span>sda4 -N ABCD1234 ::truc_en_fat
  </div>
  
  </div>
</p>
<p>
  Ce qui dans les deux cas nous donne un <kbd>/dev/disk/by-uuid/ABCD-1234</kbd> et un <kbd>/dev/disk/by-label/truc_en_fat</kbd>
</p>


	<a name='chapter_3'></a>
  <h2>Utiliser les attributs pour le montage</h2>
	
<p>
  La syntaxe de <kbd>fstab</kbd> a été modifiée pour prendre directement en compte les deux attributs, soit par UUID :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re2">UUID=</span>dec3cbc6-0b42-11db-9e45-7542811b6ad4 <span class="sy0">/</span>media<span class="sy0">/</span>ma_partition ext3 noatime,nodiratime <span class="nu0">1</span> <span class="nu0">2</span>
  </div>
  
  </div>
</p>
<p>
  Encore un peu cryptique, ce serait plus sympathique directement avec le label :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="re2">label=</span>ma_partition <span class="sy0">/</span>media<span class="sy0">/</span>ma_partition ext3 noatime,nodiratime <span class="nu0">1</span> <span class="nu0">2</span>
  </div>
  
  </div>
</p>
<p>
  Voilà qui est beaucoup mieux. 
</p>


	<a name='chapter_4'></a>
  <h2>Utiliser les attributs pour désactiver des volumes</h2>
	
<p>
  Dans de nombreuses situations il n'est pas souhaitable que certaines partitions apparaissent sur le bureau de Gnome ou même qu'elle soit montées automatiquement. C'est le cas lorsque l'on a un disque "Alien" contenant une série de partitions utilisées par exemple par <a class='external' target='_blank' href='/node/1572' >VMWare</a> ou encore pour la partition de <a class='external' target='_blank' href='/node/1164' >pam_usb</a> contenant les clefs. 
</p>
<p>
  Il est possible d'utiliser <kbd>gconf-editor</kbd> et de basculer <kbd>/apps/nautilus/desktop/volumes_visible</kbd> à <kbd>false</kbd>. Mais l'on perd du coup tous les volumes ce qui n'est pas acceptable.
</p>
<p>
 Une autre solution consiste à ajouter un "noauto" dans les options de montage de <kbd>gnome-volume-manager</kbd> par un click-droit/propriétés sur le volume. Mais cela ne marche pas avec tous les millésimes de Gnome.
</p>
<p>
  La solution que j'ai retenue est d'ajouter ses propres préférences à HAL qui est chargé de la découverte des volumes. Pour cela, il suffit simplement de créer un fichier <kbd>/usr/share/hal/fdi/policy/preferences.fdi</kbd> et d'utiliser les UUID des volumes à ne pas monter :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; <span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;deviceinfo</span> <span class="re0">version</span>=<span class="st0">&quot;0.2&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;device<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;match</span> <span class="re0">key</span>=<span class="st0">&quot;volume.uuid&quot;</span> <span class="re0">string</span>=<span class="st0">&quot;a78f4795-08a4-4d7f-855d-23c61c769d49&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;merge</span> <span class="re0">key</span>=<span class="st0">&quot;volume.ignore&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;bool&quot;</span><span class="re2">&gt;</span></span>true<span class="sc3"><span class="re1">&lt;/merge<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/match<span class="re2">&gt;</span></span></span><br />
&nbsp; <span class="sc3"><span class="re1">&lt;/device<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/deviceinfo<span class="re2">&gt;</span></span></span>
  </div>
  
  </div>
</p>
<p>
  A partir de maintenant cette partition sera systématiquement ignorée. Pour que cela fonctionne à chaud, il faut redémarrer HAL par <kbd>/etc/init.d/haldaemon restart</kbd>, retirer la clef et la repositionner. Le volume devrait du coup ne plus être affiché sur le bureau.
</p>


	<a name='chapter_5'></a>
  <h2>Conclusion</h2>
	
<p>
  Voilà nos disques sont maintenant un peu plus civilisés. Ce type de nommage est particulièrement utile dés qu'il s'agit de périphériques USB, par exemple un disque de backup ou une clef de stockage. En gros à chaque fois que l'on a besoin d'utiliser un montage dans un script. Outre cet usage, les labels sont aujourd'hui universellement prise en charge par les bureaux pour nommer dynamiquement les icônes. 
</p>
    ]]></content>
  </entry>
</feed>
