前言
Linux服务器挂载存储设备需要使用mount,因为服务器的存储通常是固定的,很少存在频繁的插拔USB存储设备的现象 ,使用Linux系统本身是没有较为简单的自动挂载存储设备的方法的。
涉及知识点
udev
udev可以监测USB设备的插入、拔出事件,并且Linux系统支持通过/etc/udev/rules.d/下的.rules文件对USB事件触发关联的动作,比如手动执行命令:mount /dev/sda1 /media/sda1时,.rules文件的内容如下:
ACTION=="add", KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", RUN+="mount /dev/%k /media/%k"
或者不直接调用后台命令,而是调用shell脚本也行:
ACTION=="add", KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", RUN+="/usr/local/bin/usb-mount.sh %k"
但是,以上的rules文件再mount的时候,挂载失败,原因是udev是systemd-udev调用的,直接使用mount命令是无效的,如果把mount改成systemd-mount,某些系统也mount不成功。
system服务
系统级的服务进行的mount挂载肯定是成功的,以下是通过编写system服务脚本来实现自动挂载存储设备。
1、创建systemd 服务
/etc/systemd/system/block_service.service
[Unit]
Description=My Block Service
After=local-fs.target[Service]
Type=simple
ExecStart=/usr/bin/block_service.sh[Install]
WantedBy=multi-user.target
/usr/bin/block_service.sh
#!/bin/bash# 定义一个函数来挂载设备
mount_device() {local device=$1local mount_point=$2echo "Mounting $device to $mount_point..."# 假设挂载点为 /mnt/$device,可以根据需求修改挂载点mkdir -p "$mount_point"mount "$device" "$mount_point"if [ $? -eq 0 ]; thenecho "$device mounted successfully at $mount_point."elseecho "Failed to mount $device."fi
}while true; do# 获取挂载状态不为空的设备,过滤掉已挂载的devices=$(lsblk -o NAME,MOUNTPOINT | grep -E "sd[a-z]+[0-9]+.*" | sed 's/^[[:space:]]*└─//g' | awk '$2 == "" {print $1, $2}'|head -n 1)# 检查是否有未挂载的设备if [ ! -z "$devices" ]; thenfor device in $devices; do# 根据设备名称构造设备路径,例如 /dev/sda1device_path="/dev/$device"# 假设挂载点路径为 /media/设备名mount_point="/media/$device"# 调用挂载函数mount_device "$device_path" "$mount_point"doneelseecho "No unmounted devices found."fi# 每5秒钟检查一次sleep 5
done
给脚本赋予执行权限:sudo chmod +x /usr/bin/block_service.sh
2、重新加载 systemd 配置
sudo systemctl daemon-reload
3、启动服务
sudo systemctl start block_service.service
4、设置服务开机自启
sudo systemctl enable block_service.service
5、查看服务状态
systemctl status block_service.service