ฉันเจอคำตอบนี้โดยไม่ตั้งใจ แต่ในกรณีที่ใครอยากรู้อยากเห็นนี่เป็นคำตอบที่ได้รับการสนับสนุนจากการทดลอง
เวอร์ชั่นสั้น
คำถามโบนัส: ฉันสามารถสร้างmd(4)
อาร์เรย์ RAID จากอุปกรณ์บล็อกที่มีขนาดไม่เท่ากันได้หรือไม่ ใช่ แต่อาร์เรย์ RAID จะมีขนาดของอุปกรณ์บล็อกที่เล็กที่สุด (บวกค่าโสหุ้ยบางอย่างสำหรับการดูแลทำความสะอาดของตัวเอง) หากขนาดอุปกรณ์ไม่อยู่ในระยะ 1% ของกันและกันคุณจะได้รับคำเตือน
คำถามที่ 1: ฉันสามารถเพิ่มmd(4)
อาเรย์ RAID ที่มีอยู่ในอุปกรณ์ที่เล็กกว่าสมาชิกปัจจุบันที่เล็กที่สุดได้หรือไม่? ไม่ขอโทษ mdadm
จะไม่ยอมทำเช่นนั้นเพื่อปกป้องข้อมูลของคุณ
คำถามที่ 2: คุณสามารถปรับขนาดอาร์เรย์ md ที่มีอยู่ได้หรือไม่ ใช่ (อ่านmdadm
manpge!) แต่อาจไม่คุ้มค่ากับความพยายาม คุณจะต้องสำรองข้อมูลทุกอย่างจากนั้นปรับขนาดเนื้อหาของอุปกรณ์ RAID จากนั้นปรับขนาดอุปกรณ์เอง - ทั้งหมดนี้มีแนวโน้มที่จะเกิดข้อผิดพลาดการคำนวณผิดและสิ่งอื่น ๆ ที่จะทำให้คุณเสียค่าใช้จ่าย .
มันไม่คุ้มกับความเสี่ยงและความพยายาม หากคุณมีดิสก์เปล่าใหม่นี่คือวิธีการปรับขนาดและเก็บระหว่างสำเนาข้อมูลทั้งหมดของคุณหนึ่งถึงสองครั้งตลอดเวลา (สมมติว่าคุณมี RAID1 2 ดิสก์):
- สร้าง
md(4)
อาร์เรย์ใหม่ในนั้น (โดยไม่มีดิสก์หนึ่งแผ่น)
- สร้างโครงสร้างของเนื้อหาอาเรย์อีกครั้ง (Crypto, LVM, ตารางพาร์ทิชั่น, การรวมกันใด ๆ ของมัน, ไม่ว่าเรือของคุณจะลอย)
- คัดลอกข้อมูลจากดิสก์ที่มีอยู่ไปยังดิสก์ใหม่
- รีบูตโดยใช้ดิสก์ใหม่
- เช็ดตารางพาร์ติชันของดิสก์เก่า (หรือศูนย์
md(4)
superblock) ถ้าจำเป็นให้สร้างพาร์ติชันที่จำเป็นเพื่อให้ตรงกับโครงร่างบนเขาใหม่ดิสก์
- เพิ่มดิสก์เก่าลงในอาร์เรย์ใหม่
- รอให้สมาชิกอาร์เรย์ทำการซิงค์ มีกาแฟบ้าง บินไปละตินอเมริกาและเลือกเมล็ดกาแฟของคุณเองสำหรับเรื่องนั้น :) (หากคุณอาศัยอยู่ในละตินอเมริกาบินไปแอฟริกาแทน)
หมายเหตุ: ใช่นี่เป็นเทคนิคเดียวกัน 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 99 1024 1024 บล็อก K) อย่างแน่นอน
การสร้าง RAID Array จากอุปกรณ์ที่มีขนาดเหมือนกัน
ไปที่นี่:
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 เตือนเราว่ารุ่น 1.2 เมตาดาต้าที่ใช้เวลาถึง 128K: 128 + 102,272 = 102400. ตอนนี้เรามาทำลายมันในการเตรียมการสำหรับการทดสอบที่สอง
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1
การสร้าง RAID Array จากอุปกรณ์ที่มีขนาดไม่เท่ากัน
คราวนี้เราจะใช้อุปกรณ์บล็อกเล็ก ๆ
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 พื้นที่ใช้งานได้คืออุปกรณ์ขนาดเล็กที่สุด (รวมทั้งข้อมูลเมตาของ RAID 128K) ลองนำมาลงทั้งหมดอีกครั้งสำหรับการทดสอบครั้งล่าสุดของเรา:
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2
และสุดท้าย: การเพิ่มอุปกรณ์ขนาดเล็กลงใน Running Array
อันดับแรกให้สร้างอาร์เรย์ RAID1 ที่มีเพียงหนึ่งในดิสก์ 100M อาร์เรย์จะลดลง แต่เราไม่สนใจจริงๆ เราแค่ต้องการอาเรย์เริ่มต้น 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
แน่นอนมันสั้น 128K ของ 102400 บล็อก การเพิ่มดิสก์ขนาดเล็ก:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
บูม! มันจะไม่ยอมให้เราและความผิดพลาดนั้นชัดเจนมาก