From dccf677650aef96196747580068456883e26afa9 Mon Sep 17 00:00:00 2001 From: speak-agent <248744407+speak-agent@users.noreply.github.com> Date: Fri, 21 Aug 2026 04:02:09 +0800 Subject: [PATCH] =?UTF-8?q?docs(plan):=20qemu-x86=20=E4=BA=94=E5=AE=BF?= =?UTF-8?q?=E4=B8=BB=E7=9F=A9=E9=98=B5=E7=9A=84=E5=85=AD=E6=9D=A1=E5=8F=91?= =?UTF-8?q?=E7=8E=B0,=E4=BB=A5=E5=8F=8A=E4=BD=93=E7=A7=AF=E7=9A=84?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E6=9E=84=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⭐ 「先跑通再发布」这一步的价值已经兑现:六条只有真跑才会出现的发现,而每一条都是 「已发布却装不上」的成因 —— 在这里它们只是红叉。 其中三条是我自己判断错了的: * distlib 我先归因于「Homebrew 比较特别」,Windows 走到同一行说明它是 QEMU 的属性; * 「MSYS2 的 tar 会把符号链接改成复制」是错的,而报错是 No such file or directory 不是 Permission denied —— 是顺序不是权限; * darwin x64 两轮没跑不是失败,是 macos-13 已退役、永远排队。 ⚠️ 体积一条尤其重要:strip 之后二进制 78.7MB→27.0MB,而整个前缀只从 392MB 降到 343MB —— **约 316MB 根本不是模拟器**。索引的资产预算是实测 0.012 MB/s 的单连接 上传、无分片无续传,所以载荷**选什么**比它 strip 掉什么更重要。 --- ...026-08-21-freestanding-outstanding-four.md | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/.agents/docs/2026-08-21-freestanding-outstanding-four.md b/.agents/docs/2026-08-21-freestanding-outstanding-four.md index 2a9fddbd..f0c5fc76 100644 --- a/.agents/docs/2026-08-21-freestanding-outstanding-four.md +++ b/.agents/docs/2026-08-21-freestanding-outstanding-four.md @@ -600,6 +600,42 @@ QEMU 可以从源码构建,而且**只构建需要的目标**能把代价压下 一次就等于把门槛降成注释。 **阶段 2:在一个临时 PR 的 CI 上,用 Actions 构建其余四个宿主。** +**⇒ 已开始:`mcpplibs/qemu-x86`。** + +> 仓库只含跨宿主构建工作流,不含描述符、不含二进制、不做镜像上传。截至本次修订 +> **linux x64 / linux arm64 / darwin arm64 三条腿绿**(x64 那条还引导了 multiboot +> 探针并断言了打印),darwin x64 绿,win32 x64 仍在迭代。 + +⭐ **这一步的价值已经兑现:六条只有真跑才会出现的发现,而每一条都是「已发布却装不上」 +的成因。** 它们在这里只是红叉。 + +| # | 宿主 | 发现 | +|---|---|---| +| 1 | darwin | `found no usable distlib` —— QEMU 的 `mkvenv` 建非隔离虚拟环境要 distlib,而现代 Python 都不自带。⚠️ 第一轮我只在 macOS 修了它并归因于「Homebrew 比较特别」;Windows 走到同一行,说明它是 **QEMU 9.2.4 的属性** | +| 2 | win32 | 解压创建符号链接失败。⚠️ 我先断言「MSYS2 的 tar 会改成复制」——**错的**:`setup-msys2` 默认 `winsymlinks:nativestrict`。⭐ 报的是 `No such file or directory` 而不是 `Permission denied`,所以是**顺序**不是权限,冲权限去的修法不会奏效 | +| 3 | darwin x64 | ⚠️ **两轮都没跑过 —— 不是失败,是一直排队。** `macos-13` 镜像已退役,而退役标签不报错、只等。汇总页上「没跑」与「慢」长得一样。换 `macos-15-intel` 后立刻开始 | +| 4 | win32 | vendored wheel 够不着:`file://D:/…/python/wheels` —— `file://` URL 在盘符前需要**三个**斜杠,只有两个时 `D:` 被解析成主机名。而 `mkvenv` 离线,没有回落。⭐ 修法不是补斜杠,是预装 `pycotap`:非隔离虚拟环境看得见系统的包,mkvenv 的判据就是「能不能 import」 | +| 5 | win32 | MSYS2 的 Python **不自带 pip**(单独的包)。我默认了它在场 | +| 6 | win32 | `ninja` 会连**单元测试**一起构建,而 `test-vmstate.exe` 在 MinGW 下链接不了(`undefined reference to qemu_ftruncate64`)—— 2032 个目标里已经编好 1897 个。⭐ 只构建模拟器目标而不是给测试打补丁,是更小的主张 | + +### 4.3.1 ⚠️ 体积:strip 回答的比预期少得多 + +实测于 linux-x64: + +| | | +|---|---| +| `qemu-system-x86_64` | 78,681,192 → **26,994,336 字节**(strip 后) | +| 整个安装前缀 | 392 MB → **343 MB** | + +⭐ **也就是说约 316 MB 根本不是模拟器。** 一个把这个前缀直接打包的载荷会把它一起 +发出去,而索引的资产预算是实测 **0.012 MB/s** 的单连接上传、无分片、无断点续传 —— +所以**载荷选什么**比它 strip 掉什么更重要。这一条要在写描述符之前回答,而不是靠 +「删到出问题为止」。 + +⚠️ macOS 那两条腿不 strip,并且说明了原因:strip Mach-O 会让 ad-hoc 签名失效,这 +正是本生态发布流水线自己的规则。 + + ⭐ 这一步的价值在于**先把五条流水线跑通,再谈收录**。GitHub 托管的 runner 覆盖 linux x64/arm64、macOS arm64/x64 与 windows x64,恰好就是本索引服务的