Linux usb 设备
一:/sys/bus/usb/devices/
-
信息显示如下
-
1-0:1.0
- 1:表示 1 号总线,或者说 1 号 Root Hub
- 0:表示端口号
- 1:表示配置号
- 0:表示接口号
- 命名规则:Root Hub-port:configuration.interface
-
1-1.1:1.0 or 1-1.2:1.0
- 1:表示1号总线,或者说1号 Root Hub
- 1:
表示 Hub 连在 Root Hub 上的端口号
- 1:
表示设备连在 Hub 上的端口号
- 1:表示配置号
- 0:表示接口号
二:设备信息
- 设备种类
cat /sys/bus/usb/devices/1-1/bDeviceClass
09:表示为一个usb hub
#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */
#define USB_CLASS_AUDIO 1
#define USB_CLASS_COMM 2
#define USB_CLASS_HID 3
#define USB_CLASS_PHYSICAL 5
#define USB_CLASS_STILL_IMAGE 6
#define USB_CLASS_PRINTER 7
#define USB_CLASS_MASS_STORAGE 8
#define USB_CLASS_HUB 9
#define USB_CLASS_CDC_DATA 0x0a
#define USB_CLASS_CSCID 0x0b /* chip+ smart card */
#define USB_CLASS_CONTENT_SEC 0x0d /* content security */
#define USB_CLASS_VIDEO 0x0e
#define USB_CLASS_WIRELESS_CONTROLLER 0xe0
#define USB_CLASS_MISC 0xef
#define USB_CLASS_APP_SPEC 0xfe
#define USB_CLASS_VENDOR_SPEC 0xff
-
version usb协议版本
usb2.0 hub -
busnum & devnum
-
dev 主设备号:次设备号
-
bMaxPower 设备最大电流
-
idVendor(厂商 ID) & idProduct(产品 ID)
-
product 产品名称
-
bcdDevice 固件版本
-
speed 速率
-
uevent
sysfs usb 设备的 uevent 是一个事件通知机制,表示当该 usb 设备在系统上被插入或拔出时,内核会发送一个事件通知给用户空间的系统进程,告知设备的状态变化。这个事件通知会包含一些关于设备的属性信息,例如设的厂商ID、产品ID、序列号等等,方便用户空间的应用程序进行设备管理和配置
-
bmAttributes
大小为一字节,不同的位,表示不同的特性。- bit7 是保留的,必须为1。
- bit6 表示供电方式:1 设备自供电;0 设备是总线供电的。
- bit5 表示是否支持远程唤醒:1 支持远程唤醒;0 不支持远程唤醒。
- bit0~4 是保留的,默认为0。
-
drivers_autoprobe
drivers_autoprobe 是一个 sysfs 属性,用于在新插入 USB 设备时触发自动探测 USB 驱动程序。当将此属性设置为 1 时,内核将尝试自动加载适当的驱动程序,以便为任何新连接的 USB 设备进行配置。这可以节省手动 USB 设备所需的时间和精力。
三:固定usb设备名方法
根据连接在usb hub上的端口号区分。usb hub端口号是固定的。
- 查找需要固定的usb设备
#输入命令:ls /sys/class/tty/ttyUSB* -l,输出结果如下
lrwxrwxrwx root root 2017-08-01 13:40 ttyUSB0 -> …/…/devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0
lrwxrwxrwx root root 2017-08-01 13:43 ttyUSB1 -> …/…/devices/ff540000.usb/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1
- 添加规则
终端输入:sudo vi /etc/udev/rules.d/10-local.rules,添加下面的内容(这句话是个模板,每固定一个设备把这句话复制一次,把开头的#号去掉,把KERNELS和SYMLINK改成自己想要的就可以了)。
#ACTION==“add”,KERNELS==“1-2:1.0”,SUBSYSTEMS==“usb”,MODE:=“0777”,SYMLINK+=“name”
ACTION==“add”,KERNELS==“3-1.1:1.0”,SUBSYSTEMS==“usb”,MODE:=“0777”,SYMLINK+=“my_serial0”
ACTION==“add”,KERNELS==“3-1.2:1.0”,SUBSYSTEMS==“usb”,MODE:=“0777”,SYMLINK+=“my_serial1”
KERNELS==“3-1.1:1.0”固定设备信息参考(第一章:第1小节)
SYMLINK+=“my_serial0” 固定名称
四:固定挂载目录
- usb挂载规则配置文件
/etc/udev/rules.d/10-myusbstorage.rules
1 KERNEL!="sd*", GOTO="auto_mount_end" 2 SUBSYSTEM!="block", GOTO="auto_mount_end" 3 ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service" 4 ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service" 5 LABEL="auto_mount_end"
- usb挂载服务
/etc/systemd/system/usb-mount@.service
1 [Unit] 2 Description=Mount USB Drive on %i 3 4 [Service] 5 Type=oneshot 6 RemainAfterExit=true 7 ExecStart=/usr/bin/usbstorage-mount.sh add %i 8 ExecStop=/usr/bin/usbstorage-mount.sh remove %i
- usb挂载脚本
/usr/bin/usbstorage-mount.sh
#!/bin/bash # This script is called from our systemd unit file to mount or unmount # a USB drive. usage() { echo "Usage: $0 {add|remove} device_name (e.g. sdb1)" exit 1 } if [[ $# -ne 2 ]]; then usage fi ACTION="$1" DEVBASE="$2" DEVICE="/dev/${DEVBASE}" # See if this drive is already mounted, and if so where MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }') do_mount() { if [[ -n "${MOUNT_POINT}" ]]; then echo "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}" exit 1 fi # Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE # added some sed's to avoid space issues eval $(/sbin/blkid -o udev ${DEVICE}|sed 's/=/="/'|sed 's/$/"/') # Figure out a mount point to use LABEL="${ID_FS_LABEL}" if [[ -z "${LABEL}" ]]; then LABEL="${DEVBASE}" elif /bin/grep -q " /media/${LABEL} " /etc/mtab; then # Already in use, make a unique one LABEL+="-${DEVBASE}" fi # MOUNT_POINT="/media/${LABEL}" #MOUNT_POINT="/media/${DEVBASE}" MOUNT_POINT="/media/sda1" #修改挂载点 echo "Mount point: ${MOUNT_POINT}" /bin/mkdir -p "${MOUNT_POINT}" # Global mount options OPTS="rw,relatime" #added a chmod checker for file systems that don't #understand allow all to read write # CHMOD=no # File system type specific mount options if [[ ${ID_FS_TYPE} == "vfat" ]]; then OPTS+=",users,gid=100,iocharset=utf8,umask=000" # OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush" #added options I wanted on ntfs elif [[ ${ID_FS_TYPE} == "ntfs" ]]; then OPTS+=",users,gid=100,iocharset=utf8,umask=000" # OPTS+=",user,users,umask=000,allow_other" else OPTS+=",users,gid=100,iocharset=utf8,umask=000" # CHMOD=yes fi if ! /bin/mount -o "${OPTS}" ${DEVICE} "${MOUNT_POINT}"; then echo "Error mounting ${DEVICE} (status = $?)" /bin/rmdir "${MOUNT_POINT}" exit 1 fi echo "**** Mounted ${DEVICE} at ${MOUNT_POINT} ****" # if [ "${CHMOD}" = "yes" ];then # /usr/bin/find "${MOUNT_POINT}" -type f -exec chmod 0666 {} \; # /usr/bin/find "${MOUNT_POINT}" -type d -exec chmod 0777 {} \; # fi } do_unmount() { if [[ -z ${MOUNT_POINT} ]]; then echo "Warning: ${DEVICE} is not mounted" else /bin/umount -l ${DEVICE} echo "**** Unmounted ${DEVICE}" fi # Delete all empty dirs in /media that aren't being used as mount # points. This is kind of overkill, but if the drive was unmounted # prior to removal we no longer know its mount point, and we don't # want to leave it orphaned... for f in /media/* ; do if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then if ! /bin/grep -q " $f " /etc/mtab; then echo "**** Removing mount point $f" /bin/rmdir "$f" fi fi done } case "${ACTION}" in add) do_mount ;; remove) do_unmount ;; *) usage ;; esac
MOUNT_POINT="/media/sda1" 为U盘挂载点,修改此处即可