ZFS บน FreeBSD: การกู้คืนจากข้อมูลเสียหาย


44

ฉันมีข้อมูลส่วนบุคคลที่มีค่ามากหลาย TBs ในสวนสัตว์ซึ่งฉันไม่สามารถเข้าถึงได้เนื่องจากข้อมูลเสียหาย เดิมพูลนั้นถูกตั้งค่าไว้ในปี 2009 หรือในระบบ FreeBSD 7.2 ที่ทำงานภายในเครื่องเสมือน VMWare ที่ด้านบนของระบบ Ubuntu 8.04 FreeBSD VM ยังคงมีอยู่และทำงานได้ดีมีเพียง OS โฮสต์ที่ได้รับการเปลี่ยนเป็น Debian 6 ฮาร์ดไดรฟ์นั้นสามารถเข้าถึงได้โดย VM guest โดยอุปกรณ์ VMWare SCSI ทั่วไปรวม 12 รายการ

มี 2 ​​สระว่ายน้ำ:

  • zpool01: 2x 4x500GB
  • zpool02: 1x 4x 160GB

อันที่ทำงานว่างเปล่าอันที่พังนั้นเก็บข้อมูลสำคัญทั้งหมดไว้:

[user@host~]$ uname -a
FreeBSD host.domain 7.2-RELEASE FreeBSD 7.2-RELEASE #0: \
  Fri May  1 07:18:07 UTC 2009                          \
  root@driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

[user@host ~]$ dmesg | grep ZFS
WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6

[user@host ~]$ sudo zpool status
  pool: zpool01
 state: UNAVAIL
 scrub: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    zpool01     UNAVAIL      0     0     0  insufficient replicas
      raidz1    UNAVAIL      0     0     0  corrupted data
        da5     ONLINE       0     0     0
        da6     ONLINE       0     0     0
        da7     ONLINE       0     0     0
        da8     ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        da1     ONLINE       0     0     0
        da2     ONLINE       0     0     0
        da3     ONLINE       0     0     0
        da4     ONLINE       0     0     0

  pool: zpool02
 state: ONLINE
 scrub: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    zpool02     ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        da9     ONLINE       0     0     0
        da10    ONLINE       0     0     0
        da11    ONLINE       0     0     0
        da12    ONLINE       0     0     0

errors: No known data errors

ฉันสามารถเข้าใช้สระได้สองสามสัปดาห์ที่ผ่านมา ตั้งแต่นั้นมาฉันต้องเปลี่ยนฮาร์ดแวร์ทั้งหมดของเครื่องโฮสต์และติดตั้งระบบปฏิบัติการโฮสต์หลายตัว

ความสงสัยของฉันคือว่าหนึ่งในการติดตั้งระบบปฏิบัติการเหล่านี้ได้เขียน bootloader (หรืออะไรก็ตาม) ลงในไดรฟ์ 500GB หนึ่งตัว (หรือไม่?) และทำลาย metadata ของ zpool (หรืออะไรก็ตาม) - 'หรืออะไรก็ตาม' ซึ่งหมายความว่า และหัวเรื่องนั้นไม่ใช่ด้านที่แข็งแกร่งของฉัน ...


มีเว็บไซต์บล็อกรายการส่งเมลและอื่น ๆ อีกมากมายเกี่ยวกับ ZFS ฉันโพสต์คำถามนี้ที่นี่ด้วยความหวังว่ามันจะช่วยให้ฉันรวบรวมข้อมูลเพียงพอสำหรับวิธีการที่มีสติมีโครงสร้างมีการควบคุมแจ้งให้ความรู้เพื่อรับข้อมูลของฉันกลับมา - และหวังว่าจะช่วยคนอื่นในสถานการณ์เดียวกัน


ผลลัพธ์การค้นหาแรกเมื่อ googling สำหรับ 'zfs recovery' คือบทการแก้ไขปัญหา ZFS และการกู้คืนข้อมูลจากคู่มือการดูแลระบบ Solaris ZFS ในส่วนZFS Failure Modesมันกล่าวไว้ในวรรค 'Data ZFS ที่เสียหาย':

ความเสียหายของข้อมูลเป็นสิ่งที่ถาวรและต้องพิจารณาเป็นพิเศษในระหว่างการซ่อมแซม แม้ว่าอุปกรณ์พื้นฐานจะได้รับการซ่อมแซมหรือเปลี่ยนใหม่ข้อมูลต้นฉบับจะสูญหายไปตลอดกาล

ค่อนข้างน่าผิดหวัง

อย่างไรก็ตามผลการค้นหา google ครั้งที่สองคือเว็บล็อกของ Max Bruningและในนั้นฉันอ่าน

เมื่อเร็ว ๆ นี้ฉันได้รับอีเมลจากบุคคลที่มีวิดีโอและเพลง 15 ปีเก็บไว้ในสระ ZFS ขนาด 10TB ซึ่งหลังจากไฟฟ้าดับ น่าเสียดายที่เขาไม่มีข้อมูลสำรอง เขาใช้ ZFS เวอร์ชัน 6 บน FreeBSD 7 [... ] หลังจากใช้เวลาประมาณ 1 สัปดาห์ในการตรวจสอบข้อมูลบนดิสก์ฉันสามารถกู้คืนได้ทั้งหมด

