You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:40:25