RAID (mdadm)-드라이브 크기가 일치하지 않으면 어떻게됩니까?


15

질문 1- "더 작은 디스크 만 가져옵니다"라고 대답하기 전에 빨리 들으십시오. 내 3TB WD Red의 크기는 3001GB입니다. 드라이브의 100 %에 걸쳐있는 sdb1 및 sdc1에 대해 mdadm을 통해 미러를 설정했다고 가정하겠습니다. 그러나 갑자기 드라이브 중 하나가 고장납니다. 교체는 3TB이며 무게는 3000GB입니다. 현재 어레이에있는 것보다 작은 드라이브를 넣으면 어떻게됩니까? 3000 대 3001을 사용하는 새 배열을 사용하면 배열을 3000으로 만들 것입니다. 그러나 앞에서 말했듯이 3001 @ 현재 배열은 어떻습니까? 더 작은 드라이브를 추가합니까? 재 구축 중에 크기가 3000GB로 재구성됩니까?

질문 2-기존 3001GB의 어레이에 3000GB를 추가 할 수없고 단순히 3000으로 크기를 줄인 경우 ... 3001의 크기를 약간 줄일 수 있습니까?

질문 3-또는 더 나은 아이디어. 3TB 드라이브의 크기를 2999GB로 줄이면 어떻게됩니까? 이런 방식으로 드라이브의 용량이 1MB, 1 바이트, 10KB인지 여부는 중요하지 않으며 항상 2999GB에서 "작은"드라이브를 선택합니다.

답변:


28

실수 로이 답변을 발견했지만 누군가 궁금한 경우 실험에서 지원하는 답변이 있습니다.

짧은 버전

보너스 질문 : md(4)크기가 다른 블록 장치 에서 RAID 어레이를 만들 수 있습니까? 예. 그러나 RAID 어레이는 가장 작은 블록 장치 의 크기와 자체 관리를위한 오버 헤드를 갖습니다 . 장치 크기가 서로 1 % 이내 인 경우 경고가 표시됩니다.

질문 1 : md(4)가장 작은 현재 구성원보다 작은 장치를 기존 RAID 배열에 추가 할 수 있습니까? 아니야, 미안. mdadm귀하의 데이터를 보호하기 위해 그렇게 거부합니다.

질문 2 : 기존 md 배열의 크기를 조정할 수 있습니까? 그렇습니다 ( mdadmmanpge를 읽으십시오 !).하지만 노력할 가치가 없을 수도 있습니다. 모든 것을 백업 한 다음 RAID 장치의 내용의 크기를 조정 한 다음 장치 자체의 크기를 조정해야합니다.이 모든 것은 오류, 계산 오류 및 기타 데이터 비용이 많이 발생합니다 (통화 경험이 많음) .

위험과 노력의 가치가 없습니다. 비어있는 새 디스크가있는 경우 디스크 크기를 조정하고 모든 데이터의 1-2 개 사본을 항상 그대로 유지하는 방법은 다음과 같습니다 (2 디스크 RAID1이 있다고 가정).

  1. md(4)하나의 디스크가없는 새 어레이를 만듭니다 .
  2. 배열 내용의 구조를 다시 만듭니다 (Crypto, LVM, 파티션 테이블, 그 조합, 보트를 떠 다니는 모든 것).
  3. 기존 디스크에서 새 디스크로 데이터를 복사하십시오.
  4. 새 디스크를 사용하여 재부팅하십시오.
  5. 이전 디스크의 파티션 테이블을 닦아냅니다 (또는 md(4)수퍼 블록을 0으로 만듭니다). 필요한 경우 새 디스크의 구성표와 일치하도록 필요한 파티션을 만듭니다.
  6. 기존 디스크를 새 어레이에 추가하십시오.
  7. 배열 구성원이 동기화 될 때까지 기다립니다. 커피 마셔 라틴 아메리카로 날아가서 자신의 커피 원두를 선택하십시오. :) ( 중남미에 거주 하는 경우 아프리카로 대신 비행하십시오).

참고 : 예, 이것은 그의 답변에 설명 된 것과 동일한 기술 0xC0000022L입니다.

질문 3. 드라이브가 1G 짧으면 어떻게됩니까? :) 걱정하지 마십시오. 교체 드라이브가 더 클 수 있습니다. 실제로, 위와 같은 전략을 사용 하면 고장이 날 때마다 (또는 더 저렴한 업그레이드를 위해) 더 큰 대형 드라이브를 구입 해야 합니다 . 점진적으로 업그레이드 할 수 있습니다.

