Files
diskmanager2/AGENTS.md
2026-02-10 02:54:13 +08:00

238 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Linux 存储管理器 (Linux Storage Manager)
## 项目概述
这是一个基于 PySide6 开发的 Linux 图形化存储管理工具,提供磁盘管理、逻辑卷管理(LVM)和软 RAID 管理功能。应用程序通过调用系统命令(如 `lsblk`, `parted`, `mdadm`, `lvm` 等)与 Linux 存储子系统交互。
### 主要功能模块
1. **块设备管理** - 查看磁盘信息、创建分区、格式化文件系统(ext4/xfs/ntfs/fat32)、挂载/卸载设备
2. **LVM 管理** - 物理卷(PV)、卷组(VG)、逻辑卷(LV)的创建、删除和扩容
3. **RAID 管理** - 软 RAID 阵列的创建、删除和监控(支持 RAID0/1/5/6/10
## 技术栈
- **GUI 框架**: PySide6 (Qt for Python)
- **UI 设计**: Qt Designer (form.ui)
- **构建工具**: PyInstaller
- **依赖库**:
- PySide6 - GUI 框架
- pexpect - 交互式命令执行(用于 RAID 创建时的密码输入)
## 项目结构
```
.
├── mainwindow.py # 应用程序入口,主窗口逻辑,连接各模块
├── ui_form.py # 由 form.ui 自动生成的 UI 类
├── form.ui # Qt Designer UI 定义文件(主界面布局)
├── dialogs.py # 自定义对话框分区创建、挂载、RAID/LVM 创建等)
├── system_info.py # 系统信息获取模块lsblk 解析等)
├── disk_operations.py # 磁盘操作(分区、格式化、挂载管理)
├── lvm_operations.py # LVM 操作PV/VG/LV 管理)
├── raid_operations.py # RAID 操作mdadm 命令封装)
├── occupation_resolver.py # 设备占用检测与解除(嵌套挂载、进程占用)
├── logger_config.py # 日志配置(输出到 QTextEdit 控件)
├── pyproject.toml # PySide6 项目配置文件
├── disk-manager.spec # PyInstaller 打包配置
└── build-app.sh # 构建脚本
```
## 模块依赖关系
```
mainwindow.py
├── ui_form.py (UI 布局)
├── system_info.py (系统信息)
├── logger_config.py (日志)
├── disk_operations.py (磁盘操作)
│ └── 依赖 system_info.py, lvm_operations.py
├── raid_operations.py (RAID 操作)
│ └── 依赖 system_info.py
├── lvm_operations.py (LVM 操作)
├── occupation_resolver.py (占用解决)
│ └── 依赖 lvm_operations.py, system_info.py
└── dialogs.py (对话框)
└── 依赖 logger_config.py
```
## 代码组织规范
### 文件命名
- 模块文件使用下划线命名法:`disk_operations.py`, `lvm_operations.py`
- UI 相关文件:`form.ui`(设计源文件), `ui_form.py`(自动生成)
### 类命名规范
- 主窗口类:`MainWindow`
- UI 类:`Ui_MainWindow`Qt 自动生成)
- 操作类:`DiskOperations`, `LvmOperations`, `RaidOperations`
- 对话框类:`CreatePartitionDialog`, `MountDialog`, `CreateRaidDialog`
- 工具类:`SystemInfoManager`, `OccupationResolver`
### 命令执行模式
所有系统命令执行都通过 `_execute_shell_command``_run_command` 方法封装,统一处理:
- sudo 权限提升
- 错误处理和日志记录
- QMessageBox 错误提示(可抑制)
## 构建和运行
### 运行环境要求
- Linux 操作系统(需要 root/sudo 权限执行存储管理命令)
- Python 3.x
- 系统依赖:`parted`, `mdadm`, `lvm2`, `dosfstools`, `e2fsprogs`, `xfsprogs`, `ntfs-3g`
### 安装依赖
```bash
pip install PySide6 pexpect
```
### 运行应用
```bash
python mainwindow.py
```
注意:大部分功能需要 root 权限,建议以 sudo 运行或确保用户有 sudo 权限。
### 打包可执行文件
```bash
# 使用 PyInstaller
sudo pyinstaller -F --name "disk-manager" mainwindow.py
# 或使用提供的脚本
sudo ./build-app.sh
```
打包后的可执行文件位于 `dist/disk-manager`
## 开发注意事项
### UI 修改流程
1. 使用 Qt Designer 编辑 `form.ui`
2. 使用 `pyside6-uic form.ui -o ui_form.py` 重新生成 Python UI 文件
3. 或在 Qt Creator 中配置 PySide6 项目自动处理
### 日志系统
- 使用 `logger_config.py` 中配置的全局 logger
- 日志同时输出到控制台和 GUI 的 QTextEdit 控件
- 日志级别:`logging.DEBUG`(开发时可调整)
### 线程安全
- 格式化操作使用 `FormatWorker` 在后台线程执行,避免阻塞 UI
- 通过 Qt Signal/Slot 机制与主线程通信
### 错误处理
- 所有 shell 命令执行都有统一的错误处理
- 关键错误会弹出 QMessageBox 提示用户
- 详细错误信息写入日志
## 系统命令依赖
应用依赖以下 Linux 命令行工具:
| 功能 | 命令 |
|------|------|
| 块设备信息 | `lsblk` |
| 分区操作 | `parted`, `partprobe` |
| 文件系统 | `mkfs.ext4`, `mkfs.xfs`, `mkfs.ntfs`, `mkfs.vfat` |
| 挂载管理 | `mount`, `umount`, `findmnt` |
| RAID 管理 | `mdadm` |
| LVM 管理 | `pvcreate`, `vgcreate`, `lvcreate`, `pvs`, `vgs`, `lvs` 等 |
| 进程查询 | `lsof`, `fuser` |
## 安全考虑
1. **权限要求**: 应用需要 root/sudo 权限执行存储管理操作
2. **危险操作确认**: 格式化、删除分区/卷等操作都有确认对话框
3. **设备占用检测**: `OccupationResolver` 模块检测并解除设备占用(卸载挂载点、停止进程)后才执行操作
4. **fstab 备份**: 修改 `/etc/fstab` 前建议用户手动备份
## 已知限制
- 仅支持 Linux 系统
- 需要图形桌面环境
- 部分操作(如 RAID 创建)可能需要密码输入
- 不支持 LVM/RAID 的降级恢复等高级场景
## 调试建议
1. 查看日志输出GUI 底部 QTextEdit 或控制台)
2. 检查系统命令是否安装:`which parted mdadm lvm`
3. 手动测试命令:`sudo lsblk -J`
4. 检查权限:确保用户有 sudo 权限或已切换到 root
---
## 跨平台兼容性 (新增)
本项目现在支持 **Arch Linux****CentOS/RHEL 8** 两大平台,统一使用 **Tkinter** 作为 GUI 后端。
### 平台支持矩阵
| 平台 | Python版本 | GUI后端 | 状态 |
|------|-----------|---------|------|
| Arch Linux | 3.7+ | Tkinter | ✓ 完全支持 |
| CentOS 8 | 3.6 | Tkinter | ✓ 完全支持 |
| CentOS 8 Stream | 3.9+ | Tkinter | ✓ 完全支持 |
| RHEL 8 | 3.6 | Tkinter | ✓ 完全支持 |
| Ubuntu/Debian | 3.x | Tkinter | ✓ 支持 |
### 为什么统一使用 Tkinter?
- **Python 内置**: 无需额外安装
- **跨版本兼容**: 支持 Python 3.6+ (包括 CentOS 8 的 Python 3.6)
- **跨发行版**: 所有 Linux 发行版都支持
- **打包简单**: PyInstaller 处理更稳定
### 新文件说明
- **`main.py`** - 统一入口点,使用 Tkinter
- **`platform_compat.py`** - 平台检测模块
- **`system_compat.py`** - 系统命令兼容性模块
- **`build-compat.sh`** - 跨平台构建脚本
- **`disk-manager-compat.spec`** - PyInstaller 兼容配置
- **`run.sh`** - 启动脚本
### 启动方式
```bash
# 统一入口(推荐)
python3 main.py
# 或使用启动脚本
./run.sh
# 或直接运行主模块
python3 mainwindow_tkinter.py
```
### Python 3.6 兼容性修改
为支持 CentOS 8 的 Python 3.6,进行了以下修改:
1. **system_info.py** - `_run_command()` 方法避免使用 `capture_output``text` 参数
2. **platform_compat.py** - `_command_exists()` 使用 `stdout/stderr` 代替 `capture_output`
3. **system_compat.py** - 版本检测使用 `stdout/stderr` 管道
4. **smart_monitor.py** - 为 `dataclasses` 提供回退实现
5. **disk_operations_tkinter.py** - 修复 f-string 中文引号问题
### 系统命令兼容性
| 命令 | Arch Linux | CentOS 8 |
|------|-----------|----------|
| lsblk | `lsblk -J` (JSON) | `lsblk -J` (JSON) |
| lsblk 列 | 支持 PATH | 不支持 PATH使用 KNAME |
| LVM JSON | 支持 | 支持 |
### 构建打包
```bash
# 使用新的构建脚本(自动检测平台)
./build-compat.sh
# 或手动打包
pyinstaller -F disk-manager-compat.spec
```
打包后的可执行文件可在两个系统上运行,启动时会自动检测并选择合适的 GUI 后端。