OxBeats OS - USB 安装工具盘 (Tiny)  v1.5
============================================

这是一个"极简系统刷机工具盘底座"：
  - 启动底座约 30 MB（Tiny Core 16.2 内核 + 精简根文件系统）
  - UEFI 启动：GRUB 2.14（Ubuntu 签名版 shim + grub，兼容 Secure Boot 关闭环境）
  - BIOS 启动：syslinux 6.03
  - 不包含蛮牛(OxBeats)系统镜像，由你自行拷贝
  - 安装界面为英文/ASCII，纯文本 TTY 下绝不会出现汉字乱码

文件结构（U盘根目录）
----------------------
  boot/
    vmlinuz                  Tiny Core 内核
    core.gz                  精简根文件系统（已定制：开机自动拉起安装器）
    syslinux/                BIOS 菜单组件
  EFI/BOOT/                  UEFI 引导（BOOTX64.EFI / grubx64.efi / grub.cfg）
  grub.cfg                   UEFI 启动菜单
  syslinux.cfg               BIOS 启动菜单
  install.sh                 安全安装脚本（英文界面，带菜单和多重确认）
  README.txt                 本说明
  make_oxbeats_usb.ps1       Windows 一键制盘脚本（可选）
  tools/syslinux64.exe       BIOS 引导安装工具


使用方法（UEFI，推荐）
----------------------
1. 把 U 盘格式化为 FAT32（U 盘上所有数据会被清空）。
2. 把本压缩包解压到 U 盘根目录，确认根目录下有：
       EFI /  boot /  grub.cfg /  install.sh ...
3. 把系统镜像复制到 U 盘根目录（或任意子目录）：
       oxbeats.img        （未压缩镜像）
       或 oxbeats.img.xz  （xz 压缩镜像，推荐，更省空间）
   U 盘上可以同时放多个不同版本的镜像，启动后会自动列成菜单。
4. 把 U 盘插入目标机器，开机选择从 U 盘启动（UEFI 模式）。
5. 自动进入安装器，操作流程：
   a) 从镜像菜单中选择要刷写的 IMG（输入数字）。
   b) 从硬盘菜单中选择目标硬盘（输入数字；启动 U 盘已自动排除）。
   c) 如果该硬盘上检测到 oxroot 分区，则激活"覆盖升级"菜单：
        [1] 覆盖升级（替换 oxefi loader + dd 写入 oxroot 分区）
        [2] 整盘覆盖（dd 写入整个镜像）
   d) 覆盖升级时选择备份方式（U 盘备份 / 仅备份 oxefi / 不备份）。
   e) 核对分区表信息（两边 GPT 分区名 / 偏移 / 大小），输入大写 YES。
   f) 第二重确认（FINAL CHECK）：再输入一次大写 YES 才开始写入。
6. 写入完成后拔掉 U 盘并重启目标机器。


覆盖升级（保留其它分区）
------------------------
目标硬盘上检测到 oxroot 分区时，安装器激活"覆盖升级"，它包含两步操作：
  1) oxefi 分区可以直接挂载：把镜像里的 EFI loader 文件（EFI/BOOT/... 等）
     覆盖式写进去 —— 同名文件被新版本替换，镜像里没有的文件保留下来，这样
     固件启动项指向的路径不会被删掉。
  2) oxroot 分区在本工具盘里挂不起来：不做文件级操作，而是先把镜像里的
     oxroot 分区整块切出来存成一个独立文件，再用一条普通 dd 写到目标盘的
     同名分区上 —— 和整盘覆盖用的是同一条写盘路径，只是范围限定在这个分区。

写盘前会列出两边的分区表信息供核对（GPT 分区名、镜像内偏移、分区大小），
并检查目标 oxroot 分区不小于镜像里的 oxroot 分区；写盘后会校验首扇区、
末扇区和整块内容。其它分区（数据区等）完全不动。

启动身份（BOOT IDENTITY）—— 这是能不能启动的关键：
  OxBeats 的 loader 只接受"GPT 类型 = 系统分区类型、且 GPT 名字完全等于
  oxtools / oxroot"的分区，再去挂这个名字对应的根分区。也就是说，目标盘
  根分区的 GPT 名字和类型不是"跟镜像保持一致"，而是必须满足 loader 的
  固定契约。安装器写盘后检查并（经你确认）修正目标 GPT：
    - 根分区名字 -> oxroot（镜像自己的名字若 loader 能接受，则沿用镜像的）
    - 根分区类型 -> 系统分区类型 (516e7cb6-6ecf-11d6-8ff8-00022d09712b)
    - oxefi 名字为空时补回 oxefi（不会清空已有的名字）
    - 盘上若有 oxtools 分区（loader 会优先选它），会提示改名，否则刚写入的
      oxroot 不会被用到
  改写同时处理主/备两份分区表并重算 CRC，校验不过会自动整体回滚。

整盘覆盖（dd）模式：写完后会把镜像自带的 GPT 扩展到整块磁盘（备份表/
表头移到盘尾、修正 last usable LBA 与保护性 MBR），并同样执行上面的启动
身份修正 —— 镜像里的根分区名字如果 loader 认不出来（例如叫 oxtool），
这里会被改成 loader 能接受的名字，否则写完整盘也起不来。

