RAID (mdadm) - अगर ड्राइव आकार में बेमेल हैं तो क्या होगा?


15

प्रश्न 1 - इससे पहले कि आप "यह सिर्फ छोटी डिस्क लेता है" के साथ उत्तर दें, मुझे त्वरित रूप से सुनें। मेरे 3TB WD रेड्स का साइज़ 3001 GB है। मान लीजिए कि मैंने sdb1 और sdc1 के लिए mdadm के माध्यम से एक दर्पण स्थापित किया है, जो ड्राइव का 100% है। लेकिन अचानक, ड्राइव में से एक विफल हो जाता है। प्रतिस्थापन एक 3TB है, जिसका वजन 3000 GB है। क्या होता है जब मैं एक ड्राइव में डालता हूं जो कि वर्तमान में मौजूद सरणी से छोटा है? मुझे पता है कि 3000 बनाम 3001 का उपयोग करके एक नई सरणी के साथ, यह सरणी का निर्माण 3000 होगा। लेकिन जैसा मैंने कहा, वर्तमान सरणी @ 3001 के बारे में क्या है और मैं एक छोटी ड्राइव जोड़ता हूं? क्या यह 3000 जीबी आकार में पुनर्निर्माण के दौरान फिर से संरचना करता है?

प्रश्न 2 - इस घटना में कि मैं एक मौजूदा 3001 जीबी के साथ 3000 जीबी को सरणी में नहीं जोड़ सकता हूं और यह केवल 3000 तक कम हो जाता है ... क्या मैं 3001 को थोड़ा कम कर सकता हूं?

प्रश्न 3 - या, एक बेहतर विचार। क्या होगा अगर मैं अपने 3TB ड्राइव को 2999 GB करता हूँ। इस तरह कि क्या ड्राइव 1 एमबी, 1 बाइट, 10 केबी से छोटा है, इससे कोई फर्क नहीं पड़ता, यह हमेशा "छोटे" ड्राइव @ 2999 जीबी को उठाएगा।

जवाबों:


28

मैं गलती से इस जवाब पर आया था, लेकिन अगर किसी को कोई भी जानकारी नहीं है, तो यहाँ प्रयोगों द्वारा समर्थित उत्तर है।

लघु संस्करण

बोनस प्रश्न: क्या मैं md(4)असमान आकार के ब्लॉक डिवाइस से एक RAID सरणी बना सकता हूं ? हां, लेकिन RAID सरणी में सबसे छोटे ब्लॉक डिवाइस का आकार होगा (साथ ही अपने स्वयं के हाउसकीपिंग के लिए कुछ ओवरहेड्स)। यदि डिवाइस आकार एक दूसरे के 1% के भीतर नहीं हैं, तो आपको एक चेतावनी मिलती है।

प्रश्न 1: क्या मैं किसी मौजूदा md(4)RAID सरणी में एक डिवाइस को सबसे छोटे वर्तमान सदस्य से छोटा कर सकता हूं ? नहीं माफ़ करो। mdadmअपने डेटा की सुरक्षा के लिए ऐसा करने से मना कर देगा।

प्रश्न 2: क्या आप किसी मौजूदा md सरणी का आकार बदल सकते हैं? हां ( mdadmमैनपेज पढ़ें !), लेकिन यह प्रयास के लायक नहीं हो सकता है। आपको सब कुछ वापस करना होगा, फिर RAID डिवाइस की सामग्री का आकार बदलना होगा, फिर डिवाइस को स्वयं आकार देना होगा - यह सब त्रुटियों, मिसकल्चुलेशन और अन्य चीजों से काफी प्रभावित होता है, जो आपके डेटा को खर्च कर सकते हैं (दर्दनाक अनुभव से बात करना) ।

