既存のLVM LVをbcacheバックアップデバイスに変換

既存のLVM LVをbcacheバックアップデバイスに変換

既存のLVM LVをbcacheサポートされているデバイスに変換するには?

bcache既存のデバイスを次に変換する公式ツールです。blocksただし、2014年12月以降は更新されませんでした。

少なくとも問題はある13そして36maintbootとbtrfsとの使用を防ぎます。

LVMをLVに手動で変換する方法はbcache

ベストアンサー1

概要

ソースを見た後にblocks実行される作業は次のとおりです。

  1. LV ファイルシステムの縮小 LVM PE の縮小
  2. LV自体を1 LVM PEに縮小します(これはbcacheヘッダーに対して1つの無料PEを保証します)。
  3. VG設定を編集し、前の手順でリリースされたPEであるサイズ1の新しい最初のセグメントを挿入します。
  4. --data-offsetLVM PE サイズの BCache バックアップデバイスを作成します。

データを収集し、バックアップVG設定を減らします。

まず、VGのPEサイズ(通常4MiB)を取得します。

sudo vgdisplay /dev/mapper/VG | grep 'PE Size'

LVのファイルシステムをこの量だけ縮小します(ファイルシステムによって異なります)。 4MiBと4MBを混同しないように注意してください。

その後、LV自体を縮小します。lvresize^2個単位を使用するので4M=4MiBです。

sudo lvresize -L -4M /dev/mapper/VG-LV

Start次に、割り当てられていない新しいPEを見つけます。

sudo pvs --segments -o +lv_name,seg_start_pe,seg_size_pe,seg_pe_ranges,seg_le_ranges

私の(非常に、非常に醜い)ディストリビューションで必要なStart列番号は次のとおりです177406

  PV         VG  Fmt  Attr PSize    PFree Start  SSize  LV     Start  SSize  PE Ranges               LE Ranges
  /dev/sdb1  2TB lvm2 a--  <693.00g 4.00m      0 177406 backup 299499 177406 /dev/sdb1:0-177405      /dev/sdb1:0-177405
  /dev/sdb1  2TB lvm2 a--  <693.00g 4.00m 177406      1             0      1
  /dev/sdb2  2TB lvm2 a--  <662.96g    0       0 149749 backup 149750 149749 /dev/sdb2:0-149748      /dev/sdb2:0-149748
  /dev/sdb2  2TB lvm2 a--  <662.96g    0  149749  19968 backup 129782  19968 /dev/sdb2:149749-169716 /dev/sdb2:149749-169716
  /dev/sdb3  2TB lvm2 a--   506.96g    0       0 129782 backup      0 129782 /dev/sdb3:0-129781      /dev/sdb3:0-129781

また、この値は177406私のLVの最も高い数値(名前付き)よりLE Ranges1大きいですbackup

編集する予定なので、VGを無効にします。

sudo vgchange -an VG

VG構成ダンプ:

sudo vgcfgbackup --file vg-config VG
sudo chown $USER vg-config

この時点でバックアップする構成されました。

VG設定を編集し、新しくリリースされたPEを最初のLEとして挿入します。

logical_volumes設定ファイルセクションでLVを見つけます。

segment_count新しく解放された範囲を使用して新しいセグメントを作成できるようにする増分。

すべての既存のセグメントを増やします(たとえば、前のセグメントはsegment1segment2

次によって解放された単一の論理範囲を含む新しい最初のセグメントを作成しますlvresize

        segment1 {
            start_extent = 0
            extent_count = 1

            type = "striped"
            stripe_count = 1    # linear

            stripes = [
                "pv2", 177406
            ]
        }

この数字177406は上記のLVを縮小して解放されたPEです。横の項目がプロファイルセクションpv#の正しい物理デバイスと一致していることを確認してください。physical_volumes

Segment2以上の場合、start_extentsに1を追加するだけです。これはに挿入された新しい論理範囲を示していますsegment1。 (ヒント:人的エラーを避けるために^ Aを使用してください。)(LVが縮小された後にバックアップが実行されるため、vi最後の段落はすでに正確です。)extent_count

私のVG設定のパッチを見ることができます。ここ

新しいVG構成の確認

VGメタデータに新しい設定を作成します。

sudo vgcfgrestore --file vg-config

VGを再度有効にします。

sudo vgchange -ay VG

問題が発生しないことを確認するには、単一のPEオフセットループバックを使用してLVをインストールします。

sudo losetup --find --show --offset 4M --read-only /dev/mapper/VG-LV

(上記では、PEサイズが4MiBの例を使用しました。)

fsck みんなVGのファイルシステムでセグメントマッピングに問題が発生していないことを確認してください。

問題が発生した場合は、ロールバックセクション(下)を参照してください。その他、sudo losetup --detach /dev/loop#

bcacheヘッダーの書き込み

bcacheデバイスがLVM PEと一致する適切なブロックサイズとデータオフセットを持つようにします。

セクタからデータオフセットを取得します。

sudo vgdisplay --units s 2TB | grep 'PE Size'

一般的な4MiB PEサイズの場合、これは8192です。

BCache 8KiB ヘッダーを作成します。

dev=/dev/mapper/VG-LV
make-bcache --bdev --data-offset 8192 --block "$(blockdev --getpbsz "$dev")" "$dev" # --writeback --cset-uuid # see `make-bcache --help`

新しく設定されたサポートデバイスをキャッシュデバイスに接続します。

fsckLV専用ファイルシステム(他のVGファイルシステムは前回以降変更されていませんfsck

誇らしげに、これはfsck前の実行時間の一部しかかかりません:)

ロールバック

fsck問題が発生してVG構成ファイルのエラーを特定できない場合は、作成したバックアップを復元できます。

sudo vgcfgrestore -f vg-config.orig

おすすめ記事