udev(八):实战:使用udevadm修改usb优盘在/dev下的名字

本文介绍如何使用udev规则自定义USB设备名称,通过具体步骤展示如何将USB设备sdc4重命名为kinstonusb,并创建符号链接。

       原创文章,转载请注明出处,谢谢!       
       作者:清林,博客名:
空静渡


       udev的规则的编写,我这里就不说了,大家可以在udev的文档中可以了解,有时间的话我在安排一章在说明udev 的规则了。


      下面是我要做的一个测试,我的系统是ubuntu9.10,我有一个usb优盘,是kinston的4G的优盘。

       运行:

            sudo fdisk -l

       看下我的优盘的情况,如下图:


      


       大家可以看到,我的usb设备是sdc,里面有一个分区是sdc4。

       运行 ls  /dev -l可以看到我的usb的优盘的设备有sdc和sdc4。


       这里说说udev的规则,用户自定义的规则一般放在/etc/udev/rules.d目录下,里面有很多规则都是以数字开头的,数字越小就表示规则越优先。

       我的/etc/udev/rules.d目录下有这几个规则文件:

            10-vboxdrv.rules  70-persistent-cd.rules  70-persistent-net.rules  README


      一般,我们可以在这个目录里新建一个规则文件作为我们自己使用的规则文件:10-local.rules,如果有这个文件就不用建了。


     现在我所要做的就是在/dev 目录下更改我的usb 优盘的设备名,就是说由/dev/sdc4 改名成/dev/kinstonusb 并为了演示增加了一个链接到/dev/kinstonusb ,这个链接为/dev/kinstonusb_link


     好了,我们怎么来写这个规则呢,我们要记住的一点是我们写的这些规则可以唯一确定我们的设备,不然系统会认不出来的。

    

     udev 的规则文件里定义了很多变量,如KERNELS SUBSYSTEMS DRIVERS 等等,我们可以用这些变量中的几个来确定我们的设备,并修改我们其中的NAME SYMLINK 变量,这样我们就可以改变我们的设备在/dev 目录下的名字和链接了。


     其实,我们并不真的需要很了解这些变量,我们只需要知道几个就可以了,而且我们在写这些规则文件的时候也不需要记住怎么写,很方便,下面看我怎么一步一步做。


     首先,我们来看下我们都有什么块设备:

     运行 ls /sys/block

     loop0 loop2 loop4 loop6 ram0 ram10 ram12 ram14 ram2 ram4 ram6 ram8 sda sdc sde

     loop1 loop3 loop5 loop7 ram1 ram11 ram13 ram15 ram3 ram5 ram7 ram9 sdb sdd

     家看到我的系统里有 sda sdb sdc sdd sde 5 个设备。我们可以用下面这个命令来查看我的 usb 优盘的信息:

    

     udevadm info -a -p /sys/block/sdc


U devadm info starts with the device specified by the devpath and then

walks up the chain of parent devices. It prints for every device

found, all possible attributes in the udev rules key format.

A rule to match, can be composed by the attributes of the device

and the attributes from one single parent device.

looking at device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0/block/sdc':

KERNEL=="sdc"

SUBSYSTEM=="block"

DRIVER==""

ATTR{range}=="16"

ATTR{ext_range}=="256"

ATTR{removable}=="1"

ATTR{ro}=="0"

ATTR{size}=="7830528"

ATTR{alignment_offset}=="0"

ATTR{capability}=="53"

ATTR{stat}==" 48 966 1714 344 0 0 0 0 0 328 344"

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0':

KERNELS=="5:0:0:0"

SUBSYSTEMS=="scsi"

DRIVERS=="sd"

ATTRS{device_blocked}=="0"

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


      上面省略了后面的信息信息,大家都可以看到,这些信息就是我们需要定义我们规则文件里的变量的信息。

    

     这些信息是以最里一层的一层一层向外显示的信息,如上,第一部分是 sdc 的信息,第二部分是 sdc 父目录的信息,即它的上一层设备的信息等等。

 

     但这里我们不是需要 sdc 的信息,我们需要的是 sdc4 的信息,而 /sys/block 目录下并没有 sdc4 这一项,那么我们怎么看到 sdc4 分区的信息呢。

 

     运行下面的命令可以得到 sdc4 的设备所在。

     udevadm info -q path -n /dev/sdc4

    

     我的输出如下:

     /devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0/block/sdc/sdc4

 

     那么我们就可以用上面的命令来得到 sdc4 的信息了,运行如下的命令:

     udevadm info -a -p $(udevadm info -q path -n /dev/sdc4)

 

     我机子的输出如下(省略了一部分):

 

Udevadm info starts with the device specified by the devpath and then

