Zoned Storage-Tools and Librarues

本文详细介绍了Linux系统中用于管理分区存储的工具和库,包括lsblk、blkzone、libzbc、libnvme等。lsblk和blkzone命令用于查看设备和zone信息,libzbc和libnvme则是用户库,提供操作ZBC和NVMe设备的接口。此外,文章还提到了SCSI通用工具lsscsi和用于ZNS设备的nvme-cli,以及QEMU等模拟工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本章描述了支持zoned块设备的用户级应用程序和库。

Linux 系统实用程序

正如 util-linux 项目本身的文档所说,util-linux 是 Linux® 实用程序的随机集合。 util-linux 项目托管在 GitHub 。 该项目以 util-linux 名称打包在大多数发行版中,并默认安装。

util-linux 提供(以及其他实用程序)lsblkblkzone 命令行工具,用于列出分区zoned设备和获取zone的配置。 blkzone 工具还允许重置顺序区域的写指针。

这些实用程序对于 shell 脚本和解决用户应用程序中的zone管理问题特别有用。

lsbllk

  • lsblk 命令列出系统的所有块设备,无论块设备类型如何(这意味着是的,它还包括分区块设备)。 lsblk 的输出如下:
# lsblk
NAME     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda        8:0    0 167.7G  0 disk
├─sda1     8:1    0     1G  0 part /boot
├─sda2     8:2    0 150.7G  0 part /
└─sda3     8:3    0    16G  0 part [SWAP]
sdb        8:16   0  12.8T  0 disk
sdc        8:32   0  12.8T  0 disk
sdd        8:48   0  13.7T  0 disk
  • 默认情况下,lsblk 不提供列出的块设备的区域模型的指示。 要发现此信息,请使用选项 -z
# lsblk -z
NAME     ZONED
sda      none
├─sda1   none
├─sda2   none
└─sda3   none
sdb      host-managed
sdc      host-managed
sdd      host-managed
  • 可以使用 -o 选项格式化 lsblk 的输出。 例如,以下命令将显示块设备名称、大小和区域模型。
# lsblk -o NAME,SIZE,ZONED
NAME       SIZE ZONED
sda      167.7G none
├─sda1       1G none
├─sda2   150.7G none
└─sda3      16G none
sdb       12.8T host-managed
sdc       12.8T host-managed
sdd       13.7T host-managed

blkzone

blkzone 命令行实用程序列出(报告)zoned块设备的区域并重置顺序区域的写指针。 blkzone 依赖于内核提供的 ZBD ioctl() 接口来执行“zone report”和“zone reset”操作。 blkzone 不会直接向设备发出 SCSI、ATA 或 NVMe 命令。

blkzone 命令用法如下图:

# blkzone --help

Usage:
 blkzone <command> [options] <device>

Run zone command on the given block device.

Commands:
 report       Report zone information about the given device
 capacity     Report zone capacity for the given device
 reset        Reset a range of zones.
 open         Open a range of zones.
 close        Close a range of zones.
 finish       Set a range of zones to Full.

Options:
 -o, --offset <sector>  start sector of zone to act (in 512-byte sectors)
 -l, --length <sectors> maximum sectors to act (in 512-byte sectors)
 -c, --count <number>   maximum number of zones
 -f, --force            enforce on block devices used by the system
 -v, --verbose          display more details

 -h, --help             display this help
 -V, --version          display version

Arguments:
 <sector> and <sectors> arguments may be followed by the suffixes for
   GiB, TiB, PiB, EiB, ZiB, and YiB (the "iB" is optional)

For more details see blkzone(8).
  • Zone Report
# blkzone report /dev/sdd
  start: 0x000000000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000080000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000100000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000180000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000200000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000280000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000300000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000380000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000400000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x000480000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  ...
  start: 0x010500000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x010580000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
  start: 0x010600000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 1(em) [type: 2(SEQ_WRITE_REQUIRED)]
  start: 0x010680000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 1(em) [type: 2(SEQ_WRITE_REQUIRED)]
  start: 0x010700000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 1(em) [type: 2(SEQ_WRITE_REQUIRED)]
  start: 0x010780000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 1(em) [type: 2(SEQ_WRITE_REQUIRED)]
  start: 0x010800000, len 0x080000, cap 0x080000, wptr 0x000000 reset:0 non-seq:0, zcond: 1
### 关于 `dm-zoned` 的介绍 #### 设备映射器模块中的 `dm-zoned` 设备映射器(Device Mapper)是一个 Linux 内核框架,用于管理块设备的抽象层。它允许创建虚拟块设备,这些设备可以基于其他物理或逻辑块设备构建复杂的功能[^3]。 `dm-zoned` 是 Device Mapper 中的一个特定目标类型,旨在处理分区设备上的写入操作优化。对于现代大容量 SSD 和 HDD 存储介质而言,它们通常具有内部区域划分特性,即所谓的 Zoned Block Devices (ZBD),这使得某些部分只支持顺序写入而不能随机覆盖旧数据。为了更好地适应这种新型存储技术并提高性能,Linux 社区开发了 `dm-zoned` 来作为解决方案之一[^1]。 当使用 `dm-zoned` 时,会通过识别底层设备是否为分区分块设备来决定如何管理和调度 I/O 请求。如果检测到的是一个 zone-aware 或者 zoned 型态的目标,则该驱动程序将会按照相应的规则执行读/写命令序列化控制以及重定位等动作以确保最佳效率。 此外,在初始化过程中,`dm-init()` 函数负责启动整个 Device Mapper 模块,并调用一系列必要的子功能完成设置工作;而对于具体像 `dm-zoned` 这样的组件来说,其配置参数可能涉及到指定哪些实际磁盘应当被当作带状结构看待等问题。 ```c // Example of initializing a dm-zoned target within the kernel code. static int __init dm_zoned_init(void) { // Initialization logic here... } module_init(dm_zoned_init); ``` #### 数据结构关联 在实现上,`dm-zoned` 需要依赖一些核心的数据结构来进行有效的资源管理和请求转发。例如: - **struct dm_dev**: 描述了一个低级别的块设备实例,包含了指向底层 block_device 结构体的指针以及其他元信息,如文件访问权限和名称等属性。 - **set_capacity()**: 此函数用来设定给定通用磁盘对象 (`gendisk`) 所表示的实际大小,这对于正确反映新加入系统的分区或者调整现有卷尺寸非常重要[^2]。 综上所述,`dm-zoned` 提供了一种机制让操作系统能够充分利用带有内置区域特性的现代化固态硬盘和其他类型的持久性内存装置所带来的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值