และ

สำหรับ ZFS สูญเสียข้อมูลของคุณฉันสงสัยมัน ฉันสงสัยว่ามีข้อมูลของคุณอยู่ที่นั่น แต่คุณต้องหาวิธีที่เหมาะสมในการเข้าถึง

(นั่นฟังดูคล้ายกับสิ่งที่ฉันอยากได้ยิน ... )

ขั้นแรก : ปัญหาคืออะไรกันแน่?

ฉันจะวินิจฉัยได้อย่างไรว่าทำไม zpool ถึงรายงานว่าเสียหาย? ฉันเห็นว่ามี zdb ซึ่งดูเหมือนจะไม่ได้รับการบันทึกอย่างเป็นทางการโดย Sun หรือ Oracle ที่ใดก็ได้บนเว็บ จากหน้าคนของมัน:

NAME
       zdb - ZFS debugger

SYNOPSIS
       zdb pool

DESCRIPTION
       The  zdb  command is used by support engineers to diagnose failures and
       gather statistics. Since the ZFS file system is  always  consistent  on
       disk  and is self-repairing, zdb should only be run under the direction
       by a support engineer.

       If no arguments are specified, zdb, performs basic  consistency  checks
       on  the pool and associated datasets, and report any problems detected.

       Any options supported by this command are internal to Sun  and  subject
       to change at any time.

นอกจากนี้ Ben Rockwood ได้โพสต์บทความโดยละเอียดและมีวิดีโอของ Max Bruning ที่พูดถึงเรื่องนี้ (และ mdb) ในการประชุมนักพัฒนา Open Solaris ในกรุงปรากเมื่อวันที่ 28 มิถุนายน 2551

การรัน zdb ในฐานะรูทบน zpool ที่เสียหายจะให้เอาต์พุตต่อไปนี้:

[user@host ~]$ sudo zdb zpool01
    version=6
    name='zpool01'
    state=0
    txg=83216
    pool_guid=16471197341102820829
    hostid=3885370542
    hostname='host.domain'
    vdev_tree
        type='root'
        id=0
        guid=16471197341102820829
        children[0]
                type='raidz'
                id=0
                guid=48739167677596410
                nparity=1
                metaslab_array=14
                metaslab_shift=34
                ashift=9
                asize=2000412475392
                children[0]
                        type='disk'
                        id=0
                        guid=4795262086800816238
                        path='/dev/da5'
                        whole_disk=0
                        DTL=202
                children[1]
                        type='disk'
                        id=1
                        guid=16218262712375173260
                        path='/dev/da6'
                        whole_disk=0
                        DTL=201
                children[2]
                        type='disk'
                        id=2
                        guid=15597847700365748450
                        path='/dev/da7'
                        whole_disk=0
                        DTL=200
                children[3]
                        type='disk'
                        id=3
                        guid=9839399967725049819
                        path='/dev/da8'
                        whole_disk=0
                        DTL=199
        children[1]
                type='raidz'
                id=1
                guid=8910308849729789724
                nparity=1
                metaslab_array=119
                metaslab_shift=34
                ashift=9
                asize=2000412475392
                children[0]
                        type='disk'
                        id=0
                        guid=5438331695267373463
                        path='/dev/da1'
                        whole_disk=0
                        DTL=198
                children[1]
                        type='disk'
                        id=1
                        guid=2722163893739409369
                        path='/dev/da2'
                        whole_disk=0
                        DTL=197
                children[2]
                        type='disk'
                        id=2
                        guid=11729319950433483953
                        path='/dev/da3'
                        whole_disk=0
                        DTL=196
                children[3]
                        type='disk'
                        id=3
                        guid=7885201945644860203
                        path='/dev/da4'
                        whole_disk=0
                        DTL=195
zdb: can't open zpool01: Invalid argument

ฉันคิดว่าข้อผิดพลาด 'อาร์กิวเมนต์ไม่ถูกต้อง' ในตอนท้ายเกิดขึ้นเนื่องจาก zpool01 ไม่มีอยู่จริง: มันไม่ได้เกิดขึ้นกับ zpool02 ที่ใช้งานได้ แต่ดูเหมือนจะไม่มีผลลัพธ์ใด ๆ เพิ่มเติม ...

ตกลงในขั้นตอนนี้อาจเป็นการดีกว่าที่จะโพสต์สิ่งนี้ก่อนที่บทความจะยาวเกินไป

บางทีใครบางคนสามารถให้คำแนะนำกับฉันเกี่ยวกับวิธีการก้าวไปข้างหน้าจากที่นี่และในขณะที่ฉันรอการตอบสนองฉันจะดูวิดีโออ่านรายละเอียดของผลลัพธ์ zdb ด้านบนอ่านบทความ Bens และพยายามหาว่ามีอะไรบ้าง อะไร...


20110806-1600 + 1000

อัปเดต 01:

