Linux服务器端自动挂载存储设备(U盘、移动硬盘)

发布于:2025-02-11 ⋅ 阅读:(31) ⋅ 点赞:(0)

前言

        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=$1
    local mount_point=$2
    echo "Mounting $device to $mount_point..."
    # 假设挂载点为 /mnt/$device,可以根据需求修改挂载点
    mkdir -p "$mount_point"
    mount "$device" "$mount_point"
    if [ $? -eq 0 ]; then
        echo "$device mounted successfully at $mount_point."
    else
        echo "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" ]; then
        for device in $devices; do
            # 根据设备名称构造设备路径,例如 /dev/sda1
            device_path="/dev/$device"
            # 假设挂载点路径为 /media/设备名
            mount_point="/media/$device"
            
            # 调用挂载函数
            mount_device "$device_path" "$mount_point"
        done
    else
        echo "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


网站公告

今日签到

点亮在社区的每一天
去签到