Навайбил скрипт, который позволят чуть читабельнее понимать, как подключены USB-устройства в Linux · Заметки

Не мог разобраться, что у меня на чём висит в компьютере на USB, поэтому навайбил с ГигаЧатом небольшой скриптик. В принципе, lsusb -t -v выводит эту же инфу, но на мой взгляд, менее читабельно.

·· [Continuing] ··

#!/bin/bash

printf "%-60s %-8s %-10s %-10s %s\n" "PHYSICAL PATH" "SPEED" "VENDOR" "PRODUCT" "DEVICE NAME"
echo "------------------------------------------------------------------------------------------------------------------"

for device in /sys/bus/usb/devices/*; do
    # Пропускаем служебные директории виртуальных шин без идентификаторов
    if [ -e "$device/idVendor" ] && [ -e "$device/devnum" ]; then
        phys_path=$(realpath $device | sed 's|.*pci||')

        # Читаем скорость и сразу нормализуем её до формата lsusb
        speed_raw=$(cat $device/speed 2>/dev/null)
        case "$speed_raw" in
            1.5) speed="1.5M" ;;
            12) speed="12M" ;;
            480) speed="480M" ;;
            5000) speed="5000M" ;;
            10000) speed="10000M" ;;
            *) speed="${speed_raw:-N/A}" ;;
        esac

        vendor=$(<$device/idVendor 2>/dev/null)
        product=$(<$device/idProduct 2>/dev/null)

        # Безопасное чтение имен: если cat падает, переменная остается пустой
        manufacturer=$(cat $device/manufacturer 2>/dev/null)
        prod_name=$(cat $device/product 2>/dev/null)

        if [ -z "$manufacturer" ] || [ -z "$prod_name" ]; then
            vid_upper=$(echo "$vendor" | tr '[:lower:]' '[:upper:]')
            pid_upper=$(echo "$product" | tr '[:lower:]' '[:upper:]')

            if [ -n "$vid_upper" ] && [ -n "$pid_upper" ]; then
                name="$vid_upper:$pid_upper"
            else
                name="N/A"
            fi
        else
            # Объединяем имена, удаляя лишние пробелы и переносы строк
            name="$(echo -e "${manufacturer} ${prod_name}" | xargs)"
        fi

        printf "%-60s %-8s %-10s %-10s %s\n" "$phys_path" "$speed" "$vendor" "$product" "$name"
    fi
done | sort

Пример вывода:

PHYSICAL PATH                                                SPEED    VENDOR     PRODUCT    DEVICE NAME
------------------------------------------------------------------------------------------------------------------
0000:00/0000:00:01.0/0000:01:00.0/usb5                       480M                           Linux 5.15.0-174-generic xhci-hcd xHCI Host Controller
0000:00/0000:00:01.0/0000:01:00.0/usb5/5-1                   480M                           Generic 4-Port USB 2.0 Hub
0000:00/0000:00:01.0/0000:01:00.0/usb5/5-1/5-1.1             480M                           Generic 4-Port USB 2.0 Hub
0000:00/0000:00:01.0/0000:01:00.0/usb5/5-1/5-1.1/5-1.1.1     480M                           Webcam Webcam
0000:00/0000:00:01.0/0000:01:00.0/usb5/5-2                   480M                           VIA Labs, Inc. USB2.0 Hub
0000:00/0000:00:01.0/0000:01:00.0/usb5/5-2/5-2.5             480M                           VIA Labs, Inc. USB Billboard Device
0000:00/0000:00:01.0/0000:01:00.0/usb6                       10000M                         Linux 5.15.0-174-generic xhci-hcd xHCI Host Controller
0000:00/0000:00:01.0/0000:01:00.0/usb6/6-1                   5000M                          Generic 4-Port USB 3.0 Hub
0000:00/0000:00:01.0/0000:01:00.0/usb6/6-1/6-1.1             5000M                          Generic 4-Port USB 3.0 Hub
0000:00/0000:00:01.0/0000:01:00.0/usb6/6-1/6-1.1/6-1.1.4     5000M                          TS-RDF8 Transcend
0000:00/0000:00:01.0/0000:01:00.0/usb6/6-1/6-1.4             5000M                          ULT-Best Best USB Device
0000:00/0000:00:01.0/0000:01:00.0/usb6/6-2                   5000M                          VIA Labs, Inc. USB3.1 Hub
...

Это фрагмент с девайсами на одном хабе. Важно понимать, что устройства USB 2 и USB 3 сидят как бы в разных виртуальных мирах, и отображаются разных цепочках подключений. Даже если физически они воткнуты в один хаб, в системе мы видим их на разных корнях, в данном случае usb5... это USB 2, а usb6... это USB 3. Webcam и Transcend (кардридер) по факту в одном хабе рядом, но в выводе lsusb, например, кажется что они должны быть вообще на разных контроллерах.


Tags: Linux.


Comments:

No Comments for this post yet...

Leave a comment:

Your email address will not be displayed on this site.
Your URL will not be displayed on this site. Comments containing URL's of non-personal pages may be removed.
Confirmation Code:
Human Confirmation Code (Captcha)

HTML tags and "<", ">" symbols are not allowed. Links will not be converted to hyperlinks. Any commercials are removed and reported as abuse.

Archives

                                                                                                                                                                                                                                                                   


© Sergey A. Galin, 1998-2021 sageshome.net/blog/