ฉันคิดว่าฉันได้พบสาเหตุ: แม็กซ์ Bruning zdb -lllก็ใจดีพอที่จะตอบอีเมลของเหมืองอย่างรวดเร็วขอให้การส่งออกของ ในฮาร์ดไดรฟ์ทั้ง 4 ตัวในส่วน 'ดี' raidz1 ของพูลผลลัพธ์จะคล้ายกับที่ฉันโพสต์ไว้ด้านบน อย่างไรก็ตามใน 3 ไดรฟ์แรกของ 4 ไดรฟ์ในครึ่ง 'แตก' zdbรายงานfailed to unpack labelสำหรับเลเบล 2 และ 3 ไดรฟ์ที่สี่ในพูลดูเหมือนว่า OK zdbแสดงเลเบลทั้งหมด

Googling ข้อผิดพลาดที่นำขึ้นโพสต์นี้ จากการตอบกลับแรกไปยังโพสต์นั้น:

ด้วย ZFS ที่มี 4 ป้ายชื่อเหมือนกันในแต่ละฟิสิคัล vdev ในกรณีนี้ฮาร์ดไดรฟ์เดียว L0 / L1 ที่จุดเริ่มต้นของ vdev และ L2 / L3 ที่ส่วนท้ายของ vdev

ทั้งหมด 8 ไดรฟ์ในสระว่ายน้ำที่มีรูปแบบเดียวกัน, Seagate Barracuda 500GB อย่างไรก็ตามฉันจำได้ว่าฉันเริ่มพูลด้วยไดรฟ์ 4 ตัวจากนั้นหนึ่งในนั้นก็ตาย หลังจากนั้นฉันเพิ่มอีก 4 ไดรฟ์ ด้วยเหตุผลดังกล่าวตัวระบุไดรฟ์และเฟิร์มแวร์จึงแตกต่างกัน:

[user@host ~]$ dmesg | egrep '^da.*?: <'
da0:  <VMware, VMware Virtual S 1.0> Fixed Direct Access SCSI-2 device 
da1:  <ATA ST3500418AS CC37> Fixed Direct Access SCSI-5 device 
da2:  <ATA ST3500418AS CC37> Fixed Direct Access SCSI-5 device 
da3:  <ATA ST3500418AS CC37> Fixed Direct Access SCSI-5 device 
da4:  <ATA ST3500418AS CC37> Fixed Direct Access SCSI-5 device 
da5:  <ATA ST3500320AS SD15> Fixed Direct Access SCSI-5 device 
da6:  <ATA ST3500320AS SD15> Fixed Direct Access SCSI-5 device 
da7:  <ATA ST3500320AS SD15> Fixed Direct Access SCSI-5 device 
da8:  <ATA ST3500418AS CC35> Fixed Direct Access SCSI-5 device 
da9:  <ATA SAMSUNG HM160JC AP10> Fixed Direct Access SCSI-5 device 
da10: <ATA SAMSUNG HM160JC AP10> Fixed Direct Access SCSI-5 device 
da11: <ATA SAMSUNG HM160JC AP10> Fixed Direct Access SCSI-5 device 
da12: <ATA SAMSUNG HM160JC AP10> Fixed Direct Access SCSI-5 device 

ฉันจำได้ว่าไดรฟ์ทั้งหมดมีขนาดเท่ากัน เมื่อดูที่ไดรฟ์ในตอนนี้มันแสดงให้เห็นว่าขนาดมีการเปลี่ยนแปลงสำหรับสามตัวพวกเขามีขนาดเล็กลง 2 MB:

[user@host ~]$ dmesg | egrep '^da.*?: .*?MB '
da0:   10240MB (20971520  512 byte sectors: 255H 63S/T 1305C)
da1:  476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da2:  476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da3:  476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da4:  476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da5:  476938MB (976771055 512 byte sectors: 255H 63S/T 60801C) <--
da6:  476938MB (976771055 512 byte sectors: 255H 63S/T 60801C) <--
da7:  476938MB (976771055 512 byte sectors: 255H 63S/T 60801C) <--
da8:  476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
da9:  152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
da10: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
da11: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)
da12: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)

ดังนั้นจากรูปลักษณ์ของมันมันไม่ใช่หนึ่งในการติดตั้งระบบปฏิบัติการที่ 'เขียน bootloader ไปยังไดรฟ์หนึ่ง' (ตามที่ฉันเคยคิดมาก่อน) มันเป็นเมนบอร์ดตัวใหม่ ( อัสซุส P8P67 LE ) สร้างโฮสต์ 2 MB พื้นที่คุ้มครองในตอนท้ายของไดรฟ์สามตัวซึ่งทำให้เมตาดาต้า ZFS ของฉันสับสน