walks up the chain of parent devices. It prints for every device

found, all possible attributes in the udev rules key format.

A rule to match, can be composed by the attributes of the device

and the attributes from one single parent device.

looking at device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0/block/sdc/sdc4':

KERNEL=="sdc4"

SUBSYSTEM=="block"

DRIVER==""

ATTR{partition}=="4"

ATTR{start}=="63"

ATTR{size}=="7830465"

ATTR{alignment_offset}=="0"

ATTR{stat}==" 35 910 1162 280 0 0 0 0 0 272 280"

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0/block/sdc':

KERNELS=="sdc"

SUBSYSTEMS=="block"

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


     好,我们就可以编写我们的 /etc/udev/rules.d/10-local.rules 文件了。

     sudo vim /etc/udev/rules.d/10-local.rules

 

     在里面加入这几个变量信息,如下。

     KERNEL=="sdc4", SUBSYSTEMS=="block", NAME+="kinstonusb", SYMLINK+="kinstonusb_link"


     上面的 KERNEL=="sdc4", SUBSYSTEMS=="block" 我们可以根据上面的输出直接拷贝过去的。我们保存这个文件。

 

     一般我们要使这个规则文件生效,要热插拔我们的设备以产生一个事件或在设备中的 event 文件中增加信息以达到发送事件的目的来更新我们的 udev 规则,但这里有个更加方便的方法,我们可以运行下面这个命令。

 

     sudo udevadm test /sys/class/block/sdc4


      这样我们就更新了我们的规则。


     好,我们来看下我们的 /dev 里的情况,如下图:



     在看下我们的sdc,如下图:


     我们的sdc4不见了,即是我们命名我们的sdc4为kinstonusb了,而且还有个kinstonusb_link链接到它,以后我们就可用/dev/kinstonusb或/dev/kinstonusb_link来操作我们的优盘而不是/dev/sdc4了。


详细:可以参考udev的官方文档。

