HAL (Français)

From ArchWiki

Jump to: navigation, search


i18n
English
Español
简体中文
Français
Italiano
Polish
Русский
Türkçe

HAL (Hardware Abstraction Layer, ou couche d'abstraction matérielle) est un daemon qui permet aux applications de bureau d'accéder facilement aux informations matérielles. Il leurs permet de localiser et d'utiliser le matériel sans se soucier du bus ou du type de périphérique. Dans cette idée les applications de bureau peuvent présenter toutes les ressources à l'utilisateur de manière logique et uniforme.

Contents

HAL et le branchement à chaud

Plusieurs choses participent au branchement à chaud dont HAL. À l'ajout d'un périphérique, branchement d'une clé USB par exemple, un ensemble d'actions a lieu :

  • Le noyau prend conscience du nouveau périphérique et le rajoute dans /sys ;
  • Udev crée un nouveau noeud (par exemple /dev/sdb1) et lance les pilotes/modules nécessaires ;
  • Le daemon HAL est alerté par D-Bus et ajoute le périphérique et ce qu'il peut trouver à son propos dans sa base de données ;
  • L'ajout d'un nouveau périphérique est diffusé par HAL à travers D-Bus aux programmes inscrits, par exemple Dolphin qui l'affiche comme une icône dans le panneau de raccourcis, ou Metacity/Nautilus qui ajoute une icone sur le bureau ;
  • Un autre programme écoutant peut-être un gestionnaire de volumes, comme thunar-volman ou AutoFS, configuré pour automatiquement créer les points de montage et monter certains types de disques, démarrer Rythmbox quand un iPod est connecté, etc.

hal ne détecte pas le matériel (noyau), ni ne gère les périphériques, les pilotes (udev) ou monte automatiquement les disques (gestionnaire de volumes). Son rôle est plus une communication centrale, fournissant aux applications une interface sympathique et propre aux périphériques. Le problème de montage à chaud de périphériques disfonctionnels, mal détectés ou montés, doit être étudié, en sachant que c'est un long processus incluant plusieurs composants (voir "Débugage").

Configuration initiale

Le daemon hal requière la présence du daemon D-Bus, nous nous assurrons donc que les deux sont installés.

# pacman -S hal dbus

Si vous le désirez vous pouvez installer pmount pmount permet à un simple utilisateur de monter et démonter des disques sans l'aide de la commande sudo ni l'édition de /etc/fstab. Ouvrez un terminal en tant que root et entrez la commande suivante :

# pacman -S pmount

Que pmount soit installé ou non, continuons: Éditez le fichier /etc/rc.conf en tant que root avec votre éditeur favori et ajouter hal à la liste des DAEMONS, par exemple :

DAEMONS=(syslog-ng hal network netfs ...)

Le daemon HAL sera désormais chargé automatiquement au démarrage. Au lancement de HAL il vérifiera la présence de D-Bus et le chargera automatiquement. Si D-Bus est présent dans votre liste de daemon, enlevez-le, afin d'éviter des problèmes.

Vous pouvez aussi démarrez HAL manuellement en lançant la commande suivante en tant que root :

# /etc/rc.d/hal start

Pour que D-Bus et HAL soient utiles, les utilisateurs locaux doivent être membres des groupes suivants : optical et storage. Pour cela ouvrez un terminal en tant que root et lancez les commande :

# gpasswd -a username optical
# gpasswd -a username storage

Remplacez username par votre login (par exemple johndoe).

Pour que ces changements de groupes prennent effet vous devez vous déloguer et vous reloguer.

Politiques

Politique des permissions

Vos programmes communiquent avec les périphériques contrôlés par HAL à travers une interface D-Bus. Un nombre d'interfaces est défini, associées chacune à un nombre de méthodes. L'interface du périphérique de stockage, par exemple, dispose de la méthode 'eject' et 'close' (pour les CD/DVD). Pour pouvoir monter une clé USB, vous devez avoir accès à l'interface D-Bus correspondante ('volume' dans ce cas).

Le fichier de configuration /etc/dbus-1/system.d/hal.conf définit les privilèges spécifiques à HAL, c'est-à-dire, quel utilisateur peut accéder à quelle interface. Ces privilèges sont définis comme des exceptions aux restrictions globales imposées sur les interface D-Bus. Elles sont spécifiées dans /etc/dbus-1/system.conf. Pour faire court, vous aurez besoin que hal.conf vous donne le droit d'accéder à l'interface D-Bus/HAL, car la configuration par défaut de D-Bus ne vous laissera pas y accéder.

Le fichier hal.conf par défaut contient des politiques refusant et autorisant l'accès aux même périphériques. La dernière des valeurs est apparemment déterminante.

<policy context="default">
  <deny send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
  <deny send_interface="org.freedesktop.Hal.Device.VideoAdapterPM"/>
  <deny send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
  <deny send_interface="org.freedesktop.Hal.Device.Volume"/>
  <deny send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
</policy>

Pour faire court, les utilisateurs n'ont par défaut aucun accès aux interfaces comme les volume qui ont des méthodes telles que mount et umount. Ces politiques sont annulées par les politiques autorisant les utilisateurs des groupes 'power' et 'storage' à accéder à leurs périphériques respectifs :

<policy group="power">
  <allow send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
  <allow send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
</policy>
<policy group="storage">
  <allow send_interface="org.freedesktop.Hal.Device.Volume"/>
  <allow send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
</policy>

Ce qui explique que vous deviez ajouter votre utilisateur à ces groupes (voir 'Configuration initiale'), cela réduit le nombre de fichiers de configuration personnalisés. Une solution moins élégante consisterait à insérer votre nom d'utilisateur dans la section des politiques d'utilisateurs vous donnant accès à tous les périphériques HAL listés (remplacez votre_nom par votre nom d'utilisateur):

 <policy user="0">
   <allow send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
   <allow send_interface="org.freedesktop.Hal.Device.VideoAdapterPM"/>
   <allow send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
   <allow send_interface="org.freedesktop.Hal.Device.Volume"/>
   <allow send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
 </policy>

Politiques spécifique à un périphérique

NTFS

Ajouter la suite au fichier /etc/hal/fdi/policy/20-ntfs-config-write-policy.fdi (créez le fichier si il n'existe pas).

Note: Ce fichier de configuration a été testé avec hal = 0.5.11 et identifie/monte correctement les disques (externes) ntfs avec ntfs-3g. 'mount' devrait afficher le type de système de fichier comme 'fuseblk' si ce fichier est correctement détecté.

<?xml version="1.0" encoding="UTF-8"?> 
<deviceinfo version="0.2">
   <device>
       <match key="volume.fstype" string="ntfs">
           <match key="@block.storage_device:storage.hotpluggable" bool="true">
               <merge key="volume.fstype" type="string">ntfs-3g</merge>
               <merge key="volume.policy.mount_filesystem" type="string">ntfs-3g</merge>
               <append key="volume.mount.valid_options" type="strlist">locale=</append>
           </match>
       </match>
   </device>
</deviceinfo>

L'astuce PCManFM

Si vous utilisez pcmanfm comme gestionnaire de fichier, vous devez explicitement lui dire comment gérer les drivers ntfs-3g. Ce n'est pas difficile, vous devez juste éditer le fichier de configuration /usr/share/pcmanfm/mount.rules de la manière suivante :

[ntfs-3g]
# mount_options=locale=;exec
mount_options=uid=1000;gid=100;fmask=0113;dmask=0002;locale=;exec

Vous pouvez sélectionner les permissions voulues.

Monter un périphérique en un point spécifique

La politique de montage d'un périphérique en un point spécifique nécessite deux choses :

  • $device_uuid, l'UUID (Universal Unique IDentifier) du périphérique (ls -l /dev/disk/by-uuid/ peut aider).
  • $device_name, le nom que vous voulez donner au périphérique. Le périphérique sera monté sous /media/$device_name
Note: Le répertoire /media/$device_name ne doit PAS exister. Il sera créer et détruit dynamiquement par HAL.
Note: Le périphérique ne doit PAS apparaitre dans fstab, sinon HAL refusera de le monter.

Placez la suite dans "/etc/hal/fdi/policy/20-$device_name.fdi" sans oublier de remplacer $device_name et $device_name par leurs valeurs.

<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
   <device>
       <match key="volume.uuid" string="$device_uuid">
               <merge key="volume.label" type="string">$device_name</merge>
               <merge key="storage.automount_enabled_hint" type="bool">true</merge> <!-- Si vous voulez le monter automatiquement ce paramètre doit être à true même si l'environnement de bureau ne le prend pas en compte -->
       </match>
   </device>
</deviceinfo>

Si l'autorisation est refusée par HAL avec "PermissionDeniedByPolicy hal-storage-mount-removable-extra-options no" voir Permission Denied with automounter dans la documentation anglaise.

Autoriser dmask et fmask pour ntfs-3g

dmask et fmask servent à attribuer des droits d'accès différents pour les répertoires et les fichiers. dmask=000, fmask=111, par exemple, rendront les répertoires accessibles à tout le monde, alors que les fichiers ne seront pas éxecutables.

    <device>
        <match key="volume.fstype" string="ntfs">
            <append key="volume.mount.valid_options" type="strlist">dmask=</append>
            <append key="volume.mount.valid_options" type="strlist">fmask=</append>
        </match>
    </device>

Montage automatique des périphériques amovibles uniquement

Par défaut monte automatiquement toutes les partitions accessibles non présentes dans /etc/fstab et crée une icone pour elles. Pour outrepasser ce comportement et monter automatiquement les périphériques amovibles, il suffit d'ajouter cette règle :

 <device>
   <match key="storage.hotpluggable" bool="false">
     <match key="storage.removable" bool="false">
       <merge key="storage.automount_enabled_hint" type="bool">false</merge>
     </match>
   </match>
 </device>

Activer l'option noatime pour les médias amovibles

Cette option permet d'accélérer les opérations sur les fichiers et réduit l'usure des disques à mémoire flash comme les clés USB et les cartes SD.

 <device> 
   <match key="block.is_volume" bool="true">
     <match key="@block.storage_device:storage.hotpluggable" bool="true">
       <merge key="volume.policy.mount_option.noatime" type="bool">true</merge>
     </match>
     <match key="@block.storage_device:storage.removable" bool="true">
       <merge key="volume.policy.mount_option.noatime" type="bool">true</merge>
     </match>
   </match>
 </device>

Ne pas oublier

Pensez à redémarrer le démon HAL pour que les effets soient pris en compte :

# /etc/rc.d/hal restart

Dépannage

Une solution alternative aux deux premières solution est présenté ici : [1]. Elle corrige également les problèmes avec powerdown et shutdown sur le système.

Le montage automatique échoue avec le message "IsCallerPrivileged failed"

Si vous obtenez un message "IsCallerPrivileged failed" et que vous n'utilisez pas KDM ou GDM, utilisez ck-launch-session pour démarrer votre environnement de bureau ou votre gestionnaire de fenêtres.

Par exemple avec startx/KDE, vous aviez initialement dans ~/.xinitrc :

exec startkde

À remplacer par :

exec ck-launch-session startkde

Permission refusée avec le montage automatique

Si vous venez de faire une mise à jour et que le montage automatique ne marche plus pour les utilisateurs autre que root avec une de ces erreurs :

  • "PermissionDeniedByPolicy mount-removable no"
  • "PermissionDeniedByPolicy mount-removable-extra-options no"
  • "org.freedesktop.hal.storage.mount-removable no <-- (action, result)"
  • "org.freedesktop.hal.storage.mount-removable-extra-options no <-- (action, result)"

vous pouvez corriger cette situation en éditant /etc/PolicyKit/PolicyKit.conf et copier :

       <match user="$USER"> <!-- replace with your login or delete the line if you want to allow all users to manipulate devices (keep security issues in mind though) -->
               <match action="org.freedesktop.hal.storage.*">
                       <return result="yes"/>
               </match>
               <match action="hal-storage-mount-fixed-extra-options"> <!-- Pour les périphériques internes montés avec des options supplémentaires comme un point de montage particulier -->
                       <return result="yes" />
               </match>
               <match action="hal-storage-mount-removable-extra-options"> <!-- Pour les périphériques externes montés avec des options supplémentaires comme un point de montage particulier -->
                       <return result="yes" />
               </match>
       </match>  <!-- N'oubliez pas de supprimer cette ligne si vous supprimer la première -->

Dans la section <config>. Redémarrez D-Bus et HAL.

Erreurs de sécurité

Si les CD/DVD insérés sont reconnus et qu'une icone apparaît mais que vous ne pouvez pas les ouvrir ou les parcourir, c'est que les périphériques sont reconnus par udev mais que quelque chose empêche HAL de les monter. Si un double-clic sur l'icone renvoie l'erreur (pour KDEen bas dans Dolphin) "A security policy prevents this sender from sending this message to this recipient..." vous devez vérifier la configuration des permissions ( voir les sections Politiques des permissions et Configuration Initiale).

L'insertion de CD/DVD n'est pas reconnue par HAL

Si l'insertion de CD/DVD n'est pas reconnue par HAL (pas d'icone), vérifiez /etc/fstab et enlevez les lignes correspondant à vos lecteurs de disques.

Si cette action suffit pas, la cause peut venir d'un périphérique qui n'a pas été "validé" pour le montage automatique par HAL. Vous devez avoir un fichier sous /etc/hal/fdi/information/media-check-disable-storage_model_$VOTRE_PERIPHERIQUE.fdi qui a un contenu du genre :

<deviceinfo version="0.2">
  <device>
    <match key="info.udi" string="/org/freedesktop/Hal/devices/storage_model_DV$
      <merge key="storage.media_check_enabled" type="bool">false</merge>
    </match>
  </device>
</deviceinfo>

si la clé (key) est à false , il suffit de la mettre à true.

Les clés USB et les disques ne se montent pas automatiquement correctement

Si vous avez des problèmes avec le montage automatique de clés USB et/ou de disques, mais que vous n'avez pas de problème avec le montage automatique des CD/DVD, et que ces disques sont montables manuellement, alors vous devez créer le fichier "preferences.fdi" dans le dossier /etc/hal/fdi/policy et y copier la ligne suivante :

<merge key="volume.ignore" type="bool">false</merge>

Si vous avez GParted d'installé vous devez aussi supprimer le fichier : /usr/share/hal/fdi/policy/gparted-disable-automount.fdi Vous pouvez également enlever dans /etc/fstab les lignes correspondant aux périphériques USB montés automatiquement par HAL.

Personal tools