ทำไมมันไม่สร้าง HPA ในทุกไดรฟ์ ผมเชื่อว่านี่เป็นเพราะการสร้าง HPA จะทำเฉพาะในไดรฟ์สูงอายุที่มีข้อผิดพลาดที่ได้รับการแก้ไขในภายหลังด้วยการปรับปรุงที่ซีเกทฮาร์ดไดรฟ์ BIOS: เมื่อเหตุการณ์ที่เกิดขึ้นทั้งหมดเริ่มสองสามสัปดาห์ที่ผ่านมาผมวิ่งของซีเกทSeaToolsเพื่อตรวจสอบว่ามี มีสิ่งผิดปกติทางร่างกายกับไดรฟ์ (ยังคงอยู่บนฮาร์ดแวร์เก่า) และฉันได้รับข้อความแจ้งให้ฉันทราบว่าไดรฟ์บางตัวของฉันต้องมีการอัพเดตไบออส ขณะที่ผมกำลังพยายามที่จะทำซ้ำรายละเอียดที่แน่นอนของข้อความที่และการเชื่อมโยงกับการดาวน์โหลดอัปเดตเฟิร์มมันก็ดูเหมือนว่าตั้งแต่เมนบอร์ดสร้าง HPA ทั้งรุ่น SeaTools DOS ที่จะล้มเหลวในการตรวจสอบ harddrives ในคำถาม - รวดเร็วinvalid partitionหรือสิ่งที่คล้ายกัน กะพริบเมื่อพวกเขาเริ่มต้นนั่นแหล่ะ น่าแปลกที่พวกเขาพบชุดไดรฟ์ของ Samsung

(ฉันข้ามรายละเอียดที่เจ็บปวดใช้เวลานานและไม่มีรายละเอียดในการไขสกรูในเชลล์ FreeDOS บนระบบที่ไม่ใช่เครือข่าย) ในท้ายที่สุดฉันติดตั้ง Windows 7 บนเครื่องแยกต่างหากเพื่อใช้งาน SeaTools Windows รุ่น 1.2.0.5 เป็นเพียงคำพูดสุดท้ายเกี่ยวกับ DOS SeaTools: อย่ากังวลกับการบูตพวกเขาแบบสแตนด์อโลน - แทนที่จะลงทุนสักสองสามนาทีแล้วทำ USB stick ที่สามารถบู๊ตได้พร้อมกับUltimate Boot CD ที่น่ากลัวซึ่งนอกเหนือจาก DOS SeaTools แล้ว เครื่องมือที่มีประโยชน์

เมื่อเริ่มต้น SeaTools สำหรับ Windows จะแสดงกล่องโต้ตอบนี้ขึ้น:

กล่องโต้ตอบอัพเดตเฟิร์มแวร์ SeaTools

ลิงก์ที่นำไปสู่ตัวตรวจสอบหมายเลขซีเรียล (ซึ่งด้วยเหตุผลบางอย่างได้รับการคุ้มครองโดย captcha - mine คือ 'ผู้ใช้ที่บุกรุกได้') และบทความฐานความรู้เกี่ยวกับการอัปเดตเฟิร์มแวร์ อาจมีการเชื่อมโยงเพิ่มเติมเฉพาะกับรุ่นฮาร์ดไดรฟ์และการดาวน์โหลดบางอย่างและสิ่งที่ไม่ แต่ฉันจะไม่ทำตามเส้นทางนั้นสักครู่:

ฉันจะไม่รีบไปอัปเดตเฟิร์มแวร์ของสามไดรฟ์ในเวลาที่มีการตัดพาร์ติชันและเป็นส่วนหนึ่งของพูลหน่วยเก็บข้อมูลที่เสียหาย นั่นคือการขอปัญหา สำหรับผู้เริ่มต้นการอัพเดตเฟิร์มแวร์ส่วนใหญ่ไม่สามารถยกเลิกได้ - และนั่นอาจทำลายโอกาสของฉันในการกู้คืนข้อมูลของฉันโดยไม่ได้

ดังนั้นสิ่งแรกที่ฉันจะทำต่อไปคืออิมเมจไดรฟ์และทำงานกับสำเนาดังนั้นจึงมีต้นฉบับที่จะกลับไปหากมีอะไรผิดพลาด สิ่งนี้อาจนำเสนอความซับซ้อนเพิ่มเติมเนื่องจาก ZFS อาจสังเกตเห็นว่าไดรฟ์ถูกเปลี่ยน (โดยใช้หมายเลขซีเรียลของไดรฟ์หรือ UUID อื่นหรืออะไรก็ตาม) แม้ว่ามันจะเป็นสำเนา dd บิตแน่นอนบนฮาร์ดไดรฟ์รุ่นเดียวกันก็ตาม ยิ่งไปกว่านั้นสวนสัตว์ไม่ได้มีชีวิต เจ้านี่อาจจะยุ่งยาก

ตัวเลือกอื่น ๆ จะทำงานกับต้นฉบับและเก็บไดรฟ์ที่ทำมิเรอร์ไว้เป็นข้อมูลสำรอง แต่จากนั้นฉันอาจพบความซับซ้อนสูงกว่าเมื่อบางสิ่งผิดปกติกับต้นฉบับ นาไม่ดี

เพื่อล้างฮาร์ดไดรฟ์สามตัวที่จะทำหน้าที่แทนการถ่ายภาพสำหรับไดรฟ์ทั้งสามที่มี BIOS buggy ในพูลที่เสียฉันต้องสร้างพื้นที่เก็บข้อมูลสำหรับสิ่งที่อยู่ในนั้นดังนั้นฉันจะขุดลึกลงไป กล่องฮาร์ดแวร์และประกอบ zpool ชั่วคราวจากไดรฟ์เก่าบางตัวซึ่งฉันสามารถใช้เพื่อทดสอบว่า ZFS จัดการกับไดรฟ์ dd'd ได้อย่างไร

