Gestion de volumes avec udisks

De ArchwikiFR

Utiliser les périphériques de stockage, c'est un besoin légitime et on s'attendrait à ce que ça fonctionne tout seul, sauf que, sur Arch Linux, c'est l'utilisateur qui configure. Et selon la solution choisie, une pièce peut faire échouer l'ensemble.

Cette page tente de récapituler les éléments nécessaires pour monter les périphériques en tant qu'utilisateur, et de donner des pistes de vérification afin de comprendre ce qui éventuellement ne fonctionne pas.

Sommaire


En schématisant, une demande pour monter/démonter le contenu d'un périphérique suit ce cheminement :

Gestionnaire de fichier -> dbus -> udisks -> dbus -> polkit -> dbus -> consolekit -->--\
 \-----------------------------<----/  \--------<-----/  \---------------<-------------/

Environnement

L'environnement de bureau ou le script de session du gestionnaire de fenêtres participe dans le bon fonctionnement de l'ensemble.

Selon le cas, il démarre ou non une session D-Bus et si c'est le cas, vous pouvez vous retrouver avec plusieurs services dbus en cours, voir la partie traitant de D-Bus pour vérifier.

Et dans tous les cas, il faut le démarrer avec ConsoleKit.

Gestionnaire de fichiers

Le gestionnaire de fichiers choisi doit être compatible avec udisks, quelques exemples :

Dans le cas où les partitions n'apparaissent pas, essayez en lançant le logiciel avec :

dbus-launch exécutable_du_logiciel

Si elles apparaissent, référez-vous à la partie D-Bus.

Dans le cas où elles apparaissent mais ne se montent pas, en retournant un message similaire à :

Mount failed: Not Authorized

Référez-vous à la partie PolicyKit et ConsoleKit.

udisks

udisks est en première ligne car c'est finalement le programme qui monte (ou pas) le contenu du périphérique. Il n'a pas besoin de traitement spécifique, il suffit qu'il soit installé.

De plus, udisks peut être utilisé en ligne de commande afin d'isoler un éventuel problème (ou juste pour l'utiliser !) :

$ udisks --mount /dev/sda1
Mount failed: Not Authorized

L'exemple précédent cible une partition interne. Par défaut, cette action demande le mot de passe admin selon PolicyKit.

$ udisks --mount /dev/sdb1
Mounted /org/freedesktop/UDisks/devices/sdb1 at /media/28DC-1CAE
$ udisks --unmount /dev/sdb1
$

D-Bus

Le daemon D-Bus est l'élément central, c'est ce qui permet à tout le monde de communiquer. Il doit être démarré en tant que service :

Fichier: /etc/rc.conf
DAEMONS=([...] dbus [...])
/etc/rc.d/dbus start

Ainsi que pour la session graphique, mais cela dépend si on utilise un gestionnaire de connexions et si oui, lequel.

On peut vérifier si dbus est bien lancé en lançant :

$ ps -o user,cmd -C dbus-daemon
USER     CMD
dbus     /usr/bin/dbus-daemon --system
tuxce    /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

Vous devriez avoir au minimum un service lancé par l'utilisateur dbus et un autre lancé par votre utilisateur.

Dans le cas où il n'y a pas de service lancé par l'utilisateur, modifiez la façon dont vous démarrez votre session, par exemple depuis ~/.xinitrc :

exec dbus-launch votre_environnement

ConsoleKit

ConsoleKit est un service permettant de savoir entre autre si votre session est active ET locale.

Selon l'utilisation ou non d'un gestionnaire de connexions compatible, il est démarré soit par celui-ci, soit par l'utilisateur. GDM ou KDM ne demande aucune action supplémentaire. Par contre, si vous utilisez SLiM ou juste startx, il vous faut lancer votre environnement comme suit :

exec ck-launch-session votre_environnement

ou si avez besoin de lancer dbus explicitement :

exec ck-launch-session dbus-launch votre_environnement

Idéalement, une fois dans votre session, vous devriez avoir :

$ ck-list-sessions
Session1:
	unix-user = '1000'
	realname = '(null)'
	seat = 'Seat1'
	session-type = ''
	active = TRUE
	x11-display = ':0.0'
	x11-display-device = '/dev/tty7'
	display-device = ''
	remote-host-name = ''
	is-local = TRUE
	on-since = '2011-06-20T11:23:26.236990Z'
	login-session-id = '1'

Mais il est plus probable que vous en ayez plusieurs. Pour savoir laquelle est votre session :

$ dbus-send --system --type=method_call --print-reply \ --dest=org.freedesktop.ConsoleKit \ /org/freedesktop/ConsoleKit/Manager \ org.freedesktop.ConsoleKit.Manager.GetCurrentSession
method return sender=:1.9 -> dest=:1.191 reply_serial=2
   object path "/org/freedesktop/ConsoleKit/Session1"

ConsoleKit est pauvre en commandes, le script ck-guess vous résume tout ça :

$ ck-guess
* Session: Session2	Active:  true	Local:  true
  Session: Session1	Active:  false	Local:  true

Le but étant d'avoir la session courante (*) active et locale.

PolicyKit

Avec PolicyKit, on rentre dans le vif du sujet, les droits d'utilisations. Pour les systèmes de fichiers, les droits sont définis par action, et en ce qui nous concerne, les actions sont les suivantes :

$ pkaction | grep "udisks.filesystem.*mount"
org.freedesktop.udisks.filesystem-mount
org.freedesktop.udisks.filesystem-mount-system-internal
org.freedesktop.udisks.filesystem-unmount-others
  • org.freedesktop.udisks.filesystem-mount est générale.
  • org.freedesktop.udisks.filesystem-mount-system-internal spécifie des permissions pour les partitions internes.
  • org.freedesktop.udisks.filesystem-unmount-others permet ou non de démonter une partition montée par un autre utilisateur.

Vous pouvez avoir plus de précisions sur les actions ainsi que les permissions par défaut en lançant :

pkaction | grep "udisks.filesystem.*mount" | xargs -n 1 pkaction --verbose --action-id

PolicyKit est requis par udisks et n'a pas besoin de configuration (si les permissions par défaut vous semblent satisfaisantes). Néanmoins, il est nécessaire d'installer une interface pour s'authentifier si l'action le demande (en retournant par exemple Not Authorized). Les interfaces disponibles dépendent de l'environnement : polkit-gnome ou polkit-kde.

Note: polkit-gnome ne dépend pas de gnome mais seulement de GTK.

Il faut que l'agent d'authentification soit lancé pour afficher l'interface de demande de mot de passe :

$ ps -p $(pgrep -d, -f "polkit.*auth") -o user,cmd
USER     CMD
tuxce    /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
Note: gnome-shell fournit son propre agent d'authentification, la commande précédente retournera donc une erreur, il n'y a pas de processus lancé à part.

Il devrait se lancer au démarrage de votre session si votre environnement est compatible XDG, sinon, il vous faut rajouter par exemple pour polkit-gnome :

/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1

Dans le fichier / dossier d' autostart de votre environnement.

La page de PolicyKit propose un exemple pour modifier les autorisations d'une action : Montage d'une partition interne.

Outils personnels