如何在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系统如何查看时间

    Linux系统中,可通过date命令查看当前时间,如在终端输入date即可

    2025年8月10日
    4900
  • Linux如何查看当前登录的用户信息?

    在Linux系统中,查看登录用户是系统管理和安全维护的基础操作,无论是监控当前系统使用情况、排查异常登录行为,还是优化资源分配,都需要掌握相关命令和方法,本文将详细介绍Linux系统中查看登录用户的多种命令,包括其功能、参数、输出示例及适用场景,帮助管理员根据实际需求选择合适的工具,基础查看命令:whowho是……

    2025年10月3日
    3300
  • ngrok如何实现内网穿透?

    ngrok 是一款开源的网络隧道工具,可将本地服务(如 Web 服务器、SSH 等)安全地暴露到公网,生成临时域名供外部访问,适用于开发调试、演示、远程访问等场景,支持 HTTPS、TCP 隧道等功能,Linux 安装 ngrok 详细步骤步骤 1:下载 ngrok 客户端打开终端,通过官方源下载最新版(以 6……

    2025年6月16日
    7000
  • linux如何查看jdk是否安装成功

    Linux 中,可以通过命令 java -version 来查看 JDK 是否安装

    2025年8月14日
    8800
  • 如何按字母降序排列文件内容?

    在Linux系统中,降序排列数据通常通过sort命令实现,结合其反向排序选项-r,以下是详细操作指南:核心命令语法sort -r [选项] [文件]-r(–reverse):核心降序参数,将默认升序转为降序,常用辅助选项:-n:按数值大小排序(避免”10″排在”2″前),-k:指定排序的列(如-k 2表示按第……

    2025年7月1日
    6900

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信