อาจใช้เวลาสักครู่ ...


20111213-1930 + 1100

อัปเดต 02:

สิ่งนี้ใช้เวลาสักครู่แน่นอน ฉันใช้เวลาหลายเดือนกับเคสคอมพิวเตอร์ที่เปิดอยู่หลายตัวบนโต๊ะพร้อมแฮ็คฮาร์ดไดรฟ์จำนวนมากแขวนอยู่กับที่และนอนหลับสองสามคืนด้วยที่อุดหูเพราะฉันไม่สามารถปิดเครื่องก่อนนอนเพราะมันทำงานที่สำคัญมาก . อย่างไรก็ตามฉันชนะในที่สุด! :-) ฉันได้เรียนรู้มากมายในกระบวนการและฉันต้องการแบ่งปันความรู้นั้นกับทุกคนในสถานการณ์ที่คล้ายกันนี้

บทความนี้มีความยาวกว่าใครก็ตามที่มีไฟล์เซิร์ฟเวอร์ ZFS ไม่ทำงานมีเวลาให้อ่านดังนั้นฉันจะเข้าไปดูรายละเอียดที่นี่และสร้างคำตอบด้วยการค้นพบที่สำคัญเพิ่มเติมด้านล่าง

ฉันขุดลึกลงไปในกล่องฮาร์ดแวร์ที่ล้าสมัยเพื่อรวบรวมพื้นที่เก็บข้อมูลเพียงพอที่จะย้ายสิ่งต่าง ๆ ออกจากไดรฟ์ 500GB เดียวซึ่งมีการทำสำเนาไดรฟ์ที่มีข้อบกพร่อง ฉันต้องดึงฮาร์ดไดรฟ์สองสามตัวออกจากเคส USB ของพวกเขาด้วยดังนั้นฉันจึงสามารถเชื่อมต่อพวกเขาผ่าน SATA ได้โดยตรง มีบางประเด็นที่ไม่เกี่ยวข้องที่เกี่ยวข้องและไดรฟ์เก่าบางตัวเริ่มต้นล้มเหลวเมื่อฉันนำพวกเขากลับไปสู่การปฏิบัติที่ต้องมีการเปลี่ยน zpool แต่ฉันจะข้ามมันไป

คำแนะนำ:ในบางขั้นตอนมีฮาร์ดไดรฟ์ทั้งหมดประมาณ 30 รายการที่เกี่ยวข้อง ด้วยฮาร์ดแวร์จำนวนมากมันเป็นความช่วยเหลืออย่างมากในการจัดวางอย่างถูกต้อง สายเคเบิลที่หลวมหรือฮาร์ดไดรฟ์ตกลงมาจากโต๊ะของคุณจะไม่ช่วยในกระบวนการนี้และอาจทำให้เกิดความเสียหายต่อความสมบูรณ์ของข้อมูล

ฉันใช้เวลาสองสามนาทีในการสร้างอุปกรณ์ติดตั้งฮาร์ดไดรฟ์แบบปรับเปลี่ยนได้ซึ่งช่วยให้เรียงลำดับสิ่งต่าง ๆ ได้ดี:

พื้นที่เก็บข้อมูล make-shift บางส่วน เพียงแค่สกรูมัดรวมทั้งกระดาษแข็ง ไม่จำเป็นต้องใช้พัดลมอย่างแน่นอนสแต็กมาจากโครงการก่อนหน้านี้ ไม่จำเป็นต้องใช้ชิ้นส่วนของระยะทาง ...

กระแทกแดกดันเมื่อฉันเชื่อมต่อไดรฟ์เก่าเป็นครั้งแรกฉันรู้ว่ามี zpool เก่าอยู่ที่นั่นฉันต้องสร้างสำหรับการทดสอบกับรุ่นเก่ากว่าบางส่วน แต่ไม่ใช่ข้อมูลส่วนบุคคลทั้งหมดที่หายไปดังนั้นในขณะที่ข้อมูลสูญหาย ลดลงบ้างนั่นหมายถึงการขยับไปมาของไฟล์เพิ่มเติม

ในที่สุดฉันได้ทำมิรเรอร์ไดรฟ์ที่มีปัญหาไปยังไดรฟ์สำรองใช้ไดรฟ์เหล่านั้นสำหรับ zpool และปล่อยให้หลุดการเชื่อมต่อเดิม ไดรฟ์สำรองมีเฟิร์มแวร์ที่ใหม่กว่าอย่างน้อย SeaTools ไม่รายงานการอัพเดตเฟิร์มแวร์ที่จำเป็น ฉันทำมิรเรอร์ด้วย dd แบบง่ายจากอุปกรณ์หนึ่งไปยังอีกเครื่องหนึ่งเช่น

sudo dd if=/dev/sda of=/dev/sde

ฉันเชื่อว่า ZFS สังเกตเห็นการเปลี่ยนแปลงฮาร์ดแวร์ (โดย UUID ของฮาร์ดไดรฟ์หรืออะไรก็ตาม) แต่ดูเหมือนจะไม่สนใจ

