以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@localhostroot]#
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卸载删除同上!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)