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

    Общий рейтинг статьи: 0 (проголосовало 0 )
    Опубликовано:  [просмотров 650]


    Продолжаем знакомиться с некоторыми специфичными аспектами администрирования 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

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


    Связанные записи в блоге

    Обсуждение статьи
    Вопрос нашего пользователяа команду mount не учил?
    Ответ на комментарийНе очень понял вопрос. Тут к mount вообще ничего никаким боком не относится я рассказываю как отключить определенное устройство подключенное по USB и это может быть не только дисковое устройство, но и джойстик или wifi-адаптер.

    Ваш комментарий: