4.9 KiB
4.9 KiB
Linux 存储管理器 - 跨平台兼容性实现总结
目标
实现一个打包后的软件,可以在 Arch Linux 和 CentOS 8 两个系统上运行,统一使用 Tkinter 作为 GUI 后端。
解决方案概述
核心设计
-
统一入口点 (
main.py)- 直接使用 Tkinter,无需检测 GUI 后端
- 简化启动逻辑
-
平台检测模块 (
platform_compat.py)- 检测操作系统类型 (Arch/CentOS/RHEL/Ubuntu/Debian)
- 检查系统前提条件
- 提供安装指南
-
系统命令兼容模块 (
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?
- Python 内置 - 无需额外安装
- 跨版本兼容 - 支持 Python 3.6+ (包括 CentOS 8)
- 跨发行版 - 所有 Linux 发行版都原生支持
- 打包简单 - PyInstaller 处理更稳定
兼容性修改详情
1. Python 3.6 兼容性修复
system_info.py
# 修改前 (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模块提供回退实现
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 列代替,在解析时构建路径
# 命令修改
"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 操作- 其他所有原始文件
使用方式
源码运行
# 统一入口
python3 main.py
# 或使用启动脚本
./run.sh
# 直接运行主模块
python3 mainwindow_tkinter.py
构建打包
# 使用新的构建脚本
./build-compat.sh
# 或手动打包
pyinstaller -F disk-manager-compat.spec
# 输出
# dist/disk-manager
安装依赖
Arch Linux
sudo pacman -S python tk parted mdadm lvm2
sudo pacman -S dosfstools e2fsprogs xfsprogs ntfs-3g
pip3 install pexpect
CentOS 8
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: 正常获取块设备
系统命令: 自动适配
注意事项
- 权限要求: 磁盘管理操作需要 root/sudo 权限
- Tkinter 安装: 确保系统已安装 python3-tkinter/tk
- 可选依赖: mkfs.ntfs 等命令为可选,缺失时相应功能不可用
- 打包文件: 单个可执行文件可在两个系统运行
后续建议
- 考虑添加更多发行版支持 (Ubuntu/Debian/SUSE)
- 可以添加容器化部署选项
- 考虑添加主题支持改进 Tkinter 外观