Управление USB-устройствами в Linux консоли

HELP-ME-24.COM (Freelance Team), Черноусов Антон

Продолжаем знакомиться с некоторыми специфичными аспектами администрирования Linux-систем.

Сегодня мы рассмотрим вопрос управления USB-устройствами без использования графического интерфейса. Наверняка, все вы видели значок безопасного извлечения при использовании внешних жестких дисков подключенных по интерфейсу USB и сегодня мы научимся делать абсолютно тоже самое, но без использования графического интерфейса.

Отключение USB-устройства из графического интерфейса Linux

Прежде всего необходимо получить сведения о присутствующих в системе USB-устройствах и для этого служит команда lsusb.

Получение сведений о подключенных USB-устройствах в Linux

Запрашиваем сведения о подключенных USB-устройствах:

# lsusb
Bus 002 Device 002: ID 8087:8000 Intel Corp.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8008 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 026: ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA Bridge
Bus 003 Device 003: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 003 Device 002: ID 1a2c:0e24 China Resource Semico Co., Ltd
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Прежде всего обратите внимание, что USB-устройства могут быть подключены древовидно при помощи USB-хабов и вы можете передать команде lsusb дополнительный параметр (-t) для вывода информации в древовидной псевдо-графической форме:

# lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 1: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 2: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 9: Dev 27, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 28, If 0, Class=Mass Storage, Driver=usb-storage, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M

Как вы видите все устройства имеют разный класс и ниже я приведу основные которые могут вам встретиться:

  • root_hub - разъем на материнской плате
  • Hub - USB-разветвитель
  • Human Interface Device - Устройство ввода (клавиатура/мышь)
  • Mass Storage - Накопитель (USB-брелок или внешний USB-жесткий диск)

При помощи этой же команды мы можем запросить более детальную информацию о отдельном подключенном USB-устройстве, но обратите внимание, что по умолчанию указание параметра -v выдаст подробную информацию по всем USB устройствах и ее будет очень много:

Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0 Unused
  bDeviceProtocol         0 Full speed (or root) hub
  bMaxPacketSize0        64
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0002 2.0 root hub
  bcdDevice            4.10
  .....

Разумнее использовать фильтр устройств задаваемый ключом -s и параметрами к этому ключу будут идентификатор шины и устройства:

# lsusb -v -s 3:3

Bus 003 Device 003: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  ...
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval              10
Device Status:     0x0000
  (Bus Powered)

Указанная выше команда вывела подробную информацию о подключенной в USB-порт 003 устройства с идентификатором 003 и в моем случае это обычная USB-мышь.

Управление usb-устройствами в консоли LInux

Теперь, после того как вы поняли структуру отображения USB-устройств мы можем начать ими управлять. Для управления USB-устройствами предназначено отдельное пространство в каталоге /sys/bus/usb/devices/ и если вы выведите структуру суб-каталогов, то конечно же вы обратите внимание, что она полностью повторяет структуру выводимую lsusb при указании ключа отображения в виде дерева:

# tree -l -L 2 -d /sys/bus/usb/devices/
/sys/bus/usb/devices/
├── 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:1a.0/usb1/1-0:1.0
│   ├── driver -> ../../../../../bus/usb/drivers/hub
│   ├── ep_81
│   ├── power
│   ├── subsystem -> ../../../../../bus/usb
│   ├── usb1-port1
│   └── usb1-port2
├── 1-1 -> ../../../devices/pci0000:00/0000:00:1a.0/usb1/1-1
│   ├── 1-1:1.0
│   ├── driver -> ../../../../../bus/usb/drivers/usb
│   ├── ep_00
│   ├── port -> ../1-0:1.0/usb1-port1 
│   ├── power
│   └── subsystem -> ../../../../../bus/usb 
├── 1-1:1.0 -> ../../../devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1:1.0 

Для управления usb-устройствами нам необходимо лишь использовать команду echo для передачи управляющих команд требуемому устройству.

Отключить (деавторизация) устройство:

# echo 0 > /sys/bus/usb/devices/usb1/1-1/1-1.2/authorized

Включить (авторизация) устройство (не всегда срабатывает и зависит от типа usb-устройства):

# echo 1 > /sys/bus/usb/devices/usb1/1-1/1-1.2/authorized

Полное отключение устройства (извлечь):

# echo 1 > /sys/bus/usb/devices/usb1/1-1/1-1.2/remove

Обратите внимание, что извлеченное устройство подключиться заного только при физическом переподключении устройства или перезагрузке.

Оставьте комментарий

Вы должны быть вошедший в чтобы отправить комментарий