यह जोखिम और प्रयास के लायक नहीं है। यदि आपके पास एक नई, खाली डिस्क है, तो इसका आकार कैसे बदलें और हर समय अपने सभी डेटा की एक और दो प्रतियों के बीच रखें (यह मानते हुए कि आपके पास 2-डिस्क RAID1 है):

  1. md(4)उस पर एक नया सरणी बनाएं (एक डिस्क गुम होने के साथ)।
  2. सरणी सामग्री (क्रिप्टो, LVM, विभाजन सारणी, उसके किसी भी संयोजन, जो भी आपकी नाव को तैरता है) की संरचना को फिर से बनाएँ।
  3. मौजूदा डिस्क से डेटा को नए पर कॉपी करें।
  4. रिबूट, नई डिस्क का उपयोग कर।
  5. पुरानी डिस्क के विभाजन तालिका को मिटा दें (या md(4)सुपरब्लॉक को शून्य करें )। यदि आवश्यक हो, तो उस नई डिस्क पर योजना से मिलान करने के लिए आवश्यक विभाजन बनाएं।
  6. नए सरणी में पुरानी डिस्क जोड़ें।
  7. सरणी सदस्यों को सिंक करने के लिए प्रतीक्षा करें। कुछ कॉफी लीजिये। लैटिन अमेरिका के लिए उड़ान भरें और उस मामले के लिए अपनी खुद की कॉफी बीन्स चुनें। :) (यदि आप लैटिन अमेरिका में रहते हैं , तो इसके बजाय अफ्रीका के लिए उड़ान भरें)।

नोट: हाँ, यह वही तकनीक है जिसका 0xC0000022L उसके उत्तर में वर्णित है।

प्रश्न 3. अगर ड्राइव 1G छोटा है तो क्या होगा? :) इसके बारे में चिंता मत करो। संभावना है कि आपका प्रतिस्थापन ड्राइव बड़ा होगा। वास्तव में, ऊपर की रणनीति के साथ, जब भी कोई विफल होता है (या एक सस्ता अपग्रेड के लिए) सस्ती बड़ी ड्राइव प्राप्त करने के लिए भुगतान करता है। आप एक प्रगतिशील उन्नयन प्राप्त कर सकते हैं।

प्रायोगिक प्रमाण

प्रयोगिक व्यवस्था

पहले, चलो कुछ ब्लॉक डिवाइस को नकली करें। हम उपयोग करेंगे /tmp/sdxऔर /tmp/sdy(प्रत्येक 100M), और /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

: तीन लूपबैक ब्लॉक उपकरणों के रूप में तीन फाइलों को इस सेट /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) के दो लूप डिवाइस हैं और 99M (बिल्कुल 99 × 1024 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

यह निश्चित रूप से हम क्या उम्मीद करते हैं: mdadm मैनुअल पर एक नज़र हमें याद दिलाता है कि संस्करण 1.2 मेटाडाटा 128K: 128 + 102272 = 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

इतना ज़रूर है कि यह 1024K ब्लॉक का 128K छोटा है। छोटी डिस्क जोड़ना:

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

बूम! यह हमें जाने नहीं देगा, और त्रुटि बहुत स्पष्ट है।


Synology हाइब्रिड RAID (SHR) इस समस्या को हल करता है।
डेनिस डेनिसोव

1

mdXउपकरणों को स्थापित करने के कई तरीके हैं । यह विधि GPT के रूप में विभाजन के लिए gdisk(या sgdiskयदि आप कमांड-लाइन केवल संस्करण को पसंद करते हैं) का उपयोग करना होगा । यदि आप सरणी से बूट करना चाहते हैं तो "BIOS बूट पार्टीशन" बनाएं, कोड लिखें ef02। यह केवल तभी आवश्यक है जब आप इस सरणी को बूट करना चाहते हैं, अन्यथा देखभाल करने की आवश्यकता नहीं है। फिर, ऐरे में जोड़े जाने वाले सबसे छोटे डिस्क की तुलना में एक ही आकार या छोटे से एक विभाजन बनाएँ। अंतिम लेकिन कम से कम, अन्य डिस्क पर GPT डेटा की प्रतिलिपि बनाएँ (विशेषज्ञ मेनू में gdisk, उपयोग x, और फिर uऔर लक्ष्य डिवाइस निर्दिष्ट करें)। यह एक विनाशकारी प्रक्रिया है।

यह संभव होना चाहिए - अगर फ़ाइल सिस्टम इसके लिए अनुमति देता है - किसी छोटे से मौजूदा विभाजन का आकार बदलने के लिए और फिर उसी विधि का उपयोग करके GPT डेटा की प्रतिलिपि बनाएँ। हालाँकि, यह आपको थोड़े से फेरबदल में बदल जाता है। क्योंकि अब आपके पास दो डिस्क हैं, लेकिन फिर भी कोई mdXडिवाइस नहीं है। उनमें से एक के रूप में तैयार किया जाना है mdX, या तो विभाजन-वार (जो मैंने ऊपर उल्लिखित किया है) या डिस्क-वार) और फिर डेटा को मौजूदा डिस्क से उस पर स्थानांतरित किया जाना चाहिए।

