如何检测USB磁盘是否接入嵌入式Linux系统(基于Nvidia Jetson Nano)
检测USB磁盘接入的几种实用方法(Jetson Nano)
方法1:udev规则(推荐)
udev是Linux内核的设备管理系统,能在设备插拔时自动触发脚本,适合实现自动化操作。
- 步骤1:创建udev规则文件,比如
/etc/udev/rules.d/99-usb-disk.rules - 规则示例(匹配USB存储设备分区):
说明:ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z][1-9]", RUN+="/usr/local/bin/usb_disk_handler.sh"ACTION=="add"指定设备接入时触发,SUBSYSTEM=="block"匹配块设备,KERNEL=="sd[a-z][1-9]"匹配USB磁盘的分区(如sdb1)。 - 步骤2:编写处理脚本
/usr/local/bin/usb_disk_handler.sh,赋予执行权限chmod +x /usr/local/bin/usb_disk_handler.sh
脚本示例(可在此添加显示图标等操作):#!/bin/bash # 写入日志记录设备信息 echo "USB磁盘已接入,设备路径:$DEVNAME" >> /var/log/usb_disk.log # 指定桌面环境DISPLAY(如果要显示图标) export DISPLAY=:0 # 调用你的显示图标程序 # /path/to/your/app/display_icon - 步骤3:重新加载udev规则生效:
sudo udevadm control --reload-rules && sudo udevadm trigger
方法2:轮询挂载点或/proc/mounts
适合简单场景,定期检查系统挂载状态:
- 编写循环检查脚本:
#!/bin/bash # 记录初始挂载的USB设备 PREV_DEVICES=$(cat /proc/mounts | grep /dev/sd) while true; do CURRENT_DEVICES=$(cat /proc/mounts | grep /dev/sd) # 对比前后状态,判断是否有新设备接入 if [ "$CURRENT_DEVICES" != "$PREV_DEVICES" ] && [ -n "$CURRENT_DEVICES" ]; then echo "USB磁盘已接入" # 执行你的操作 PREV_DEVICES=$CURRENT_DEVICES fi sleep 2 done - 也可以直接检查
/run/media/${USER}目录(Jetson Nano默认自动挂载USB磁盘到此处),判断是否有新增目录。
方法3:libudev编写C/C++程序
如果你的应用是C/C++开发的,可直接调用libudev库监听设备事件:
- 核心代码片段:
#include <libudev.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { struct udev *udev_ctx = udev_new(); if (!udev_ctx) { fprintf(stderr, "创建udev上下文失败\n"); return 1; } struct udev_monitor *monitor = udev_monitor_new_from_netlink(udev_ctx, "udev"); udev_monitor_filter_add_match_subsystem_devtype(monitor, "block", "disk"); udev_monitor_enable_receiving(monitor); int monitor_fd = udev_monitor_get_fd(monitor); while (1) { fd_set fds; FD_ZERO(&fds); FD_SET(monitor_fd, &fds); int ret = select(monitor_fd + 1, &fds, NULL, NULL, NULL); if (ret > 0 && FD_ISSET(monitor_fd, &fds)) { struct udev_device *dev = udev_monitor_receive_device(monitor); if (dev) { const char *action = udev_device_get_action(dev); if (action && !strcmp(action, "add")) { const char *dev_path = udev_device_get_devpath(dev); printf("USB磁盘接入:%s\n", dev_path); // 在此触发显示图标等操作 } udev_device_unref(dev); } } } udev_monitor_unref(monitor); udev_unref(udev_ctx); return 0; } - 编译时链接libudev库:
gcc usb_monitor.c -o usb_monitor -ludev
注意事项
- udev规则中的脚本必须写绝对路径,避免环境变量问题
- 如果要在桌面环境显示图标,需在脚本中指定
export DISPLAY=:0(默认桌面显示端口为:0) - 可通过
udevadm info -a -n /dev/sdb1查看设备属性,调整udev规则的匹配条件
内容的提问来源于stack exchange,提问作者Bob Kang
相关产品推荐
相关产品推荐