อย่างไรก็ตาม zpool ยังคงอยู่ในสถานะเดียวกันข้อมูลเรพลิกา / เสียหายไม่เพียงพอ

เป็นที่กล่าวถึงในบทความวิกิพีเดีย HPAกล่าวก่อนหน้านี้การปรากฏตัวของโฮสต์พื้นที่คุ้มครองมีรายงานเมื่อบูทลินุกซ์และสามารถตรวจสอบการใช้hdparm เท่าที่ฉันรู้ไม่มีเครื่องมือ hdparm ใน FreeBSD แต่ตอนนี้ฉันยังติดตั้ง FreeBSD 8.2 และ Debian 6.0 เป็นระบบดูอัลบูตดังนั้นฉันบูตเข้า Linux:

user@host:~$ for i in {a..l}; do sudo hdparm -N /dev/sd$i; done

   ...
/dev/sdd:
 max sectors   = 976773168/976773168, HPA is disabled
/dev/sde:
 max sectors   = 976771055/976773168, HPA is enabled
/dev/sdf:
 max sectors   = 976771055/976773168, HPA is enabled
/dev/sdg:
 max sectors   = 976771055/976773168, HPA is enabled
/dev/sdh:
 max sectors   = 976773168/976773168, HPA is disabled
   ...

ดังนั้นปัญหาที่เห็นได้ชัดคือเมนบอร์ดใหม่สร้าง HPA สองสามเมกะไบต์ที่ส่วนท้ายของไดรฟ์ซึ่ง 'ซ่อน' ป้ายกำกับ ZFS สองรายการด้านบนไว้นั่นคือป้องกันไม่ให้ ZFS เห็นพวกเขา


การเล่นน้ำกับ HPA ดูเหมือนจะเป็นธุรกิจที่อันตราย จากหน้า hdparm man พารามิเตอร์ -N:

Get/set max visible number of sectors, also known as the Host Protected Area setting.
  ...
To change the current max (VERY DANGEROUS, DATA LOSS IS EXTREMELY LIKELY), a new value
should be provided (in base10) immediately following the -N option.
This value is specified as a count of sectors, rather than the "max sector address"
of the drive. Drives have the concept of a temporary (volatile) setting which is lost on
the next hardware reset, as well as a more permanent (non-volatile) value which survives
resets and power cycles.  By default, -N affects only the temporary (volatile) setting.
To change the permanent (non-volatile) value, prepend a leading p character immediately
before the first digit of the value. Drives are supposed to allow only a single permanent
change per session. A hardware reset (or power cycle) is required before another
permanent -N operation can succeed.
  ...

ในกรณีของฉัน HPA จะถูกลบออกเช่นนี้

user@host:~$ sudo hdparm -Np976773168 /dev/sde

/dev/sde:
 setting max visible sectors to 976773168 (permanent)
 max sectors   = 976773168/976773168, HPA is disabled

และในทำนองเดียวกันสำหรับไดรฟ์อื่นที่มี HPA หากคุณได้รับไดรฟ์ที่ไม่ถูกต้องหรือบางอย่างเกี่ยวกับพารามิเตอร์ขนาดที่คุณระบุไม่น่าเชื่อถือ hdparm จะฉลาดพอที่จะคิด:

user@host:~$ sudo hdparm -Np976773168 /dev/sdx

/dev/sdx:
 setting max visible sectors to 976773168 (permanent)
Use of -Nnnnnn is VERY DANGEROUS.
You have requested reducing the apparent size of the drive.
This is a BAD idea, and can easily destroy all of the drive's contents.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.

หลังจากนั้นฉันรีสตาร์ทเครื่องเสมือน FreeBSD 7.2 ที่ zpool สร้างขึ้นมา แต่เดิมและสถานะ zpool รายงานพูลการทำงานอีกครั้ง เย้! :-)

ฉันส่งออกพูลบนระบบเสมือนและนำเข้าอีกครั้งบนระบบ FreeBSD 8.2 โฮสต์

การอัพเกรดฮาร์ดแวร์ที่สำคัญบางอย่างการแลกเปลี่ยนเมนบอร์ดอื่นการอัปเดตพูล ZFS เป็น ZFS 4/15 การขัดถูอย่างละเอียดและตอนนี้สวนสัตว์ของฉันประกอบด้วย 8x1TB บวก 8x500GB ส่วน raidz2:

[user@host ~]$ sudo zpool status
  pool: zpool
 state: ONLINE
 scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
zpool       ONLINE       0     0     0
  raidz2    ONLINE       0     0     0
    ad0     ONLINE       0     0     0
    ad1     ONLINE       0     0     0
    ad2     ONLINE       0     0     0
    ad3     ONLINE       0     0     0
    ad8     ONLINE       0     0     0
    ad10    ONLINE       0     0     0
    ad14    ONLINE       0     0     0
    ad16    ONLINE       0     0     0
  raidz2    ONLINE       0     0     0
    da0     ONLINE       0     0     0
    da1     ONLINE       0     0     0
    da2     ONLINE       0     0     0
    da3     ONLINE       0     0     0
    da4     ONLINE       0     0     0
    da5     ONLINE       0     0     0
    da6     ONLINE       0     0     0
    da7     ONLINE       0     0     0

