分区循环块设备¶
1) 概述¶
分区循环块设备驱动程序 (zloop) 允许用户使用每个分区一个常规文件作为后备存储来创建分区块设备。此驱动程序不直接控制任何硬件,而是使用文件系统的常规文件的读取、写入和截断操作来模拟分区块设备。
使用 zloop,可以创建具有可配置容量、分区大小和常规分区数量的分区块设备。设备的每个分区的存储使用最大大小等于分区大小的常规文件来实现。支持常规分区的文件的文件大小始终等于分区大小。支持顺序分区的文件的文件大小指示顺序写入文件的数据量,即,文件的大小直接指示分区的写入指针的位置。
重置顺序分区时,其后备文件大小将被截断为零。相反,对于分区完成操作,后备文件将被截断为分区大小。这样,创建的 zloop 分区块设备的最大容量可以配置为大于后备文件系统上可用的存储空间。当然,对于此类配置,写入的数据多于后备文件系统上可用的存储空间将导致写入错误。
分区循环块设备驱动程序实现了一个完整的分区转换状态机。也就是说,分区可以是空的、隐式打开的、显式打开的、关闭的或已满的。当前实现不支持对最大打开和活动分区数量的任何限制。
创建和删除 zloop 设备不需要任何用户工具。
2) 创建分区设备¶
一旦加载 zloop 模块(或者如果 zloop 被编译到内核中),可以使用字符设备文件 /dev/zloop-control 添加 zloop 设备。这是通过直接将“add”命令写入 /dev/zloop-control 设备来完成的
$ modprobe zloop
$ ls -l /dev/zloop*
crw-------. 1 root root 10, 123 Jan 6 19:18 /dev/zloop-control
$ mkdir -p <base directory/<device ID>
$ echo "add [options]" > /dev/zloop-control
可以通过读取 /dev/zloop-control 设备来列出 add 命令可用的选项
$ cat /dev/zloop-control
add id=%d,capacity_mb=%u,zone_size_mb=%u,zone_capacity_mb=%u,conv_zones=%u,base_dir=%s,nr_queues=%u,queue_depth=%u,buffered_io
remove id=%d
更详细地说,可以与“add”命令一起使用的选项如下。
id |
设备号(/dev/zloopX 中的 X)。默认值:自动分配。 |
capacity_mb |
设备总容量,单位为 MiB。这总是向上舍入到分区大小的最近的更高倍数。默认值:16384 MiB (16 GiB)。 |
zone_size_mb |
设备分区大小,单位为 MiB。默认值:256 MiB。 |
zone_capacity_mb |
设备分区容量(必须始终等于或小于分区大小。默认值:分区大小。 |
conv_zones |
从扇区 0 开始的常规分区总数。默认值:8。 |
base_dir |
用于创建包含设备分区文件的目录的基本目录的路径。默认值=/var/local/zloop。包含分区文件的设备目录始终以设备 ID 命名。例如,/dev/zloop0 的默认分区文件目录是 /var/local/zloop/0。 |
nr_queues |
分区块设备的 I/O 队列数。此值始终受在线 CPU 数量的限制。默认值:1 |
queue_depth |
每个 I/O 队列的最大 I/O 队列深度。默认值:64 |
buffered_io |
执行缓冲 I/O 而不是直接 I/O(默认值:false) |
3) 删除分区设备¶
删除未使用的分区循环块设备是通过向 /dev/zloop-control 发出“remove”命令来完成的,并指定要删除的设备的 ID
$ echo "remove id=X" > /dev/zloop-control
remove 命令没有任何选项。
可以再次重新添加已删除的分区设备,而无需更改设备分区的状态:设备分区将恢复到删除设备之前的最后状态。在删除分区设备后再次添加分区设备必须始终使用与首次添加设备时相同的配置来完成。如果检测到分区配置更改,将返回一个错误,并且不会创建分区设备。
要完全删除分区设备,在执行删除操作后,必须删除包含设备分区后备文件的设备基本目录。
4) 示例¶
以下命令序列创建一个 2GB 分区设备,其分区大小为 64 MB,分区容量为 63 MB
$ modprobe zloop
$ mkdir -p /var/local/zloop/0
$ echo "add capacity_mb=2048,zone_size_mb=64,zone_capacity=63MB" > /dev/zloop-control
对于创建的设备 (/dev/zloop0),分区后备文件都创建在默认基本目录 (/var/local/zloop) 下
$ ls -l /var/local/zloop/0
total 0
-rw-------. 1 root root 67108864 Jan 6 22:23 cnv-000000
-rw-------. 1 root root 67108864 Jan 6 22:23 cnv-000001
-rw-------. 1 root root 67108864 Jan 6 22:23 cnv-000002
-rw-------. 1 root root 67108864 Jan 6 22:23 cnv-000003
-rw-------. 1 root root 67108864 Jan 6 22:23 cnv-000004
-rw-------. 1 root root 67108864 Jan 6 22:23 cnv-000005
-rw-------. 1 root root 67108864 Jan 6 22:23 cnv-000006
-rw-------. 1 root root 67108864 Jan 6 22:23 cnv-000007
-rw-------. 1 root root 0 Jan 6 22:23 seq-000008
-rw-------. 1 root root 0 Jan 6 22:23 seq-000009
...
然后可以正常使用创建的分区设备 (/dev/zloop0)
$ lsblk -z
NAME ZONED ZONE-SZ ZONE-NR ZONE-AMAX ZONE-OMAX ZONE-APP ZONE-WGRAN
zloop0 host-managed 64M 32 0 0 1M 4K
$ blkzone report /dev/zloop0
start: 0x000000000, len 0x020000, cap 0x020000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
start: 0x000020000, len 0x020000, cap 0x020000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
start: 0x000040000, len 0x020000, cap 0x020000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
start: 0x000060000, len 0x020000, cap 0x020000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
start: 0x000080000, len 0x020000, cap 0x020000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
start: 0x0000a0000, len 0x020000, cap 0x020000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
start: 0x0000c0000, len 0x020000, cap 0x020000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
start: 0x0000e0000, len 0x020000, cap 0x020000, wptr 0x000000 reset:0 non-seq:0, zcond: 0(nw) [type: 1(CONVENTIONAL)]
start: 0x000100000, len 0x020000, cap 0x01f800, wptr 0x000000 reset:0 non-seq:0, zcond: 1(em) [type: 2(SEQ_WRITE_REQUIRED)]
start: 0x000120000, len 0x020000, cap 0x01f800, wptr 0x000000 reset:0 non-seq:0, zcond: 1(em) [type: 2(SEQ_WRITE_REQUIRED)]
...
删除此设备使用命令
$ echo "remove id=0" > /dev/zloop-control
可以使用与首次创建设备时相同的“add”命令再次重新添加已删除的设备。要完全删除分区设备,在执行 remove 命令后,还应删除其后备文件
$ rm -r /var/local/zloop/0