ตกลง นี่คือสิ่งที่ฉันทำ อาจช่วยคนต่อไป
การค้นหาข้อเท็จจริง
ก่อนอื่น ฉันแนบดิสก์ทั้งหมดกับ HBA GNU/Linux พยายามรวบรวมไฟล์
การโจมตี แต่พบ (อย่างน้อย) สองปริมาณการโจมตี (และพิเศษอีกเล็กน้อย) ฉัน
จากนั้นทำการสำรองข้อมูล 32 แรกและ 32MB สุดท้ายของแต่ละดิสก์ จัดทำดัชนีโดย
WWID/WWN ของพวกเขา
ฉันจึงดาวน์โหลดข้อกำหนด SNIA DDF
(https://www.snia.org/tech_activities/standards/curr_standards/ddf)
เพราะฉันรู้ว่า megaraid/dell (บางส่วน) ใช้มัน (ddf
ไม่ใช่มายากลสมอบล็อก เด11เด11
โดยบังเอิญ :) แล้วเขียนมาก
สคริปต์ที่น่าเกลียดในการถอดรหัสข้อมูลและทำความเข้าใจกับมัน
นี่แสดงให้ฉันเห็นว่าอาร์เรย์ถูกแบ่งออกเป็นสามส่วน
คอนฟิกูเรชันหนึ่งที่มีดิสก์หนึ่งแผ่นและอีกอันหนึ่งรวมอยู่ด้วย
ดิสก์และอีก 4 แผ่น และอีกอันที่มีดิสก์อีก 2 แผ่นที่เหลือ
ตัวสคริปต์เองไม่มีประโยชน์มากนักหากไม่เข้าใจสิ่งที่คุณกำลังทำอยู่ ดังนั้นฉันจึงไม่ได้รวมไว้ที่นี่
ในที่สุดสิ่งนี้ทำให้ฉันสามารถแยกแยะลำดับดั้งเดิมที่ถูกต้องของ
ดิสก์ คำแนะนำ: หลังจากสร้างอาร์เรย์แล้ว ให้จดลำดับของ WWN
(perccli /c0/s0 แสดงทั้งหมด | เกรป WWN
) และขนาดแถบเป็นอย่างน้อย
กระบวนการนี้ยังทำให้ฉันมีออฟเซ็ตเริ่มต้น (0 เสมอ) และขนาดของ
พาร์ติชัน (ภาค 19531825152)
ตัวแปร Raid5 ที่ใช้โดย H740P (และอาจเป็น megaraid ทั้งหมด
คอนโทรลเลอร์) เรียกว่า ซ้ายสมมาตร
หรือ "RAID-5 Rotating Parity N ด้วย
ความต่อเนื่องของข้อมูล (PRL=05, RLQ=03)"
ประกอบดิสก์อีกครั้งสำหรับการทดสอบ
จากนั้นฉันพยายามทดสอบประกอบการจู่โจมอีกครั้งโดยใช้ mdadm -- สร้าง
. น่าเสียดายที่ mdadm ปฏิเสธที่จะรวบรวมอาร์เรย์ Raid5 - คุณ
มี เพื่อเขียนไปยังอาร์เรย์และทำลายข้อมูล :(
วิธีแก้ปัญหาเบื้องต้น เพื่อทดสอบว่าคำสั่งถูกต้องหรือไม่ ฉันเริ่ม kvm
ในโหมดสแน็ปช็อตพร้อมอิมเมจบูต GNU / Linux แบบสุ่มเป็น /dev/sda
และดิสก์เป็นดิสก์ virtio:
ผู้บริหาร kvmb -snapshot -m 16384 \
- ไฟล์ไดรฟ์ = linux.img, snapshot = ปิด \
-drive file=/dev/sdm,if=virtio,snapshot=on \
-drive file=/dev/sdl,if=virtio,snapshot=on \
-drive file=/dev/sdk,if=virtio,snapshot=on \
-drive file=/dev/sdi,if=virtio,snapshot=on \
-drive file=/dev/sdg,if=virtio,snapshot=on \
-drive file=/dev/sdf,if=virtio,snapshot=on \
-drive file=/dev/sdh,if=virtio,snapshot=on
สิ่งนี้ทำให้ดิสก์ปรากฏในลำดับที่ระบุเป็น /dev/vda
, /dev/vdb
และอื่น ๆ และทำให้ฉันสามารถทดสอบตัวเลือกต่าง ๆ ได้อย่างง่ายดาย การลองครั้งแรกภายใน VM สำเร็จ:
mdadm --create /dev/md0 -f \
--ข้อมูลเมตา 1.0 \
--อุปกรณ์จู่โจม 7 \
-z $((19531825152/2))K -c 256K \
-l Raid5 -p ddf-N-ดำเนินการต่อ \
--assume-clean -k resync \
/dev/vd?
สำหรับ Raid5 ขนาดพาร์ติชันนั้นไม่สำคัญ - หากใหญ่กว่านั้นคือ GPT ของคุณ
ตารางพาร์ติชันเสียหายและคุณมีข้อมูลเพิ่มเติม แต่ส่วนที่เหลือ
ดิสก์ควรจะยังสามารถอ่านได้
ฉันตรวจสอบความถูกต้องของข้อมูลโดยการติดตั้งพาร์ติชัน (ซึ่งควร
ไม่โยนข้อผิดพลาด แต่อาจสำเร็จแม้ว่าคำสั่งจะผิด) และการใช้
btrfs สครับ
ซึ่งจะตรวจสอบผลรวมการตรวจสอบของข้อมูลเมตาและบล็อกข้อมูล ซึ่งเป็นการทดสอบขั้นสูงสุด และข้อดีที่สำคัญของ btrfs
จากนั้นฉันก็เรียกใช้ backzp อีกครั้ง
จากนั้นฉันเขียน WWN ของดิสก์ทั้งหมดตามลำดับ เพื่อให้ฉันสามารถสร้างมันขึ้นมาใหม่ได้
กับ เพอร์คลี
. ฉันได้สำรองข้อมูล 1GB แรกและสุดท้ายด้วย
ปริมาณของตัวเองในกรณีที่ตัวควบคุมการโจมตีจะเขียนทับสิ่งเหล่านั้น
ย้ายระดับเสียงกลับเข้าไปในตัวควบคุมการโจมตี
เนื่องจากไม่ได้สำรองข้อมูลประมาณ 14TB (เนื่องจากข้อมูลสามารถ
ดึงมาจากที่อื่นด้วยความพยายามบางอย่างและฉันก็ใจร้อนเกินไป
รอการคัดลอก) การคืนค่าทั้งหมดไม่ใช่ตัวเลือกที่ฉันตั้งตารอ
ฉันจึงพยายามย้ายอาร์เรย์กลับเข้าไปในตัวควบคุม
ความพยายามครั้งแรกของฉันคือจัดรูปแบบอาร์เรย์เป็นคอนเทนเนอร์ DDF ด้วย Raid5
ปริมาณภายในโดยใช้พารามิเตอร์เดียวกับที่คอนโทรลเลอร์ใช้ แต่น่าเสียดายที่คอนโทรลเลอร์ megaraid - ขณะใช้งาน
DDF เอง - ไม่รองรับ DDF "ต่างประเทศ" สำหรับการนำเข้าและแสดงดิสก์อย่างง่ายๆ
เป็น "ดีที่ไม่ได้กำหนดค่า"
ฉันพยายามสร้างอาร์เรย์ใหม่โดยการเพิ่มอีกครั้ง เช่น:
perccli /c0 เพิ่ม vd r5 name=XXX drives=3,6,9,1,2,3,0 pdcache=off wb ra strip=256
การทำเช่นนี้บนระบบที่บู๊ตด้วย perccli ทำให้แน่ใจว่าตัวควบคุมการโจมตี
จะทำการเริ่มต้นพื้นหลังซึ่งไม่ทำลาย และด้วย RAID5
จะไม่แม้แต่จะทำลายข้อมูลเมื่อลำดับของดิสก์หรือแถบขนาดผิด เช่น
ตราบใดที่คุณใช้ อย่างแน่นอน ดิสก์ทั้งหมดจากอาร์เรย์ดั้งเดิมในลำดับใดก็ได้ โดยไม่ทิ้งดิสก์หรือให้มากเกินไป
นี่คือจุดที่ฉันล้มเหลว - ฉันทำลำดับของดิสก์ผิดพลาดโดยสิ้นเชิง
และยังจัดการความเสียหาย 1.5MB แรกของโวลุ่ม ฉันมีอย่างแน่นอน
ไม่รู้ว่าเกิดอะไรขึ้น แต่ฉันลองเรียงสับเปลี่ยนหลายอย่างแล้วไม่เห็น
ข้อมูลที่ถูกต้องจนถึงจุดที่ฉันคิดว่าผู้ควบคุมการโจมตีจะทำได้
จัดลำดับดิสก์ของฉันใหม่ (แต่ไม่ใช่ มันใช้ลำดับเป็น
ระบุ).
เรื่องสั้นสั้น ๆ ฉันแนบดิสก์กับ HBA อีกครั้งและลองและ
ล้มเหลวในการทำความเข้าใจกับมัน นี่คือที่ที่การสำรองข้อมูลดั้งเดิมของฉันมีประโยชน์:
แม้ว่าฉันจะสูญเสียลำดับของดิสก์ แต่ฉันก็มีข้อมูลสำรองที่ชัดเจนและ
ลดลำดับที่เป็นไปได้ให้เหลือการเรียงสับเปลี่ยนที่เป็นไปได้สองแบบง่ายๆ โดยดูที่ hexdumps การสร้างอาร์เรย์ด้วย คุณนาย
และการทดสอบข้อมูลทำให้ฉันมีลำดับที่ถูกต้อง
จากนั้นฉันก็เขียนลำดับของ WWN อีกครั้ง แนบดิสก์เข้ากับ
ตัวควบคุม บูตและทำ perccli /c0 เพิ่ม...
. จากนั้นฉันก็เรียกคืนครั้งแรก
ปริมาณ 1.5MB (ซึ่งรวมถึงพาร์ติชัน GPT และป้ายกำกับ LVM และ
ข้อมูลขยะเก่า ๆ ที่เหลืออยู่ซึ่งมีประโยชน์มากในการเดาอะไร
สั่งซื้อได้) มั่นใจได้ระดับหนึ่งว่าสามารถเลิกทำได้
ความผิดพลาดมีประโยชน์ในสถานการณ์นี้
ผลลัพธ์: อาร์เรย์กลับมา btrfs สอดคล้องกัน และตอนนี้ con troller กำลังเริ่มต้นพื้นหลัง ซึ่งทำให้ทั้งระบบช้าลงสองสามวัน แต่เป็นราคาที่ต้องจ่ายเล็กน้อย
สิ่งที่ได้เรียนรู้
ฉันได้เรียนรู้มากมาย!
คอนโทรลเลอร์ perc (และคอนโทรลเลอร์ megaraid ทั้งหมด) ไม่สามารถรับมือได้
ดีกับปัญหาดิสก์ที่เกิดขึ้นอย่างรวดเร็วและไม่ต่อเนื่อง - ฉันสงสัยว่าดิสก์จะหายไปและกลับมาอย่างรวดเร็วทำให้เกิดสภาวะการแย่งชิงซึ่งคอนโทรลเลอร์พยายามเขียนการกำหนดค่าใหม่ลงในดิสก์และประสบความสำเร็จเพียงบางส่วนกับดิสก์บางส่วน ในที่สุดก็แยกการจู่โจมออกเป็นสองส่วน . นี่เป็นบั๊กของเฟิร์มแวร์อย่างชัดเจน แต่แล้วใครจะคาดคิดว่าสายไฟจะขาด...
mdadm ไม่มีประโยชน์มากนักในการทำความเข้าใจหรือแสดงส่วนหัว DDF -
ฉันไม่สามารถเข้าใจข้อมูลที่แสดงได้ และเมื่อฉันค้นพบ
เมื่อถอดรหัสส่วนหัวเองนี่เป็นเพราะข้อมูลจำนวนมาก
หายไปจาก --รายละเอียด
และ --พิจารณา
เอาต์พุตนอกจากนี้ยังไม่เป็นประโยชน์ในการทดลองเนื่องจากปฏิเสธที่จะประกอบแบบอ่านอย่างเดียวแบบไม่ทำลาย
ตัวควบคุม perc/megaraid ใช้รูปแบบ SNIA DDF ภายใน และนี่คือ
ข้อกำหนดที่สาธารณชนเข้าถึงได้นั้นมีประโยชน์อย่างยิ่ง แม้ว่าในท้ายที่สุดแล้ว ฉันก็ค้นพบสิ่งที่ต้องการโดยปราศจากข้อมูลนี้
สามารถคาดเดาลำดับของ Raid Strip ที่ถูกต้องจากข้อมูลเพียงอย่างเดียว
มีประโยชน์มาก ขยะที่เหลือและข้อมูลอื่น ๆ ที่สามารถช่วยได้
ยังมีประโยชน์มาก ฉันจะพิจารณาเขียน "ดิสก์ 1", "ดิสก์ 2" และอื่นๆ ลงใน
พื้นที่ "ว่างเปล่า" ของส่วนหัวโวลุ่ม RAID ของฉันนับจากนี้ (มี 0 ไบต์ยาวเหยียดใน 2MB แรก)
มันง่ายมากที่จะบ้า - ชื่ออุปกรณ์, หมายเลขสมาชิก Raid, WWN,
หมายเลขสล็อตและอื่น ๆ ทั้งหมดที่แตกต่างกันอาจหมายถึงข้อมูลจำนวนมาก
จัดการและ WWN ก็ยาวและตาแก่ของฉันก็ไม่ดีอีกต่อไป นอกจากนี้ ฉันไม่เป็นระเบียบและมั่นใจในตัวเองมากเกินไป :/
การสร้างและการลบอาร์เรย์โดยใช้ดิสก์ที่มีข้อมูลอยู่
จะไม่ลบข้อมูล อย่างน้อยกับ RAID5 และใช้พื้นหลัง
การเริ่มต้น การเริ่มต้นเบื้องหน้าแทบจะเป็นศูนย์อย่างแน่นอน
ดิสก์ นั่นหมายความว่าคุณสามารถสร้างและลบอาร์เรย์ได้มาก
เท่าที่คุณต้องการโดยไม่เสี่ยงกับการสูญเสียข้อมูล โดยมีข้อยกเว้นประการหนึ่งที่เป็นไปได้:
การลบอาร์เรย์บางครั้งต้องใช้ตัวเลือกบังคับเนื่องจาก RAID
คอนโทรลเลอร์คิดว่ามัน "ใช้งานอยู่" เนื่องจากป้ายกำกับพาร์ติชันที่ถูกต้อง และนี่ อาจ ทำให้ป้ายกำกับ GPT - YMMV เป็นศูนย์ และตรวจสอบให้แน่ใจว่าคุณมีข้อมูลสำรองของ
สองสามเมกะไบต์แรกในกรณี
Perc/megaraid ไม่เข้าใจคอนเทนเนอร์ DDF ที่ไม่ใช่ของ Dell/megaraid ที่
อย่างน้อยฉันก็ไม่พบวิธีทำให้คอนโทรลเลอร์ยอมรับ DDF ที่สร้างด้วย mdadm
ตู้คอนเทนเนอร์ ความสามารถในการฟอร์แมตดิสก์ใน GNU/Linux และย้ายกลับเข้าไปในคอนโทรลเลอร์จะช่วยได้มากและจะช่วยหลีกเลี่ยงความเศร้าโศกที่อยู่เคียงข้างฉันได้นานหลายชั่วโมง
สรุป
ฉันได้ทุกอย่างกลับคืนมาโดยไม่ต้องกู้คืนจากข้อมูลสำรอง
เวลาเริ่มต้นพื้นหลังช้าสองสามวันฉันเขียนวิธีแก้ปัญหาของฉัน
ข้างต้นเผื่อว่าบางส่วนอาจเป็นประโยชน์กับท่านอื่นใน
สถานการณ์ที่คล้ายกัน