ATTR {index} sempre 0, como escrever regra persistente do udev?

1

Eu tenho dois dispositivos USB idênticos. Apenas um link simbólico persistente é criado:

/dev/v4l/by-id/usb-fushicai_usbtv007_300000000002-video-index0

Acho que é porque /usr/lib/udev/rules.d/60-persistent-v4l.rules usa ATTR{index} para diferenciá-los, mas é sempre zero:

for d in /dev/video*; do echo $d; udevadm info -a $d | grep 'ATTRS.manufacturer\|ATTR.index\|ATTR.name'; echo ; done
/dev/video0
    ATTR{index}=="0"
    ATTR{name}=="Loopback video device 0"

/dev/video1
    ATTR{index}=="0"
    ATTR{name}=="Loopback video device 1"

/dev/video2
    ATTR{index}=="0"
    ATTR{name}=="Loopback video device 2"

/dev/video3
    ATTR{index}=="0"
    ATTR{name}=="Loopback video device 3"

/dev/video4
    ATTR{index}=="0"
    ATTR{name}=="usbtv"
    ATTRS{manufacturer}=="fushicai"
    ATTRS{manufacturer}=="Linux 4.2.5-1-ARCH ehci_hcd"

/dev/video5
    ATTR{index}=="0"
    ATTR{name}=="usbtv"
    ATTRS{manufacturer}=="fushicai"
    ATTRS{manufacturer}=="Linux 4.2.5-1-ARCH ehci_hcd"

/dev/video6
    ATTR{index}=="0"
    ATTR{name}=="stk1160"
    ATTRS{manufacturer}=="Syntek Semiconductor"
    ATTRS{manufacturer}=="Linux 4.2.5-1-ARCH xhci-hcd"

Quem atribui este atributo? Como consertar isso?

saída completa para comparação. link link

Como você pode ver, a única diferença é a porta usb conectada.

    
por basin 22.11.2015 / 13:37

1 resposta

0

Escrevi um script para encontrar o índice de dispositivo desocupado por padrão. Ele aceita um padrão printf como /dev/v4l/by-id/usb-fushicai_usbtv007_300000000002-video-index%d e encontra o primeiro arquivo inexistente.

Tomou a regra existente do pacote systemd e a reescreveu para usar o resultado do script em vez de ATTR{index} . Como ATTR{index} é inalterável, decidi usar meu próprio diretório para links simbólicos.

/etc/udev/rules.d/65-persistent-v4l-my.rules:

ACTION=="remove", GOTO="my_fix_v4l_index_end"
SUBSYSTEM!="video4linux", GOTO="my_fix_v4l_index_end"
ENV{MAJOR}=="", GOTO="my_fix_v4l_index_end"

IMPORT{program}="v4l_id $devnode"

SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"

KERNEL=="video*", ENV{ID_SERIAL}=="?*", ENV{UNOCCUPIED_PATTERN}="v4l/by-id-my/$env{ID_BUS}-$env{ID_SERIAL}-video-index%%d"
IMPORT{program}="/usr/local/bin/find-unoccupied-device-index /dev/$env{UNOCCUPIED_PATTERN}"
KERNEL=="video*", ENV{ID_SERIAL}=="?*", SYMLINK+="v4l/by-id-my/$env{ID_BUS}-$env{ID_SERIAL}-video-index$env{UNOCCUPIED_INDEX}"


LABEL="my_fix_v4l_index_end"

/ usr / local / bin / find-não-ocupado-dispositivo-index:

#!/bin/bash
set -e    
if [ $# != 1 ]; then
  >&2 echo "usage: ${0##*/} prefix-%d-suffix"
  exit 1
fi

echo "pattern: $1" >&2

for ((i=0;;i++)); do
  filename='printf "$1" $i'
  [ -e "$filename" ] || break
done
echo "unoccupied index: $i" >&2
echo "UNOCCUPIED_INDEX=$i"
    
por basin 22.11.2015 / 16:54