errors: No known data errors

[user@host ~]$ df -h
Filesystem         Size    Used   Avail Capacity  Mounted on
/dev/label/root     29G     13G     14G    49%    /
devfs              1.0K    1.0K      0B   100%    /dev
zpool              8.0T    3.6T    4.5T    44%    /mnt/zpool

ในฐานะที่เป็นคำพูดสุดท้ายสำหรับฉันดูเหมือนว่ากลุ่ม ZFS นั้นยากมากที่จะฆ่า ผู้ชายจาก Sun ที่สร้างระบบนั้นมีเหตุผลทั้งหมดที่เรียกมันว่าคำสุดท้ายในระบบไฟล์ เคารพ!


2
ก่อนที่คุณจะทำอะไรให้นึกภาพไดรฟ์เหล่านั้น สำรองข้อมูล 'เสียหาย' ของคุณในกรณีที่คุณทำให้แย่ลง
MikeyB

ใช่นั่นเป็นจุดที่ดีมาก! และมันก็เป็นเหตุผลว่าทำไมฉันถึงไม่ได้อัปเดตบทความนี้ด้วยความคืบหน้าของฉัน - ยังคงยุ่งอยู่กับการล้างฮาร์ดไดรฟ์สำรอง ...
ssc

คำตอบ:


24

ปัญหาคือ BIOS ของมาเธอร์บอร์ดตัวใหม่นั้นสร้างพื้นที่คุ้มครองโฮสต์ (HPA) บนไดรฟ์บางตัวซึ่งเป็นส่วนเล็ก ๆ ที่ OEM ใช้สำหรับการกู้คืนระบบซึ่งมักจะอยู่ที่ส่วนท้ายของฮาร์ดไดรฟ์

ZFS เก็บรักษาป้ายกำกับ 4 รายการพร้อมข้อมูลเมตาพาร์ติชันและ HPA ป้องกัน ZFS ไม่ให้เห็นสองรายการด้านบน

วิธีแก้ปัญหา: Boot Linux ใช้ hdparm เพื่อตรวจสอบและลบ HPA ระวังให้ดีนี่สามารถทำลายข้อมูลของคุณได้อย่างง่ายดาย ศึกษาบทความและหน้า hdparm man (พารามิเตอร์ -N) สำหรับรายละเอียด

ปัญหาไม่เพียงเกิดขึ้นกับมาเธอร์บอร์ดใหม่เท่านั้นฉันมีปัญหาคล้ายกันเมื่อเชื่อมต่อไดรฟ์กับการ์ดคอนโทรลเลอร์ SAS การแก้ปัญหาเหมือนกัน


5

สิ่งแรกที่ฉันขอแนะนำให้คุณทำคือการหาฮาร์ดไดรฟ์เพิ่มเติมและทำสำเนาของ 8 ไดรฟ์ที่คุณมีกับข้อมูลของคุณโดยใช้ddคำสั่ง ด้วยวิธีนี้หากคุณพยายามกู้คืนพวกเขาคุณจะทำให้สิ่งเลวร้ายลงไปอีกคุณยังสามารถกลับไปสู่พื้นฐานนี้ได้

ผมเคยทำแบบนี้มาก่อนและมีบางครั้งผมไม่ได้ต้องการมัน แต่ครั้งที่ฉันไม่จำเป็นต้องทำมันทั้งหมดมูลค่าความพยายาม

ไม่ทำงานหากไม่มีเน็ต


อันที่จริงผมอยากจะแนะนำมากกว่าddrescue ddมันไม่ได้ทำงานแตกต่างกันมากนักเมื่อไดรฟ์ทำงานได้อย่างสมบูรณ์แบบ (แต่มันให้การบ่งชี้ความก้าวหน้าที่ดีแก่คุณ) แต่ถ้ามีภาคที่มีปัญหาหรืออะไรทำนองนั้น ddrescue จะจัดการกับสถานการณ์นั้นได้ดีกว่า dd ได้รับการบอก)
CVn

2

ดูเหมือนว่าคุณจะสามารถแก้ไขปัญหานี้ได้ หากคุณต้องการมุมมองใหม่ที่เป็นไปได้คุณสามารถลองใช้แผ่นซีดี Solaris 11 Express live มีโอกาสที่รหัสใหม่จำนวนมากทำงานอยู่ที่นั่น (zpool ใน Solaris เป็นรุ่นที่ 31 ในขณะที่คุณอยู่ที่รุ่น 6) และอาจมีความเป็นไปได้ในการกู้คืนที่ดีขึ้น อย่าทำงานzpool upgradeภายใต้โซลาริสแม้ว่าคุณต้องการให้สระว่ายน้ำติดตั้งได้ภายใต้ FreeBSD


