RAID (mdadm) - Sürücüler boyut olarak uyuşmazsa ne olur?


15

Soru 1 - "Bu sadece daha küçük bir disk alır" ile cevap vermeden önce, beni çabucak duy. 3 TB WD Red'lerimin boyutu 3001 GB. Diyelim ki sürücünün% 100'ünü kapsayan sdb1 ve sdc1 için mdadm üzerinden bir ayna kurdum. Ama aniden, sürücülerden biri başarısız. Yerine 3 GB, 3000 GB ağırlığında. Şu anda dizide mevcut olandan daha küçük bir sürücüye koyduğumda ne olur? Ben 3000 vs 3001 kullanarak yeni bir dizi ile biliyorum, bu 3000 için dizi inşa ediyorum. Ama dediğim gibi, geçerli bir dizi @ 3001 hakkında ve daha küçük bir sürücü eklemek? Yeniden oluşturma sırasında kendini 3000 GB olacak şekilde yeniden yapılandırıyor mu?

Soru 2 - 3001 GB'lık bir diziye 3000 GB ekleyemediğim ve 3000'e küçültebildiğimde 3001'i biraz yeniden boyutlandırabilir miyim?

Soru 3 - Veya daha iyi bir fikir. 3 TB sürücümü 2999 GB olacak şekilde küçültürsem ne olur? Bu şekilde sürücünün 1 MB, 1 bayt, 10 KB kadar kısa olması fark etmez, her zaman "2999 GB @" daha küçük "sürücüyü alır.

Yanıtlar:


28

Bu yanıta yanlışlıkla rastladım, ancak merak edilen biri varsa, deneylerle desteklenen bir cevap.

Kısa Versiyon

Bonus Soru: md(4)Eşit boyuttaki blok cihazlardan bir RAID dizisi oluşturabilir miyim ? Evet, ancak RAID dizisi en küçük blok aygıtının boyutuna sahip olacaktır (ayrıca kendi temizliği için bazı ek yükler). Cihaz boyutları birbirinin% 1'i içinde değilse bir uyarı alırsınız.

Soru 1: Mevcut bir md(4)RAID dizisine en küçük geçerli üyeden daha küçük bir aygıt ekleyebilir miyim ? Hayır üzgünüm. mdadmverilerinizi korumak için bunu yapmayı reddedecektir.

Soru 2: Mevcut bir md dizisini yeniden boyutlandırabilir misiniz? Evet (mdadm manipülasyonu !), Ama çabaya değmeyebilir. Her şeyi yedeklemeniz, ardından RAID cihazının içeriğini yeniden boyutlandırmanız ve ardından cihazın kendisini yeniden boyutlandırmanız gerekir - bunların hepsi hatalara, yanlış hesaplamalara ve verilerinize mal olacak diğer şeylere oldukça yatkındır (acı verici konuşma deneyimi) .

Risk ve çabaya değmez. Yeni, boş bir diskiniz varsa, diski nasıl yeniden boyutlandıracağınız ve tüm verilerinizin bir ila iki kopyasını her zaman bozulmadan tutabilirsiniz (2 diskli RAID1'iniz varsa):

  1. md(4)Üzerinde yeni bir dizi oluşturun (bir disk eksik).
  2. Dizi içeriğinin yapısını yeniden oluşturun (Kripto, LVM, bölüm tabloları, bunların herhangi bir kombinasyonu, teknenizde ne olursa olsun).
  3. Mevcut diskteki verileri yenisine kopyalayın.
  4. Yeni diski kullanarak yeniden başlatın.
  5. Eski diskin bölüm tablosunu silin (veya md(4)süper bloğu sıfırlayın ). Gerekirse, yeni diskteki şema ile eşleşmesi için gerekli bölümleri oluşturun.
  6. Eski diski yeni diziye ekleyin.
  7. Dizi üyelerinin senkronize edilmesini bekleyin. Biraz kahve al. Latin Amerika'ya uçun ve bu konuda kendi kahve çekirdeklerinizi seçin. :) ( Latin Amerika'da yaşıyorsanız , bunun yerine Afrika'ya uçun).

Not: evet, bu cevabı 0xC0000022L ile aynı tekniktir.

Soru 3. Sürücü 1G kısasa ne olur? :) Endişelenme. Muhtemelen yedek sürücünüz daha büyük olacaktır. Aslında, yukarıdaki gibi bir strateji ile, başarısız olduğunda (veya daha ucuz bir yükseltme için) daha ucuz daha büyük sürücüler elde etmek için ödeme yapar . Aşamalı yükseltme alabilirsiniz.

Deneysel Kanıt

Deneysel kurulum

İlk olarak, bazı blok cihazları taklit edelim. Biz kullanacağız /tmp/sdxve /tmp/sdy(her 100M) ve /tmp/sdz(99M).

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

: Üç geri döngü blok cihazları olarak üç dosya kadar bu setleri /dev/loop0, /dev/loop1ve /dev/loop2, için haritalama sdx, sdyve sdzsırasıyla. Boyutları kontrol edelim:

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

Beklendiği gibi, tam 100M (102400 KiB = 100 MiB) ve 99M'den (tam olarak 99 × 1024 1K blok) biri olan iki döngü cihazımız var.

Aynı Boyuttaki Aygıtlardan RAID Dizisi Oluşturma

İşte gidiyor:

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

Boyutunu kontrol:

sudo grep md100 /proc/partitions
   9      100     102272 md100

Bu tam olarak beklediğimiz şeydir: mdadm kılavuzuna bir bakış, 1.2 meta verilerinin 128K: 128 + 102272 = 102400'ü kapladığını hatırlatıyor. Şimdi ikinci denemeye hazırlanırken imha edelim.

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

Eşsiz Olarak Boyutlandırılmış Aygıtlardan RAID Dizisi Oluşturma

Bu sefer küçük blok cihazı kullanacağız.

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.

Uyardık, ama dizi yapıldı. Boyutunu kontrol edelim:

sudo grep md100 /proc/partitions
   9      100     101248 md100

Burada elde ettiğimiz şey 101.248 blok. 101248 + 128 = 101376 = 99 × 1024. Kullanılabilir alan en küçük cihazın alanıdır (artı 128K RAID meta verileri). Son denememiz için hepsini tekrar indirelim:

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

Son olarak: Çalışan Diziye daha küçük bir Aygıt Ekleme

İlk olarak, 100M disklerden sadece bir tanesiyle RAID1 dizisi oluşturalım. Dizi bozulacak, ama gerçekten umursamıyoruz. Sadece bir istiyorum başladı dizi. missingAnahtar kelimeler 'Ben, henüz hediye bir cihaz var şimdi o diziyi başlatmak ve daha sonra bir ekleyeceksiniz yok' diyor bir yer tutucudur.

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

Yine, boyutu kontrol edelim:

sudo grep md100 /proc/partitions
   9      100     102272 md100

Elbette, 102400 bloktan 128K kısa. Daha küçük disk ekleme:

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

Boom! Bize izin vermez ve hata çok açıktır.


Synology Hybrid RAID (SHR) bu sorunu çözer.
Denis Denisov

1

mdXCihazları kurmanın birkaç yolu vardır . Yöntem, bunu GPT olarak bölümlemek için gdisk(veya sgdiskyalnızca komut satırı sürümünü tercih ediyorsanız) kullanmak olacaktır . Diziden önyükleme yapmak istiyorsanız bir "BIOS Önyükleme Bölümü" oluşturun, kod yazın ef02. Bu, yalnızca bu diziyi başlatmak istiyorsanız gereklidir, aksi takdirde ilgilenmenize gerek yoktur. Ardından, diziye eklenecek en küçük diskle aynı boyutta veya daha küçük bir bölüm oluşturun. Son olarak, (uzman menüye diğer diske üzerinde GPT veri kopyalamak gdiskkullanarak xve sonra uve hedef cihazı belirtin). Bu yıkıcı bir süreç.

Dosya sistemi buna izin veriyorsa, varolan bir bölümü daha küçük bir şeye yeniden boyutlandırmak ve ardından GPT verilerini kopyalamak için aynı yöntemi kullanmak mümkün olmalıdır. Ancak, bu sizi bir çırpıda geçirir. Çünkü şimdi iki diskiniz var, ama yine de mdXcihazınız yok . Bunlardan biri, mdXbölüm olarak (yukarıda ima ettiğim) ya da disk olarak hazırlanmalıdır ve daha sonra veriler mevcut diskten bu diske taşınmalıdır.

