Repository navigation
Description
制作启动U盘后,数据分区起点在 LBA 63,U 盘读写被限速到 4 MB/s
问题
用 HotPE Client 制作启动 U 盘后,数据分区从第 63 扇区开始。
63 扇区 = 32,256 字节。
32,256 不是 1024 的倍数(32,256 mod 1024 = 512),也不是 1 MiB 的倍数。
结果是整块 U 盘的数据分区只有 4 MB/s 左右。复制大文件也只有个位数 MB/s。
实测
同一块盘、同一根线、同一个 USB 口(梵想 F379 Pro 512GB,JMicron JMS567 桥接芯片):
| 读的位置 | 速度 |
|---|---|
| 数据分区,偏移 0(起点错位 512 字节) | 4.2 MiB/s |
| 同一个数据分区,偏移 512 字节(对齐) | 309 MiB/s |
EFI 分区(客户端用 /end 创建,起点是对齐的) |
197–309 MiB/s |
只把数据分区起点从 LBA 63 挪到 LBA 2048(1 MiB 对齐),其它都不动:
| 修复前 | 修复后 | |
|---|---|---|
| 数据分区起点 | 32,256 B(LBA 63) | 1,048,576 B(LBA 2048) |
| 顺序读 | 4.3 MiB/s | 401.7 MiB/s |
| 簇大小 | exFAT 128 KiB | exFAT 128 KiB(没改) |
所以:盘、线、口、驱动都没问题,慢的原因只有一个——分区起点没有对齐。
簇大小不是问题,128 KiB 簇在对齐后照样能跑 400 MiB/s。
原因
src/view/controller/Install/toUDisk.ts 里,先做了这些:
/hd:N /init:N
/hd:N /rebuildmbr:N /mbrtype:2
然后从盘首创建数据分区:
/hd:N /cre /size:auto /pri /align /fs:NTFS /letter:auto
在这个版本里,/align 对“重写 MBR 之后创建的第一个分区”没有生效,起点仍然是老式 MBR 的 LBA 63。
起点错 512 字节之后,桥接芯片退回逐扇区搬运,速度掉到正常值的 1/47。
这和文件系统、块大小、队列深度都无关。
需要改什么
两处代码都用了同样的写法:
src/view/controller/Install/toUDisk.ts:70(安装到 U 盘,数据分区)src/view/controller/Install/toUDisk.ts:159(还原 U 盘,数据分区)
建议给数据分区显式指定起点,不要依赖 /align。
方案 A:调用 PartAssist 时加上 /offset。
/hd:N /cre /size:auto /pri /offset:1 /align /fs:NTFS /letter:auto
resources/tools/PACMDforUSB/PartAssist.exe 自带的用法字符串里就有 /offset(在 /cre 同一行),
官方命令行文档的写法是 partassist.exe /hd:0 /cre /pri /size:auto /offset:100 /fs:fat32 /act /align /label:DATA /letter:F,
/offset:100 表示 100MB。请实测确认 /offset:1 是不是 1 MiB,如果不是,换成能落在 1 MiB 边界的值。
方案 B:数据分区改用 Windows 自带的 diskpart 创建,其它步骤不变。
select disk N
create partition primary align=1024
align 的单位是 KiB,1024 KiB = 1 MiB。
复现方式
-
用客户端制作启动 U 盘。
-
管理员 PowerShell 读一下数据分区的起始 LBA:
$b = New-Object byte[] 512
$f = [IO.File]::OpenRead('\.\PhysicalDrive'); $f.Read($b,0,512) | Out-Null; $f.Close()
[BitConverter]::ToUInt32($b, 446 + 8) # 分区 1 起始 LBA63 # 32,256 字节,不是 2048 的倍数
-
顺序读该分区上的一个大文件,速度在 4 MB/s 附近。
-
同一个文件,从偏移 512 字节处开始读,速度回到 300 MB/s。
自检建议(防回归)
建完分区后读一次上表的起始 LBA,起始 LBA % 2048 != 0 就提示制作失败。
这个 bug 只有在用户抱怨“U 盘很慢”时才会被发现,最好让工具自己发现。
文档 MakeUDisk.md:31 的示例命令也要一起改。
环境
- U 盘:梵想 F379 Pro 512GB,JMicron JMS567(VID_152D PID_0562)
- 系统:Windows 11
- 客户端:0.4.251209
- 仓库 main(a510050)里是同一段代码
AI写的
Activity