RAID (mdadm) - Apa yang terjadi jika ukuran drive tidak cocok?

15

Pertanyaan 1 - Sebelum Anda menjawab dengan "itu hanya membutuhkan disk yang lebih kecil", dengarkan saya dengan cepat. 3TB WD Reds saya berukuran 3001 GB. Katakanlah saya membuat mirror melalui mdadm untuk sdb1 dan sdc1 yang menjangkau 100% dari drive. Tapi tiba-tiba, salah satu drive gagal. Pengganti adalah 3TB, dengan berat 3000 GB. Apa yang terjadi ketika saya memasukkan drive yang lebih kecil dari yang saat ini ada pada array? Saya tahu dengan array baru menggunakan 3000 vs 3001, itu akan membangun array menjadi 3000. Tapi seperti yang saya katakan, bagaimana dengan array saat ini @ 3001 dan saya menambahkan drive yang lebih kecil? Apakah struktur ulang itu sendiri selama pembangunan kembali menjadi ukuran 3000 GB?

Pertanyaan 2 - Jika saya tidak dapat menambahkan 3000 GB ke array dengan 3001 GB yang sudah ada dan hanya berhemat menjadi 3000 ... bisakah saya mengubah ukuran 3001 sedikit?

Pertanyaan 3 - Atau, ide yang lebih baik. Bagaimana jika saya memperkecil drive 3TB saya menjadi 2999 GB. Dengan cara itu apakah drive tersebut pendek sebesar 1 MB, 1 byte, 10 KB, tidak masalah, itu akan selalu mengambil drive "kecil" @ 2999 GB.

JaSauders
sumber

Jawaban:

28

Saya menemukan jawaban ini secara tidak sengaja, tetapi jika ada orang yang penasaran, inilah jawaban yang didukung oleh eksperimen.

Versi Pendek

Pertanyaan Bonus: dapatkah saya membuat md(4)array RAID dari perangkat blok dengan ukuran yang tidak sama? Ya, tetapi array RAID akan memiliki ukuran perangkat blok terkecil (ditambah beberapa overhead untuk housekeeping sendiri). Jika ukuran perangkat tidak dalam 1% dari satu sama lain, Anda mendapat peringatan.

Pertanyaan 1: dapatkah saya menambah md(4)array RAID yang ada perangkat lebih kecil dari anggota terkecil saat ini? Tidak maaf. mdadmakan menolak untuk melakukan itu untuk melindungi data Anda.

Pertanyaan 2: dapatkah Anda mengubah ukuran array md yang ada? Ya (baca mdadmmanpge!), Tetapi mungkin tidak sepadan dengan usaha. Anda harus mencadangkan semuanya, lalu mengubah ukuran konten perangkat RAID, lalu mengubah ukuran perangkat itu sendiri - semua ini cukup rentan terhadap kesalahan, kesalahan perhitungan, dan hal-hal lain yang akan dikenakan biaya data Anda (pengalaman berbicara yang menyakitkan) .

Itu tidak sepadan dengan risiko dan upaya. Jika Anda memiliki disk kosong baru, berikut ini cara mengubah ukurannya dan juga menyimpan antara satu dan dua salinan semua data Anda setiap saat (dengan asumsi Anda memiliki 2-disk RAID1):

  1. Buat md(4)array baru di atasnya (dengan satu disk hilang).
  2. Buat kembali struktur isi array (Crypto, LVM, tabel partisi, kombinasi apa saja, apa pun yang mengapung perahu Anda).
  3. Salin data dari disk yang ada ke yang baru.
  4. Mulai ulang, menggunakan disk baru.
  5. Bersihkan tabel partisi disk lama (atau nol md(4)superblok). Jika perlu, buat partisi yang diperlukan untuk mencocokkan skema pada disk baru.
  6. Tambahkan disk lama ke array baru.
  7. Tunggu anggota array disinkronkan. Minumlah kopi. Terbanglah ke Amerika Latin dan pilih biji kopi Anda sendiri. :) (Jika Anda tinggal di Amerika Latin, sebaliknya terbang ke Afrika).

Catatan: ya, ini adalah teknik yang sama 0xC0000022L yang dijelaskan dalam jawabannya.