실험적 증거

실험 설정

먼저, 일부 블록 장치를 위조하자. 우리는 사용합니다 /tmp/sdx/tmp/sdy(각 100M) 및 /tmp/sdz(테크네튬).

cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99  # Here's a smaller one!
sudo losetup -f sdz

세 루프백 블록 장치와 같은 세 개의 파일을 백업이 세트 /dev/loop0, /dev/loop1/dev/loop2, 매핑 sdx, sdy그리고 sdz각각. 크기를 확인합시다 :

sudo grep loop[012] /proc/partitions
   7        0     102400 loop0
   7        1     102400 loop1
   7        2     101376 loop2

예상대로 정확히 100M (102400 KiB = 100 MiB)의 루프 장치 2 개와 99M (정확히 99x1024 1K 블록) 중 하나가 있습니다.

동일한 크기의 장치에서 RAID 어레이 만들기

간다 :

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.

크기를 확인하십시오 :

sudo grep md100 /proc/partitions
   9      100     102272 md100

이다 precicely mdadm를 설명서에 하나의 모습 128K를 차지 메타 데이터를 우리에게 해당 버전 1.2을 생각 나게 : 128 + 102,272 = 102400. 이제 두 번째 실험 준비를 파괴하자 우리가 기대하는 것.

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1

크기가 다른 장치에서 RAID 배열 만들기

이번에는 소형 블록 장치를 사용하겠습니다.

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.

글쎄, 우리는 경고를 받았지만 배열이 만들어졌습니다. 크기를 확인하자 :

sudo grep md100 /proc/partitions
   9      100     101248 md100

우리가 얻는 것은 101,248 블록입니다. 101248 + 128 = 101376 = 99 × 1024. 사용 가능한 공간은 가장 작은 장치의 공간 (128K RAID 메타 데이터)입니다. 마지막 실험을 위해 다시 한 번 정리하겠습니다.

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2

마지막으로 실행중인 어레이에 더 작은 장치 추가

먼저 100M 디스크 중 하나만으로 RAID1 어레이를 만들어 봅시다. 배열은 저하되지만 실제로는 신경 쓰지 않습니다. 우리는 단지 시작된 배열을 원합니다 . missing키워드는 '나는 아직 당신을위한 장치가 이제 그는 배열을 시작하고 나중에 하나를 추가 할 것입니다하지 않습니다'라고 그 자리 표시 자입니다.

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing

다시 한 번 크기를 확인하십시오.

sudo grep md100 /proc/partitions
   9      100     102272 md100

충분히, 그것은 102400 블록의 128K 짧은입니다. 더 작은 디스크 추가하기 :

sudo mdadm  --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array

팔! 그것은 우리를 못하게 할 것이며, 오류는 매우 분명합니다.


SHR (Synology Hybrid RAID)이이 문제를 해결합니다.
Denis Denisov

1

mdX장치 를 설정하는 방법에는 여러 가지가 있습니다. 방법은 이것을 GPT로 분할하는 데 사용합니다 gdisk(또는 sgdisk명령 행 전용 버전을 선호하는 경우). 어레이에서 부팅하려면 "BIOS Boot Partition"을 작성하고 code를 입력하십시오 ef02. 이 어레이를 부팅하려는 경우에만 필요하며, 그렇지 않으면 신경 쓸 필요가 없습니다. 그런 다음 어레이에 추가 할 가장 작은 디스크와 같거나 작은 파티션을 만듭니다. 마지막으로, (전문가 메뉴 다른 디스크에 걸쳐 GPT 데이터를 복사 gdisk하여, x다음 u과 대상 장치 지정). 이것은 파괴적인 과정입니다.

파일 시스템이 허용하는 경우 기존 파티션의 크기를 더 작은 것으로 변경 한 다음 동일한 방법을 사용하여 GPT 데이터를 복사 할 수 있어야합니다. 그러나 이것은 약간의 커프에 당신을 데려옵니다. 이제 두 개의 디스크가 있지만 여전히 mdX장치 가 없기 때문 입니다. 그중 하나는 mdX파티션 단위 (위에서 암시 한) 또는 디스크 단위로 준비해야하며 데이터는 기존 디스크에서 해당 디스크로 이동해야합니다.

