技术专栏
一种在Linux上实现SD卡自动挂载的办法
本文是描述在Linux上如何实现SD卡自动检测并挂载的描述。
首先要实现热插拔功能请先检测硬件上是否有设计,要有CD引脚做检测,这样Linux内核驱动才会去加载上,才会在/dev下生成对应的设备块;
我这个办法主要是基于udev来实现的,它会捕捉到外设设备在内核在的加载情况,比如当我们插入sd卡设备时它就能获取得到,所以我们就利用它来检测是否有sd卡插入,当检测到时通过mount挂载到系统上使用。
udev是Linux系统中的一个设备管理系统,它负责管理系统中的设备节点,即在/dev目录下的设备文件。udev的主要功能包括:
- 动态设备节点管理:当新设备插入系统时,udev会自动创建对应的设备节点,并在设备移除时自动移除这些节点,从而实现设备的动态管理。
- 规则引擎:udev通过规则引擎来匹配设备属性,并执行相应的操作。这些规则可以包括设备名称、设备类型、设备ID等信息,以便根据设备属性来执行自定义的操作。
- 设备信息管理: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个
手气红包
暂无数据
相关专栏
-
浏览量:2253次2020-03-18 09:22:40
-
浏览量:1060次2023-06-12 14:36:04
-
2023-08-10 09:40:45
-
浏览量:1236次2023-02-14 10:01:43
-
浏览量:1011次2023-03-14 17:52:28
-
浏览量:1920次2023-03-16 09:42:49
-
浏览量:2149次2019-12-28 10:40:42
-
浏览量:3195次2020-07-28 10:38:42
-
浏览量:2666次2020-06-18 10:24:46
-
浏览量:1771次2020-08-21 14:40:54
-
浏览量:1704次2020-02-28 09:50:55
-
浏览量:692次2024-02-04 09:47:59
-
浏览量:545次2023-11-10 11:30:56
-
浏览量:902次2023-01-12 15:13:42
-
浏览量:920次2023-02-25 09:47:12
-
浏览量:599次2023-09-01 10:53:05
-
浏览量:668次2023-02-23 14:26:16
-
浏览量:786次2023-03-14 10:09:41
-
浏览量:965次2023-02-21 17:24:55
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
毛巾卷
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注