news 2026/8/4 15:01:45

Ubuntu USB设备排查指南:从lsusb到内核监控与故障诊断

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu USB设备排查指南:从lsusb到内核监控与故障诊断

1. 项目概述:为什么需要深入查看USB设备信息

在Ubuntu系统下捣鼓硬件,尤其是USB设备,几乎是每个开发者、运维工程师乃至技术爱好者的日常。你可能遇到过这样的场景:新买的USB网卡插上去没反应,想确认系统到底认没认出来;或者一个U盘在文件管理器里不显示,需要判断是硬件故障还是驱动问题;又或者,你需要精确获取某个USB设备的厂商ID、产品ID,以便为其手动安装特定的驱动程序。这些时候,仅仅依赖图形界面的“磁盘”工具或者文件管理器是远远不够的,它们提供的信息太表层,一旦设备出现异常,你就像被蒙住了眼睛。

lsusb命令是大家最熟悉的起点,它就像一份USB总线的设备清单。但这份清单往往只告诉你“有什么”,对于“它是什么”、“它怎么了”、“为什么不行”这些问题,就显得力不从心了。一个设备在lsusb里能看到,却无法挂载,问题可能出在内核模块、udev规则、文件系统或者权限上。因此,掌握一套从浅入深、从列举到诊断的完整USB设备信息查看方法,是一项非常实用的系统级技能。这不仅能帮你快速定位硬件兼容性问题,还能在驱动开发、逆向工程或者系统调优时,提供关键的低层信息。

本文将带你超越lsusb,系统性地梳理在Ubuntu下查看USB设备信息的各种工具和方法。我们会从最基础的设备列表开始,逐步深入到内核信息、详细参数、实时监控乃至故障排查,目标是让你在遇到USB相关问题时,能有一套清晰的排查思路和趁手的工具链,而不是盲目地搜索和尝试。

2. 核心工具链与思路解析

面对USB设备问题,一个清晰的排查思路比记住所有命令更重要。我的经验是遵循一个从“宏观”到“微观”、从“静态”到“动态”的流程。首先,你需要确认设备是否被系统内核识别,这是所有后续操作的基础。然后,了解设备的详细信息,包括它的“身份”(厂商、产品)和“能力”(速度、协议)。接着,观察设备与系统交互的动态过程,这在设备突然失灵或无法枚举时特别有用。最后,结合具体问题(如挂载失败、权限不足),深入到相应的子系统(如存储、网络)进行专项排查。

整个工具链可以大致分为四层:

  1. 基础枚举层:使用lsusbusb-devices等工具,快速列出所有已连接的USB设备,建立整体视图。
  2. 详细信息层:通过lsusb -v、查看sysfs文件系统,获取设备的详细描述符、配置、接口等底层信息。
  3. 动态监控层:利用dmesgjournalctl以及专门的usbmon工具,实时捕获内核与USB设备的通信日志,观察枚举、加载驱动等过程。
  4. 专项诊断层:针对特定类型的设备,如大容量存储设备,使用lsblkfdiskudevadm等工具进行更具体的操作和诊断。

这个分层思路能帮你避免在问题面前感到混乱。例如,一个U盘不显示,你应该先走完1、2层,确认系统识别了它的基本USB身份;然后通过第3层查看是否有错误日志;最后用第4层的工具检查它是否被正确识别为块设备以及分区是否正常。

3. 基础枚举:快速建立设备清单

3.1 使用 lsusb 命令

lsusb无疑是查看USB设备的瑞士军刀,它直接查询系统的USB总线,列出所有连接的主控制器和下游设备。不带任何参数运行,它会输出一个简洁的列表。

lsusb

输出通常如下:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 8087:0aaa Intel Corp. Bus 001 Device 003: ID 04f2:b5c9 Chicony Electronics Co., Ltd Integrated Camera Bus 001 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