oxroot 里装的是什么（这一版镜像的启动方式）：
  内核和真正的根文件系统都放在 oxroot 分区里：
      /boot/kernel/kernel   未压缩内核
      /boot/rootfs.img      真正的根文件系统（约 40M，由 loader 装载到内存）
  ESP 里的 loader（EFI/BOOT/BOOTX64.EFI）自己找到名字为 oxroot 的分区，再从
  那里读出上面两个文件。所以 oxroot 就是"启动分区"，它必须同时满足：GPT
  名字 oxroot、类型正确、内容与 loader 来自同一个镜像 ——
  **旧 loader 配新 rootfs 一定起不来**（旧 loader 不认识 /boot/rootfs.img）。

  因此覆盖升级时，安装器会检查 ESP 上是否存在**镜像以外的** loader 文件
  （例如某个别名的 loader.efi、EFI/Microsoft/... 、startup.nsh），有就提示
  把它们一并替换成镜像里的 loader（原文件留 .bak）。固件只认自己启动项里
  写的那条路径，留别的路径上的旧 loader，它就会继续用旧的，表现为
  黑屏或停在光标不动。整盘 dd 模式不存在这个问题（整个 ESP 被镜像覆盖）。

写盘后还会做一次 BOOT CHECK：列出两边 oxefi/oxroot 的 PARTUUID、检查
oxroot 里的分区标记（位于 +1372 处），并检查 oxefi 里的启动配置是否引用了
"镜像里的分区 UUID"（目标盘保留自己的 GPT，这些 UUID 在目标盘上不存在，
按 UUID 找根分区会启动失败，检测到会提示改写）。

READ BACK（写盘后回读）：
  本工具盘挂不起 oxroot。安装器内置了一个极简的只读分区读取器
  （纯 dd/od/awk 实现），写盘后直接读目标盘：
      /boot/kernel/kernel   /boot/rootfs.img   /oxbeats.version
  并把大小与镜像内的同一文件逐个比对、把版本号打出来。这样不用开机就能
  判断"写进去了没有、写得全不全" —— 内核和 rootfs 镜像都位于 oxroot 的
  末端，短写或写错分区会立刻在这里暴露，而不是等到开机卡住才发现。

备份（写盘前，可选）：
  [1] U 盘：oxefi 全部文件 + oxroot 分区原始镜像（oxroot.img）
  [2] U 盘：仅 oxefi 文件
  [3] 不备份（需要输入 SKIP 确认）
备份放在 U 盘根目录 /oxbeats-backup-<日期时间>/ 下；U 盘空间不足时，
oxroot 原始镜像会自动跳过并提示。

分区识别方式（按优先级）：GPT 分区名（oxefi / oxroot / oxtools）、GPT 分区
类型（EFI System -> oxefi，系统分区类型 -> oxroot，oxmusic 排除在外）、然后
才是 FAT16/FAT32 卷标（OXEFI / OXROOT）。分区名是空的或还是旧名字时也能
认出来；名字比较大小写不敏感，但写进 GPT 的卷标按 loader 的要求用全小写。

注意：升级模式需要读到镜像内的分区，请用未压缩的 .img；如果选的是
.img.xz，安装器会先把它解包到 U 盘（U 盘只读时改用内存），再照常升级。


其他用法
--------
A) Windows 一键制盘（可选，自动格式化并装好 BIOS 引导）：
   右键点击 make_oxbeats_usb.ps1 -> 使用 PowerShell 运行
   （或双击 make_oxbeats_usb.bat；会请求管理员权限）。
   按提示输入 U 盘编号并输入 YES 确认。

B) BIOS 老机器（不支持 UEFI）：
   手动拷文件后还需执行：tools\syslinux64.exe -m -a X:，
   其中 X: 为 U 盘盘符。

C) 测试用镜像：
   OxBeats-USB-Toolkit-v1.5.img 可直接用 Rufus/balenaEtcher 写入 U 盘，
   用于验证启动链。注意：写盘后 U 盘容量 = 镜像大小（128 MB），
   正式使用请使用"解压到 FAT32 U 盘"的方式，才能保留全部容量。


注意事项
--------
- 开启 Secure Boot 的机器请先在 BIOS 中关闭 Secure Boot
  （或设置 Allow 3rd-party/Non-Microsoft 启动项）。
- FAT32 单文件上限为 4 GB，超大镜像请保持 xz 压缩后再放入。
- 安装器会自动排除当前启动 U 盘，不会误格 U 盘。
- 写盘前必须经过两级 YES 确认，任一级不通过都会中止。
- 镜像解压后的大小不能超过目标盘容量（脚本会自动检查并拒绝）。
- 覆盖升级会先做备份再写入；备份在 U 盘 /oxbeats-backup-<日期时间>/，
  也可以只备份 oxefi 或跳过（跳过需输入 SKIP）。
- 覆盖升级只动 oxefi（替换 loader 文件）和 oxroot（整分区 dd），同一个
  硬盘上的其它分区不受影响。
- 覆盖升级会保留 oxefi 里镜像未提供的文件；如果启动配置里引用了镜像的
  分区 UUID，安装器会提示改写成本机 UUID（这才是能正常启动的关键）。
- oxroot 在工具盘里挂不起来，因此只能整分区覆盖，无法选择性保留
  里面的文件；需要旧数据请先用 [1] 备份出 oxroot.img。
- 目标磁盘上的所有数据会被永久覆盖，请提前备份。
- 本工具盘不会修改 U 盘上的镜像原文件。

组件版本
--------
Tiny Core Linux 16.2 (CorePure64), Linux kernel 6.x
GRUB 2.14 (Ubuntu grub-efi-amd64-signed 1.215)
shim 15.8 (Microsoft 签名)
syslinux 6.03