ขอบคุณสำหรับเคล็ดลับ! :-) ฉันกำลังมองหา OpenSolaris ย้อนกลับไปในปี 2009 หรือเมื่อฉันเริ่มต้นธุรกิจ ZFS ทั้งหมดนี้ แต่น่าเสียดายที่มันไม่สนับสนุนตัวควบคุมที่ฉันใช้อยู่ - นี่คือฮาร์ดแวร์ระดับผู้บริโภคหลังจากทั้งหมด เมื่อเร็ว ๆ นี้ฉันได้ดู OpenIndiana ด้วย แต่ฉันไม่แน่ใจว่าสถานการณ์เปลี่ยนไปหรือไม่ ฉันอาจอัพเกรดคอนโทรลเลอร์ไปเป็น SAS ในบางช่วงและพิจารณาย้ายข้อมูลในตอนนั้น
ssc

ฉันคิดว่า OpenIndiana อาจคุ้มค่ากับรูปลักษณ์ใหม่ หากไม่มีอะไรอื่นพวกเขาอาจเป็นมิตรกับฮาร์ดแวร์ "ราคาถูก" มากกว่า Oracle ... ฉันแนะนำซีดีสดเพราะง่ายต่อการทดลอง - คุณสามารถเรียกใช้ใน VM ได้เช่นกัน
Jakob Borg

1

รายชื่อผู้รับจดหมาย FreeBSD อาจเป็นจุดเริ่มต้นที่ดีสำหรับการค้นหาของคุณ ฉันจำได้ว่าเคยเห็นคำขอที่คล้ายกันดำเนินการโดย FreeBSD-Stable และ -Current ขึ้นอยู่กับความสำคัญของข้อมูลของคุณคุณอาจต้องการติดต่อ บริษัท กู้ข้อมูลมืออาชีพอย่างไรก็ตามเนื่องจากการแก้ไขปัญหากับพูลหน่วยเก็บข้อมูลที่ไม่สามารถเข้าถึงได้มีโอกาสที่จะทำให้สิ่งต่าง ๆ แย่ลง


1

ฉันประสบปัญหาคล้ายกันหลังจากอัปเกรดจาก FreeBSD 10.3 เป็น 11.1 หลังจากนั้น zpool นั้นเกิดความผิดพลาดและไม่มีวิธีการกู้คืนข้อมูลแม้ว่าจะzdb -lllส่งคืนป้ายกำกับทั้งสี่ที่ถูกต้องแล้ว

ปรากฎว่าการอัปเดตกระตุ้นให้ไดรเวอร์การจัดการหน่วยเก็บข้อมูลของ Intel สร้างมิเรอร์แบบ softraid ดิสก์ (อาจถูกเปิดใช้งาน แต่ไม่ได้รับการสนับสนุนจากgeomผู้ให้บริการของ Intel จนกระทั่งโพสต์อัปเดต) และบล็อก ZFS จากการติดตั้งดิสก์

การเชื่อมต่อไปยังพีซีเครื่องอื่นที่มีเฟิร์มแวร์บูตเวลา Intel RST เปิดใช้งานและปิดการใช้งาน softraid ( สำคัญมาก:มีสองวิธีในการแบ่ง softraid ซึ่งเป็นค่าเริ่มต้นที่เริ่มต้น (ฟอร์แมต aka!) ดิสก์คุณต้องเลือกตัวเลือก ปิดการใช้งานโดยไม่ต้องสัมผัสข้อมูลแทน) จากนั้นให้ ZFS รู้จักดิสก์แรกในมิเรอร์ แต่ไม่มีอะไรที่ฉันจะอนุญาตให้ระบุดิสก์ที่เหลือเหมือนกับที่อยู่ในเครื่องอัพเดตล่วงหน้า โชคดีที่มันเป็นสวนสัตว์ที่มีกระจกเงาและฉันก็สามารถถอดและใส่ดิสก์กลับเข้าไปที่สระว่ายน้ำดังกล่าวและทำการกู้คืนโดยไม่มีเหตุการณ์

หมายเหตุด้านข้าง: ในกรณีของฉันhdparm(เรียกใช้จากเซิร์ฟเวอร์ Ubuntu สด ISO) รายงานว่า HBA ถูกปิดใช้งานบนดิสก์ทั้งหมดและไม่สามารถช่วยได้


-2

ถ้ามันเป็นเพียงปัญหาพาร์ทิชันบางชนิดฉันจะ dd พาร์ทิชันไดรฟ์ + MBR และเพียงแค่ทำให้พาร์ทิชันขนาดที่เหมาะสม ...

หากคุณไม่ฟอร์แมตพาร์ติชันที่สร้างหรือเปลี่ยนตารางพาร์ติชันจะไม่มีผลกับสิ่งใด (ดังนั้นคุณสามารถย้อนกลับได้!) ตราบใดที่ไม่มีรูปแบบข้อมูลส่วนใหญ่จะยังคงอยู่ที่นั่น / สามารถเข้าถึงได้หากใส่พาร์ติชันใหม่ ในตอนท้ายของไดรฟ์คุณอาจมีไฟล์ที่เสียหายที่ซึ่งสิ่งใหม่ ๆ เขียนยากนั่นคือเหตุผลว่าทำไมคุณถึงดีสำหรับเล่ห์เหลี่ยมจนกระทั่งคุณฟอร์แมต (mbr ใหม่, ตารางไฟล์ ฯลฯ ... )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.