El sistema de archivos virtual Gnome (gvfs) proporciona funcionalidad de montaje y utilidad de papelera. GVFS / KIO (KDE) usan udisks2 para la funcionalidad de montaje en escritorio. Estas dos aplicaciones y normalmente también polkit (control de acceso) son la solución recomendada y más utilizada para la mayoría de los administradores de ficheros de los escritorio GNU/Linux a la hora de montar dispositivos.
La utilidad udisks2 proporciona interfaces para enumerar y realizar operaciones en discos y dispositivos de almacenamiento. Cualquier aplicación (incluido usuarios no privilegiados) puede acceder al demonio udisksd por medio de la API D-BUS y por lo tanto operar con ellos, como es el montaje automático en el escritorio sin requerir de usuario root.
Los privilegios de usuarios a la hora de trabajar con dispositivos vienen normalmente definidas por polkit, dependencia típica del ecosistema necesario para las funciones de automontaje que funciona también como demonio. Polkit se usa para controlar los privilegios de todo el sistema. Proporciona que los procesos no privilegiados se comuniquen con los privilegiados. A diferencia de sistemas como sudo, no otorga permisos de raíz a todo un proceso, sino que permite un nivel más fino de control de la política del sistema centralizado.
Los gestores de archivos suelen correr como demonios sobre el escritorio y están al tanto de cualquier cambio o petición realizada sobre el sistema de ficheros. No todos los gestores de ficheros montan de manera automática los dispositivos USB una vez se conectan.
Algunos gestores muestran un diálogo preguntando qué acción desempeñar, otros solo avisan de que hay un dispositivo listo para montarse y requieren de un click de ratón sobre el dispositivo. Algunos como Thunar permiten configurar este tipo de comportamientos y otros montan el dispositivo directamente sin preguntar al usuario.
Sintaxis / Opciones de udisksctl.
udisksctl status udisksctl info {--object-path OBJECT | --block-device DEVICE} udisksctl mount {--object-path OBJECT | --block-device DEVICE} [--filesystem-type TYPE] [--options OPTIONS...] [--no-user-interaction] udisksctl unmount {--object-path OBJECT | --block-device DEVICE} [--force] [--no-user-interaction] udisksctl unlock {--object-path OBJECT | --block-device DEVICE} [--no-user-interaction] [--key-file PATH] udisksctl lock {--object-path OBJECT | --block-device DEVICE} [--no-user-interaction] udisksctl loop-setup --file PATH [--read-only] [--offset OFFSET] [--size SIZE] [--no-user-interaction] udisksctl loop-delete {--object-path OBJECT | --block-device DEVICE} [--no-user-interaction] udisksctl power-off {--object-path OBJECT | --block-device DEVICE} [--no-user-interaction] udisksctl smart-simulate --file PATH {--object-path OBJECT | --block-device DEVICE} [--no-user-interaction] udisksctl monitor udisksctl dump udisksctl help
En esta guía veremos todas las opciones de udisksctl, que es la herramienta de linea de comandos que permite interactuar con el dominio udisksd. Esto permite realizar desde la linea de comandos tareas que suelen realizar los gestores de archivos de escritorio. Por ejemplo se puede utilizar udisksctl para el montaje automático de USB o dispositivos de bloque cifrados desde la terminal de la misma manera que lo hace el escritorio. Es decir, creando de manera transparente al usuario un punto de montaje temporal con el nombre del usuario y el UUID del dispositivo en el directorio /run/media/.
La opción “--no-user-interaction” (interacción sin usuario) puede utilizarse para evitar cualquier tipo de interacción con el usuario referente a la autenticación. Como es el típico cuadro de diálogo de autenticación para por ejemplo desbloquear un dispositivo cifrado mediante root. Delegando dicha autenticación a ser verificada por el gestor de autorización “polkit”.
También se verá muy por encima como crear una regla polkit para permitir una acción, en nuestro caso para permitir a un usuario normal sin privilegios desbloquear dispositivos cifrados como LUKS o TrueCrypt.
Ejemplo de montaje automático de dispositivos USB desde terminal tal y como lo hace el escritorio.
# Se conecta un dispositivo y desde el escritorio se ve que está montado en /run/media/maria/0d0544e1-5168-4946-83c2-9c09e957bb5a. mount | grep -i "/run/media/" /dev/sdd1 on /run/media/maria/0d0544e1-5168-4946-83c2-9c09e957bb5a type xfs (rw,nosuid,nodev,relatime,attr2,inode64,noquota,uhelper=udisks2) # Desmontamos el dispositivo. umount /dev/sdd1 # Opción clásica usando umount (No quita corriente al disco duro) udisksctl unmount -b /dev/sdd1 # Opción mediante udisksctl (No quita corriente al disco duro) udisksctl power-off -b /dev/sdd1 # Se le deja de dar corriente al USB. # Usamos udisksctl para que se monte de nuevo de la misma manera que lo hace el escritorio (interactuando con el demonio udisksd). udisksctl mount -b /dev/sdd1 Mounted /dev/sdd1 at /run/media/maria/0d0544e1-5168-4946-83c2-9c09e957bb5a.
Desbloquear (descifrar) / Bloquear dispositivos cifrados. (TrueCrypt, LUKS, Veracrypt, etc)
Desbloquear (solicitará passphrase y requiere por defecto del usuario root) / Montar.
udisksctl unlock -b /dev/Volgroup00/cifrado Passphrase: Unlocked /dev/dm-2 as /dev/dm-3. udisksctl mount -b /dev/dm-3 Mounted /dev/dm-3 at /run/media/root/037ee8d0-0fd8-47a2-abc9-3b59609b137d. # Si se hace uso de una llave, se puede especificar con la opción "--key-file PATH". # mount /dev/dm-3 /mnt/cifrado # También se podría usar el clásico mount para montar.
Para desbloquear un dispositivo es necesario el usuario root, si se intenta saltar la autenticación mediante le uso de “--no-user-interaction”, se mostrará un error como el siguiente.
Error unlocking /dev/dm-2: GDBus.Error:org.freedesktop.UDisks2.Error.NotAuthorizedCanObtain: Not authorized to perform operation.
Crear regla polkit para un usuario sin privilegios pueda montar dispositivos cifrados (unlock)
Si se quiere que un usuario no privilegiado pueda desbloquear dicho dispositivo cifrado, se podría crear una regla polkit en /etc/polkit-1/rules.d/ que otorgara permisos a un determinado grupo o usuario a la acción “org.freedesktop.udisks2.encrypted-unlock-system” (Leer).
Para crear la regla sería suficiente crear un fichero /etc/polkit-1/rules.d/00_user_XYZ.rules con el siguiente contenido. Modificar XYZ por el usuario deseado, también en el fichero de reglas en la variable “subject.user”.
polkit.addRule(function (action, subject) { var YES = polkit.Result.YES; var permission = { "org.freedesktop.udisks2.encrypted-unlock-system": YES }; if (subject.user == "XYZ") { return permission[action.id]; } return polkit.Result.NOT_HANDLED; });
systemctl restart polkit.service
Desmontar / Bloquear de nuevo un disco cifrado (No requiere de passphrase / llave).
udisksctl unmount -b /dev/dm-3 Unmounted /dev/dm-3. # umount /mnt/cifrado # También se podría usar el clásico umount. udisksctl lock -b /dev/Volgroup00/cifrado Locked /dev/dm-2.
Mostrar información de dispositivos con udisksctl.
Mostrar toda la información de todos los dispositivos con detalle se hace mediante el comando “dump”. Primero visualizará todos los dispositivos, sus particiones y al final de todos los controladores (uno por dispositivo).
El resultado sería el mismo que ejecutar el comando “info” para todos los dispositivos, sus particiones y driver (objetos) correspondientes. Ejemplo de salida no completo.
udisksctl dump /org/freedesktop/UDisks2/block_devices/sdb: org.freedesktop.UDisks2.Block: Configuration: [] CryptoBackingDevice: '/' Device: /dev/sdb DeviceNumber: 2064 Drive: '/org/freedesktop/UDisks2/drives/WDC_WD10EZEX_00BN5A0_WD_WMC3F0685256' HintAuto: false HintIconName: HintIgnore: false HintName: HintPartitionable: true HintSymbolicIconName: HintSystem: true Id: by-id-ata-WDC_WD10EZEX-00BN5A0_WD-WMC3F0685256 IdLabel: IdType: IdUUID: IdUsage: IdVersion: MDRaid: '/' MDRaidMember: '/' PreferredDevice: /dev/sdb ReadOnly: false Size: 1000204886016 Symlinks: /dev/disk/by-id/ata-WDC_WD10EZEX-00BN5A0_WD-WMC3F0685256 /dev/disk/by-id/wwn-0x50014ee25ecae508 /dev/disk/by-path/pci-0000:00:1f.2-ata-3 UserspaceMountOptions: org.freedesktop.UDisks2.PartitionTable: Partitions: ['/org/freedesktop/UDisks2/block_devices/sdb4', '/org/freedesktop/UDisks2/block_devices/sdb2', '/org/freedesktop/UDisks2/block_devices/sdb1', '/org/freedesktop/UDisks2/block_devices/sdb3'] Type: dos /org/freedesktop/UDisks2/block_devices/sdb1: ...
Mostrar toda la información de los dispositivos pero sin detalle.
udisksctl status sda MODEL REVISION SERIAL DEVICE -------------------------------------------------------------------------- ST31000528AS CC38 9VP5ENVM sda WDC WD10EZEX-00BN5A0 01.01A01 WD-WMC3F0685256 sdb Samsung SSD 860 EVO 500GB RVT01B6Q S3Z2NB1K109169L sdc PIONEER DVD-RW DVR-221L 1.00 MIQC118289WL sr0 TOSHIBA MQ01UBD100 AX001U 13Q6TXSKT sdd SanDisk Ultra 1.00 4C530001281116118481 sde
Información sobre dispositivos y particiones: Se debe especificar disco/partición y objeto para obtener toda la información que el comando “dump” obtiene.
# Información sobre el dispositivo /dev/sda (Mostrará el nombre del Driver pero no su información). udisksctl info -b /dev/sda # Dispositivo (Lista las particiones sin detalle). udisksctl info -b /dev/sda1 # Partición
Información sobre el objeto (driver): Para obtener esa información se utilizan las opciones -p y -d, que obtienen la misma información. El nombre del driver casi siempre es la concatenación del modelo y el serial.
# Información del dispositivo a nivel de controlador. udisksctl info -p drives/ST31000528AS_9VP5ENVM # udisksctl info -d ST31000528AS_9VP5ENVM # Equivalente al anterior.
Montar imágenes de dispositivos de bloque.
Montar imágenes de disco con udisksctl, como el clásico “-o loop” de mount.
# Crear el mapeo a /dev/loopX y montar. udisksctl loop-setup -f fichero.iso Mapped file fichero.iso as /dev/loop1. mount /dev/loop1 /mnt/imagen # Desmontar y borrar el mapeo /dev/loop1. umount /mnt/imagen udisksctl loop-delete -b /dev/loop1 # NOTA: Si se usa "-r" el montaje será de solo lectura, si son imágenes ISO, estas siempre serán montadas como solo lectura, se especifique o no la opción "-r"
Monitorizar eventos relacionados con los dispositivos de bloque / USB con udisksctl.
Muestra cambios de / en dispositivos que el demonio udisksd detecta, como son conexiones / desconexiones USB, debloqueo de discos cifrados, etc.
Ejemplo de salida en el modo monitor de udisksctl al desconectar una memoria USB.
udisksctl monitor Monitoring the udisks daemon. Press Ctrl+C to exit. 19:13:48.955: The udisks-daemon is running (name-owner :1.34). 19:13:57.801: Removed /org/freedesktop/UDisks2/block_devices/sdd1 19:13:57.801: Removed /org/freedesktop/UDisks2/block_devices/sdd 19:13:57.801: /org/freedesktop/UDisks2/drives/TOSHIBA_MQ01UBD100_13Q6TXSKT: Removed interface org.freedesktop.UDisks2.Drive.Ata 19:13:57.801: Removed /org/freedesktop/UDisks2/drives/TOSHIBA_MQ01UBD100_13Q6TXSKT 19:13:57.802: Added /org/freedesktop/UDisks2/jobs/7 org.freedesktop.UDisks2.Job: Bytes: 0 Cancelable: true ExpectedEndTime: 0 Objects: [] Operation: cleanup Progress: 0.0 ProgressValid: false Rate: 0 StartTime: 1535130837800574 StartedByUID: 0 19:13:57.826: /org/freedesktop/UDisks2/jobs/7: org.freedesktop.UDisks2.Job::Completed (true, '') 19:13:57.826: Removed /org/freedesktop/UDisks2/jobs/7
Cambiar directorio de montaje de /run/media/XXX/ a cualquier otro directorio.
Crear un fichero regla como el siguiente y especificar el directorio /mnt/ en la segunda linea de la siguiente manera.
Fichero /etc/udev/rules.d/99-udisks2.rules
# UDISKS_FILESYSTEM_SHARED # ==1: mount filesystem to a shared directory (/mnt/VolumeName) # ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName) # See udisks(8) ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"
Establece datos SMART mediante un fichero blob de libatasmart (Se usa para depuración)
# Indicando el dispositivo /dev/sda. udisksctl smart-simulate -f /home/XX/fichero -b /dev/sda. # Indicando el driver del dispositivo (Tiene el mismo efecto que el comando anterior.) udisksctl smart-simulate -f /home/XX/fichero -p drives/ST31000528AS_9VP5ENVMOBJECT