如何在Linux下固定ttyUSBx设备名称使其重启后持久化?

在Linux系统中,USB串口设备(如CH340、FT232、PL2303等)插入时,系统会动态分配设备名(如ttyUSB0、ttyUSB1等),但设备名的分配顺序取决于插入时机,可能导致同一设备在不同时间插入时名称变化(如先插入的设备被识别为ttyUSB1,后插入的反而成为ttyUSB0),这种不确定性会影响依赖固定设备名的脚本、应用程序或服务(如串口通信程序、工业设备控制等),因此需要通过固定ttyUSBx设备名来解决这一问题,核心方法是利用udev(Linux设备管理器)创建规则,根据设备的唯一属性(如Vendor ID、Product ID、序列号等)绑定固定的设备名或符号链接。

如何固定linux下ttyusbx

获取USB串口设备的唯一属性

编写udev规则前,需先确定目标设备的唯一标识信息,避免与其他设备冲突,常用属性包括Vendor ID(厂商ID)、Product ID(产品ID)、序列号(Serial Number)及设备路径等,获取方法如下:

  1. 使用lsusb命令识别设备
    执行lsusb会列出所有USB设备,找到目标串口设备,记录其Vendor ID和Product ID(格式为idVendor:idProduct,如1a86:7523)。
    示例输出:

    Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics CH340 serial converter

    此处1a86为Vendor ID,7523为Product ID。

  2. 通过udevadm获取详细信息
    若多个设备同型号(Vendor ID和Product ID相同),需进一步区分,可通过序列号或设备路径,插入设备后,执行:

    udevadm info -a -n /dev/ttyUSB0 --query=all

    在输出中查找ATTRS{idVendor}ATTRS{idProduct}ATTRS{serial}(若有)等字段,记录设备的唯一属性。
    示例关键输出:

    如何固定linux下ttyusbx

    ATTRS{idVendor}=="1a86"
    ATTRS{idProduct}=="7523"
    ATTRS{serial}=="1234567890abcdef"

编写udev规则固定设备名

udev规则文件存放在/etc/udev/rules.d/目录下,文件名需以.rules数字越小优先级越高(如99-usb-serial.rules),规则语法核心是通过SUBSYSTEMATTRS等条件匹配设备,再通过SYMLINKNAME绑定固定名称。

基本规则语法

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="xxxx", SYMLINK+="my_device"
  • ACTION=="add":设备插入时触发;
  • SUBSYSTEM=="tty":匹配tty设备(即串口设备);
  • ATTRS{idVendor}ATTRS{idProduct}:匹配设备的厂商和产品ID;
  • SYMLINK+="my_device":创建固定名称的符号链接(如/dev/my_device指向实际设备/dev/ttyUSB0),推荐使用SYMLINK而非直接修改NAME,避免覆盖默认设备名导致兼容性问题。

多设备区分规则

若存在多个同型号设备,需通过序列号(ATTRS{serial})或设备路径(KERNELS)进一步区分:

  • 通过序列号区分
    ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="1234567890abcdef", SYMLINK+="device_1"
    ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="abcdef1234567890", SYMLINK+="device_2"
  • 通过设备路径区分(若设备插入不同物理端口):
    ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-1.1", SYMLINK+="device_1"
    ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-1.2", SYMLINK+="device_2"

    KERNELS可通过udevadm info -a -n /dev/ttyUSB0中的KERNELS字段获取。

设置设备权限(可选)

若需固定用户访问权限,可在规则中添加MODEGROUP

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="my_device", MODE="0666", GROUP="dialout"
  • MODE="0666":所有用户可读写;
  • GROUP="dialout":将设备加入dialout组(默认串口用户组),需确保用户在该组内(可通过usermod -aG dialout $USER添加)。