इसलिए:

  1. बिग डिस्क ( /dev/sda) में डेटा है, डेटा 3001 जीबी से छोटा है, विभाजन नहीं हैं
  2. /dev/sdbसिस्टम में छोटी डिस्क जुड़ जाती है
  3. आप के /dev/sdbसाथ विभाजनgdisk
  4. आप प्रत्येक संबंधित विभाजन से एक सरणी बनाते हैं ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. आप नए सरणियों पर फ़ाइल सिस्टम बनाते हैं
  6. आप सभी डेटा को कॉपी करते हैं, यह सुनिश्चित करते हुए कि आपका सिस्टम GPT डिस्क को चलाने के लिए तैयार होगा और GRUB2 के निहितार्थों को समझेगा (नीचे देखें)
  7. आप से अधिक GPT विभाजन डेटा की प्रतिलिपि /dev/sdbकरने के लिए/dev/sda
  8. आप /dev/sdaमौजूदा सरणियों में "कच्चे" विभाजन जोड़ते हैं
  9. आपको /proc/mdstatयह दिखाने के लिए इंतजार करना होगा कि सिंकिंग किया गया है

यदि आपने सभी चरणों का पालन किया है तो आपको अब mdX सरणियों से नई प्रणाली में बूट करने में सक्षम होना चाहिए। हालाँकि, बचाव की सीडी या पीएक्सई बूट विकल्प को संभाल कर रखें, बस मामले में।


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 @ 3001 GB और sdc1 @ 3001 GB है, तो क्या होगा, लेकिन sdc1 मर जाता है और प्रतिस्थापन 3000 GB है? क्या sdb1 3000 से कम हो जाता है? क्या सरणी @ / dev / md0 डाउनसाइज़ होकर ३०० जीबी है? जितना मैं इसके बारे में सोचता हूं, उतना ही यह अंत में कमरे को छोड़ने के लिए समझ में आता है, जैसे कि ऊपर 2999 उदाहरण - इस तरह से उस सिरदर्द को दूर करना चाहिए। जब तक मैं कुछ याद कर रहा हूँ?
Jaaauders 3

1
वास्तव में, यहां RAID स्तर 1 को मानते हुए, mdadmअगर यह असंगत है, तो पहली जगह में सरणी बनाने से इंकार कर देगा। RAID 5 में आपको अंततः अधिक डिस्क की आवश्यकता होगी और RAID 0 में आपको इसकी परवाह नहीं होगी, यही कारण है कि मैंने RAID 1 ग्रहण किया है। इसलिए हां, यह कमरे को छोड़ने के लिए समझ में आता है।
0xC0000022L

मेरा मतलब घोड़े को पीटना नहीं है, लेकिन मैं आपके द्वारा किए गए "असंगत" बयान के बारे में थोड़ा अनिश्चित हूं। असंगत क्या होगा? क्या आप मेरे उदाहरण में ३००० जीबी बनाम ३००१ जीबी के आकार अंतर का संदर्भ दे रहे हैं? किसी भी तरह से, मैंने सिर्फ अपने विभाजन को प्रत्येक भाग के साथ 2999 जीबी किया, भले ही प्रत्येक डिस्क 3001 जीबी थी। यह बस किसी भी सिरदर्द को दूर करना चाहिए जो उस घटना में रेखा से नीचे आता है जो मुझे समान प्रतिस्थापन ड्राइव नहीं मिल सकता है। अपनी अंतर्दृष्टि की सराहना करें!
Jaaauders 3

@JaSauders: मुझे लगता है कि कमोबेश एक GiB पहले से ही असंगत होगा। लेकिन काफी स्पष्ट रूप से मुझे नहीं पता कि सीमा कहां है। हालांकि, मुझे पता है कि आकार में मामूली बदलाव बर्दाश्त किया जाएगा। बाकी सब चीजों के लिए आपको एक तरह से माइग्रेट करना होगा जो मैंने उल्लिखित किया था।
0xC0000022L

@ 0xC0000022L: mdadmसरणी सदस्यों में मनमाने ढंग से 1% अंतर को सहन करता है।
एलेक्सजॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.