经过几次错误的开始,我想出了这个.关键是在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驱动器相关推荐

  1. linux设备驱动程序架构的研究,Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介)...

    Linux设备驱动程序学习(12) -Linux设备模型(底层原理简介) 以<LDD3>的说法:Linux设备模型这部分内容可以认为是高级教材,对于多数程序作者来说是不必要的.但是我个人认 ...

  2. linux设备驱动程序的编程思路,Linux设备驱动工程师之路——高级字符设备驱动程序...

    高级字符设备驱动在简单字符驱动的基础上添加ioctl方法.阻塞非阻塞读写.poll方法.和自动创建设备文件的功能. 一.重要知识点 1.ioctl ioctl命令:使用4个字段定义一个ioctl命令, ...

  3. Linux 设备驱动程序(二)

    系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序( ...

  4. Linux 设备驱动程序(三)

    系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序( ...

  5. wdm设备驱动程序开发pdf_世界顶级Linux技术大师力作1000页Linux开发实战

    20世纪90年代初,Linux操作系统诞生,随着虚拟化.云计算.大数据.容器技术的出现和人工智能时代的来临,Linux 以迅雷不及掩耳之势飞速发展,占据着整个服务器行业的半壁江山,但同时也面临着巨大的 ...

  6. 嵌入式Linux设备驱动程序:编写内核设备驱动程序

    嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...

  7. linux设备驱动程序中的阻塞机制

    阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经常用到等待队列. 一.阻塞与非阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回. 非阻塞指不能立刻 ...

  8. Linux设备驱动程序 三 字符设备驱动

    Linux设备驱动程序 三 字符设备驱动 笔记 第三章 字符驱动设备 本章会编写一个完整的字符设备,字符设备简单,易于理解, 名字是scull:Simple Caracter Utility for ...

  9. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  10. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

最新文章

  1. 边界框的回归策略搞不懂?算法太多分不清?看这篇就够了
  2. TCP之深入浅出send和recv
  3. java 压缩汉字字节_java中计算汉字的字节数
  4. opencv求两张图像光流_光流(optical flow)和openCV中实现
  5. matlab 色彩模型,常见色彩模型的相互转换(基于MATLAB).doc
  6. Java 语言基础(一)
  7. windows下搭建SSH隧道内网映射
  8. 欠拟合、过拟合、优化器
  9. 博士德服务器帐套维护密码忘记,T+账套主管的密码忘记了,怎么办
  10. 微信公众号jssdk音频
  11. 8.7. Enumerated Types
  12. 安装docker多系统操作示列(window为例)
  13. Lotka-Volterra模型
  14. Pycharm this applicatation failed to start because it could not find or laod the qt plaform plugin
  15. 在微型计算机中任何外部设备,微型计算机与外部设备之间的信息传输方式有( )。...
  16. 【10.03】富士康(世界500强第22位) 嵌入式软件相关多岗位招聘 10-45k月薪 内推...
  17. 传智播客风清扬视频-------线程简介
  18. 【BZOJ】【P2295】【POJ Challenge】【我爱你啊】【题解】【水题】
  19. js无限滚动动画公告栏
  20. Kubeadm部署Kubernetes1.18.6集群1

热门文章

  1. NFS客户端在/etc/fstab设置开机挂载后,开机时无法进入系统
  2. 使用GameKit实现IOS设备之间的蓝牙通信
  3. 【编程好习惯】使用sizeof减少内存操作失误
  4. Spring 2.5配置文件详解
  5. 关于深度学习caffe for Windows编译入门
  6. 【Java基本功】很多人经常忽视的Java基础知识点
  7. 阿里巴巴Android开发手册V1.0.0随手笔记
  8. 一份清单:所有可以放进head标签的元素
  9. 自定义IBaseAdapter,简化适配器重复的步骤
  10. Java中反射的理解