udev rules文件语法

udev 规则文件(.rules 文件)的语法用于定义设备事件触发时的行为(如设备命名、权限设置、执行脚本等)。以下是 udev 规则语法 的详细说明和示例:


1. 规则文件基础

  • 文件位置
    • 系统默认规则:/usr/lib/udev/rules.d/
    • 用户自定义规则:/etc/udev/rules.d/(优先级更高)
  • 文件名格式数字-名称.rules(如 99-myrule.rules),数字越小优先级越高。

2. 规则语法结构

每条规则由 匹配键(匹配条件)赋值键(执行动作) 组成,格式如下:

键=="值", 键!="值", ... 动作键="值", 动作键+="值", ...
  • 逗号分隔:多个条件或动作用逗号分隔。
  • 行尾换行:每条规则占一行。

3. 常用匹配键(条件)

说明
KERNEL匹配内核设备名(如 ttyUSB*, sd*
SUBSYSTEM匹配设备子系统(如 usb, block, net
ATTR{属性名}匹配设备属性(如 ATTR{idVendor}=="0781"
ENV{变量名}匹配环境变量(如 ENV{DEVTYPE}=="usb_device"
ACTION匹配事件类型(add(添加设备), remove(移除设备), change(变更)
示例:
# 匹配所有USB存储设备
SUBSYSTEM=="block", KERNEL=="sd*", ATTR{removable}=="1"

4. 常用赋值键(动作)

说明
NAME重命名设备节点(如 NAME="mydisk"
SYMLINK创建符号链接(如 SYMLINK+="myusb"
MODE设置设备权限(如 MODE="0666"
GROUP设置设备所属组(如 GROUP="users"
OWNER设置设备所有者(如 OWNER="root"
RUN执行脚本或命令(如 RUN+="/bin/my_script.sh"
ENV{变量名}设置环境变量(如 ENV{ID_MM_DEVICE_IGNORE}="1"
示例:
# 为USB串口设备设置权限并创建符号链接
KERNEL=="ttyUSB*", ATTR{idVendor}=="0403", ATTR{idProduct}=="6001", MODE="0666", SYMLINK+="my_serial"

5. 运算符

运算符说明
==等于(匹配条件)
!=不等于(匹配条件)
=赋值(覆盖原有值)
+=追加赋值(不覆盖原有值)
:=最终赋值(禁止后续规则修改)

6. 高级用法

变量替换

使用 $% 引用变量:

# 使用设备属性作为变量
KERNEL=="sd*", PROGRAM="/usr/bin/get_disk_id %k", SYMLINK+="disk-%c"
  • %k:内核设备名(如 sda1)。
  • %cPROGRAM 命令的输出结果。
多条件组合
# 匹配特定厂商的USB设备,并排除某个产品ID
SUBSYSTEM=="usb", ATTR{idVendor}=="0781", ATTR{idProduct}!="5571", MODE="0666"
执行脚本
# 设备插入时执行脚本
ACTION=="add", KERNEL=="sd*", RUN+="/usr/bin/my_script.sh"

7. 调试规则

查看设备属性
udevadm info -a -p /sys/class/tty/ttyUSB0
测试规则
udevadm test /sys/class/tty/ttyUSB0
重新加载规则
sudo udevadm control --reload-rules
sudo udevadm trigger

8. 完整示例

为USB网卡重命名并设置权限
# /etc/udev/rules.d/99-my-net.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:11:22:33:44:55", NAME="mynet0", GROUP="netadmin", MODE="0660"
为摄像头设备创建符号链接
# /etc/udev/rules.d/99-webcam.rules
SUBSYSTEM=="video4linux", ATTR{idVendor}=="046d", ATTR{idProduct}=="0825", SYMLINK+="my_webcam"

9. 注意事项

  1. 避免修改 /usr/lib/udev/rules.d/:该目录会被系统更新覆盖。
  2. 规则顺序:文件名数字越小优先级越高(如 10-xxx.rules 优先于 20-yyy.rules)。
  3. 语法错误:错误的规则可能导致设备无法识别,建议用 udevadm test 测试。

通过合理编写 udev 规则,可以实现设备动态管理(如自动挂载、权限控制、重命名等)。

<think>嗯,用户想了解Linux系统中udev规则的使用与配置,包括使用指南、配置方法和最佳实践。这需要结合引用材料和系统知识整理一份全面的解答。 用户引用的四个材料很有价值:引用[3]解释了udev的内核层交互机制,引用[4]提供了USB设备配置实例,引用[1]和[2]则涉及日志管理与系统工具整合。这些材料正好覆盖了udev的理论基础、实操配置和运维管理三个层面。 考虑设计回答框架时,准备从概念开始层层深入:先说明udev是什么(动态设备管理核心),再讲规则文件结构(键值对语法),然后是具体配置场景(权限/链接/触发器),最后补充日志调试和最佳实践。这样符合认知逻辑。 注意到引用[4]中那个USB串口的配置案例特别实用,应该作为重点示例解析。这个规则同时解决了设备识别、权限分配和符号链接创建三个典型需求,能帮助用户理解规则的实际价值。准备在回答中拆解它的每个配置段含义。 对于高级部分,考虑强调udevmon和udevadm工具的使用(引用[2]提到过实时监控)。用户如果是运维人员,可能更关注故障排查技巧,所以准备把日志分析位置提前到配置方法之后。 最后的安全建议也很必要。引用[1]提到过udev配置会影响系统稳定性,准备补充两条关键原则:比如避免直接修改/lib/udev规则,以及测试时使用udevadm test避免重启风险。 </think>以下是Linux系统中`udev`规则的详细使用与配置指南,结合核心概念、实操方法和最佳实践: --- ### **一、udev 的核心作用** 1. **动态设备管理** - 取代静态`/dev`目录,实时响应设备插拔事件(如USB、硬盘)。 - 自动创建设备节点(如`/dev/sdb1`)[^3]。 2. **规则驱动的配置** - 通过用户自定义规则设置设备权限、符号链接、执行脚本等。 --- ### **二、规则文件配置详解** #### **1. 规则文件位置** ```bash /etc/udev/rules.d/ # 用户自定义规则(优先读取) /lib/udev/rules.d/ # 系统默认规则(勿直接修改) ``` - **优先级**:文件名以数字开头(如`99-myrule.rules`),数字越小优先级越高。 #### **2. 规则语法结构** ```bash ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", GROUP="dialout", MODE="0666", SYMLINK+="fdilink_ahrs" ``` - **键值说明**: - `ACTION`:设备事件类型(`add`/`remove`/`change`)。 - `SUBSYSTEM`:设备子系统(如`usb`、`tty`)。 - `ATTRS{属性名}`:设备属性(通过`udevadm info`查看)。 - `GROUP`/`MODE`:设置设备所属组和权限(如`0666`即所有用户可读写)。 - `SYMLINK+="别名"`:创建持久符号链接(避免`ttyUSB0`随机变化)。 #### **3. 关键操作命令** - **查看设备属性**(以USB设备为例): ```bash udevadm info -a -p /sys/class/tty/ttyUSB0 # 显示设备所有属性 ``` - **重载规则生效**: ```bash sudo udevadm control --reload-rules && sudo udevadm trigger ``` --- ### **三、典型配置场景示例** #### **场景1:为USB串口设备固定符号链接** ```bash # /etc/udev/rules.d/99-usb-serial.rules ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="fdilink_ahrs", GROUP="dialout", MODE="0666" ``` - **效果**:插入CP210x芯片设备时,自动创建`/dev/fdilink_ahrs`符号链接,并赋予`dialout`组读写权限[^4]。 #### **场景2:限制普通用户访问摄像头** ```bash ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="046d", GROUP="video", MODE="0640" ``` --- ### **四、日志分析与调试技巧** 1. **实时监控udev事件**: ```bash udevadm monitor --kernel --property # 显示内核发出的设备事件详情[^2] ``` 2. **查看历史日志**: ```bash journalctl -b -u systemd-udevd # 检索本次启动后的udev日志 ``` 3. **测试规则而不触发实际操作**: ```bash udevadm test /sys/class/tty/ttyUSB0 # 模拟规则匹配过程 ``` --- ### **五、最佳实践与注意事项** 1. **规则命名规范** - 使用`<数字>-<描述>.rules`格式(如`99-network.rules`),确保加载顺序。 2. **避免过度匹配** - 用`ATTRS`精确限定设备,而非仅依赖`SUBSYSTEM`。 3. **权限最小化** - 优先用`GROUP="dialout"`而非`MODE="0666"`,限制非必要用户的访问。 4. **备份与版本控制** - 将自定义规则纳入Git管理,避免配置丢失。 --- ### **六、进阶应用** - **触发自定义脚本**: ```bash ACTION=="add", RUN+="/usr/local/bin/mount_custom_drive.sh" ``` - **网卡重命名**: 通过`NAME="eth_internal"`覆盖默认名称(需配合`.link`文件)。 ---
<think>嗯,用户问的是如何在Linux中创建或配置Udev规则。我之前看到过相关的引用内容,比如引用[4]提到了创建/etc/udev/rules.d/99-oracle-asmdevices.rules文件,还有引用[1]中的PROGRAM和RESULT参数。可能需要先解释Udev规则的基本结构和存放位置。 首先,应该告诉用户Udev规则文件的存放目录是/etc/udev/rules.d/,文件名通常以数字开头,决定优先级。然后,规则的语法包括匹配键和赋值键,比如ACTION、KERNEL、ATTR等等。可能需要举个例子,比如根据SCSI ID来创建符号链接,就像引用[1]里的例子那样,使用PROGRAM获取SCSI ID,然后用SYMLINK+="asm-disk1"来创建链接。 另外,引用[3]提到了使用partprobe和udevtest测试规则,这部分需要提醒用户在修改规则后重新加载并测试。还有编写规则时要注意权限设置,比如设置GROUP和MODE,这在Oracle ASM中可能常用,引用[4]的文件可能就是这样的用例。 用户可能需要具体的步骤,比如如何确定设备属性,使用udevadm info命令。还有规则生效的步骤,比如重新加载规则,触发事件,或者重启服务。需要把这些步骤详细列出,确保用户能一步步操作。 最后,生成相关问题时要考虑用户可能的后续疑问,比如如何调试规则,常见错误,权限管理,持久化存储设备,与其他工具对比等等。这样能帮助用户更全面地理解和应用Udev规则。</think>### Udev规则创建与配置方法 UdevLinux系统中管理设备节点的核心服务,其规则文件存储在`/etc/udev/rules.d/`目录下。以下是具体步骤: --- #### **1. 规则文件基础** - **文件命名**:规则文件以数字前缀命名(如`99-oracle-asmdevices.rules`),数字越小优先级越高[^4]。 - **语法结构**: ```bash # 匹配条件 + 操作指令 SUBSYSTEM=="block", ACTION=="add", ENV{DEVTYPE}=="disk", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="SATA_VBOX_HARDDISK_VBd306dbe0-df3367e3_", SYMLINK+="asm-disk1" ``` 其中: - **匹配键**:`SUBSYSTEM`, `ACTION`, `ATTR{属性名}`, `ENV{变量名}` - **操作键**:`SYMLINK`, `GROUP`, `MODE`, `RUN` --- #### **2. 关键操作示例** - **创建设备符号链接**(适用于存储设备绑定): ```bash SUBSYSTEM=="block", KERNEL=="sdb1", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="<SCSI_ID>", SYMLINK+="asm-disk1" [^1] ``` - **设置设备权限**: ```bash SUBSYSTEM=="block", ATTR{size}=="2097152", GROUP="oracle", MODE="0660" ``` --- #### **3. 设备属性获取** 通过`udevadm info`命令查询设备属性: ```bash udevadm info --query=property --name=/dev/sdb1 ``` 输出示例: ``` DEVPATH=/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/sdb1 ID_SCSI=1 ID_VENDOR=ATA ``` --- #### **4. 规则生效步骤** 1. **重载规则**: ```bash sudo udevadm control --reload-rules ``` 2. **触发设备事件**(可选): ```bash sudo udevadm trigger --type=devices --action=change ``` 3. **验证规则**(通过`udevadm test`模拟)[^3]: ```bash sudo udevadm test /block/sdb/sdb1 ``` --- #### **5. 典型用例** - **Oracle ASM磁盘绑定**:通过SCSI ID固定设备路径[^4]。 - **USB设备自动挂载**:匹配`ID_VENDOR`和`ID_MODEL`设置挂载脚本。 ---
<think> 我们正在讨论如何更新 `/etc/udev/rules.d/99-platformio-udev.rules` 文件。根据引用中提到的udev规则文件创建和修改的方法,我们可以总结出以下步骤: 1. **备份原始文件**:在修改任何配置文件之前,备份是一个好习惯。 2. **获取最新规则文件**:通常,更新规则文件意味着获取最新版本的规则内容。对于PlatformIO,最新的规则文件可以在其官方文档或GitHub仓库中找到。 3. **替换或修改文件**:将新规则内容写入到目标文件中。 4. **重新加载udev规则**:修改后需要重新加载udev规则,使更改生效而不需要重启。 具体步骤: ### 步骤1: 备份现有规则文件 ```bash sudo cp /etc/udev/rules.d/99-platformio-udev.rules /etc/udev/rules.d/99-platformio-udev.rules.bak ``` ### 步骤2: 获取最新的规则文件 通常,PlatformIO的udev规则文件可以从其官方仓库获取。我们可以使用`curl`或`wget`下载最新版本。 例如,从PlatformIO的GitHub仓库下载: ```bash sudo curl -o /etc/udev/rules.d/99-platformio-udev.rules https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules ``` 或者使用`wget`: ```bash sudo wget -O /etc/udev/rules.d/99-platformio-udev.rules https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules ``` ### 步骤3: 检查文件内容(可选) 下载完成后,可以查看文件内容确保正确: ```bash cat /etc/udev/rules.d/99-platformio-udev.rules ``` ### 步骤4: 重新加载udev规则 ```bash sudo udevadm control --reload-rules sudo udevadm trigger ``` 这样,新的规则就会立即生效。 ### 注意事项: - 如果下载过程中出现网络问题,可以尝试重新下载。 - 如果系统中有多个用户需要访问设备,可能需要调整规则中的用户组(GROUP)和权限(MODE)。 - 如果设备仍然无法访问,可能需要重新插拔设备或重启系统。 通过以上步骤,就可以更新`99-platformio-udev.rules`文件到最新版本。 §§相关问题§§ 1. 如何检查udev规则是否生效? 2. 如何为特定的USB设备自定义udev规则? 3. 在更新udev规则后,为什么设备仍然没有权限? </think>要更新 `/etc/udev/rules.d/99-platformio-udev.rules` 文件,请按照以下步骤操作: ### 更新步骤 1. **获取最新规则文件**: ```bash sudo curl -o /etc/udev/rules.d/99-platformio-udev.rules \ https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules ``` 这直接从 PlatformIO 官方仓库下载最新规则文件覆盖旧文件[^1]。 2. **手动编辑(可选)**: ```bash sudo nano /etc/udev/rules.d/99-platformio-udev.rules ``` 按需修改后保存(如添加新设备 ID 或调整权限)。 3. **重载 udev 规则**: ```bash sudo udevadm control --reload-rules sudo udevadm trigger ``` 使新规则立即生效,无需重启[^1][^3]。 4. **验证设备权限**: ```bash ls -l /dev/ttyUSB* # 检查串口设备权限 groups # 确认用户是否在 dialout 组 ``` ### 关键配置说明 - **用户组要求**:确保用户属于 `dialout` 组(串口设备): ```bash sudo usermod -aG dialout $USER ``` - **规则文件位置**:所有自定义规则需放在 `/etc/udev/rules.d/`,文件名前缀决定加载顺序(数字越小优先级越高)[^1][^4]。 ### 故障排查 - 若设备未识别:重启服务 `sudo systemctl restart udev` - 检查规则语法:`udevadm test /sys/class/tty/ttyUSB0 2>&1 | grep error` - 查看日志:`journalctl -f -u udev`(实时监控设备事件) > **注意**:更新后需重新插拔 USB 设备使新规则生效[^3]。
<think>好的,我现在需要帮助用户解决多个RealSense udev规则冲突的问题。用户提到有两个文件,99-realsense-libusb.rules和60-librealsense2-udev-rules.rules,可能存在冲突。我应该先回顾udev规则的基本知识,然后分析可能的问题来源。 首先,udev规则文件是按文件名顺序处理的,数字越小的文件越先加载。用户的两个文件分别是60开头和99开头,所以60的会先加载,99的后加载。如果有重复的规则,后加载的可能会覆盖前面的,导致冲突。用户需要确认这两个文件中的内容是否有重复或冲突的规则。 接下来,我应该建议用户检查这两个文件的内容,使用cat或文本编辑器查看。比如,使用命令`cat /etc/udev/rules.d/60-librealsense2-udev-rules.rules`和`cat /etc/udev/rules.d/99-realsense-libusb.rules`。比较两者中的规则是否针对相同的设备或属性,或者是否有不同的配置导致冲突。 用户需要保留哪个规则呢?通常,librealsense2的官方规则(60开头)可能更可靠,而99开头的可能是第三方或旧版。如果确认99的文件是多余的,可以删除它。但需要谨慎,避免误删必要的规则。 然后,处理步骤应该是先备份现有的规则文件,防止出错后可以恢复。使用sudo cp命令复制到备份目录。之后,删除多余的规则文件,比如sudo rm 99-realsense...。接着重新加载udev规则,使用sudo udevadm control --reload-rules和sudo udevadm trigger,然后重新插拔设备测试是否正常工作。 如果问题仍然存在,可能需要进一步检查是否有其他冲突的规则文件,或者考虑合并两个规则中的必要内容到一个文件中,并调整文件名顺序。不过合并需要小心处理,确保语法正确,避免新的冲突。 最后,生成相关问题,可能涉及如何检查udev规则是否生效,如何调试udev问题,以及如何编写自定义的udev规则等。</think>### 解决RealSense udev规则冲突的步骤 #### 1. **确认规则文件的作用与优先级** - udev规则文件文件名**字典序**加载,数字越小优先级越高。例如:`60-*.rules`会先于`99-*.rules`加载。 - 冲突通常源于**重复的设备权限定义**或**属性匹配规则覆盖**。需检查两个文件是否包含相同设备的规则[^1]。 #### 2. **检查文件内容** - 使用以下命令查看文件内容: ```bash cat /etc/udev/rules.d/60-librealsense2-udev-rules.rules cat /etc/udev/rules.d/99-realsense-libusb.rules ``` - 重点关注`SUBSYSTEM=="usb"`、`ATTR{idVendor}`和`ATTR{idProduct}`字段的重复项。 #### 3. **移除多余规则** - **保留官方推荐规则**:`60-librealsense2-udev-rules.rules`是librealsense2官方提供的,通常更可靠。 - **删除冲突文件**: ```bash sudo rm /etc/udev/rules.d/99-realsense-libusb.rules ``` #### 4. **重新加载udev规则** ```bash sudo udevadm control --reload-rules # 重新加载规则 sudo udevadm trigger # 触发规则生效 ``` 完成后重新插拔RealSense设备,验证是否正常工作。 #### 5. **处理特殊情况** - 若仍需保留部分自定义规则,可合并两个文件内容到新文件(如`60-custom-realsense.rules`),并删除原文件。 - 确保合并后的规则语法正确,无重复条目。 ---
<think>嗯,用户想通过udev规则把网卡eth36改成eth34,还要检查/etc/udev/rules.d/目录下的文件。首先,我得回顾一下之前给他的步骤,结合现在提供的引用内容,确保信息准确。用户之前的回答里提到了修改udev规则文件、更新网络配置、禁用一致性命名等步骤。现在用户特别提到要参考站内引用,其中引用[1]来自KylinOS,步骤包括查看网卡信息、创建udev规则、重新加载规则和重启系统。引用[2]和[3]提到Ubuntu不同版本的情况,尤其是可能没有70-persistent-net.rules文件,需要新建。引用[4]则展示了规则文件的具体内容。 首先,我需要确认用户当前的系统是哪个发行版,因为不同系统的udev规则文件位置可能不同。比如,Ubuntu可能没有70-persistent-net.rules,而CentOS或KylinOS可能有。用户现在的问题中并没有明确系统,所以得给出通用的方法,同时涵盖不同情况。 步骤一应该是获取eth36的MAC地址,使用ip link或者cat/sys/class/net/eth36/address。然后检查/etc/udev/rules.d/目录下是否有相关规则文件,如70-persistent-net.rules或80-net-name-slot.rules。如果不存在,可能需要新建,尤其是像Ubuntu的情况。创建或修改规则文件时,要确保语法正确,SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="MAC",NAME="eth34"。注意引用[1]和[4]中的例子,可能不需要DRIVERS和KERNEL参数,但有些系统可能需要。需要提醒用户根据实际情况调整。然后重新加载udev规则并触发,接着重启系统。用户需要验证是否生效,使用iplink show看看网卡名是否改变。如果没变,可能需要检查规则文件是否有错,或者是否存在其他冲突的规则。另外,用户提到要确认目录下的配置文件是否存在,所以需要指导用户使用ls命令检查,比如ls /etc/udev/rules.d/*net*.rules,列出相关文件。可能的问题包括:规则文件权限问题、语法错误、多个规则冲突、系统使用Predictable NetworkInterfaceNames(需要禁用)等。比如引用[3]提到Ubuntu20.04使用新式命名,可能需要修改GRUB参数,但用户的问题里没有提到这点,可能需要作为注意事项补充。 最后生成相关问题时,可以围绕如何调试规则不生效、不同发行版的差异、如何避免冲突等。</think>### **通过udev规则修改网卡名称的完整步骤** --- #### **步骤1:获取网卡MAC地址** 1. 查看网卡`eth36`的MAC地址: ```bash cat /sys/class/net/eth36/address ``` 或 ```bash ip link show eth36 | grep link/ether | awk '{print $2}' ``` 输出示例:`00:e0:4c:90:06:83`[^1] --- #### **步骤2:创建/修改udev规则文件** 1. **检查现有规则文件**: ```bash ls /etc/udev/rules.d/*net*.rules ``` 常见文件包括: - `70-persistent-net.rules`(传统命名规则)[^1] - `80-net-name-slot.rules`(新式命名规则) 2. **编辑或新建规则文件**: ```bash sudo vim /etc/udev/rules.d/70-persistent-net.rules ``` 若文件不存在(如Ubuntu系统),需手动创建[^2]。 3. **添加规则内容**: ```bash SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:e0:4c:90:06:83", NAME="eth34" ``` - `ATTR{address}`替换为步骤1获取的MAC地址 - `NAME`字段指定新名称`eth34`[^4] --- #### **步骤3:重新加载规则并验证** 1. 应用新规则: ```bash sudo udevadm control --reload-rules sudo udevadm trigger ``` 2. **重启系统**确保生效: ```bash sudo reboot ``` 3. **验证网卡名称**: ```bash ip link show | grep eth34 ``` --- #### **步骤4:处理命名冲突(可选)** 若系统使用新式命名(如`enp0s3`),需禁用: 1. 编辑GRUB配置文件: ```bash sudo vim /etc/default/grub ``` 2. 添加参数: ```bash GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0" ``` 3. 更新GRUB并重启[^3]。 --- ### **常见问题排查** | 现象 | 解决方案 | |------|----------| | 规则未生效 | 检查MAC地址和规则语法,确保无拼写错误[^1] | | 文件不存在 | 手动创建`70-persistent-net.rules`[^2] | | 名称冲突 | 禁用其他命名规则(如`80-net-name-slot.rules`) | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值