소개하다

소개하다

파티션 대신 장치를 사용하는 Raid 5 설정이 있습니다. 최근에 md 장치의 ext4 fs를 btrfs로 변환했습니다. 처음에는 btrfs에 만족했지만 간단히 말해서 CPU 주기를 잡아먹고 있어서 다시 돌아가고 싶었습니다. 안타깝게도 원본 ext4 스냅샷을 삭제했기 때문에 복원할 수 있는 방법이 없습니다. 다행스럽게도 데이터 사용량은 MD기기의 절반에도 훨씬 못 미치는 수준입니다. btrfs를 전체 공간의 절반 미만으로 성공적으로 축소했지만 유틸리티가 /dev/md/5를 올바르게 보는 데 문제가 있습니다. fdisk는 올바른 파티션 테이블이 없음을 보여주고 gparted(저에게 더 편한 기능)는 축소 후에만 /dev/md/5를 볼 수 있지만 읽을 수 없으며 전체 장치를 소비한다는 것을 보여줍니다.

지금쯤 내가 하고 싶은 일은 btrfs를 전체 공간의 절반 미만으로 줄이고 그 옆에 ext4 fs를 만든 다음 데이터를 복사하는 것이라고 짐작하셨을 것입니다. 이 작업이 완료되면 btrfs를 제거하고 ext4 fs를 확장하여 장치를 채울 수 있습니다.

가능합니까? md 장치를 직접 fsing하는 것은 좋지 않은 생각인 것 같습니다(이 경우).

어떤 도움이라도 정말 감사하겠습니다. 파일 시스템을 복원하기 위해 외장 드라이브에 돈을 쓰고 싶지 않습니다.

미리 감사드립니다!

답변1

이것은가능한원하는 결과를 얻기 위해 디스크의 데이터를 재구성하지만 이는 많은 단계가 필요한 전문가의 절차이며 숙련된 사람이라도 실수할 가능성이 많습니다. 안전망도 없고 용서도 없습니다. 실수를 하면,~ 할 것이다데이터를 잃어버리세요. 개인적으로 저는 백업이 없으면 이 방법을 시도하고 싶지 않습니다. (좋은 백업이 있는 경우 전체 데이터를 다시 포맷하고 백업에서 복원할 수도 있습니다.) 이는 귀하의 결정이며 데이터의 가치, 시간과 같은 요소를 기반으로 결정하게 됩니다. 당신은 그것에 돈을 쓸 수 있습니다. 잠깐만 ...

먼저, 코멘트: 파티션 테이블을 포함하지 않는다고 말씀하셨는데 /dev/md/5, 그건 정상입니다. MD 장치는 일반적으로 두 가지 구성 중 하나로 사용됩니다. (1) 이전처럼 파일 시스템을 MD 장치에 직접 배치하거나 (2) MD 장치를 LVM 물리 볼륨(PV)으로 사용한 다음 볼륨이 구성원입니다. 볼륨의. VG(볼륨 그룹) - 파일 시스템, 스왑 장치, VM 이미지 등에 대한 논리 볼륨(LV)을 원하는 수만큼 생성할 수 있습니다. 후자는 많은 스태킹 레이어처럼 들리지만 실제로는 일반적인 LVM입니다. 건축학. MD 장치에 파티션 테이블을 넣는 것은 이전에 본 적이 없는 것입니다. 여러 LV를 생성하는 것처럼 MD 장치를 여러 부분으로 분할할 수 있지만 LVM만 사용할 수도 있습니다. 또한 파티션 테이블을 MD 장치에 직접 배치하는 것이 자동으로 작동하는지 확실하지 않습니다. kpartx작동하려면 LVM과 마찬가지로 장치 매퍼 기술을 사용하는 유사한 도구를 사용해야 할 수도 있습니다. 또한 LVM을 직접 사용합니다.

소개하다

