答え1
概要
ソースを見た後にblocks
実行される作業は次のとおりです。
- LV ファイルシステムの縮小 LVM PE の縮小
- LV自体を1 LVM PEに縮小します(これは
bcache
ヘッダーに対して1つの無料PEを保証します)。 - VG設定を編集し、前の手順でリリースされたPEであるサイズ1の新しい最初のセグメントを挿入します。
--data-offset
LVM 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 Ranges
1大きいです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
新しく解放された範囲を使用して新しいセグメントを作成できるようにする増分。
すべての既存のセグメントを増やします(たとえば、前のセグメントはsegment1
)segment2
。
次によって解放された単一の論理範囲を含む新しい最初のセグメントを作成します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_extent
sに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`
新しく設定されたサポートデバイスをキャッシュデバイスに接続します。
fsck
LV専用ファイルシステム(他のVGファイルシステムは前回以降変更されていませんfsck
)
誇らしげに、これはfsck
前の実行時間の一部しかかかりません:)
ロールバック
fsck
問題が発生してVG構成ファイルのエラーを特定できない場合は、作成したバックアップを復元できます。
sudo vgcfgrestore -f vg-config.orig