如何解决Linux下USB设备节点名不固定问题

如何解决Linux下USB设备节点名不固定问题,第1张

Linux下USB设备节点名不固定问题经常会遇到,下面就是解决的方法:

以USB转串口为例,通常设备节点名为ttyUSBx(x为0~n),Linux内核会根据插入设备的先后顺序进行编号的分配,比如第一个插入的设备编号为0,然后依此加1。

如果仅仅以设备节点ttyUSBn来区别具体是哪个设备,因为末位的编号是随时会变的,所以就会造成混乱。无法保证A设备就是0,B设备就是1。其实这个问题在LDD3上已经提到过,目前的内核早已经解决类似的问题,将所以有USB设备都导致到sys文件系统中,其实每个USB端口都有唯一的端口号,相当于每个门店的门牌号。只要我们依据端口号来进行设备的区分,那么问题就迎刃而解了。

比如当前设备插入两个USB转串口设备后,查看ttyUSBn所在端口的端口号:

root@android:/ $ ls -l /sys/class/tty/

...

lrwxrwxrwx root root 2011-01-01 13:40 ttyUSB0 ->../../devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0

lrwxrwxrwx root root 2011-01-01 13:43 ttyUSB1 ->../../devices/ff540000.usb/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1

root@android:/ $ 12345

其中ttyUSB0所在的端口号为3-1.1,而ttyUSB1所在的端口号为3-1.2。

其它类型USB设备同理,以上思路清理完毕。

查看系统当前usb设备,下面是对第二列排序的结果。

$ lsusb

Bus 001 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub

Bus 001 Device 002: ID xxx:xxx Intel Corp. Integrated Rate Matching Hub

Bus 001 Device 003: ID xxx:xxx Genesys Logic, Inc. GL827L SD/MMC/MS Flash Card Reader

Bus 001 Device 005: ID xxx:xxx Philips (or NXP)

Bus 002 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub

Bus 002 Device 002: ID xxx:xxx Intel Corp. Integrated Rate Matching Hub

Bus 002 Device 003: ID xxx:xxx Intel Corp.

Bus 003 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub

Bus 004 Device 001: ID xxx:xxx Linux Foundation 3.0 root hub

第二列是usb设备的hub编号。pc中usb设备都是接在hub上的,即使你的主板提供好多usb口,他们实际都是接在hub上的。

第四列是usb设备编号,设备在本机的编号。

所以,上面信息显示一共有4个usb hub(3个usb2.0,一个usb3.0)。如果

黑体字部分是我机器上的三个设备,001.003 是机箱自带读卡器,001.005是无线键盘,002.003是intel无线网卡蓝牙模块(具体怎么知道的往下看)。

usb设备也可以用在内核文件中找到/sys/bus/usb/devices。linux将所有设备驱动映射到了/sys下。

ls -1 /sys/bus/usb/devices/

1-0:1.0

1-1

1-1:1.0

1-1.2

1-1.2:1.0

1-1.4

1-1.4.1

1-1.4:1.0

1-1.4.1:1.0

1-1.4.1:1.1

1-1.4.1:1.2

1-1.5

1-1.5:1.0

1-1.5:1.1

1-1.5:1.2

2-0:1.0

2-1

2-1:1.0

2-1.5

2-1.5:1.0

2-1.5:1.1

3-0:1.0

4-0:1.0

usb1

usb2

usb3

usb4

都是符号连接。也可以用ls -l /sys/bus/usb/devices/ 看具体位置

输出看起来比较乱。用 udevadm工具能比较清楚列出设备信息。命令看起来是这样的:

udevadm info -p /sys/bus/usb/devices/usb1 -q property

那怎么找出是那个usb设备呢?

Bus 002 Device 003: ID xxx:xxx Intel Corp.

第二列,002 就要在所有2开头的文件去找,下面的符合第一规则。

2-0:1.0

2-1

2-1:1.0

2-1.5

2-1.5:1.0

2-1.5:1.1

通常系统的usb hub占据了`-`减号后第一位0。第一个 2-0:1.0,就是usb hub。

2-1.5*文件就是上面的设备。

$ udevadm info -p /sys/bus/usb/devices/2-1.5 -q property

BUSNUM=002

DEVNAME=/dev/bus/usb/002/003

DEVNUM=003

............

ID_MODEL_ID=xxx

............

ID_VENDOR=xxx

............

ID_VENDOR_FROM_DATABASE=Intel Corp.

............

002和003 就是lsusb 的第2/4列. 第6列,来自modelID和vender。

lsusb中的的东东就是这么来的。

那问题是怎么知道是蓝牙呢? 答案是继续用udevadm查:

$ udevadm info -p /sys/bus/usb/devices/2-1.5:1.0 -q property

ID_USB_CLASS_FROM_DATABASE=Wireless

ID_USB_PROTOCOL_FROM_DATABASE=Bluetooth

ID_USB_SUBCLASS_FROM_DATABASE=Radio Frequency

ID_VENDOR_FROM_DATABASE=Intel Corp.

具体的 *** 作过程如下: 1.接入usb设备,然后运行命令:devlabel add -d /dev/sda1 -s /dev/usbdevice (--automount 可去掉!) /dev/sda1是usb设备名称,具体可以用fdisk -l查看,如果fdisk不能显示,可以用一个万能的方法: (#表示0,1,2,3....) 检测/proc/scsi/usb-storage-#是否存在如果存在,检测/proc/scsi/usb-storage-#/#是否存在如果存在,检查文件/proc/scsi/usb-storage-#/#中最后一行Attach:是否是YES如果是YES,那么 0 = sda, 1=sdb, 2=sdc /dev/usbdevice是要使用的用户定义的设备名称,这个可以放在任意的目录中,名字大家自己定 automount指定:在 devlabel 重新启动时,如果 /etc/fstab 中有这个设备项目而且这个设备项目存在(找到了带有同一 UUID 的设备),那么就自动挂载这个项目。 2.建一个目录/mnt/usb 3.打开/etc/fstab,在里面添加一行:/dev/usbdevice /mnt/usb auto noauto,owner 0 0 这时就OK了,以后插入usb存储设备时就会自动挂载到/mnt/usb目录下了(前提是要有这个目录) 解决思想:当某个 USB 设备被插入,hotplug 就会运行 updfstab 程序。如果这个usb贮存设备存在,该程序会为它在 /etc/fstab 中添加一项记录。所添加的这一行包含实际设备名称(如 /dev/sda1)和 kudzu 选项。kudzu 选项通知 Kudzu工具如果设备不存在就删除这一行。因为这一行是 devlabel 所需的,你必须删除 kudzu 选项才能使这一行被保留在文件内。你还需把设备名称改成 devlabel 设备名称(如 /dev/usbdevice),并创建挂载点(如 /mnt/usb)。所以修改后的就是上面的第3步. 最后,还有一种最最简单的方法,也是我现在使用的方法哈: 可以直接打开/etc/hotplug/usb.agent ,在里面找到"add)",在其中的 if [ -x /sbin/devlabel ]then /sbin/devlabel restart fi 后面加上 [ -x /usr/sbin/udisk ]&&/usr/sbin/udisk 其中udisk是一个简单的挂载脚本: #! /bin/sh mount|grep /mnt/usb if [ "$?" = "0" ]then umount /mnt/usb rmdir /mnt/usb else mkdir /mnt/usb mount /dev/sda1 /mnt/usb fi 这样做的目的是:当usb设备接入时,hotplug程序就会自动运行,在运行脚本中加入一个挂载脚本,不就一切OK了么~~ 不过上面的讨论都只能用于挂载,卸载还是必须用umount(选第3种办法的直接打udisk),这是同WIN一样的.

2、在mnt目录下先建立一个usb的目录(如:[root@localhost

root]#

mkdir

/mnt/usb)

3、挂载U盘:mount

-t

vfat

/dev/sda1

/mnt/usb

4、卸载U盘:umount

/mnt/usb5、删除usb目录:rm

-rf

/mnt/usb

二.Linux挂载硬盘:

1.加挂FAT32文件系统

最简单的用法

mount

/dev/hda6

/mnt/wine

mount

-t

vfat

/dev/hda6

/mnt/wine

在实际中 *** 作中,直接加挂一个windows的分区,中文的文件名和目录名会出现乱码,为了避免这种情况可以指定字符集,命令如下:

mount

/dev/hda6

/mnt/d

-o

codepage=936,iocharset=cp936

mount

-t

vfat

/dev/hda6

/mnt/d

-o

codepage=936,iocharset=cp936

mount

-t

vfat

-o

iocharset=cp936,codepage=936

/dev/hda6

/mnt/wine(作者常用)

注意:cp936是指简体中文,cp950是指繁体中文。

卸载所挂的硬盘

umount

/mnt/wine

删除所挂的硬盘

rm

-rf

/mnt/wine

2.加挂NTFS文件系统

在目前多数的Linux版本上,需要重编译Linux核心才能,加挂NTFS分区(编译方法请参阅其它文章)。核心支持NTFS后,可以用以下命令加挂:

mount

-t

ntfs

/dev/hda2

/mnt/c

同样对于中文的文件名和目录名会出现乱码的问题可以指定字符集,不过和加挂vfat分区不同,实际中用以下命令是可行的:

mount

-t

ntfs

-o

iocharset=cp936

/dev/hda2

/mnt/c

-r

mount

-t

ntfs

-o

iocharset=cp936,rw

/dev/hda2

/mnt/c

注意:cp936是指简体中文,cp950是指繁体中文。

卸载删除同上!

三.Linux自动挂载硬盘

打开/etc找到里面的fstab文件进行编辑,如果你是以管理员身份登入的话,可以直接右键--打开方式--gedit,可以直接在后面追加行:

/dev/hda6

/mnt/wine

vfat

codepage=936,iocharset=cp936,defaults,umask=0

0

0

/dev/hda5

/mnt/wind

vfat

codepage=936,iocharset=cp936

0

0

四.Linux挂载光驱:

命令:mount

-t

iso9660

/dev/hdc

/mnt/cdrom卸载删除同上!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7578112.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-07
下一篇 2023-04-07

发表评论

登录后才能评论

评论列表(0条)

保存