Pertanyaan 3. Bagaimana jika drive pendek 1G? :) Jangan khawatir tentang itu. Kemungkinan drive pengganti Anda akan lebih besar. Bahkan, dengan strategi seperti di atas, membayar untuk mendapatkan drive yang lebih besar lebih murah setiap kali gagal (atau untuk upgrade yang lebih murah). Anda bisa mendapatkan peningkatan progresif.

Bukti Eksperimental

Pengaturan eksperimen

Pertama, mari kita palsu beberapa perangkat blokir. Kami akan menggunakan /tmp/sdxdan /tmp/sdy(masing-masing 100M), dan /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

Ini set up tiga file seperti tiga perangkat blok loopback: /dev/loop0, /dev/loop1dan /dev/loop2, pemetaan untuk sdx, sdydan sdzmasing-masing. Mari kita periksa ukurannya:

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

Seperti yang diharapkan, kami memiliki dua perangkat loop persis 100M (102400 KiB = 100 MiB) dan satu dari 99M (tepat 99 × 1024 1K blok).

Membuat Array RAID dari Perangkat yang Berukuran identik

Ini dia:

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

Periksa ukuran:

sudo grep md100 /proc/partitions
   9      100     102272 md100

Ini adalah precicely apa yang kita harapkan: satu melihat manual mdadm mengingatkan kita bahwa versi 1.2 metadata mengambil 128K: 128 + 102.272 = 102400. Sekarang mari kita menghancurkannya dalam persiapan untuk percobaan kedua.

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

Membuat Array RAID dari Perangkat Tidak Berukuran

Kali ini kita akan menggunakan perangkat blok kecil.

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.

Yah, kami sudah diperingatkan, tetapi array dibuat. Mari kita periksa ukurannya:

sudo grep md100 /proc/partitions
   9      100     101248 md100

Apa yang kita dapatkan di sini adalah 101.248 blok. 101248 + 128 = 101376 = 99 × 1024. Ruang yang dapat digunakan adalah perangkat terkecil (ditambah metadata RAID 128K). Mari kita turunkan semuanya untuk percobaan terakhir kami:

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

Dan Akhirnya: Menambahkan Perangkat yang lebih kecil ke Lari Lari

Pertama, mari kita buat array RAID1 hanya dengan satu dari 100M disk. Array akan terdegradasi, tetapi kami tidak terlalu peduli. Kami hanya ingin array yang dimulai . Kata missingkunci adalah placeholder yang mengatakan 'Saya belum memiliki perangkat untuk Anda, mulai dia susun sekarang dan saya akan menambahkannya nanti'.

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

Sekali lagi, mari kita periksa ukurannya:

sudo grep md100 /proc/partitions
   9      100     102272 md100

Benar saja, 128K kekurangan 102400 blok. Menambahkan disk yang lebih kecil:

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

Ledakan! Itu tidak akan membiarkan kita, dan kesalahannya sangat jelas.

Alexios
sumber
Synology Hybrid RAID (SHR) memecahkan masalah ini.
Denis Denisov
1

Ada beberapa cara untuk mengatur mdXperangkat. Metode ini akan menggunakan gdisk(atau sgdiskjika Anda lebih suka versi baris perintah saja) untuk mempartisi ini sebagai GPT. Jika Anda ingin mem-boot dari array, buat "BIOS Boot Partition", ketikkan kode ef02. Ini hanya diperlukan jika Anda ingin mem-boot array ini, jika tidak tidak perlu peduli. Kemudian, buat partisi dengan ukuran yang sama atau lebih kecil dari disk terkecil yang akan ditambahkan ke array. Last but not least, salin data GPT ke disk lain (menu ahli di gdisk, menggunakan x, dan kemudian udan tentukan perangkat target). Ini adalah proses yang merusak.

Seharusnya dimungkinkan - jika sistem file memungkinkannya - untuk mengubah ukuran partisi yang ada menjadi sesuatu yang lebih kecil dan kemudian menggunakan metode yang sama untuk menyalin data GPT. Namun, ini membuat Anda menjadi sedikit keriting. Karena sekarang Anda memiliki dua disk, tetapi masih belum ada mdXperangkat. Salah satunya harus disiapkan sebagai mdX, baik partisi-bijaksana (yang saya tersirat di atas) atau disk-bijaksana) dan kemudian data harus dipindahkan dari disk yang ada ke itu.