每一行都包含关键信息:

  • Bus XXX Device XXX:这是设备在USB拓扑中的“地址”。Bus指USB总线编号,Device是该总线上的设备编号。这个编号在设备重新插拔后可能会变化。
  • ID xxxx:xxxx:这是设备的“身份证”,由**厂商ID(VID)产品ID(PID)**组成,以冒号分隔。例如046d:c52b046d是罗技的厂商ID,c52b对应Unifying接收器这个产品。这个ID是稳定且唯一的,是识别设备和寻找驱动的最重要依据。
  • 后面的描述是内核根据ID从内置的硬件数据库中找到的友好名称,有时可能显示为Generic Mass Storage之类的通用名。

注意lsusb列出的设备,是已经被USB核心子系统成功枚举的设备。如果设备在物理层就有问题(如供电不足、线缆损坏),或者刚一枚举就导致内核崩溃,它可能不会出现在这个列表里。

3.2 获取树状视图与详细信息

基础的lsusb输出是扁平的。使用-t参数可以显示树状视图,清晰地展示USB主机控制器、集线器(Hub)和设备之间的层级关系。

lsusb -t

输出示例:

/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M |__ Port 4: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M |__ Port 6: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M

这个视图非常有用,它能告诉你:

  • 驱动(Driver):当前设备由哪个内核模块驱动。例如uvcvideo是USB摄像头的通用驱动,usbhid是USB键鼠等HID设备驱动。
  • 速度:末尾的5000M480M12M分别对应USB 3.0(5Gbps)、USB 2.0(480Mbps)和USB 1.1(12Mbps)的速度。如果这里显示的速度远低于你的设备标称值(比如一个USB 3.0的U盘显示为480M),可能意味着它插在了USB 2.0的端口上,或者线缆、接口有问题。
  • 拓扑:可以看到设备具体连接在哪个根集线器的哪个端口上,对于排查物理连接问题有帮助。

如果你想查看某个特定设备,可以先使用lsusb找到其总线号和设备号,然后使用-s参数指定查看:

lsusb -s 001:003

这条命令将只显示总线001、设备003的详细信息。

4. 深入细节:窥探设备描述符与内核视图

4.1 使用 lsusb -v 挖掘描述符信息

当你需要更详细的信息时,lsusb -v(verbose)是下一个利器。它会尝试从设备读取并解析USB描述符——这是设备在枚举时告诉主机“我是谁,我能做什么”的一整套数据结构。

# 查看所有设备的详细信息(输出会非常长) lsusb -v # 通常建议结合-s参数查看特定设备 lsusb -v -s 001:003

-v的输出包含大量技术细节,对于驱动开发或深度调试至关重要。关键部分包括:

  • 设备描述符(Device Descriptor):包含bcdUSB(设备遵循的USB规范版本,如2.0、3.0)、设备类(bDeviceClass)、厂商ID、产品ID、序列号等。
  • 配置描述符(Configuration Descriptor):设备可能支持多种配置(如高功耗高性能模式、低功耗模式),这里会列出。
  • 接口描述符(Interface Descriptor):一个配置下可以有多个接口。例如,一个USB摄像头可能包含一个视频流接口和一个音频接口。这里会指定接口的类(bInterfaceClass)、子类(bInterfaceSubClass)和协议(bInterfaceProtocol),这是内核为其匹配驱动的主要依据。
  • 端点描述符(Endpoint Descriptor):接口内的具体通信通道,包括类型(控制、中断、批量、等时)和方向(输入、输出)。

对于大多数用户,lsusb -v输出中最有用的可能是确认设备的序列号(iSerial),或者在设备使用通用驱动(如usb-storage)时,确认其接口类的具体子类信息。

4.2 探索 sysfs 文件系统

Linux内核通过sysfs文件系统(通常挂载在/sys)向用户空间暴露设备信息。USB设备的信息主要在/sys/bus/usb/devices/目录下。这里的目录命名规则与lsusb -t的树状结构对应。

# 列出所有USB设备在sysfs中的节点 ls -l /sys/bus/usb/devices/ # 进入特定设备目录,例如 usb1(通常代表第一个USB根集线器) cd /sys/bus/usb/devices/usb1

