一种在Linux上实现SD卡自动挂载的办法

一种在Linux上实现SD卡自动挂载的办法 毛巾卷 2024-01-12 17:24:22 1093

本文是描述在Linux上如何实现SD卡自动检测并挂载的描述。

首先要实现热插拔功能请先检测硬件上是否有设计,要有CD引脚做检测,这样Linux内核驱动才会去加载上,才会在/dev下生成对应的设备块;

我这个办法主要是基于udev来实现的,它会捕捉到外设设备在内核在的加载情况,比如当我们插入sd卡设备时它就能获取得到,所以我们就利用它来检测是否有sd卡插入,当检测到时通过mount挂载到系统上使用。

udev是Linux系统中的一个设备管理系统,它负责管理系统中的设备节点,即在/dev目录下的设备文件。udev的主要功能包括:

  1. 动态设备节点管理:当新设备插入系统时,udev会自动创建对应的设备节点,并在设备移除时自动移除这些节点,从而实现设备的动态管理。
  2. 规则引擎:udev通过规则引擎来匹配设备属性,并执行相应的操作。这些规则可以包括设备名称、设备类型、设备ID等信息,以便根据设备属性来执行自定义的操作。
  3. 设备信息管理:udev可以获取设备的信息,如设备路径、设备类型、设备ID等,并将这些信息用于设备的管理和配置。
    udev通常与Linux系统中的设备管理和热插拔功能紧密相关,它可以帮助系统动态地管理设备,并根据设备的属性执行相应的操作,从而提高系统的灵活性和可管理性。udev的配置文件通常存储在/etc/udev/rules.d/目录下,用户可以通过编辑这些规则文件来自定义系统中设备的管理行为。

udev资料参考:
https://wiki.archlinux.org/title/Udev#Tips_and_tricks
http://www.jinbuguo.com/systemd/udev.html

我这里是基于udev和systemed服务来实现的,上代码:
/etc/udev/rules.d/11-media-automount.rules

###########---sd---################
#----------------------------------#
KERNEL=="sd[a-z][0-9]", SUBSYSTEM=="block", ACTION=="add", RUN+="/bin/systemctl restart media-automount@%k.service"
KERNEL=="sd[a-z][0-9]", SUBSYSTEM=="block", ACTION=="remove", RUN+="/bin/systemctl restart media-automount@%k.service", OPTIONS="last_rule"

/etc/systemd/system/media-automount@.service

[Service]
Type=forking
ExecStart=/opt/scripts/boot/media-automount.sh %I

/opt/scripts/boot/media-automount.sh

#! /bin/sh

dev=/dev/$1
mediadir=/tfcard/DCIM

# 设备文件是否存在,如果不存在且还mounted,则umount,且删除文件夹
if ! [ -b $dev ]
then
    if grep /etc/mtab -qe "^$dev"
    then
        echo "$dev device removed, umounting and cleaning $mediadir"
        if umount -l "$dev"
        then 
            exitcode=0
        else
            exitcode=$?
            echo "umount $dev failed, errcode:$exitcode"
        fi 
    else
        # prevent it from failing on nonexistent devices and degrading systemctl boot
        exitcode=0
        echo "device doesn't exist anymore or is not a block device: $dev"
    fi

    # cleanup
    # for dir in "$mediadir"/*
    # do
    #     [ -d "$dir" ] && ! mountpoint -q "$dir" && sudo rmdir "$dir"
    # done
    [ -d "$mediadir" ] && ! mountpoint -q "$mediadir" && sudo rmdir "$mediadir"
    exit $exitcode
else
    # 挂载
    echo "mounting device $dev in $mediadir"
    mkdir -p "$mediadir"
    if mount -t vfat "$dev" "$mediadir" 
    then    
        # Notify
        username="$(ps au | awk '$11 ~ /^xinit/ { print $1; exit }')"
        [[ "$username" ]] && DISPLAY=:0 runuser -u "$username" xdg-open "$mediadir"
        echo "Device successfully mounted: $mediadir"
        set_sd() true
        exit 0
    else
        echo "Mount error: $?"
        sudo rmdir "$mediadir"
        exit 1
fi

这是我在gitee上面开源的资料,已经做了个简单的demo:
https://gitee.com/towel-roll/media-automount

有什么问题欢迎交流!

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
毛巾卷
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区