# Linux 存储管理器 - 跨平台兼容性实现总结 ## 目标 实现一个打包后的软件,可以在 **Arch Linux** 和 **CentOS 8** 两个系统上运行,统一使用 **Tkinter** 作为 GUI 后端。 ## 解决方案概述 ### 核心设计 1. **统一入口点** (`main.py`) - 直接使用 Tkinter,无需检测 GUI 后端 - 简化启动逻辑 2. **平台检测模块** (`platform_compat.py`) - 检测操作系统类型 (Arch/CentOS/RHEL/Ubuntu/Debian) - 检查系统前提条件 - 提供安装指南 3. **系统命令兼容模块** (`system_compat.py`) - 处理不同系统版本的命令差异 - 自动降级到兼容的命令格式 - 手动解析回退方案 ### 平台支持 | 平台 | 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? 1. **Python 内置** - 无需额外安装 2. **跨版本兼容** - 支持 Python 3.6+ (包括 CentOS 8) 3. **跨发行版** - 所有 Linux 发行版都原生支持 4. **打包简单** - PyInstaller 处理更稳定 ## 兼容性修改详情 ### 1. Python 3.6 兼容性修复 #### system_info.py ```python # 修改前 (Python 3.7+) result = subprocess.run( command_list, capture_output=check_output, # 3.7+ text=True, # 3.7+ ... ) # 修改后 (兼容 Python 3.6) result = subprocess.run( command_list, stdout=subprocess.PIPE if check_output else None, stderr=subprocess.PIPE if check_output else None, encoding='utf-8' if check_output else None, ... ) ``` #### platform_compat.py - `_command_exists()`: 使用 `stdout=subprocess.PIPE` 代替 `capture_output=True` #### system_compat.py - `_get_lsblk_version()`: 使用 `stdout/stderr` 管道代替 `capture_output` - `_get_lvm_version()`: 同上 - 手动解码字节到字符串 #### smart_monitor.py - 为 `dataclasses` 模块提供回退实现 ```python if sys.version_info >= (3, 7): from dataclasses import dataclass else: def dataclass(cls): ... # 简化实现 ``` #### disk_operations_tkinter.py - 修复 f-string 中的中文引号问题 (Python 3.6 f-string 限制) ### 2. 系统命令差异处理 #### lsblk PATH 列 - **问题**: CentOS 8 的 lsblk (2.32) 不支持 PATH 列 - **解决**: 使用 KNAME 列代替,在解析时构建路径 ```python # 命令修改 "NAME,FSTYPE,...,PATH" → "NAME,KNAME,FSTYPE,...,PKNAME" # 解析时处理 dev['path'] = f"/dev/{dev['kname']}" ``` #### JSON 格式支持 - **lsblk JSON**: util-linux 2.23+ (CentOS 8 ✓) - **LVM JSON**: LVM 2.02.166+ (CentOS 8 ✓) - **回退**: 普通格式 + 手动解析 ## 文件列表 ### 新增文件 | 文件 | 说明 | |------|------| | `main.py` | 统一入口点 (Tkinter) | | `platform_compat.py` | 平台检测模块 | | `system_compat.py` | 命令兼容性模块 | | `build-compat.sh` | 跨平台构建脚本 | | `run.sh` | 启动脚本 | | `disk-manager-compat.spec` | PyInstaller配置 | | `README_COMPAT.md` | 使用文档 | | `COMPAT_SUMMARY.md` | 本文档 | ### 修改的文件 | 文件 | 修改内容 | |------|----------| | `system_info.py` | 使用兼容性模块;修复 subprocess 调用 | | `smart_monitor.py` | 添加 dataclass 回退 | | `disk_operations_tkinter.py` | 修复 f-string 引号 | | `AGENTS.md` | 添加兼容性文档 | ### 保留的原文件 - `mainwindow_tkinter.py` - Tkinter 主窗口 - `disk_operations_tkinter.py` - 磁盘操作 - `lvm_operations_tkinter.py` - LVM 操作 - `raid_operations_tkinter.py` - RAID 操作 - 其他所有原始文件 ## 使用方式 ### 源码运行 ```bash # 统一入口 python3 main.py # 或使用启动脚本 ./run.sh # 直接运行主模块 python3 mainwindow_tkinter.py ``` ### 构建打包 ```bash # 使用新的构建脚本 ./build-compat.sh # 或手动打包 pyinstaller -F disk-manager-compat.spec # 输出 # dist/disk-manager ``` ### 安装依赖 #### Arch Linux ```bash sudo pacman -S python tk parted mdadm lvm2 sudo pacman -S dosfstools e2fsprogs xfsprogs ntfs-3g pip3 install pexpect ``` #### CentOS 8 ```bash sudo yum install -y python3 python3-tkinter parted mdadm lvm2 sudo yum install -y dosfstools e2fsprogs xfsprogs ntfs-3g pip3 install pexpect ``` ## 测试验证 在 CentOS 8 环境测试通过: ``` Python 3.6.8 平台: Linux-4.18.0-348.el8.x86_64 GUI后端: tkinter lsblk: 正常获取块设备 系统命令: 自动适配 ``` ## 注意事项 1. **权限要求**: 磁盘管理操作需要 root/sudo 权限 2. **Tkinter 安装**: 确保系统已安装 python3-tkinter/tk 3. **可选依赖**: mkfs.ntfs 等命令为可选,缺失时相应功能不可用 4. **打包文件**: 单个可执行文件可在两个系统运行 ## 后续建议 1. 考虑添加更多发行版支持 (Ubuntu/Debian/SUSE) 2. 可以添加容器化部署选项 3. 考虑添加主题支持改进 Tkinter 外观