当前位置: 代码网 > 科技>电脑产品>硬盘 > Ubuntu使用udev+systemd+UUID实现USB硬盘自动挂载的方案

Ubuntu使用udev+systemd+UUID实现USB硬盘自动挂载的方案

2026年09月22日 硬盘 我要评论
1. 背景在 ubuntu 系统中,usb 硬盘、移动硬盘盒插拔后,linux 可能重新分配设备名称:例如第一次:/dev/sdb1重新插拔后:/dev/sdc1如果使用固定设备路径:/dev/sdb

1. 背景

在 ubuntu 系统中,usb 硬盘、移动硬盘盒插拔后,linux 可能重新分配设备名称:

例如第一次:

/dev/sdb1

重新插拔后:

/dev/sdc1

如果使用固定设备路径:

/dev/sdb1

会导致挂载失败。

linux 中推荐使用:

uuid

作为磁盘唯一标识。

本文实现:

usb硬盘插入
        |
        |
      udev监听
        |
        |
 systemd触发服务
        |
        |
 根据uuid识别
        |
        |
 自动挂载
        |
        |
 /data/usb/<uuid>

适用版本:

  • ubuntu 20.04
  • ubuntu 22.04
  • ubuntu 24.04
  • ubuntu 26.04

支持文件系统:

  • ntfs
  • ext4
  • xfs
  • exfat

2. 方案特点

优点

  • 不依赖 /dev/sdx
  • 支持 usb 设备编号变化
  • 自动识别硬盘
  • 支持拔插
  • 支持 docker 数据目录
  • 支持服务器和桌面环境

不推荐方式

不要使用:

/dev/sda1
/dev/sdb1

原因:

usb设备顺序不固定。

3. 安装依赖

安装 ntfs 支持

ubuntu:

apt update

apt install -y ntfs-3g

检查:

mount.ntfs-3g --version

4. 创建挂载目录

统一规划:

mkdir -p /data/usb

最终效果:

/data/usb

├── uuid1
├── uuid2
└── uuid3

5. 创建自动挂载脚本

创建文件:

vim /usr/local/bin/usb-auto-mount.sh

内容:

#!/bin/bash


mount_root="/data/usb"


mkdir -p "$mount_root"


for dev in $(lsblk -lnpo name,type | awk '$2=="part"{print $1}')
do

    # 已经挂载跳过
    if mount | grep -q "^$dev "
    then
        continue
    fi


    fstype=$(blkid -s type -o value "$dev" 2>/dev/null)


    case "$fstype" in

        ntfs|ext4|xfs|exfat)
            ;;

        *)
            continue
            ;;

    esac



    uuid=$(blkid -s uuid -o value "$dev")


    [ -z "$uuid" ] && continue



    mount_point="${mount_root}/${uuid}"


    mkdir -p "$mount_point"



    if ! mountpoint -q "$mount_point"
    then

        case "$fstype" in

            ntfs)

                mount -t ntfs-3g "$dev" "$mount_point"
                ;;


            *)

                mount "$dev" "$mount_point"
                ;;

        esac



        if [ $? -eq 0 ]
        then

            logger -t usb-auto-mount \
            "mount $dev uuid=$uuid -> $mount_point"

        else

            logger -t usb-auto-mount \
            "mount failed $dev"

        fi

    fi

done


exit 0

增加执行权限:

chmod +x /usr/local/bin/usb-auto-mount.sh

6. 创建 systemd 服务

创建:

vim /etc/systemd/system/usb-auto-mount.service

内容:

[unit]

description=usb uuid auto mount service

after=local-fs.target



[service]

type=oneshot

execstart=/usr/local/bin/usb-auto-mount.sh

remainafterexit=yes



[install]

wantedby=multi-user.target

重新加载:

systemctl daemon-reload

测试启动:

systemctl start usb-auto-mount

查看状态:

systemctl status usb-auto-mount

设置开机启动:

systemctl enable usb-auto-mount

7. 配置 udev 监听

udev 负责监听硬盘插拔事件。

创建规则:

vim /etc/udev/rules.d/99-usb-auto-mount.rules

添加:

action=="add", subsystem=="block", kernel=="sd*", run+="/bin/systemctl restart usb-auto-mount.service"

action=="remove", subsystem=="block", kernel=="sd*", run+="/bin/systemctl restart usb-auto-mount.service"

重新加载:

udevadm control --reload-rules

触发:

udevadm trigger

8. 测试

插入移动硬盘。

查看日志:

journalctl -t usb-auto-mount -f

示例:

mount /dev/sdb1 uuid=abcd-1234 -> /data/usb/abcd-1234

查看挂载:

df -h

结果:

/dev/sdb1

mounted on:

/data/usb/abcd-1234

9. ubuntu desktop 注意事项

ubuntu desktop 默认使用:

udisks2

负责:

  • 文件管理器自动挂载
  • 桌面显示移动设备
  • 普通用户挂载

如果机器作为 nas 或服务器使用,可以关闭:

systemctl disable --now udisks2

查看:

systemctl status udisks2

恢复:

systemctl enable --now udisks2

10. 防止误挂系统盘

建议增加过滤。

查看系统根分区:

findmnt /

获取:

uuid=xxxx

脚本中排除:

if [ "$uuid" = "$root_uuid" ]
then
    continue
fi

避免扫描:

  • /
  • /boot
  • 系统 lvm

11. docker 使用

例如:

硬盘:

/data/usb/abcd-1234

docker:

services:

  backup:

    volumes:

      - /data/usb/abcd-1234:/backup

设备重新插入:

/dev/sdb1

变成:

/dev/sdc1

docker路径不受影响。

12. 推荐目录规划

生产环境:

/data

├── docker
│
├── mysql
│
├── redis
│
├── backup
│
└── usb
    |
    ├── uuid1
    |
    └── uuid2

13. 与其他方案比较

方案稳定性推荐
/dev/sdx挂载
while循环扫描⭐⭐⭐
fstab uuid⭐⭐⭐⭐
udev + systemd + uuid最高⭐⭐⭐⭐⭐

14. 最终推荐架构

对于 ubuntu desktop + todesk + docker + 移动硬盘盒:

推荐:

固定数据盘
    |
    +-- fstab uuid


移动硬盘
    |
    +-- udev
          |
          +-- systemd
                |
                +-- uuid挂载


docker
    |
    +-- 使用固定/data路径

该方案可以长期稳定运行,避免 usb 硬盘重新识别导致路径变化问题。

到此这篇关于ubuntu使用udev+systemd+uuid实现usb硬盘自动挂载的方案的文章就介绍到这了,更多相关ubuntu实现usb硬盘自动挂载内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com