LUN(Logical Unit Number,逻辑单元号)是存储目标内部的逻辑单元编号,用来把同一设备中的不同逻辑存储区域暴露给主机;在 UFS 中,boot、user、RPMB 等区域可以表现为不同 LUN。
核心问题
一颗存储设备可能不只有一个“盘”。它可能同时有:
- 普通用户数据区域。
- 启动区域。
- RPMB 安全区域。
- 厂商或系统保留区域。
主机需要一种方式区分这些逻辑区域,但又不必把它们理解成多颗物理芯片。LUN 就是这种逻辑编号。
核心对象
| 对象 | 作用 |
|---|---|
| target | 存储目标设备,例如一颗 UFS device。 |
| logical unit | target 内部的一个逻辑存储单元。 |
| LUN id | 标识 logical unit 的编号。 |
| boot LUN | 启动用逻辑单元。 |
| user LUN | 普通数据逻辑单元。 |
| RPMB LUN | 防回放安全存储逻辑单元。 |
核心机制
主机发命令时不只说明“读哪个 LBA”,还要说明目标逻辑单元:
request = (target, lun, lba, length, operation)target是具体 UFS device。lun选择这个设备内部的逻辑单元。lba和length是该 LUN 内部的逻辑块范围。operation是读、写、flush、query 或任务管理操作。
同一个 lba = 0 在不同 LUN 中含义不同,因为它们属于不同逻辑地址空间。
工程用途
- 在 UFS 中区分 boot LUN、user LUN 和 RPMB LUN。
- 在操作系统中把同一物理设备暴露成多个逻辑块设备或安全访问入口。
- 在启动链中选择从哪个 boot LUN 加载早期镜像。
边界与常见坑
- LUN 不是物理 NAND die,也不一定是独立性能域。
- LUN 不是文件系统分区。分区通常存在于某个 LUN 的逻辑块空间里;LUN 是更底层的设备逻辑单元。
- 访问 RPMB LUN 通常需要认证流程,不能像普通 user LUN 一样随意读写。
- 启动配置、LUN enable 和分区表是不同层的配置,混淆后容易把镜像写错位置。