在上一篇文章中中,我们使用 Configfs 方法配置了三种 USB OTG 功能(USB 以太网、USB 串行通信和 USB 存储)。这是为了同时启用多个功能。如果你想要单个功能,请单独指定每个功能,而不是使用 Composite。
Linux 有一种名为 USB 小工具框架的机制。
| 小工具 | 目录 |
|---|---|
| g_ether | USB 以太网 |
| g_serial | USB 串行 |
| g_mass_storage | USB 存储器 |
| g_hid | 键盘和鼠标 |
| Composite | 同时提供多种功能 |
这次,我们将尝试一种简单的方法,即只使用 g_ether、g_serial 和 g_mass_storage 三个函数。
使用单个模块时,无法同时设置多个功能,而是由内核控制,因此自动启动无需额外工作。
下面是如何设置每个模块并测试单个功能。
编写本报告时的说明
在此环境中,我们使用了基于 CM5 的工业级 Raspberry Pi PL-R5,操作系统是 Raspberry Pi OS(书虫)。主机在 Linux/macOS 上进行测试。
验证环境
型号:工业 Raspi “PL-R5” (Raspberry Pi Compute Module 5 Rev 1.0)
OS:Debian GNU/Linux 12 (bookworm)
内核:6.12.62+rpt-rpi-v8
macOS:Tahoe 26.3
使用 Windows 作为主机时,由于不支持 ECM(以太网控制模型),因此需要 RNDIS(远程网络驱动程序接口规范)驱动程序。连接 USB 电缆后,在设备管理器中更新驱动程序。
如果只有 USB 以太网可用,只需启用即可。
rpi-usb-gadget 软件包包含在 Raspberry Pi OS Trixie 中。如果启用它,无需手动配置就能将其识别为 USB 以太网设备,并立即通过 SSH 进行连接,而无需配置 Wi-Fi 或有线局域网。
以下内容摘自官方网站。
“从 20.10.2025 或更高版本的 Raspberry Pi OS Trixie 映像开始,默认情况下会包含一个名为 rpi-usb-gadget 的新软件包。激活后,Raspberry Pi 会显示为 USB 以太网设备,您可以立即通过 SSH 进行连接,而无需配置 Wi-Fi 或以太网。
2025 年 10 月 20 日之后,Raspberry Pi OS Trixie 映像将默认包含一个名为 rpi-usb-gadget 的新软件包。一旦启用,Raspberry Pi 将被识别为 USB 以太网设备,无需配置 Wi-Fi 或以太网即可立即进行 SSH 连接。
https://www.raspberrypi.com/news/usb-gadget-mode-in-raspberry-pi-os-ssh-over-usb/
从 raspi-config 中选择即可。
sudo raspi-config
USB OTG 的线缆选择和目标端口
就 PL-R5 而言,与 PC 连接的 USB 电缆不是常见的 USB Type-A,而是用于写入操作系统映像的 USB Type-C 端口。这一点很容易理解。(写入开关保持关闭)

不过,在 Pi 4/5 上,通常用于 OTG 的 USB Type-C 端口就是连接电源适配器的 USB Type-C 端口。电源也是通过 USB 供电,操作系统也是通过 USB 启动。
不过,对于 Pi 5,当使用 USB Type-C 电缆直接连接到电脑时,可能无法很好地决定操作哪一边。根据线缆的不同,可能无法正确识别为大容量存储小工具模式。
有了USB Type-A 转 USB Type-C(USB 2.0 规范)电缆,USB-A 端总是很容易被固定为要操作的主机端,从而使角色的确定稳定可靠。
下一个候选产品是 USB Type-C 至 Type-C(仅支持 USB 2.0)。这并非万无一失,但应该可以普遍识别。
不过,带有 e-Marker 的 USB 3.x/PD 兼容电缆、声称高速充电的电缆和 Thunderbolt 3/4 电缆可能会导致识别不稳定,具体视环境而定。
例外情况是,如果您想使用 “PL-R5 “实现 USB OTG,请使用带开关的 USB 电缆,该开关可以打开或关闭电源。开关必须关闭,以防止通过 USB 电缆供电。
这是因为,与 rpibooting 不同,设备已经在使用电源适配器运行。
当然,请注意任何机型都不可能处于小工具模式,因为仅使用 USB Type-C 数据线是无法进行数据通信的。
根据不同的 Raspberry Pi 型号,在选择 USB 电缆时应小心谨慎。
准备工作将 USB OTG 端口设置为设备模式(手动)
如果在上一步中没有使用raspi-config USB 以太网化,则需要手动配置。
要在设备端使用 PL-R5 的 USB2.0 OTG 端口,首先要在启动时将 USB 控制器设置为启用外设模式。
这对于 USB 以太网、串行通信和 USB 存储来说基本相同。
/boot/firmware/config.txt添加到
dtoverlay=dwc2,dr_mode=peripheral
不过,由于 CM5 系列通常默认包含 host,因此如果有以下情况,请在添加前将其注释掉。
[cm5]
#dtoverlay=dwc2,dr_mode=host
dtoverlay=dwc2,dr_mode=peripheral
/boot/firmware/cmdline.txt(末尾以单字节空格隔开,不换行)
modules-load=dwc2
添加后重新启动系统。
现在已启用。
*如果使用 USB 以太网和 raspi-config(如上一节所述),则不需要此设置。
USB 以太网(手动设置)
什么是 USB 以太网?它是一种机制,只需一根 USB 电缆,PL-R5 就可以被电脑识别为“通过 USB 连接的网络适配器”,并自动分配 IP 地址,实现点对点直连,无需使用网线。
该连接对应的虚拟网络接口为 usb0。

实用示例
– 访问初始设置 Web UI
– 作为维护访问方法
– 用于无 DHCP 环境下的紧急连接
– 直接 SSH 连接
还可以创建一个 “只需连接 USB 电缆,就能打开管理屏幕 “的系统。
如果服务器运行在 Raspberry Pi 端,即使连接了两台设备,也可以从主机 PC 端使用 Raspberry Pi 端的服务器。
,无需现有的 DHCP 等即可运行。
USB 以太网单一功能测试
*如果使用 USB 以太网和 raspi-config(如上一节所述),则不需要此设置。
将 usb0 创建为虚拟网卡 (NIC),并测试将其连接到主机。
/boot/firmware/cmdline.txt对以下内容的描述作了如下修改
modules-load=dwc2
↓
modules-load=dwc2,g_ether
*
重启后将启用。
提示:如果主机是 Windows
如果使用 Windows 作为主机,则无需使用 g_ether 符号。modules-load=dwc2保持不变。
,但必须在 Windows 端启用 RNDIS 并安装驱动程序。
如果 Windows 端操作自动识别如下,则无需安装驱动程序。
✅ 自动识别为 “远程 NDIS 兼容设备”
✅ 显示在网络适配器上
如果无法自动识别,请按照以下步骤操作:
打开设备管理器
右键点击 “未知设备”。
3. 更新驱动程序
4.”浏览计算机
5.”从列表中选择
6.”网络适配器
7.微软
8.”远程 NDIS 兼容设备


如果主机是 Linux/macOS,则无需此步骤。
创建虚拟网卡(usb0)
既然我们已经将 OTG 端口启用为设备模式,下一步就是将 usb0 创建为虚拟网卡 (NIC),并为其分配一个固定 IP 地址。
,只需运行 nmcli 命令即可同时自动连接它们。
sudo nmcli con add type ethernet \
ifname usb0 con-name usb0 \
ipv4.method manual ipv4.addresses 192.168.7.2/24 \
connection.autoconnect yes
连接’usb0’(449a53a2-8cf5-4c9c-9320-ee8eddbdd3c4)已成功添加。
我将上传链接。
sudo ip link set usb0 up
接下来,在主机端,在网络设置中将 IP 地址设置为192.168.7.1/24。
例如,如果你使用的是 macOS 系统,连接电缆时会新添加 “RNDIS/Ethernet Gadget “或类似功能。如果没有,请转到添加服务并添加以太网。
打开详细信息并手动设置 IP 地址,如下所示
Host PC Network IP Settings
Configuration: Manual
IP Address: 192.168.7.1
Subnet Mask: 255.255.255.0
Router: (blank)

然后,在 Pi 端(PL-R5)执行以下命令完成连接。
sudo nmcli con up usb0
连接成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)
如下图所示,您应该可以在 Pi 端使用 ip a 命令,在主机端使用 ping 或 ssh 连接。
# Check usb0 on the Pi
ip a
## From the host PC to the Pi
ping 192.168.7.2
ssh <username>@192.168.7.2
如果在断开 Pi 一侧的有线局域网或 Wi-Fi 连接后,通信仍处于连接状态,则表示已通过 USB-OTG 以太网连接。
如果在 Pi 端安装了 Apache,主机电脑的网络浏览器中将显示默认的 Apache 页面。

