기존 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새로 해제된 범위를 사용하여 새 세그먼트를 생성할 수 있도록 하는 증분입니다 .

모든 기존 세그먼트를 늘립니다(예: 이전 세그먼트는 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_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

관련 정보