设备管理 -- Udev(二)U盘挂载
1、检测U盘
/etc/udev/rules.d/99-usb-hotplug.rules
ACTION=="add",SUBSYSTEM=="block",ENV{ID_BUS}=="usb",ENV{ID_FS_TYPE}=="?*",RUN+="/home/lorentz/usb_hotplug.sh add %k"
ACTION=="remove",SUBSYSTEM=="block",ENV{ID_BUS}=="usb",ENV{ID_FS_TYPE}=="?*",RUN+="/home/lorentz/usb_hotplug.sh remove %k"
usb_hotplug.sh
#!/bin/bashecho "正在检测U盘设备..."
found=0# 遍历所有块设备
for dev in /sys/block/sd*; doif [[ ! -e "$dev" ]]; thencontinuefidev_name=$(basename "$dev")removable=$(cat "$dev/removable" 2>/dev/null)if [[ "$removable" -eq 1 ]]; thenfound=1model=$(cat "$dev/device/model" 2>/dev/null | tr -d ' ')size=$(cat "$dev/size" 2>/dev/null)size_gb=$((size * 512 / 1000000000))# 检查挂载点mount_point=$(lsblk -n -o MOUNTPOINT "/dev/$dev_name" | grep -v '^$' | head -1)if [[ -z "$mount_point" ]]; thenmount_status="未挂载"elsemount_status="已挂载至 $mount_point"fiecho "--------------------------------"echo "设备: /dev/$dev_name"echo "型号: $model"echo "大小: ${size_gb}GB"echo "状态: $mount_status"fi
doneif [[ $found -eq 0 ]]; thenecho "未检测到U盘!"
fi
2、U盘挂载
/etc/udev/rules.d/99-usb-hotplug.rules
ACTION=="add",SUBSYSTEM=="block",ENV{ID_BUS}=="usb",ENV{ID_FS_TYPE}=="?*",RUN+="/home/lorentz/usb_hotplug.sh add %k"
ACTION=="remove",SUBSYSTEM=="block",ENV{ID_BUS}=="usb",ENV{ID_FS_TYPE}=="?*",RUN+="/home/lorentz/usb_hotplug.sh remove %k"
usb_hotplug.sh
#!/bin/bash# 事件类型:add 或 remove
EVENT="$1"
# 设备名称(如 sdb1)
DEVICE="$2"
# 日志文件路径
LOG_FILE="/var/log/usb_hotplug.log"
# 挂载点基础路径
MOUNT_BASE="/media/usb"log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | sudo tee -a "$LOG_FILE"
}case $EVENT inadd)# 创建挂载点目录MOUNT_POINT="${MOUNT_BASE}/${DEVICE}"sudo mkdir -p "$MOUNT_POINT"# 尝试挂载设备if sudo mount "/dev/${DEVICE}" "$MOUNT_POINT" 2>/dev/null; thenlog "设备 /dev/${DEVICE} 已挂载到 ${MOUNT_POINT}"# 获取设备信息VENDOR=$(udevadm info --query=property --name="/dev/${DEVICE}" | grep "ID_VENDOR=" | cut -d'=' -f2)MODEL=$(udevadm info --query=property --name="/dev/${DEVICE}" | grep "ID_MODEL=" | cut -d'=' -f2)SIZE=$(lsblk -n -o SIZE "/dev/${DEVICE}")# 发送桌面通知(如果可用)if [ -n "$DISPLAY" ]; thennotify-send "U盘已插入" "设备: ${VENDOR} ${MODEL} 大小: ${SIZE} 挂载点: ${MOUNT_POINT}"filog "设备信息: ${VENDOR} ${MODEL}, 大小: ${SIZE}"elselog "无法挂载 /dev/${DEVICE}"fi;;remove)# 查找设备挂载点MOUNT_POINT=$(grep "/dev/${DEVICE}" /proc/mounts | awk '{print $2}')if [ -n "$MOUNT_POINT" ]; then# 卸载设备sudo umount -l "$MOUNT_POINT"# 删除挂载点sudo rmdir "$MOUNT_POINT"log "设备 /dev/${DEVICE} 已卸载,挂载点 ${MOUNT_POINT} 已删除"# 发送桌面通知if [ -n "$DISPLAY" ]; thennotify-send "U盘已移除" "设备 /dev/${DEVICE} 已安全移除"fifi;;*)log "未知事件: $EVENT";;
esacexit 0