일관된 Linux 장치 열거

일관된 Linux 장치 열거

우리 Linux 상자에는 항상 /dev/ttyACM0. 그런데 갑자기(예, 원격 프레젠테이션 중에...) 장치가 작동을 멈췄습니다. 빠르게 조사한 결과 연결이 로 변경된 것을 발견했습니다 /dev/ttyACM1. 이것은 약간 이상하지만 이제 문제가 발생했습니다. 내 장치를 명확하게 식별하려면 어떻게 해야 합니까? 예를 들어 UUID가 /dev/sd**변경된 경우에도 UUID를 사용하여 저장소 드라이브를 초기화할 수 있습니다 . 직렬 장치에 대해 이 작업을 수행할 수 있는 방법이 있습니까?

이제 나는 어리석은 해결 방법을 사용합니다.

for(int i = 0; i < 10; i ++)
{
    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}

이것협회우리가 사용하는 장비에.

답변1

우리는 USB 장치에 대해 이야기하고 있으며 udev가 있다고 가정하므로 몇 가지 udev 규칙을 설정할 수 있습니다.

제 생각에는 누군가 또는 무언가가 장치를 분리/제거한 다음 다시 연결하거나 장치를 다시 추가하여 숫자가 증가한 것으로 추측됩니다.

이제 먼저 공급업체와 제품 ID가 필요합니다.

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC

다음으로 일련번호가 필요합니다(두 개 이상인 경우).

# udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
    ATTRS{serial}=="A6008isP"

이제 udev 규칙을 만들어 보겠습니다.

UDEV 규칙은 일반적으로 /etc/udev/rules.d.라는 새 파일을 만들고 99-usb-serial.rules여기에 각각 다른 일련 번호를 가진 세 개의 장치가 있습니다.

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

ls -l /dev/MySerialDevice
lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1

일련 번호가 필요하지 않은 경우 공급업체의 동일한 칩을 사용하는 모든 장치는 동일한 심볼릭 링크를 받게 되며 주어진 시간에 하나만 연결할 수 있습니다.

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MySerialDevice"

여기에서 가져옴

답변2

UDEV 규칙은 좋은 생각이지만 많은 장치에 직렬이 없거나 동일한 직렬이 있어 ttyACM0에서 ttyACM1까지의 문제가 해결되지 않습니다.

노력하다

systemctl stop ModemManager systemctl 비활성화 ModemManager

PS 저는 마술사가 아닙니다. 단지 배우는 중입니다. 하지만 우정은 우리가 진정한 기적을 만드는 데 도움이 될 수 있습니다.

관련 정보