项目目的:
该项目旨在为一个运行 Linux 的系统(特别是针对群晖 DSM 环境优化过)提供一个自动化的外部 SATA 硬盘管理解决方案。其核心目标是简化新插入或未格式化硬盘的初始化和挂载流程,使其能够被系统自动识别、格式化(需用户通过特定文件确认)、挂载,并能方便地在 Linux 和 Windows 系统下使用。同时,它还记录硬盘的基本信息以供查阅。
主要功能点:
- 设备自动扫描: 定期(每
CHECK_INTERVAL秒)检测指定的 SATA 设备路径是否存在(默认为/dev/sata2到/dev/sata8)。 - 分区动态检测: 使用
lsblk命令动态查找指定设备上存在的分区,而不是硬编码猜测分区名称(如sataX1或sataXp1)。 - 自动挂载:
- 如果检测到设备上有分区且该分区未被挂载,则尝试将找到的第一个分区挂载到
MOUNT_BASE下以设备名命名的子目录中(例如/volume1/Share1/mnt/sata3)。 - 如果分区已被挂载,则跳过挂载步骤。
- 如果检测到设备上有分区且该分区未被挂载,则尝试将找到的第一个分区挂载到
- 元数据写入: 成功挂载分区后,会执行
smartctl -i获取硬盘的 SMART 信息,并将提取到的关键信息(如设备型号、序列号、容量、固件版本等,以及解析出的精确字节容量)写入挂载点目录下的.meta.json文件中。如果该文件已存在,则会覆盖;如果设备已挂载但文件丢失,也会尝试重新创建。 - 自动格式化 (需用户确认):
- 触发条件: 当检测到设备存在,但没有找到任何分区,或者找到了分区但挂载失败(暗示文件系统损坏或类型不支持)时,会进入格式化判断流程。
- 确认机制: 检查
MOUNT_BASE目录下是否存在名为sataX-needs-format的占位符文件。 - 等待确认: 如果占位符文件存在,脚本会记录日志提示用户删除该文件以进行格式化,并跳过当前设备的格式化操作。
- 执行格式化: 如果占位符文件不存在,脚本会认为需要进行格式化(用户删除了文件或首次处理裸盘),并执行以下操作:
- 分区: 使用
parted在设备上创建 GPT 分区表,然后创建一个覆盖整个磁盘的主分区。 - 类型设置: 使用
parted set 1 msftdata on将该分区的类型标志设置为 "Microsoft Basic Data",以增强 Windows 兼容性。 - 内核通知: 使用
partprobe(并辅以短暂延时) 通知 Linux 内核识别新的分区。 - 分区再检测: 再次调用
find_partitions确认新分区已被系统识别,并获取其准确路径。 - 文件系统创建: 使用
mkfs.exfat命令格式化检测到的新分区为 exFAT 文件系统,并自动添加AUTO-FMT-YYMMDD格式的卷标。
- 分区: 使用
- 格式化后挂载: 格式化成功后,自动尝试挂载新创建并格式化的分区。
- 失败处理: 如果格式化过程中的任何一步(分区、设置标志、
mkfs.exfat)失败,或者格式化成功但后续挂载仍然失败,脚本会创建(或重新创建)sataX-needs-format占位符文件。该文件包含格式化说明和硬盘的 SMART 信息,用于通知用户并防止脚本在问题解决前反复尝试格式化。
- 双日志系统:
LOG_FILE(.disk_mount.log): 记录脚本运行过程中的详细信息、检查步骤、错误等。ACTION_LOG_FILE(.disk_action.log): 单独记录关键的操作性事件,如成功挂载、成功格式化、移除占位符文件等。
- 运行模式:
- 支持通过
--no-daemon参数在前台运行,日志会同时输出到文件和控制台。 - 默认以后台守护进程模式运行,使用标准的双 fork 方式,并将标准输入输出重定向到
/dev/null,仅通过日志文件记录信息。
- 支持通过
- 依赖与兼容性:
- 依赖
lsblk,parted,smartctl,mkfs.exfat,partprobe这些命令行工具。 - 格式化选用 GPT 分区表和 exFAT 文件系统,并设置
msftdata标志,旨在实现跨平台兼容性(Linux & Windows)。
- 依赖