Begitu:

  1. disk besar ( /dev/sda) berisi data, data lebih kecil dari 3001 GB, partisi tidak
  2. disk yang lebih kecil /dev/sdbditambahkan ke sistem
  3. Anda partisi /dev/sdbdengangdisk
  4. Anda membuat array dari setiap partisi masing-masing ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. Anda membuat sistem file pada array baru
  6. Anda menyalin semua data, memastikan bahwa sistem Anda akan siap untuk menjalankan GPT disk dan membuat GRUB2 memahami implikasinya (lihat di bawah)
  7. Anda menyalin data partisi GPT dari /dev/sdbke/dev/sda
  8. Anda menambahkan partisi "mentah" dari /dev/sdake dalam array yang ada
  9. Anda menunggu untuk /proc/mdstatmenunjukkan kepada Anda bahwa sinkronisasi telah dilakukan

Jika Anda mengikuti semua langkah, Anda sekarang bisa boot ke sistem baru dari array mdX. Namun, simpan CD penyelamatan atau opsi boot PXE untuk berjaga-jaga.


GRUB2 tidak akan dapat mengenali pengaturan begitu saja. Jadi, Anda perlu "sihir". Inilah satu kalimat:

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

Atau mari kita lebih bertele-tele:

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

Ini membuat (atau menimpa) default /boot/grub/devicemapdengan yang memberitahu GRUB2 di mana menemukan masing-masing disk. Hasilnya akan seperti daftar ini:

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

Jika Anda menggunakan GRUB lawas, Anda juga harus membuat "BIOS Boot Partition" dengan meta-data versi 0.9, menggunakan mdadm -e 0 ...dan prosesnya akan berbeda. Saya belum melakukan itu.

0xC0000022L
sumber
1
Terima kasih untuk balasan Anda. Array ini sebenarnya hanya untuk penyimpanan mentah di server saya sehingga tidak akan menangani booting atau semacamnya. Saya hanya khawatir tentang mencampur dan mencocokkan ukuran hard drive yang berbeda di kemudian hari dalam permainan. Maksud saya, apa yang AKAN terjadi jika saya memiliki sdb1 @ 3001 GB dan sdc1 @ 3001 GB, tetapi sdc1 mati dan penggantiannya adalah 3000 GB? Apakah sdb1 berhemat menjadi 3000? Apakah array @ / dev / md0 berhemat menjadi 3000 GB? Semakin saya memikirkannya, semakin masuk akal untuk meninggalkan ruangan pada akhirnya, seperti contoh 2999 di atas - dengan cara itu ia harus menghilangkan sakit kepala itu. Kecuali saya kehilangan sesuatu?
JaSauders
1
Sebenarnya, dengan asumsi level RAID 1 di sini, mdadmakan menolak untuk membangun array di tempat pertama jika itu tidak kompatibel. Di RAID 5 Anda akan membutuhkan lebih banyak disk pada akhirnya dan di RAID 0 Anda tidak akan peduli, itulah sebabnya saya mengasumsikan RAID 1. Jadi ya, masuk akal untuk meninggalkan ruang.
0xC0000022L
Saya tidak bermaksud mengalahkan kuda itu, tetapi saya sedikit tidak yakin tentang pernyataan "tidak sesuai" yang Anda buat. Apa yang tidak sesuai? Apakah Anda mereferensikan perbedaan ukuran dalam hal 3000 GB vs 3001 GB dalam contoh saya? Either way, saya hanya menjalankan array saya dengan setiap partisi menjadi 2999 GB, meskipun setiap disk 3001 GB. Ini harusnya menghilangkan semua sakit kepala yang muncul saat saya tidak bisa mendapatkan drive pengganti yang identik. Hargai wawasan Anda!
JaSauders
@ JaSauders: Saya pikir satu GiB lebih atau kurang sudah tidak kompatibel. Tapi sejujurnya saya tidak tahu di mana batasnya. Saya tahu, bagaimanapun, bahwa sedikit variasi ukuran akan ditoleransi. Untuk semua yang lain, Anda harus bermigrasi dengan cara yang mirip dengan apa yang saya uraikan.
0xC0000022L
@ 0xC0000022L: mdadmmentolerir 1% perbedaan ukuran anggota array yang sewenang-wenang.
Alexios