Permitir a usuarios no root leer / escribir / archivos de desarrollo

8

En mi /devcarpeta, me gustaría que los siguientes archivos sean legibles y escribibles por el usuario:

/dev/ttyUSB0
/dev/gpib0

¿Cómo hago esto sin usar chgrp? Puedo editar /etc/udev/rules.dpero no sé la sintaxis.

Equipo
fuente
1
¿Por qué desea otorgar permisos de lectura / escritura a estos?
slm
Estoy usando esta PC como controlador para varios dispositivos de prueba e instrumentación (osciloscopios, medidores de potencia, etc.) Todas las lecturas / escrituras serán realizadas por scripts y bibliotecas de Python. El usuario no realizará ninguna lectura / escritura de bajo nivel. Supongamos que el sistema es infinitamente seguro. Me gustaría que sea conveniente para mis colegas de laboratorio escribir guiones para los instrumentos.
Kit
3
¿Por qué no simplemente dar acceso a sudo a los colegas en su lugar?
slm

Respuestas:

11

Cómo se estructuran las reglas de udev

Para los dispositivos que caen en el subsistema tty, puede configurar su grupo de la siguiente manera:

SUBSYSTEM=="tty", GROUP="dialout"

Tenga en cuenta que, al igual que en la programación común, ==es una prueba de igualdad, mientras que =es una tarea. Por lo tanto, la declaración anterior se traduce como "si SUBSYSTEM=="tty"luego se asigna GROUP="dialout". Una declaración puede tener múltiples pruebas, que se agrupan, y múltiples asignaciones.

Si desea cambiar los permisos de lectura-escritura-ejecución, asigne MODE en lugar de GROUP donde MODE sigue la notación octal Unix habitual, por ejemplo, MODE="0660"otorga al propietario y al grupo permisos de lectura-escritura. man udevTiene todos los detalles.

Puede encontrar muchos ejemplos de tales reglas en /lib/udev/rules.d/91-permissions.rules

Cómo agregar una regla udev a su sistema

Una vez que se haya decidido cuál quiere que sea su regla, es bastante simple agregarla. En un sistema derivado de Debian, vaya al directorio /etc/udev/rules.dy cree un archivo. Los archivos se ejecutan en orden de clasificación. Por lo tanto, para hacer que su archivo de reglas sea el último en leer, anulando las anteriores, intente con un nombre como 99-instruments.rules. Luego ponga sus reglas en ese archivo, una por línea. (Si es necesario, las líneas se pueden extender colocando una barra diagonal inversa al final de la línea, al igual que en el shell).

Entonces, si desea cambiar el grupo y los permisos en los dispositivos tty, su archivo /etc/udev/rules.d/99-instruments.rulespodría consistir en una sola línea:

SUBSYSTEM=="tty", GROUP="dialout", MODE="0660"

Para asegurarse de que su nuevo archivo tenga los permisos habituales:

sudo chown root:root /etc/udev/rules.d/99-instruments.rules
sudo chmod 0644 /etc/udev/rules.d/99-instruments.rules

Después de haber creado su archivo, udevd puede leerlo automáticamente. Si no, puede forzarlo a volver a leer sus archivos con:

udevadm control --reload-rules

Más información sobre cómo udev clasifica los dispositivos

Si desea obtener un control más preciso sobre qué dispositivos responden a qué reglas, puede obtener más información sobre cómo udev ve sus dispositivos examinando / sys /. En este momento, no tengo acceso a una máquina con ttyUSB o HPIB, así que hagamos un ejemplo de disco sda. Correr:

udevadm info --attribute-walk --path=/sys/block/sda

Esto proporciona mucha información similar a la siguiente:

. . . .
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="0"
. . . .

Todas estas líneas tienen la forma adecuada para usar como ifcláusulas en las reglas. Entonces, por ejemplo, para cambiar la propiedad en todos los dispositivos de bloque que están marcados como no extraíbles, usaríamos la regla:

SUBSYSTEM=="block", ATTR{removable}=="0", OWNER=john1024

Con información de udevadm, uno puede desarrollar reglas que pueden apuntar específicamente a los dispositivos de interés.

John1024
fuente
El primer ejemplo debe tener una coma, no un punto, antes de MODE =
Jim Hunziker
1
@ JimHunziker Gracias por eso. El error tipográfico ahora está corregido.
John1024
4

Creo que sugeriría que la regla sea un poco más restrictiva que la de John. Por ejemplo, cree un archivo como /etc/udev/rules.d/99-tty-dialout.rules:

SUBSYSTEM=="tty", KERNEL=="ttyUSB0", GROUP="dialout", MODE="0660"

Puede usar udevadmpara determinar dispositivos SUBSYSTEM==y KERNEL==valores. Por ejemplo:

$ udevadm info -a -n /dev/tty0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/virtual/tty/tty0':
    KERNEL=="tty0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{active}=="tty1"
slm
fuente