加载并测试udev规则

  1. 重新加载udev规则
    sudo udevadm control --reload-rules
  2. 触发规则生效
    sudo udevadm trigger
  3. 验证设备名
    拔插设备后,检查/dev/下是否出现固定符号链接(如/dev/my_device),并通过ls -l /dev/my_device确认指向实际设备(如/dev/ttyUSB0)。
    示例输出:

    lrwxrwxrwx 1 root root 7 Dec 1 10:00 /dev/my_device -> ttyUSB0

USB串口设备属性总结表

属性名 获取方式 规则中示例 作用说明
Vendor ID lsusbudevadm info ATTRS{idVendor}=="1a86" 匹配设备厂商
Product ID lsusbudevadm info ATTRS{idProduct}=="7523" 匹配设备型号
序列号 udevadm info(需设备支持) ATTRS{serial}=="1234567890" 区分同型号不同设备
设备路径 udevadm info(KERNELS字段) KERNELS=="1-1.1" 匹配设备插入的物理USB端口
子系统 固定(串口设备为”tty”) SUBSYSTEM=="tty" 确保匹配串口设备

FAQs

Q1:为什么我的udev规则编写后没有生效?
A:可能原因包括:① 规则文件语法错误(可通过udevadm test /sys/class/tty/ttyUSBx测试);② 设备属性不匹配(如Vendor ID/Product ID写错);③ 未重新加载规则或触发udev(执行udevadm control --reload-rulesudevadm trigger);④ 规则文件名优先级过低(确保文件名数字小于默认规则,如99-xxx.rules),检查/var/log/syslogjournalctl -u udev查看udev日志,定位错误原因。

如何固定linux下ttyusbx

Q2:如何为多个同型号USB串口设备分别分配固定名称?
A:若设备支持序列号,优先通过序列号区分(如ATTRS{serial}=="xxx");若不支持序列号,可通过设备路径(KERNELS)区分(如插入到主板的USB端口1和端口2,路径分别为1-1.11-1.2),编写多条规则,每条规则匹配唯一属性并分配不同的SYMLINK名称,

# 设备1(插入端口1-1.1)
ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-1.1", SYMLINK+="device_port1"
# 设备2(插入端口1-1.2)
ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-1.2", SYMLINK+="device_port2"

拔插设备后,通过ls -l /dev/device_port*验证是否正确绑定。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/31709.html

(0)
酷番叔酷番叔
上一篇 2025年9月28日 09:37
下一篇 2025年9月28日 09:51

相关推荐

  • Linux下FLTK环境配置如何快速上手?

    在Linux中启动FLTK需三步:安装开发库,编写FLTK程序源码,最后编译链接并运行生成的可执行文件。

    2025年7月28日
    10800
  • Linux如何删除文本行?常用命令与操作步骤有哪些?

    在Linux系统中,删除文本行是日常文本处理中的常见需求,无论是日志分析、配置文件修改还是数据清洗,都可能涉及这一操作,Linux提供了多种命令行工具和编辑器来实现文本行的删除,每种工具都有其适用场景和语法特点,掌握这些方法能显著提升文本处理效率,本文将详细介绍几种主流的删除文本行方式,包括sed、awk、gr……

    2025年10月3日
    9300
  • 如何格式化Linux?操作步骤与注意事项解析?

    格式化Linux系统中的存储设备(如硬盘、U盘或分区)是指为其创建文件系统的过程,以便操作系统识别并管理数据存储,以下是详细的格式化方法、工具选择及注意事项,帮助用户安全高效完成操作,格式化的基本概念与准备工作格式化的本质是在存储设备上建立特定的文件系统结构(如ext4、xfs等),使数据能够按规则写入和读取……

    2025年8月30日
    9100
  • 如何轻松掌握高效方法?

    系统日志的位置与分类Linux日志文件通常存储在 /var/log/ 目录下,常见日志包括:系统核心日志:/var/log/messages(CentOS/RHEL)或 /var/log/syslog(Debian/Ubuntu)认证日志:/var/log/auth.log(记录登录、sudo操作)内核日志……

    2025年7月5日
    13700
  • linux如何查看账号

    Linux 中,可通过命令 cat /etc/passwd 查看

    2025年8月13日
    11600

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信