실제로 사용 가능한 크기의 절반 미만을 사용하고 있으므로 /dev/md/5프로세스에는 장치를 절반으로 분할하고, 데이터를 앞쪽 절반에서 뒤쪽 절반으로 이동하고, 앞쪽 절반에 원하는 새로운 유형의 파일 시스템을 생성하고, 데이터를 다시 상반부로 되돌린 다음 두 개로 분할된 상황에서 벗어납니다.

마지막으로 원하는 형식의 데이터 전반부를 갖게 됩니다. 마지막으로 이 절반을 확장하여 전체 장치를 차지할 수 있습니다.

우리는 장치 매퍼를 사용하여 각각 대형 장치의 절반을 나타내는 두 개의 가상 블록 장치를 생성할 것입니다 /dev/md/5.

장치 매퍼는 LVM에서 물리 볼륨(PV)의 여러 블록과 조각을 논리 볼륨(LV)에 매핑하는 데 사용되는 것과 동일한 기술입니다. 선형 매핑 유형의 경우 이는 소스 장치, 소스 오프셋 및 대상 길이를 지정하여 수행됩니다. (device-mapper에는 다른 유형의 매핑도 있는데 이에 대해서는 논의하지 않습니다.) 차이점은 LVM이 이러한 매핑을 자동으로 관리 및 추적하고 이를 PV에 헤더로 저장되는 메타데이터에 지속적으로 저장한다는 것입니다. 또한 배치 정보(오프셋 및 크기, 여러 블록...)를 자동으로 투명하게 선택합니다. 오프셋과 크기를 수동으로 엄격하게 제어해야 하고 처음에 /dev/md/5PV 메타데이터 헤더를 삽입할 공간이 없기 때문에 LVM을 사용하여 작업을 수행할 수 없습니다 . 그래서 우리는 dmsetup명령을 통해 직접 장치 매퍼를 사용합니다.

부인 성명

아직 이 과정을 시도해보지 않았습니다. 원칙적으로는 작동해야 하지만 실수를 저지르고 있을 수도 있습니다. 제가 실수를 하거나 귀하가 실수를 하면 귀하의 데이터가 손실됩니다.

