裝置對映器快照支援

裝置對映器允許您,無需大量資料複製,

  • 建立任何塊裝置的快照,即塊裝置的可掛載、已儲存狀態,這些狀態也可以寫入而不會干擾原始內容;

  • 建立裝置“分支”(forks),即同一資料流的多個不同版本。

  • 將塊裝置的快照合併回快照的源裝置。

在前兩種情況下,dm 只複製發生變化的資料塊,並使用單獨的寫時複製 (COW) 塊裝置進行儲存。

對於快照合併,COW 儲存的內容會合並回源裝置。

有三個 dm 目標可用:snapshot、snapshot-origin 和 snapshot-merge。

  • snapshot-origin <origin>

通常會有一個或多個快照基於它。讀取將直接對映到後端裝置。對於每次寫入,原始資料將儲存在每個快照的 <COW device> 中,以保持其可見內容不變,至少直到 <COW device> 填滿為止。

  • snapshot <origin> <COW device> <persistent?> <chunksize> [<# feature args> [<arg>]*]

建立 <origin> 塊裝置的快照。大小為 <chunksize> 扇區的已更改資料塊將儲存在 <COW device> 上。寫入只會寫入 <COW device>。讀取將來自 <COW device> 或來自 <origin>(對於未更改的資料)。<COW device> 通常會小於源裝置,如果它填滿,快照將變得無用並被停用,返回錯誤。因此,監控可用空間量並在 <COW device> 填滿之前進行擴充套件非常重要。

<persistent?> 是 P(持久)或 N(非持久——重啟後不會保留)。O(溢位)可以作為持久儲存選項新增,以允許使用者空間宣傳其支援在快照狀態中看到“溢位”。因此,支援的儲存型別是“P”、“PO”和“N”。

持久快照和瞬態快照的區別在於,瞬態快照需要儲存到磁碟的元資料較少——它們可以由核心保留在記憶體中。

載入或解除安裝快照目標時,必須掛起相應的 snapshot-origin 或 snapshot-merge 目標。未能掛起源目標可能導致資料損壞。

可選特性

discard_zeroes_cow - 對快照裝置發出的對映到整個資料塊的丟棄操作將清零快照異常儲存中相應的異常。

discard_passdown_origin - 對快照裝置的丟棄操作會傳遞到 snapshot-origin 的底層裝置。這不會導致複製到快照異常儲存,因為 snapshot-origin 目標被繞過。

discard_passdown_origin 功能依賴於 discard_zeroes_cow 功能的啟用。

  • snapshot-merge <origin> <COW device> <persistent> <chunksize> [<# feature args> [<arg>]*]

它接受與快照目標相同的表引數,但僅適用於持久快照。此目標承擔“snapshot-origin”目標的角色,並且如果 <origin> 的“snapshot-origin”仍然存在,則不得載入此目標。

建立一個合併快照,透過交接過程,接管現有快照的 <COW device> 中儲存的已更改資料塊,並將這些資料塊合併回 <origin>。一旦合併開始(在後臺),<origin> 可以被開啟,並且在 I/O 流向它時合併將繼續。對 <origin> 的更改將被延遲,直到合併快照的相應資料塊已合併。一旦合併開始,與“snapshot”目標關聯的快照裝置在訪問時將返回 -EIO。

LVM2 如何使用快照

當您建立卷的第一個 LVM2 快照時,會使用四個 dm 裝置:

  1. 包含源卷原始對映表的裝置;

  2. 用作 <COW device> 的裝置;

  3. 一個“快照”裝置,結合了 #1 和 #2,這是可見的快照卷;

  4. “原始”卷(使用原始源卷的裝置號),其表被裝置 #1 的“snapshot-origin”對映替換。

使用固定的命名方案,因此使用以下命令:

lvcreate -L 1G -n base volumeGroup
lvcreate -L 100M --snapshot -n snap volumeGroup/base

我們將得到以下情況(卷按上述順序)

# dmsetup table|grep volumeGroup

volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-snap-cow: 0 204800 linear 8:19 2097536
volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16
volumeGroup-base: 0 2097152 snapshot-origin 254:11

# ls -lL /dev/mapper/volumeGroup-*
brw-------  1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw-------  1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow
brw-------  1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
brw-------  1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base

LVM2 如何使用 snapshot-merge

合併快照在合併期間承擔“snapshot-origin”的角色。因此,“snapshot-origin”被“snapshot-merge”替換。“-real”裝置未更改,“-cow”裝置被重新命名為 <origin name>-cow,以幫助 LVM2 在合併快照完成後進行清理。將 COW 裝置移交給“snapshot-merge”的“snapshot”被停用(除非使用 lvchange --refresh);但如果它保持活動狀態,它將簡單地返回 I/O 錯誤。

快照將透過以下命令合併到其源中

lvconvert --merge volumeGroup/snap

我們現在將遇到這種情況

# dmsetup table|grep volumeGroup

volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-base-cow: 0 204800 linear 8:19 2097536
volumeGroup-base: 0 2097152 snapshot-merge 254:11 254:12 P 16

# ls -lL /dev/mapper/volumeGroup-*
brw-------  1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw-------  1 root root 254, 12 29 ago 18:16 /dev/mapper/volumeGroup-base-cow
brw-------  1 root root 254, 10 29 ago 18:16 /dev/mapper/volumeGroup-base

如何判斷合併何時完成

snapshot-merge 和 snapshot 狀態行以以下內容結尾:

<sectors_allocated>/<total_sectors> <metadata_sectors>

<sectors_allocated> 和 <total_sectors> 都包含資料和元資料。在合併過程中,分配的扇區數量越來越少。當包含資料的扇區數量為零時,即 <sectors_allocated> == <metadata_sectors> 時,合併完成。

這是一個實際示例(使用 lvm 和 dmsetup 命令的混合)

# lvs
  LV      VG          Attr   LSize Origin  Snap%  Move Log Copy%  Convert
  base    volumeGroup owi-a- 4.00g
  snap    volumeGroup swi-a- 1.00g base  18.97

# dmsetup status volumeGroup-snap
0 8388608 snapshot 397896/2097152 1560
                                  ^^^^ metadata sectors

# lvconvert --merge -b volumeGroup/snap
  Merging of volume snap started.

# lvs volumeGroup/snap
  LV      VG          Attr   LSize Origin  Snap%  Move Log Copy%  Convert
  base    volumeGroup Owi-a- 4.00g          17.23

# dmsetup status volumeGroup-base
0 8388608 snapshot-merge 281688/2097152 1104

# dmsetup status volumeGroup-base
0 8388608 snapshot-merge 180480/2097152 712

# dmsetup status volumeGroup-base
0 8388608 snapshot-merge 16/2097152 16

合併已完成。

# lvs
  LV      VG          Attr   LSize Origin  Snap%  Move Log Copy%  Convert
  base    volumeGroup owi-a- 4.00g