<think>好的,我现在需要帮助用户解决USB设备未生成/dev/ttyUSB*节点的问题。用户已经尝试通过udev规则和手动加载FTDI设备ID的方法来修复,现在需要更详细的指导。首先,我需要回忆之前提供的解决方案,并结合用户提到的引用内容来调整回答。 用户提到了引用[1]、[2]、[3],这些引用涉及到加载驱动模块、udev规则管理和内核模块配置。我需要确保这些内容被正确整合到新的回答中,同时参考用户之前的问题和我的历史回答,确保信息一致且准确。 首先,用户的问题可能涉及驱动加载、udev规则配置和权限设置。根据引用[1],加载ftdi_sio模块时需要指定vendor和product ID。用户可能已经尝试过这个步骤,但可能遇到模块未正确加载或设备未绑定的问题。需要检查模块是否加载,以及是否正确绑定了设备。 引用[2]提到udev规则管理设备节点命名,用户可能希望通过udev规则来确保设备正确生成节点。之前的回答中已经提供了创建udev规则的示例,但可能需要更详细的调试步骤,比如如何检查规则是否生效,或者如何重新加载规则。 引用[3]涉及内核配置中的ftdi模块选择。用户可能在内核编译时没有正确启用相关模块,或者模块版本不兼容。需要指导用户如何确认模块是否编译进内核,或者如何重新编译和加载模块。 此外,用户提到手动加载设备ID,可能需要确保这种加载是持久的,避免每次重启后失效。之前的回答中提到了在/etc/rc.local中添加命令,但用户可能需要更可靠的方法,比如创建modprobe配置文件。 还需要考虑权限问题,确保用户属于dialout组,或者通过udev规则设置正确的权限。引用[2]中提到符号链接的方法,但用户可能更希望直接生成正确的节点,而不是创建符号链接。 可能的步骤包括: 1. 确认ftdi_sio驱动是否正确加载,设备是否绑定。 2. 检查udev规则是否正确,重新加载规则并触发设备事件。 3. 确保用户权限,可能需要将用户加入dialout组。 4. 调试驱动问题,如查看dmesg日志,手动绑定设备ID。 5. 持久化配置,避免重启后配置丢失。 需要详细说明每个步骤的具体命令和验证方法,帮助用户逐步排查问题。例如,使用lsmod检查模块加载,使用udevadm info查看设备属性,使用journalctl跟踪udev事件等。 同时,要提醒用户检查硬件连接,排除供电或接触不良的问题,因为即使驱动正确,硬件问题也可能导致设备无法枚举。 最后,提供相关问题的建议,帮助用户进一步优化或解决其他可能的问题,比如如何定制udev规则或调整USB供电设置。</think>--- ### **分步解决方案:配置udev规则与调试ftdi_sio驱动** --- #### **一、核心问题定位** 1. **驱动未正确加载**:FTDI设备未绑定到 `ftdi_sio` 驱动(需检查 `dmesg` 日志中的 `FTDI USB Serial Device converter detected`)[^3]。 2. **udev规则未生效**:规则语法错误或未匹配设备属性(需验证 `ATTRS{idVendor}` 和 `ATTRS{idProduct}`)。 3. **权限配置缺失**:用户未加入 `dialout` 组或规则中未设置 `MODE` 参数。 --- #### **二、配置udev规则** ##### **1. 创建自定义udev规则文件** ```bash # 创建规则文件(以FTDI设备为例,VID=0403 PID=6001) sudo nano /etc/udev/rules.d/99-usb-serial.rules ``` ##### **2. 规则内容(关键字段)** ```bash # 强制绑定到ftdi_sio驱动,并设置权限(需替换实际VID/PID) SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", \ ACTION=="add", \ DRIVER=="ftdi_sio", \ RUN+="/sbin/modprobe ftdi_sio", \ MODE="0666", \ GROUP="dialout" ``` ##### **3. 生效规则并触发重载** ```bash # 重新加载udev规则并触发设备事件 sudo udevadm control --reload sudo udevadm trigger # 查看规则匹配情况(插入设备后运行) udevadm monitor --property ``` --- #### **三、ftdi_sio驱动调试** ##### **1. 手动加载驱动并绑定设备** ```bash # 卸载冲突驱动(如usbserial) sudo modprobe -r usbserial # 加载ftdi_sio驱动并指定设备ID(替换实际VID/PID) sudo modprobe ftdi_sio vendor=0x0403 product=0x6001 # 验证驱动绑定状态 ls /sys/bus/usb/drivers/ftdi_sio/ # 应显示设备目录 dmesg | grep ftdi_sio # 检查设备注册日志 ``` ##### **2. 持久化驱动绑定** ```bash # 在modprobe配置文件中固化参数(避免重启失效) echo "options ftdi_sio vendor=0x0403 product=0x6001" | sudo tee /etc/modprobe.d/ftdi.conf # 更新initramfs(Ubuntu必需) sudo update-initramfs -u ``` --- #### **四、权限与用户组验证** ```bash # 将当前用户加入dialout组 sudo usermod -aG dialout $USER # 立即生效组权限变更(需重新登录或执行以下命令) newgrp dialout # 检查设备权限(插入设备后) ls -l /dev/ttyUSB* # 权限应为 crw-rw-rw- ``` --- #### **五、调试工具与命令** ##### **1. 设备属性验证** ```bash # 获取设备详细信息(替换实际设备路径) udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0) ``` ##### **2. 驱动冲突检查** ```bash # 查看当前占用设备的驱动 lsof /dev/ttyUSB0 # 检查内核驱动绑定状态(需设备已插入) cat /sys/bus/usb/devices/<bus>-<port>/driver ``` ##### **3. 日志追踪** ```bash # 实时监控udev事件 journalctl -f -k -u systemd-udevd # 过滤FTDI相关内核日志 dmesg | grep -E 'ftdi_sio|usb' ``` --- #### **六、常见故障排查** 1. **设备节点未生成** - 检查 `dmesg` 中是否有 `FTDI USB Serial Device converter now attached to ttyUSBX` 的日志。 - 手动创建节点:`sudo mknod /dev/ttyUSB0 c 188 0`(不推荐,需确认主次设备号)。 2. **驱动加载失败** - 内核模块未编译:重新配置内核启用 `CONFIG_USB_SERIAL_FTDI_SIO` 并编译模块[^3]。 - 驱动黑名单:检查 `/etc/modprobe.d/blacklist.conf` 是否屏蔽了 `ftdi_sio`。 3. **udev规则未生效** - 使用 `udevadm test $(udevadm info -q path -n /dev/ttyUSB0)` 模拟规则执行过程。 --- ### **关键引用说明** - **驱动绑定**:通过 `modprobe ftdi_sio vendor=0x0403 product=0x6001` 可绕过默认驱动占用[^1]。 - **udev规则优先级**:规则文件名前缀数字越大优先级越高(如 `99-` 覆盖系统默认规则)[^2]。 - **权限持久化**:`MODE="0666"` 直接开放读写权限,适用于开发环境[^2]。 --- ### **相关问题** 1. 如何为多个同型号USB设备分配固定的 `/dev/ttyUSB` 编号? 2. 为什么修改udev规则后需要执行 `udevadm trigger`? 3. 如何在内核编译时永久启用 `ftdi_sio` 驱动?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值