Files
Deshab-OS/docs/上下文/DeshabOS安装Pacman包管理器.md
2026-07-31 13:53:49 +08:00

123 lines
4.5 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.
# DeshabOS安装Pacman包管理器
## 核心矛盾
pacman 安装的软件(如 `/usr/bin/firefox`)是 **Linux x86-64 动态链接 ELF**,依赖 glibc + Linux syscall ABI。Deshab 是 SAS-R0 单地址空间内核,没有 Linux syscall 层、没有动态链接器,**这些二进制在 Deshab 原生侧跑不起来**。
### pacman 依赖 vs Deshab 现状
| pacman 依赖 | Deshab 现状 |
|---|---|
| glibc + POSIX syscall | ❌ 无 POSIX 层,SAS-R0 |
| libalpm(动态链接 .so) | ❌ 无动态链接器 |
| libcurl(HTTP/HTTPS) | ❌ 网络栈未完成 |
| gpgme(签名校验) | ❌ 无加密库 |
| zlib/zstd/xz/bzip2 | ❌ 无压缩库 |
| 可写 Unix 文件层级 | ❌ FAT32 多数只读 |
| fork/exec 子进程 | ❌ shell 内建命令,无 exec/argv |
### 正确理解:"WSL 互操作模式"
- Linux guest 内跑 Arch + pacman → 软件装在 Linux 的 /usr/bin
- Deshab shell/desktop 通过 IPC 委托 Linux 执行命令 → 结果显示回 Deshab
- **不是**把 Arch ELF 搬到 SYSTEM/bin
### 三种方案对比
| 方案 | 软件运行位置 | 可行性 |
|---|---|---|
| A: pacman 在 Linux guest 内自治 | Linux guest | ✅ 最简单 |
| B: 包文件物理写入 SYSTEM/bin | 想在 Deshab 原生跑 → ❌ | 不可行 |
| **C: SYSTEM/bin 放 stub,IPC 委托 Linux 执行** | Linux guest | ✅ WSL 互操作 |
---
## 实现阶段(按顺序,缺一不可)
### 第一阶段:Linux guest 真正跑起来
| 编号 | 需实现 | 现状 | 证据文件 |
|---|---|---|---|
| 1.1 | virtio-block 后端 | ❌ | `CODE/linux/configs/utsm_x86_64_defconfig:120-145` |
| 1.2 | virtio-net 后端 | ❌ | 同上 |
| 1.3 | initramfs/rootfs | ❌ 无用户态 | `CODE/UTSM/vmm/linux_loader.c:519-521` |
| 1.4 | EPT 动态页映射 | ❌ vmexit handler 只有 stub | `CODE/UTSM/vmm/vmexit.c:46-58` |
| 1.5 | 构建并测试 Linux guest | ⚠️ | `CODE/linux/README.md` |
**完成标准**: QEMU → UTSM → Linux guest shell → `uname -a`
### 第二阶段:Linux guest 内装 Arch + pacman
| 编号 | 需实现 | 说明 |
|---|---|---|
| 2.1 | Arch rootfs/bootstrap | 解压到 virtio-block 镜像 |
| 2.2 | pacman 可用 | 配置 mirrorlist |
| 2.3 | 网络可用(virtio-net) | 前提: 1.2 完成 |
| 2.4 | AUR helper(可选) | yay/paru |
**完成标准**: `pacman -S neofetch && neofetch`
### 第三阶段:UTSM↔Linux 文件传输 IPC
| 编号 | 需实现 | 现状 | 证据 |
|---|---|---|---|
| 3.1 | hypercall op: FILE_TRANSFER | ❌ 仅有9个op | `hypercall.c:202-234` |
| 3.2 | payload_pool 分块传输 | ⚠️ 1MB pool 未用 | `ipc_proto.h:30-36` |
| 3.3 | Linux 侧 utsm_hcall 扩展 | ❌ 无文件发送接口 | `utsm_hcall.c:45-84` |
| 3.4 | UTSM 侧 f32_write_root_file 接入 | ✅ 已有写入 | `dsk/main.c:150-175` |
**完成标准**: `utsm-send /usr/bin/firefox /bin/firefox` → 写入 Deshab FAT32
### 第四阶段:Deshab shell 命令委托执行
| 编号 | 需实现 | 现状 | 证据 |
|---|---|---|---|
| 4.1 | hypercall op: EXEC_FORWARD | ❌ | `hypercall.c` |
| 4.2 | Linux 进程执行 + stdout/stderr 回传 | ❌ | 需新增 |
| 4.3 | shell path_search_and_run 扩展 | ⚠️ 只能加载原生 PIE | `shell/main.c:1416-1460` |
| 4.4 | shell IPC 调用层 | ❌ | 需新增 |
**完成标准**: shell 输入 `firefox` → Linux 执行 → 输出回显
### 第五阶段:desktop 集成(可选)
- 5.1: desktop 动态注册"Linux 命令"为应用图标(扩展 app_descriptor.linux_cmd)
- 5.2: 点击图标 → EXEC_FORWARD hypercall
---
## 最小可用路径
1. 第一阶段全部完成(Linux guest 启动到 shell)
2. 第二阶段 2.1-2.3 完成(Arch + pacman + 网络)
3. 第三阶段 3.1-3.4 完成(文件从 Linux 写入 Deshab FAT32)
4. 第四阶段 4.1-4.4 完成(shell 命令委托执行)
**当前最大瓶颈**: 第一阶段的 virtio 后端 + initramfs
---
## 系统现状检查
### Linux guest 方向
| 检查项 | 状态 |
|---|---|
| Linux 内核源码 | ❌ 未克隆 |
| linux-bzImage | ❌ 未构建 |
| initramfs/rootfs | ❌ 不存在 |
| limine.conf 配置 | ⚠️ 已注释(正确) |
### 已知 Bug
| 编号 | 严重度 | 问题 |
|---|---|---|
| BUG-001 | P2 | Files 窗口关闭按钮无法关闭 |
| BUG-002 | P2 | 开发者模式 shell 命令回车无反应 |
| BUG-003 | P2 | 桌面 shell 命令文字跑到下一行 |
| BUG-004 | P2 | Files 显示的不是 SYSTEM/user 目录 |
| BUG-005 | P2 | Files 没有文件夹图标 |
| BUG-006 | P2 | Files 缺少 ".." 返回上级 |
| BUG-007 | P3 | 桌面不需要重复显示终端和 CMD 图标 |
| BUG-008 | P3 | 打字机效果需要再快3倍 |