is there any way I can write a udev rule that fixes the name of each adapter based on which physical port on the hub the adapter is plugged into?
Sim, existe, como se constata. Considere a última parte da hierarquia de dispositivos mostrada no segundo exemplo acima:
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5': KERNELS=="1-4.5"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="69"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2303"
ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="7" ATTRS{version}==" 1.10" ATTRS{maxchild}=="0" ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Prolific Technology Inc."
ATTRS{product}=="USB-Serial Controller"
O nome dado a este dispositivo pelo kernel (KERNELS == "1-4.5") indica que este dispositivo está conectado à quinta porta de um hub conectado à porta quatro no barramento 1 (consulte esta FAQ para mais informações sobre como decodificar a hierarquia de dispositivos usb sysfs). Com alguma ajuda de este guia para escrever regras do udev, criei o seguinte conjunto de regras do udev para o meu USB-to-serial- conversores de porta:
KERNEL=="ttyUSB*", KERNELS=="1-8.1.5", NAME="ttyUSB0"
KERNEL=="ttyUSB*", KERNELS=="1-8.1.6", NAME="ttyUSB1"
KERNEL=="ttyUSB*", KERNELS=="1-8.1.1", NAME="ttyUSB2"
KERNEL=="ttyUSB*", KERNELS=="1-8.1.2", NAME="ttyUSB3"
Essas regras têm uma desvantagem óbvia: elas assumem que todos os conversores USB para serial serão conectados ao mesmo hub ("1-8.1. *"). Se um conversor USB para serial fosse conectado a outra porta USB, poderia ser atribuído o nome "ttyUSB0", o que entraria em conflito com o esquema de nomenclatura descrito acima. No entanto, desde que eu deixo todos os conversores conectados ao hub eu posso viver com essa restrição.