linux设备驱动程序 脚本之家,linux – 使用systemd自动挂载USB驱动器
经过几次错误的开始,我想出了这个.关键是在udev和安装脚本之间添加systemd单元服务.
(为了记录,我无法使用udeks2(通过类似udisksctl mount -b / dev / sdb1之类的东西)直接从udev规则或系统单元文件中调用它.这似乎有竞争条件和设备节点还没有准备就绪,导致查找设备/ dev / sdb1的对象时出错.不幸的是,因为udisks2可以处理所有挂载点杂乱……)
繁重的工作由shell脚本完成,该脚本负责创建和删除安装点,以及安装和卸载驱动器.
/usr/local/bin/usb-mount.sh
#!/bin/bash
# This script is called from our systemd unit file to mount or unmount
# a USB drive.
usage()
{
echo "Usage: $0 {add|remove} device_name (e.g. sdb1)"
exit 1
}
if [[ $# -ne 2 ]]; then
usage
fi
ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"
# See if this drive is already mounted,and if so where
MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')
do_mount()
{
if [[ -n ${MOUNT_POINT} ]]; then
echo "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}"
exit 1
fi
# Get info for this drive: $ID_FS_LABEL,$ID_FS_UUID,and $ID_FS_TYPE
eval $(/sbin/blkid -o udev ${DEVICE})
# Figure out a mount point to use
LABEL=${ID_FS_LABEL}
if [[ -z "${LABEL}" ]]; then
LABEL=${DEVBASE}
elif /bin/grep -q " /media/${LABEL} " /etc/mtab; then
# Already in use,make a unique one
LABEL+="-${DEVBASE}"
fi
MOUNT_POINT="/media/${LABEL}"
echo "Mount point: ${MOUNT_POINT}"
/bin/mkdir -p ${MOUNT_POINT}
# Global mount options
OPTS="rw,relatime"
# File system type specific mount options
if [[ ${ID_FS_TYPE} == "vfat" ]]; then
OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
fi
if ! /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then
echo "Error mounting ${DEVICE} (status = $?)"
/bin/rmdir ${MOUNT_POINT}
exit 1
fi
echo "**** Mounted ${DEVICE} at ${MOUNT_POINT} ****"
}
do_unmount()
{
if [[ -z ${MOUNT_POINT} ]]; then
echo "Warning: ${DEVICE} is not mounted"
else
/bin/umount -l ${DEVICE}
echo "**** Unmounted ${DEVICE}"
fi
# Delete all empty dirs in /media that aren't being used as mount
# points. This is kind of overkill,but if the drive was unmounted
# prior to removal we no longer know its mount point,and we don't
# want to leave it orphaned...
for f in /media/* ; do
if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then
if ! /bin/grep -q " $f " /etc/mtab; then
echo "**** Removing mount point $f"
/bin/rmdir "$f"
fi
fi
done
}
case "${ACTION}" in
add)
do_mount
;;
remove)
do_unmount
;;
*)
usage
;;
esac
反过来,脚本由systemd单元文件调用.我们使用“@”文件名语法,因此我们可以将设备名称作为参数传递.
/etc/systemd/system/usb-mount@.service
[Unit]
Description=Mount USB Drive on %i
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/usb-mount.sh add %i
ExecStop=/usr/local/bin/usb-mount.sh remove %i
最后,一些udev规则在hotplug / unplug上启动和停止systemd单元服务:
/etc/udev/rules.d/99-local.rules
KERNEL=="sd[a-z][0-9]",SUBSYSTEMS=="usb",ACTION=="add",RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="sd[a-z][0-9]",ACTION=="remove",RUN+="/bin/systemctl stop usb-mount@%k.service"
这似乎可以解决问题!一些有用的命令用于调试这样的东西:
> udevadm control -l debug打开详细日志记录/ var / log / syslog,这样你就可以看到发生了什么.>修改文件后的udevadm控制–reload-rulesrules.dir(可能没有必要,但不能伤害……).>修改systemd单元文件后的systemctl守护程序重新加载.
linux设备驱动程序 脚本之家,linux – 使用systemd自动挂载USB驱动器相关推荐
- linux设备驱动程序架构的研究,Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介)...
Linux设备驱动程序学习(12) -Linux设备模型(底层原理简介) 以<LDD3>的说法:Linux设备模型这部分内容可以认为是高级教材,对于多数程序作者来说是不必要的.但是我个人认 ...
- linux设备驱动程序的编程思路,Linux设备驱动工程师之路——高级字符设备驱动程序...
高级字符设备驱动在简单字符驱动的基础上添加ioctl方法.阻塞非阻塞读写.poll方法.和自动创建设备文件的功能. 一.重要知识点 1.ioctl ioctl命令:使用4个字段定义一个ioctl命令, ...
- Linux 设备驱动程序(二)
系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序( ...
- Linux 设备驱动程序(三)
系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序( ...
- wdm设备驱动程序开发pdf_世界顶级Linux技术大师力作1000页Linux开发实战
20世纪90年代初,Linux操作系统诞生,随着虚拟化.云计算.大数据.容器技术的出现和人工智能时代的来临,Linux 以迅雷不及掩耳之势飞速发展,占据着整个服务器行业的半壁江山,但同时也面临着巨大的 ...
- 嵌入式Linux设备驱动程序:编写内核设备驱动程序
嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...
- linux设备驱动程序中的阻塞机制
阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经常用到等待队列. 一.阻塞与非阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回. 非阻塞指不能立刻 ...
- Linux设备驱动程序 三 字符设备驱动
Linux设备驱动程序 三 字符设备驱动 笔记 第三章 字符驱动设备 本章会编写一个完整的字符设备,字符设备简单,易于理解, 名字是scull:Simple Caracter Utility for ...
- 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态
嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
最新文章
- 边界框的回归策略搞不懂?算法太多分不清?看这篇就够了
- TCP之深入浅出send和recv
- java 压缩汉字字节_java中计算汉字的字节数
- opencv求两张图像光流_光流(optical flow)和openCV中实现
- matlab 色彩模型,常见色彩模型的相互转换(基于MATLAB).doc
- Java 语言基础(一)
- windows下搭建SSH隧道内网映射
- 欠拟合、过拟合、优化器
- 博士德服务器帐套维护密码忘记,T+账套主管的密码忘记了,怎么办
- 微信公众号jssdk音频
- 8.7. Enumerated Types
- 安装docker多系统操作示列(window为例)
- Lotka-Volterra模型
- Pycharm this applicatation failed to start because it could not find or laod the qt plaform plugin
- 在微型计算机中任何外部设备,微型计算机与外部设备之间的信息传输方式有( )。...
- 【10.03】富士康(世界500强第22位) 嵌入式软件相关多岗位招聘 10-45k月薪 内推...
- 传智播客风清扬视频-------线程简介
- 【BZOJ】【P2295】【POJ Challenge】【我爱你啊】【题解】【水题】
- js无限滚动动画公告栏
- Kubeadm部署Kubernetes1.18.6集群1