fix bug
This commit is contained in:
201
COMPAT_SUMMARY.md
Normal file
201
COMPAT_SUMMARY.md
Normal file
@@ -0,0 +1,201 @@
|
||||
# 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 外观
|
||||
Reference in New Issue
Block a user