我试图在不使用/etc/fstab 情况下使用systemd和udev自动挂载所有ATA / SCSI驱动器。
这是必要的,因为文件系统需要安装在为其UUID命名的目录上,并且驱动器总是被冷交换到新的驱动器,因此不断修改fstab变得单调乏味。
为了做到这一点,我使用了以下脚本 ,systemd 单元文件和udev规则 ,并根据针对USB驱动器的类似问题的答案进行了改编。
但是,尽pipe该答案适用于USB驱动器,但它不适用于ATA / SCSI驱动器 :该脚本似乎能够成功执行并创build所有必需的目录,但启动完成后,将不会挂载任何内容。 但是,脚本在手动运行时工作 。
/usr/local/bin/automount.sh :
#!/bin/bash ACTION=$1 DEVBASE=$2 DEVICE="/dev/${DEVBASE}" SAVE="/root/${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}) # Check if drive is already mounted / duplicate UUID LABEL=${ID_FS_UUID} /bin/grep -q " /media/${LABEL} " /etc/mtab \ && ( echo "UUID ${LABEL} already in use"'!'; exit 1 ) # Set mount point and save for later (in case of "yanked" unmount) MOUNT_POINT="/media/${LABEL}" echo "MOUNT_POINT=${MOUNT_POINT}" | /usr/bin/tee "${SAVE}" # Create mount point /bin/mkdir -p ${MOUNT_POINT} # Global mount options OPTS="rw,relatime" # File system type specific mount options case "${ID_FS_TYPE}" in vfat) OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush" ;; esac if ! /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT} then echo "Error mounting ${DEVICE} (status = $?)" /bin/rmdir ${MOUNT_POINT} /bin/rm ${SAVE} exit 1 fi echo "**** Mounted ${DEVICE} at ${MOUNT_POINT} ****" } do_unmount() { eval $(/bin/cat "${SAVE}") [[ -z ${MOUNT_POINT} ]] \ && ( echo "Warning: ${DEVICE} is not mounted"; exit 0) /bin/umount -l ${DEVICE} \ && ( echo "**** Unmounted ${DEVICE}"; /bin/rm ${SAVE} ) \ || ( echo "Unmounting ${DEVICE} failed"'!'; exit 1 ) } case "${ACTION}" in add) do_mount ;; remove) do_unmount ;; *) echo "BAD OPTION ${ACTION}"'!' exit 1 ;; esac
/etc/systemd/system/[email protected] :
[Unit] Description=Automount ATA/SCSI drive on %i [Service] Type=oneshot RemainAfterExit=true ExecStart=/usr/local/bin/automount.sh add %i ExecStop=/usr/local/bin/automount.sh remove %i
/etc/udev/rules.d/11-automount-ata-scsi.rules :
KERNEL!="sd[az][0-9]", SUBSYSTEMS!="scsi", GOTO="automount_ata_scsi_end" ACTION=="add", RUN+="/bin/systemctl start automount@%k.service" ACTION=="remove", RUN+="/bin/systemctl stop automount@%k.service" LABEL="automount_ata_scsi_end"
(从外观上看,ATA / SCSI驱动器实际上是使用此设置进行简单安装的,但是不知何故,可以在启动过程中取消安装。)