그래서:

  1. 큰 디스크 ( /dev/sda)에 데이터가 포함되어 있고 데이터가 3001GB보다 작으며 파티션이
  2. 작은 디스크 /dev/sdb가 시스템에 추가됩니다
  3. 당신 파티션 /dev/sdbgdisk
  4. 각 파티션에서 배열을 만듭니다 ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. 새로운 어레이에서 파일 시스템을 생성
  6. 모든 데이터를 복사하여 시스템이 GPT 디스크를 실행할 준비가되었는지 확인하고 GRUB2가 그 의미를 이해하도록합니다 (아래 참조).
  7. 당신은에서를 통해 GPT 파티션 데이터를 복사 /dev/sdb하는/dev/sda
  8. "raw"파티션을 /dev/sda기존 어레이에 추가합니다
  9. /proc/mdstat동기화가 완료되었음을 보여줄 때까지 기다립니다.

모든 단계를 수행 한 경우 이제 mdX 어레이에서 새 시스템으로 부팅 할 수 있습니다. 그러나 만일을 대비하여 복구 CD 또는 PXE 부팅 옵션을 편리하게 유지하십시오.


GRUB2는 셋업을 인식 할 수 없습니다. "매직"이 필요합니다. 하나의 라이너가 있습니다.

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

또는 더 자세하게 보자.

for i in /dev/disk/by-id/md-uuid-*
do
  DEV=$(readlink $i)
  echo "(${DEV##*/}) $i"
done|sort|sudo tee /boot/grub/devicemap

/boot/grub/devicemapGRUB2에 각 디스크를 찾을 위치를 알려주 는 기본값으로 기본값 을 작성하거나 덮어 씁니다 . 결과는 다음과 같습니다.

(md0) /dev/disk/by-id/md-uuid-...
(md2) /dev/disk/by-id/md-uuid-...
(md3) /dev/disk/by-id/md-uuid-...
(md4) /dev/disk/by-id/md-uuid-...

레거시 GRUB을 사용하는 경우 메타 데이터 버전 0.9를 사용하여 "BIOS 부팅 파티션"도 만들어야합니다 mdadm -e 0 .... 프로세스가 다릅니다. 그래도 그렇게하지 않았습니다.


1
답장을 보내 주셔서 감사합니다. 이 어레이는 실제로 내 서버의 원시 스토리지를위한 것이므로 부팅 또는 이와 유사한 것을 처리하지 않습니다. 게임 후반에 다른 크기의 하드 드라이브를 혼합하고 일치시키는 것에 대해서만 걱정했습니다. sdb1 @ 3001GB 및 sdc1 @ 3001GB가 있지만 sdc1이 죽고 교체가 3000GB이면 어떻게됩니까? sdb1이 3000으로 축소됩니까? @@ dev / md0 배열이 3000GB로 축소됩니까? 내가 그것에 대해 더 많이 생각할수록 위의 2999 예와 같이 마지막에 방을 떠나는 것이 더 합리적입니다. 그러면 두통을 제거해야합니다. 내가 빠진 것이 아니라면?
JaSauders 2013

1
실제로 여기에서 RAID 레벨 1을 가정하면, mdadm호환되지 않는 어레이를 처음부터 구축하는 것을 거부합니다. RAID 5에서는 결국 더 많은 디스크가 필요하고 RAID 0에서는 신경 쓰지 않아도되므로 RAID 1을 가정 한 것이므로 공간을 떠나는 것이 좋습니다.
0xC0000022L

나는 말을 이길 것을 의미하지는 않지만, 당신이 한 "양립 할 수없는"진술에 대해서는 확신이 없습니다. 호환되지 않는 것은 무엇입니까? 내 예에서 3000GB와 3001GB의 크기 차이를 참조하고 있습니까? 어느 쪽이든, 각 디스크가 3001GB 인 경우에도 각 파티션이 2999GB 인 어레이를 실행했습니다. 이것은 동일한 교체 드라이브를 얻을 수없는 경우 라인에서 내려 오는 두통을 제거해야합니다. 통찰력을 주셔서 감사합니다!
JaSauders 2013

@JaSauders : 하나의 GiB가 이미 호환되지 않을 것이라고 생각 합니다. 그러나 나는 솔직히 한계가 어디에 있는지 모른다. 그러나 크기의 약간의 변화는 허용됩니다. 다른 모든 것들은 내가 설명한 것과 비슷한 방식으로 마이그레이션해야합니다.
0xC0000022L

@ 0xC0000022L : mdadm배열 구성원에서 크기 차이의 임의 1 %를 허용합니다.
Alexios
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.