sudo apt install apache2
在主机电脑的网络浏览器中,访问http://192.168.7.2/ 。
看到 Apache2 Debian 默认页了吗?
现在您只需使用一根 USB 电缆即可连接。
2.USB 串行端口
下一步是串行通信。
通过一根 USB 电缆,PC 就能将 PL-R5 识别为 “带 USB 连接的串行转换器”。
实用示例
– 检查 PL-R5 日志
– 命令操作
– 双向通信
– 与微控制器桥接使用
此时也不需要局域网(不加入网络)。
由于它是最可靠的维护路由,因此很可能用于工业应用。
USB 串行单功能测试
之前对/boot/firmware/cmdline.txt的描述现改为如下内容
modules-load=dwc2,g_ether
↓
modules-load=dwc2,g_serial
重新启动以激活。
/dev/ttyGS0
默认情况下是禁用的,因此我们将手动启用它并为您启动服务。
sudo systemctl status serial-getty@ttyGS0
○ serial-getty@ttyGS0.service - Serial Getty on ttyGS0
Loaded: loaded (/lib/systemd/system/serial-getty@.service; disabled; preset: enabled)
Active: inactive (dead)
Docs: man:agetty(8)
man:systemd-getty-generator(8)
https://0pointer.de/blog/projects/serial-console.html
激活并启动服务。
sudo systemctl enable serial-getty@ttyGS0
sudo systemctl start serial-getty@ttyGS0
Created symlink /etc/systemd/system/getty.target.wants/serial-getty@ttyGS0.service → /lib/systemd/system/serial-getty@.service.并创建一个符号链接。
启动服务后,我再次查看状态,发现它处于活动状态(正在运行)。
● serial-getty@ttyGS0.service - Serial Getty on ttyGS0
Loaded: loaded (/lib/systemd/system/serial-getty@.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-02-26 14:19:12 JST; 2s ago
Docs: man:agetty(8)
man:systemd-getty-generator(8)
https://0pointer.de/blog/projects/serial-console.html
Main PID: 2221 (agetty)
Tasks: 1 (limit: 4693)
CPU: 2ms
CGroup: /system.slice/system-serial\x2dgetty.slice/serial-getty@ttyGS0.service
└─2221 /sbin/agetty -o "-p -- \\u" --keep-baud 115200,57600,38400,9600 - vt220
在终端的 Linux/macOS 端,检查串行通信使用的端口。
ls -l /dev/tty.usb*
crw-rw-rw- 1 root wheel 0x9000004 Feb 26 14:14 /dev/tty.usbmodem21101
显然,在我的环境中是 usbmodem21101,所以我会用它来连接。请使用您在环境中检查过的端口。
在 macOS 终端中,我使用 screen 命令进行连接。
最后,添加通信速度并运行。(默认为 9600 bps(标准))。
在 Windows 系统中,您也可以使用 PuTTY 进行同样的操作。
screen /dev/tty.usbmodem21101 115200
首次登录时,系统会像 SSH 连接一样要求您输入登录名和密码。
,显然连接已确定。

终止方法
执行屏幕命令后,不是通过退出键退出屏幕,而是按下 Ctrl + A 后的 K 键杀死屏幕。
Ctrl + A → K → y
双向通信测试
如果从 PL-R5 端向 ttyGS0 传递如下 log~ 描述,它将显示在主机终端上。
原本,命令在实际设备上执行,但即使使用 SSH 连接的两个终端,结果也是一样的。

echo "log: sensor=26.8C" > /dev/ttyGS0
主机端显示屏。
log: sensor=26.8C
USB 串口无需联网。
无需 IP 地址或 DHCP 配置即可登录和双向通信。
速度较慢,但对于以文本为中心的维护路径来说已经足够。
执行 ping 命令的结果
我尝试从主机 ping 到 Pi 端。

屏幕空白?
没问题,让我们在 Pi 端执行一些命令。如果按之前的方法执行命令,就会在主机上的空白终端屏幕上看到结果(例如)。
(例如,执行uname -a)
纯白色为等待状态。
使用前一种退出方法以同样的方式退出此屏幕。
USB 大容量存储器
USB 大容量存储器是一种类似于以太网和串行接口的系统,电脑通过一根 USB 电缆就能将 PL-R5 存储区的一部分识别为 “USB 存储器”。
从主机端看,它显示为可移动磁盘,可在 Finder 或 Explor 中打开进行文件管理。如果权限为 rw,则可以读写文件。
换句话说,该功能允许您将运行中的 PL-R5 的指定区域视作 USB 存储设备。
您可以指定映像文件,如 .bin、.img 或分区。
rpiboot 与 USB 大容量存储小工具的本质区别
虽然很难理解,但这两个含义是不同的:将操作系统映像文件写入 PL-R5 或 CM5 的 eMMC,以及在 USB Mass Storage Gadget(USB 大容量存储小工具)模式下作为 USB OTG 连接。
通过 rpiboot 连接时,PL-R5/CM5 操作系统不会启动。eMMC 显示为通过引导 ROM 直接连接到 PC。
另一方面,在小工具模式下,PL-R5/CM5 的操作系统正在运行,预设区域显示为 USB 存储器。
| 项 | rpiboot | 大容量存储小工具 |
|---|---|---|
| 操作系统启动 | 不,我没有。 | 我正在做。 |
| 被征收人 | 整个 eMMC | 任意区域 |
| 使用 | 编写操作系统 | 数据传输 |
| 控制权 | 引导 ROM | 操作系统 |
运行 rpiboot 后的终端屏幕如下所示,运行后挂载的内容会显示在 Finder 等文件管理器中。
在 rpiboot 的情况下,只有 bootfs 被挂载,内容为操作系统配置文件。

USB 大容量存储器则显示指定区域的内容。

这有点复杂,因为从电脑主机上看,两者都像 USB 驱动器。
共享指定区域
USB 大容量存储实体可以单个图像文件或分区为单位处理。
PL-R5 操作系统可决定将此区域显示为 USB 闪存驱动器。
可以是任何映像文件或任何分区,而不是整个 eMMC。
在 PL-R5 一侧创建的 usb.img 和 usb.bin 等文件可以显示在主机 PC 一侧,但只在其中一侧挂载是很危险的。因为数据可以从任意一侧重写。
在此测试中,分区未分离。创建 /opt/usb,在其中创建映像文件 piusb.bin,并将其发布到主机 PC 端。
运行配置示例
以下解释基于实际操作中原木收集的安装模式。
例如,在 PL-R5 方面,方法是创建一个专门的分区来存储日志,并逐个分区进行处理。
,这样做即使发生故障,对系统的影响也不大。
In eMMC:
├ /rootfs
├ /data
└ /log_export ← This partition is exposed as USB storage
通常情况下,日志会输出到 /var/log。
作为可能的操作,建议定期将日志数据复制到 USB 闪存驱动器 (/log_export),并以只读方式发布到主机上。
如果不在 PL-R5 端正常加载 /log_export,只在复制日志数据时加载,并在复制后卸载,似乎可以大大防止意外发生。
USB 大容量存储器单一功能测试
与之前一样,将/boot/firmware/cmdline.txt的描述改为如下内容
modules-load=dwc2,g_serial
↓
modules-load=dwc2,g_mass_storage
重新启动以激活。
模块选项还可设置
对于 USB 大容量存储器,只需在 cmdline.txt 中再移动一次。
用一个空格隔开,然后将下一个空格也添加到行尾(cmdline.txt 不会换行)。(cmdline.txt不会换行。)更改
文件路径时要小心。
g_mass_storage.file=/opt/usb/piusb.bin g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.ro=0
要挂载的文件是/opt/usb/piusb.bin 。之后将创建该文件。 stall=0表示无错误处理,removable=1表示在文件 Finder 或资源管理器中 “可移动”。 ro=0表示读/写,设置为 1 表示只读。
创建图像文件
在/opt 下创建usb 目录,并将其放置在该目录中。在本例中,容量为 128 MB。
sudo mkdir -p /opt/usb
sudo dd if=/dev/zero of=/opt/usb/piusb.bin bs=1M count=128
sudo mkfs.vfat -n CM5USB /opt/usb/piusb.bin
-n CM5USB是加载镜像文件时显示的标签。请根据需要进行更改。
现在重新启动,它就会以 USB 闪存盘的形式出现在 Linux/Mac/Windows 文件夹等中。
调查错误
我就不细说了,但我给你留了一条命令,如果它不起作用,你可以试试。
一切都在 Pi 端执行。
我在通信调查中用我想尝试的命令查找时发现了这一点。
ip route
ip route | grep usb0
ip addr show usb0
cat /sys/class/net/usb0/carrier
ip link show
systemctl status cm5-usb-gadget.service
nmcli dev status
单功能 USB OTG 非常简单
如前一篇文章所述,如果使用 Configfs 方法进行配置,可以同时设置三种功能。不过,需要进行很多设置。
如果要使用单个函数,最简单的方法是用 g_ether 等函数进行设置。
尤其是 USB 以太网,它已预置在当前的 Raspberry Pi 操作系统中,只需在 raspi-config 中启用即可。
由于 USB OTG 允许使用单根 USB 电缆直接访问,因此在工业和个人使用中进行设置可能会很有用。
请提前测试一次,包括选择 USB 电缆,以了解其工作情况。
文章由拉斯必达提供
非工程师也能愉快使用的 Raspberry Pi 信息网站 raspida.com一个非工程师也能享受和使用的 Raspberry Pi 信息网站。他还为 PiLink 网站提供有关工业用 Raspberry Pi 的技术博客文章。

