Gestion de volumes avec udisks
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 -> logind -->--\ \-----------------------------<----/ \--------<-----/ \-------------<-----------/
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.
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 polkit et logind.
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 !) :
$ udisksctl mount -b /dev/sda1Error mounting /dev/sda1: GDBus.Error:org.freedesktop.UDisks2.Error.NotAuthorizedDismissed: The authentication dialog was dismissed
$ udisks --mount /dev/sda1Mount failed: Not Authorized
L'exemple précédent cible une partition interne. Par défaut, cette action demande le mot de passe admin selon polkit.
$ udisksctl mount -b /dev/sdb1Mounted /dev/sdb1 at /media/28DC-1CAE
udisksctl unmount -b /dev/sdb1
$ udisks --mount /dev/sdb1Mounted /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 est automatiquement démarré lorsque vous utilisez systemd.
Pour la session graphique, 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-daemonUSER CMD dbus /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation tuxce /usr/bin/dbus-daemon --fork --print-pid 4 --print-address 6 --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
logind
logind est un service donnant entre autre des informations sur votre session. Il s'utilise de manière transparente (les sessions utilisateurs sont suivis par le biais de pam).
Idéalement, une fois dans votre session, vous devriez avoir :
$ loginctl session-status $XDG_SESSION_ID | egrep '(Seat|State):'Seat: seat0; vc1 State: active
polkit
Avec polkit, 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.udisks2.filesystem-mount org.freedesktop.udisks2.filesystem-mount-other-seat org.freedesktop.udisks2.filesystem-mount-system org.freedesktop.udisks2.filesystem-unmount-others
- org.freedesktop.udisks2.filesystem-mount est générale.
- org.freedesktop.udisks2.filesystem-mount-other-seat permet de monter un système branché sur un autre ensemble matériel.
- org.freedesktop.udisks2.filesystem-mount-system spécifie des permissions pour les partitions avec le drapeau system et qui correspondent généralement aux partitions internes. (correspond à org.freedesktop.udisks.filesystem-mount-system-internal pour udisks)
- org.freedesktop.udisks2.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
polkit est requis par udisks et n'a pas besoin de configuration (si les permissions par défaut vous semblent satisfaisantes). Néanmoins, il peut être nécessaire d'installer une interface pour s'authentifier si l'action le demande (en retournant par exemple Not Authorized) et que votre environnement n'en possède pas. Les interfaces disponibles dépendent de l'environnement : polkit-gnome ou polkit-kde.
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,cmdUSER CMD tuxce /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
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 polkit propose un exemple pour modifier les autorisations d'une action : Montage d'une partition interne.