在设备目录下,你可以直接cat很多文件来获取信息:

  • idVendor,idProduct:对应VID和PID。
  • manufacturer,product:厂商和产品字符串(如果设备提供了且内核成功读取)。
  • serial:序列号。
  • speed:设备当前运行速度。
  • bConfigurationValue:当前激活的配置编号。
  • removable:设备是否可移动。
  • driver:一个指向当前绑定驱动的符号链接。

例如,查看一个设备的厂商和产品字符串:

cat /sys/bus/usb/devices/1-4/idVendor cat /sys/bus/usb/devices/1-4/idProduct cat /sys/bus/usb/devices/1-4/manufacturer 2>/dev/null || echo "Not available"

实操心得sysfs中的信息是实时反映内核状态的。当设备被拔出时,对应的目录会消失。这对于编写脚本监控设备插拔非常有用。另外,有些信息(如manufacturer)可能因为权限或设备未提供而读取失败,使用2>/dev/null可以屏蔽错误输出,让脚本更健壮。

4.3 使用 usb-devices 脚本

系统通常还提供一个名为usb-devices的shell脚本(位于/usr/bin//sbin/),它能以一种更规整、可读性更强的格式汇总信息,其内容正是解析自/sys/bus/usb/devices/

usb-devices

它的输出按设备块组织,包含了从sysfs提取的绝大部分关键信息,格式比lsusb -v更友好,适合快速浏览多个设备的详细信息。

5. 动态监控:捕捉内核与设备的对话

5.1 使用 dmesg 跟踪内核日志

当插入或拔出USB设备时,内核会输出大量的日志信息。dmesg命令是查看这些环形缓冲区日志的首选工具。为了专注于USB事件,我们通常结合greptail使用。

# 插入设备前,先清空当前缓冲区(可选,方便观察) sudo dmesg -C # 插入你的USB设备(例如U盘) # 查看最新的内核日志,筛选与USB相关的行 dmesg | tail -30 # 或者更精确地筛选 dmesg | grep -i usb dmesg | grep -i “usb.*storage” # 针对存储设备

dmesg的输出中,你需要关注:

  • 设备识别:类似usb 1-1.2: new high-speed USB device number 12 using xhci_hcd的消息,表示内核发现了新设备并分配了设备号。
  • 描述符读取Product:Manufacturer:SerialNumber:等信息。
  • 驱动匹配与绑定usb-storage 1-1.2:1.0: USB Mass Storage device detectedscsi hostX: usb-storage。这表明USB存储驱动已识别设备并将其转换为SCSI磁盘。
  • 块设备创建sd Y: sdY1: assuming drive cache: write through。这里的sdY(如sdb)就是系统分配给该存储设备的块设备名。
  • 错误信息:任何errorfailedresettimeout等关键词,都是排查问题的重要线索,例如device descriptor read/64, error -110可能表示通信超时。

5.2 使用 journalctl 查看系统日志

对于使用systemd的现代Ubuntu发行版,journalctl提供了更强大、更结构化的日志查询方式,并且默认会持久化存储。

# 查看所有与内核相关的日志(包含USB消息) sudo journalctl -k # 实时追踪新产生的日志 sudo journalctl -k -f # 结合时间筛选,查看最近5分钟的日志 sudo journalctl -k --since “5 minutes ago” | grep -i usb # 更精确地查看特定子系统(如内核、udev)的日志 sudo journalctl -t kernel | tail -50 sudo journalctl -t udev | tail -50

udev的日志尤其重要,它记录了设备节点(如/dev/sdb1)创建、权限设置、符号链接建立等用户空间设备管理事件。如果一个设备内核识别了(dmesg有记录)但没有出现预期的设备节点,查看udev日志是必须的。

5.3 高级监控:usbmon(如需进行USB协议分析)

对于极少数需要分析USB底层通信协议的场景(例如开发USB设备驱动、进行USB逆向工程),usbmon是一个内核内置的工具。它可以捕获USB总线上所有的URB(USB Request Block)请求和响应数据。

使用usbmon需要先加载内核模块,并挂载debugfs(如果尚未挂载):

# 加载 usbmon 模块 sudo modprobe usbmon # 确保 debugfs 已挂载 sudo mount -t debugfs none_debugs /sys/kernel/debug # 查看可用的usbmon接口,通常 usbmon0 对应所有总线 ls /sys/kernel/debug/usb/usbmon/ # 使用 cat 捕获指定总线的数据(例如总线1),输出将是二进制/文本混合的原始数据流 sudo cat /sys/kernel/debug/usb/usbmon/1u > /tmp/usbmon.log # 按 Ctrl+C 停止捕获

重要提示usbmon的输出是极其底层的协议数据,信息量巨大且难以直接阅读,通常需要配合wireshark等专业工具进行解析。除非你明确需要进行数据包级别的调试,否则在日常问题排查中很少需要用到它。此外,持续捕获会生成大量数据,注意磁盘空间。

6. 专项诊断:针对存储、网络等设备类型

6.1 存储设备(U盘、移动硬盘)

对于USB存储设备,在完成上述通用识别后,重点转向块设备层。

  1. 确认块设备节点:使用lsblkfdisk -l查看是否出现了新的块设备(如sdb,sdc)及其分区(sdb1)。

    lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL fdisk -l

    lsblkMODEL列有时能从设备中读取到磁盘型号,非常直观。

  2. 检查文件系统与挂载:如果看到了分区(如sdb1),但未自动挂载,可以手动检查文件系统并挂载。

    # 查看文件系统类型 sudo blkid /dev/sdb1 # 尝试手动挂载 sudo mkdir -p /mnt/usb_drive sudo mount /dev/sdb1 /mnt/usb_drive # 如果挂载失败,根据blkid的结果尝试指定文件系统类型 sudo mount -t vfat /dev/sdb1 /mnt/usb_drive sudo mount -t ntfs-3g /dev/sdb1 /mnt/usb_drive # 需要安装 ntfs-3g sudo mount -t exfat /dev/sdb1 /mnt/usb_drive # 需要安装 exfat-fuse
  3. 使用 udevadm 触发与查询udev是管理/dev下设备节点的系统。如果设备节点没有出现,可以用udevadm触发重新检测或查看规则匹配情况。

    # 触发内核事件,让udev重新处理该设备(假设设备在总线1端口4) sudo udevadm trigger --action=add --subsystem-match=usb --attr-match=“busnum=“1”” --attr-match=“devnum=“4”” # 查看设备对应的udev信息 sudo udevadm info -a -p /sys/bus/usb/devices/1-4 # 查看设备节点路径(如果已创建) sudo udevadm info -q path -n /dev/sdb

6.2 网络设备(USB网卡)

对于USB网卡,识别步骤类似,但最终关注的是网络接口。

  1. 识别与驱动:首先用lsusb确认设备被识别,并记下VID/PID。用lsusb -tlsmod | grep查看是否加载了正确的驱动(如r8152for Realtek USB网卡)。
  2. 检查网络接口:使用ip link showifconfig -a查看是否出现了新的网络接口(如enx<MAC地址>eth1)。
  3. 排查驱动问题:如果设备识别但无接口,可能是驱动未加载或加载失败。检查dmesg中关于该设备的错误信息。有时需要根据VID/PID搜索并安装特定的DKMS驱动模块。

6.3 其他设备(键鼠、串口等)

对于HID设备(键盘、鼠标)或USB转串口适配器,流程更简单:

  • HID设备:通常由usbhid驱动自动处理。lsusb -t看到驱动为usbhid,且/dev/input目录下出现新的事件设备(如eventX),即表示成功。可用evtest工具测试。
  • USB串口:驱动通常是ftdi_sio(FTDI芯片)、pl2303(Prolific芯片)或ch341等。识别后,会在/dev下创建ttyUSBXttyACMx设备节点。权限问题常见,可能需要将用户加入dialout组。

7. 常见问题排查与实战技巧

7.1 设备在 lsusb 中不显示

这是最棘手的情况,意味着设备连最基本的USB枚举都没通过。

  • 检查物理连接:换线、换端口(尤其是尝试USB 2.0端口)。有些设备对供电要求高,尝试使用带外部供电的集线器。
  • 检查内核日志:立即执行sudo dmesg -wH,然后插入设备,观察是否有任何输出。完全没有新日志,强烈指向硬件或最底层驱动问题。
  • 检查电源管理:某些USB端口可能被系统电源管理关闭。尝试在BIOS/UEFI中禁用USB省电功能,或在Linux中针对特定端口禁用autosuspend(需先找到该端口在sysfs中的路径)。
  • 排查内核模块:运行lsmod | grep usb确认核心USB模块(usbcore,xhci_hcd,ehci_pci等)已加载。对于非常老的设备,可能需要加载uhci_hcdohci_pci模块。

7.2 设备显示但无法正常工作(驱动问题)

设备出现在lsusb列表中,但没有对应的功能(如没有/dev/sd*,没有网络接口)。

  • 确认驱动绑定:查看/sys/bus/usb/devices/<bus>-<port>/driver的符号链接指向哪里。如果指向(none)或一个明显不对的驱动,可能是驱动匹配错误或缺失。
  • 手动绑定驱动:如果知道正确的驱动模块名(如usb-storage),可以尝试手动绑定和卸载。
    # 先解除当前绑定(如果已绑定) echo -n “<bus>-<port>” | sudo tee /sys/bus/usb/drivers/<wrong_driver>/unbind # 绑定到正确驱动 echo -n “<bus>-<port>” | sudo tee /sys/bus/usb/drivers/<correct_driver>/bind
  • 检查dmesg错误:仔细查看dmesg中该设备相关的所有输出,寻找failed to probeerror -xxunsupported configuration等关键词。
  • 搜索VID/PID:将设备的VID和PID(如0x1234:0x5678)复制到搜索引擎,加上“Linux driver”关键词,查找社区是否有已知的解决方案或补丁驱动。

7.3 权限问题导致无法访问

设备节点已创建,但普通用户无法读写(常见于串口ttyUSB*或某些特定设备)。

  • 查看设备权限ls -l /dev/sdb1ls -l /dev/ttyUSB0
  • 使用 udev 规则:这是永久解决方案。创建一个自定义的udev规则文件,例如/etc/udev/rules.d/99-my-usb-device.rules
    # 为特定VID/PID的存储设备设置组和权限 SUBSYSTEM==“usb”, ATTRS{idVendor}==“1234”, ATTRS{idProduct}==“5678”, GROUP=“users”, MODE=“0666” # 为USB串口设备设置 SUBSYSTEM==“tty”, ATTRS{idVendor}==“1234”, ATTRS{idProduct}==“5678”, GROUP=“dialout”, MODE=“0666”
    保存后,重新加载规则并触发:sudo udevadm control --reload-rules && sudo udevadm trigger。之后重新插拔设备即可生效。
  • 临时解决方案:使用sudo chmod更改权限,或使用sudo运行需要访问设备的程序。但这并非长久之计。

7.4 设备随机断开或速度慢

  • 电源不足:这是USB设备,尤其是移动硬盘,随机断开的最常见原因。观察dmesg中是否有under-voltagereset相关消息。使用带外接电源的USB集线器。
  • 线缆或接口不良:换一根质量好的、短的USB线缆。清理USB端口灰尘。
  • USB 3.0干扰:某些USB 3.0设备或端口会对2.4GHz无线设备(如Wi-Fi、蓝牙)造成干扰,尝试将设备移到远离无线适配器的地方,或使用屏蔽更好的线缆。
  • 系统节能设置:检查并禁用USB端口的自动挂起功能。可以创建或编辑/etc/udev/rules.d/50-usb-power.rules文件,添加规则:ACTION==“add”, SUBSYSTEM==“usb”, TEST==“power/control”, ATTR{power/control}=“on”。但这可能影响笔记本续航。

7.5 信息查询脚本与自动化

将常用命令封装成脚本可以极大提高效率。下面是一个简单的脚本示例,用于快速获取指定端口设备的综合信息:

#!/bin/bash # 脚本名:usb_info.sh # 用法:./usb_info.sh <bus-port> 例如:./usb_info.sh 1-4 if [ -z “$1” ]; then echo “Usage: $0 <bus-port> (e.g., 1-4)” exit 1 fi DEVICE_PATH=“/sys/bus/usb/devices/$1” if [ ! -d “$DEVICE_PATH” ]; then echo “Error: Device path $DEVICE_PATH does not exist.” exit 1 fi echo “=== Basic Info for USB device $1 ===” echo “Vendor ID: $(cat $DEVICE_PATH/idVendor 2>/dev/null)” echo “Product ID: $(cat $DEVICE_PATH/idProduct 2>/dev/null)” echo “Manufacturer: $(cat $DEVICE_PATH/manufacturer 2>/dev/null || echo ‘N/A’)” echo “Product: $(cat $DEVICE_PATH/product 2>/dev/null || echo ‘N/A’)” echo “Serial: $(cat $DEVICE_PATH/serial 2>/dev/null || echo ‘N/A’)” echo “Speed: $(cat $DEVICE_PATH/speed 2>/dev/null)” echo “Driver: $(basename $(readlink $DEVICE_PATH/driver 2>/dev/null) 2>/dev/null || echo ‘N/A’)” echo -e “\n=== lsusb output ===" lsusb -d $(cat $DEVICE_PATH/idVendor 2>/dev/null):$(cat $DEVICE_PATH/idProduct 2>/dev/null) echo -e “\n=== Recent kernel messages (dmesg tail) ===" dmesg | tail -20 | grep -i “usb.*$1”

这个脚本整合了sysfs查询、lsusbdmesg,能提供一个设备状态的快照。你可以根据自己的需求扩展它,比如加入udevadm info的输出或者检查对应的块设备节点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 15:01:18

ppInk:免费高效的Windows屏幕标注工具,让演示和教学更简单

ppInk&#xff1a;免费高效的Windows屏幕标注工具&#xff0c;让演示和教学更简单 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 在数字化教学和远程协作的时代&#xff0c;你是否还在为寻找一款简单易用又功能强大的屏幕标…

作者头像 李华
网站建设 2026/8/4 15:00:55

发现一家可以做万级单元的气体传感器阵列芯片的企业!

在机器视觉、语音感知全面普及的今天&#xff0c;机器嗅觉一直是智能感知赛道最难攻克的短板。传统气体传感器只能单一检测、识别混合气味准确率低、阵列芯片难以小型化量产&#xff0c;全球行业长期陷入 “实验室能做、商用落地难” 的僵局。直到一家扎根佛山的国产科创企业杀…

作者头像 李华
网站建设 2026/8/4 15:00:32

西门子数控系统调试与故障排查实战

1. 西门子数控系统调试实战指南 在工业自动化领域摸爬滚打十几年&#xff0c;我经手调试的西门子数控系统少说也有上百台。从早期的840D到现在的Sinumerik ONE&#xff0c;每次调试都像在解一道精密的多变量方程。记得有次在广东某模具厂&#xff0c;一台老款808D系统因为参数配…

作者头像 李华
网站建设 2026/8/4 14:59:03

艾尔登法环存档管理终极指南:3步安全迁移游戏角色数据

艾尔登法环存档管理终极指南&#xff1a;3步安全迁移游戏角色数据 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 艾尔登法环存档迁移工具&#xff08;EldenRingSaveCopier&#xff09;是一款专为《艾尔登法环…

作者头像 李华
网站建设 2026/8/4 14:58:29

抖音视频下载终极指南:一键批量保存高清无水印内容

抖音视频下载终极指南&#xff1a;一键批量保存高清无水印内容 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…

作者头像 李华
网站建设 2026/8/4 14:57:53

ESR和FAR

一. ESR_ELn1、ESR_ELn结构&#xff1a;63 32 31 26 25 0 ---------------------------------------------- | RES0 | EC | ISS | ----------------------------------------------2.EC&#xff08;Exceptio…

作者头像 李华