分割槽迴圈塊裝置¶
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