Skip to content

在某些U盘上制作启动盘,分区没有对其,会严重降速 #16

Open

Description

@SSSSSSSan

制作启动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。

复现方式

  1. 用客户端制作启动 U 盘。

  2. 管理员 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 起始 LBA

    63 # 32,256 字节,不是 2048 的倍数

  3. 顺序读该分区上的一个大文件,速度在 4 MB/s 附近。

  4. 同一个文件,从偏移 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions