Skip to content

Latest commit

 

History

History
33 lines (30 loc) · 4.18 KB

README.md

File metadata and controls

33 lines (30 loc) · 4.18 KB

项目目的:

该项目旨在为一个运行 Linux 的系统(特别是针对群晖 DSM 环境优化过)提供一个自动化的外部 SATA 硬盘管理解决方案。其核心目标是简化新插入或未格式化硬盘的初始化和挂载流程,使其能够被系统自动识别、格式化(需用户通过特定文件确认)、挂载,并能方便地在 Linux 和 Windows 系统下使用。同时,它还记录硬盘的基本信息以供查阅。

主要功能点:

  1. 设备自动扫描: 定期(每 CHECK_INTERVAL 秒)检测指定的 SATA 设备路径是否存在(默认为 /dev/sata2 到 /dev/sata8)。
  2. 分区动态检测: 使用 lsblk 命令动态查找指定设备上存在的分区,而不是硬编码猜测分区名称(如 sataX1 或 sataXp1)。
  3. 自动挂载:
    • 如果检测到设备上有分区且该分区未被挂载,则尝试将找到的第一个分区挂载到 MOUNT_BASE 下以设备名命名的子目录中(例如 /volume1/Share1/mnt/sata3)。
    • 如果分区已被挂载,则跳过挂载步骤。
  4. 元数据写入: 成功挂载分区后,会执行 smartctl -i 获取硬盘的 SMART 信息,并将提取到的关键信息(如设备型号、序列号、容量、固件版本等,以及解析出的精确字节容量)写入挂载点目录下的 .meta.json 文件中。如果该文件已存在,则会覆盖;如果设备已挂载但文件丢失,也会尝试重新创建。
  5. 自动格式化 (需用户确认):
    • 触发条件: 当检测到设备存在,但没有找到任何分区,或者找到了分区但挂载失败(暗示文件系统损坏或类型不支持)时,会进入格式化判断流程。
    • 确认机制: 检查 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 信息,用于通知用户并防止脚本在问题解决前反复尝试格式化。
  6. 双日志系统:
    • LOG_FILE (.disk_mount.log): 记录脚本运行过程中的详细信息、检查步骤、错误等。
    • ACTION_LOG_FILE (.disk_action.log): 单独记录关键的操作性事件,如成功挂载、成功格式化、移除占位符文件等。
  7. 运行模式:
    • 支持通过 --no-daemon 参数在前台运行,日志会同时输出到文件和控制台。
    • 默认以后台守护进程模式运行,使用标准的双 fork 方式,并将标准输入输出重定向到 /dev/null,仅通过日志文件记录信息。
  8. 依赖与兼容性:
    • 依赖 lsblk, parted, smartctl, mkfs.exfat, partprobe 这些命令行工具。
    • 格式化选用 GPT 分区表和 exFAT 文件系统,并设置 msftdata 标志,旨在实现跨平台兼容性(Linux & Windows)。