Yani:

  1. büyük disk ( /dev/sda) veri içeriyor, veriler 3001 GB'den küçük, bölümler değil
  2. /dev/sdbsisteme daha küçük disk eklenir
  3. /dev/sdbile ayrıldıngdisk
  4. her bir ilgili bölümden bir dizi oluşturursunuz ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. yeni dizilerde dosya sistemleri oluşturursunuz
  6. tüm verileri kopyalayarak sisteminizin bir GPT diskini çalıştırmaya hazır olduğundan emin olun ve GRUB2'nin etkileri anlamasını sağlayın (aşağıya bakın)
  7. Eğer arta GPT bölümleme veri kopyalamak /dev/sdbiçin/dev/sda
  8. "ham" bölümleri /dev/sdamevcut dizilere eklersiniz
  9. /proc/mdstatsenkronizasyonun yapıldığını göstermek için beklersin

Tüm adımları izlediyseniz, mdX dizilerinden yeni sisteme önyükleme yapabilmeniz gerekir. Ancak, kurtarma CD'sini veya PXE önyükleme seçeneğini her ihtimale karşı el altında bulundurun.


GRUB2 kurulumu elden tanıyamayacak. Yani biraz "büyüye" ihtiyacın var. İşte bir astar:

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

Ya da daha ayrıntılı olalım:

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

Bu /boot/grub/devicemap, GRUB2'ye her bir ilgili diskin nerede bulunacağını söyleyen bir varsayılan ile varsayılanı oluşturur (veya üzerine yazar) . Sonuç şu liste gibi bir şey olacaktır:

(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-...

Eğer eski GRUB'u kullanırsanız, ayrıca kullanarak, meta-veri sürümü 0.9 ile "BIOS önyükleme bölümü" oluşturmak için gereken mdadm -e 0 ...ve işlemler farklı olacaktır. Yine de ben yapmadım.


1
Cevabın için teşekkürler. Bu dizi aslında sadece sunucumda ham depolama içindir, bu yüzden önyükleme veya böyle bir şey işlemeyecektir. Oyunun ilerleyen bölümlerinde farklı boyutlardaki sabit diskleri karıştırma ve eşleştirme konusunda endişeliydim. Yani, sdb1 @ 3001 GB ve sdc1 @ 3001 GB, ancak sdc1 ölür ve yerine 3000 GB olursa ne olur? Sdb1 3000'e küçülüyor mu? @ / Dev / md0 dizisi 3000 GB'a küçülüyor mu? Ne kadar çok düşünürsem, yukarıdaki 2999 örneği gibi, sonunda yer bırakmak o kadar mantıklıdır - bu şekilde o baş ağrısını kaldırmalıdır. Bir şey eksik olmadıkça?
JaSauders

1
Aslında, burada RAID seviye 1 varsayıldığında, mdadmeğer uyumsuzsa diziyi ilk etapta oluşturmayı reddederdi. RAID 5'de sonunda daha fazla diske ihtiyacınız olacak ve RAID 0'da bunu önemsemezsiniz, bu yüzden RAID 1'i varsaydım. Yani evet, odadan ayrılmak mantıklı.
0xC0000022L

Atı dövmek istemiyorum ama yaptığınız "uyumsuz" ifadeden biraz emin değilim. Ne uyumsuz olurdu? Örneğimde 3000 GB ve 3001 GB arasındaki boyut farklılıklarından bahsediyor muydunuz? Her iki durumda da, her disk 3001 GB olmasına rağmen dizimi her bölüm 2999 GB olacak şekilde çalıştırdım. Bu, aynı yedek sürücüleri alamıyorum durumunda çizgiden aşağıya gelen baş ağrılarını ortadan kaldırmalıdır. Fikrinizi takdir edin!
JaSauders

@JaSauders: Sanırım az ya da çok bir GiB zaten uyumsuz olurdu. Ama açıkçası sınırın nerede olduğunu bilmiyorum. Bununla birlikte, boyuttaki küçük değişikliklerin tolere edileceğini biliyorum. Diğer her şey için ana hatlarıyla anlattığım şeye benzer bir şekilde göç etmelisiniz.
0xC0000022L

@ 0xC0000022L: mdadmdizi üyelerindeki rastgele% 1 boyut farkını tolere eder.
Alexios
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.