프로그램

  1. /dev/md/5장치의 절반 이하를 차지하도록 Btrfs 파일 시스템의 크기를 조정합니다 . blockdev --getsize64 /dev/md/5알아보기 위해 사용정확히장치에 포함된 바이트 수는 Btrfs 파일 시스템을 절반보다 작게 만듭니다. 크게 만드는 것보다 작게 만드는 것이 더 좋습니다. 장치의 절반 미만을 차지하면 괜찮지만 1바이트를 초과하면 괜찮지 않습니다.

    btrfs filesystem resize <devid>:<half>
    

    <devid>크기를 조정할 Btrfs 구성원 장치의 ID입니다. 를 사용하여 분할을 볼 수 있습니다 btrfs filesystem show /mountpoint. 이 프로세스 중에는 구성원 장치가 하나만 있는 Btrfs 파일 시스템을 사용하게 될 것으로 예상됩니다.

    half보고된 바이트 수의 절반입니다 blockdev --getsize64 /dev/md/5. 확실하게 하기 위해 반올림하여 더 많이 빼세요.

    이 명령에는 시간이 걸립니다. 즉시 돌아가서 백그라운드에서 실행되는지, 아니면 포그라운드에서 실행되는지 잘 모르겠습니다. Btrfs에 대한 내 경험에 따르면 Btrfs는 전경에서 실행될 것입니다. 어느 쪽이든 커널 로그를 확인하여 작업이 완료되었다는 표시가 있는지 확인하십시오.

  2. Btrfs 파일 시스템 크기를 다시 확인하세요.

    btrfs filesystem show /mountpoint
    

    size의 절반 미만인지 확인하세요 /dev/md/5. 이 명령은 GB 단위의 크기를 소수점 이하 2자리까지 표시할 것입니다. 반올림인지 반올림인지 확실하지 않기 때문에 이전 단계에서 일부 여백을 빼서 실제로 여기에 표시된 값이 다음보다 작은지 확인하세요. 장치 크기의 절반.

  3. 이제 다음과 같은 상황이 발생합니다.

    |*********---------| /dev/md/5
    

    어디에 *는 사용된 공간이고, -는 사용되지 않은 공간이며, |--|블록 장치의 범위를 나타냅니다.

    장치 후반부의 첫 번째 섹터 수를 계산합니다.

    장치 매퍼 섹터가 512바이트이므로 출력에서 ​​시작하여 blockdev --getsize64 /dev/md/5512로 나눕니다. 의 섹터 수입니다 /dev/md/5.

    그 숫자를 2로 나눕니다. 반올림합니다. 이 번호로 전화하세요 <half>.

    전반부와 후반부를 각각 매핑하는 가상 블록 장치를 만듭니다.

    dmsetup create half2 --table '0 <half> linear /dev/md/5 <half>'
    

    이제 다음이 있습니다.

    |*********---------| /dev/md/5
              |--------| /dev/mapper/half2
    
  4. /dev/mapper/half2에 임시 파일 시스템을 생성합니다.

    mkdir /mnt/tmp
    mkfs.ext4 /dev/mapper/half2
    mount /dev/mapper/half2 /mnt/tmp
    
  5. 모든 것을 복사하세요

    rsync -avXSH /btrfs-mountpoint/ /mnt/tmp
    

    (좋아하는 복사 도구를 사용하세요. 일반 복사 도구 cp도 작동합니다.)

  6. 이제 Btrfs 파일 시스템을 제거할 시간입니다.

    umount /btrfs-mountpoint
    
  7. 다른 장치 매퍼 매핑 만들기

    dmsetup create half1 --table '0 <half> linear /dev/md/5 0'
    

    이제 다음이 있습니다.

    |---------*********| /dev/md/5
    |--------|           /dev/mapper/half1
              |********| /dev/mapper/half2
    

    안쪽에는 *사용된 공간이 있는데 -이전에 사용하던 공간인데 뒤쪽 절반으로 이동시켜서 여유를 주고 덮어쓰려고 합니다.

  8. 원하는 최종 구성을 만듭니다 /dev/mapper/half1. ext4 파일 시스템을 직접 생성할 수도 있지만 LVM을 권장합니다.

    직접:

    mkfs -t ext4 /dev/mapper/half1
    

    LVM:

    pvcreate /dev/mapper/half1
    vgcreate volume-group-name /dev/mapper/half1
    lvcreate -n logical-volume-name -L<size> volume-group-name
    mkfs -t ext4 /dev/volume-group-name/logical-volume-name
    
  9. 설치하고 모든 것을 복사하십시오.

    mount /dev/volume-group-name/logical-volume-name /new-mountpoint
    # or
    mount /dev/mapper/half1 /new-mountpoint
    
    rsync -avXSH /mnt/tmp/ /new-mountpoint
    
  10. 임시적인 것들을 모두 제거하세요.

    umount /mnt/tmp
    dmsetup clear /dev/mapper/half2
    umount /new-mountpoint
    
    # If using LVM
    lvchange -a n /dev/volume-group-name/logical-volume-name
    vgchange -a n volume-group-name
    
    dmsetup clear /dev/mapper/half1
    

    장치 매퍼 매핑을 지울 수 없는 경우 문제를 해결하거나 다시 시작할 수 있습니다.

    다음 내용으로 돌아왔습니다.

    |*********---------| /dev/md/5
    
  11. 이제 /dev/md/5전체 장치를 사용하여 다시 설치하세요.

    # If using LVM
    vgscan
    mount /dev/volume-group-name/logical-volume-name /new-mountpoint
    
    # otherwise
    mount /dev/md/5 /new-mountpoint
    
  12. 이제 이를 전체 장치로 확장할 수 있습니다.

    # If using LVM
    pvresize /dev/md/5
    # Optionally, enlarge the LV
    
    # otherwise
    resize2fs /dev/md/5
    

우와!

관련 정보