FreeBSD의 ZFS : 데이터 손상 복구


44

데이터 풀로 인해 액세스 할 수없는 zpool에 몇 TB의 매우 유용한 개인 데이터가 있습니다. 풀은 원래 2009 년에 우분투 8.04 시스템의 VMWare 가상 머신 내에서 실행되는 FreeBSD 7.2 시스템에 다시 설정되었습니다. FreeBSD VM은 여전히 ​​사용 가능하고 잘 작동하고 있으며 호스트 OS 만 이제 데비안 6으로 변경되었습니다. 하드 드라이브는 VMWare 일반 SCSI 장치 (총 12 개)를 통해 게스트 VM에 액세스 할 수 있습니다.

2 개의 수영장이 있습니다 :

  • zpool01 : 2x 4x 500GB
  • 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

몇 주 전에 수영장에 접근 할 수있었습니다. 그 이후로 호스트 시스템의 거의 모든 하드웨어를 교체하고 여러 호스트 운영 체제를 설치해야했습니다.

이 OS 설치 중 하나가 부트 로더 (또는 무엇이든)를 500GB 드라이브 중 하나 (첫 번째?)에 작성하고 일부 zpool 메타 데이터 (또는 무엇이든)를 파괴했다는 것입니다. 그 주제는 정확히 내 강점이 아닙니다 ...


ZFS에 관한 많은 웹 사이트, 블로그, 메일 링리스트 등이 있습니다. 나는이 질문이 제 데이터를 되 찾을 수 있도록 제정신, 구조적, 통제, 정보, 지식이 풍부한 접근 방법에 대한 충분한 정보를 수집하고 동일한 상황에서 다른 사람을 도울 수 있기를 희망하여 여기에 게시합니다.


'zfs recover'인터넷 검색시 첫 번째 검색 결과 는 Solaris ZFS 관리 설명서 의 ZFS 문제 해결 및 데이터 복구 장입니다. 첫 번째 ZFS 실패 모드 섹션에서는 '손상된 ZFS 데이터'단락에 다음과 같이 표시됩니다.

데이터 손상은 항상 영구적이며 복구 중에 특별히 고려해야합니다. 기본 장치를 수리하거나 교체하더라도 원본 데이터는 영구적으로 손실됩니다.

다소 실망.

그러나 두 번째 Google 검색 결과는 Max Bruning의 웹 블로그 이며 거기에서 읽었습니다.

최근 10TB ZFS 풀에 15 년 동안 비디오와 음악을 저장 한 사람으로부터 정전이 발생한 후 결함이 발생한 이메일을 보냈습니다. 불행히도 백업이 없었습니다. 그는 FreeBSD 7에서 ZFS 버전 6을 사용하고있었습니다. [...] 디스크에서 데이터를 검사하는 데 약 1 주일이 지난 후, 기본적으로 모든 것을 복원 할 수있었습니다.

ZFS가 데이터를 잃어 버린 것에 대해서는 의심합니다. 나는 당신의 데이터가 거기에 있다고 생각하지만, 그것을 얻는 올바른 방법을 찾아야합니다.

(내가 듣고 싶은 것보다 훨씬 더 들린다 ...)

첫 번째 단계 : 문제가 정확히 무엇입니까?

정확히 zpool이 손상된 것으로보고 된 이유를 어떻게 진단 할 수 있습니까? 웹의 어느 곳에서나 Sun 또는 Oracle이 공식적으로 문서화하지 않은 zdb가 있습니다. 매뉴얼 페이지에서 :

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는 자세한 기사 를 게시했으며 2008 년 6 월 28 일 프라하에서 열린 Solaris 개발자 컨퍼런스에서 Max Bruning에 대한 비디오 (및 mdb)에 대한 비디오 가 있습니다.

손상된 zpool에서 zdb를 루트로 실행하면 다음과 같은 출력이 나타납니다.

[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 :

나는 근본 원인을 발견했다고 생각합니다. Max Bruning은 내 이메일에 매우 빠르게 응답하여의 출력을 요구하는 친절했습니다 zdb -lll. 풀의 'good'raidz1 절반에있는 4 개의 하드 드라이브에서 출력은 위에서 게시 한 것과 비슷합니다. 그러나 '손상된'절반에있는 4 개의 드라이브 중 첫 번째 3 개에는 레이블 2 및 3에 대한 zdb보고서 failed to unpack label가 있습니다. 풀의 네 번째 드라이브 zdb는 모든 레이블을 표시합니다.

해당 오류 메시지를 검색하면 이 게시물이 나타납니다 . 첫 번째 응답에서 해당 게시물로 :

ZFS를 사용하면 각 물리적 vdev에 4 개의 동일한 레이블 (이 경우 단일 하드 드라이브)이 있습니다. vdev 시작시 L0 / L1, vdev 종료시 L2 / L3

풀의 8 개 드라이브는 모두 Seagate Barracuda 500GB 와 동일한 모델 입니다. 그러나 4 개의 드라이브로 풀을 시작한 후 그 중 하나가 사망하고 Seagate의 보증에 따라 교체 된 것을 기억합니다. 나중에 또 다른 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 

모든 드라이브의 크기가 같았다는 것을 기억합니다. 이제 드라이브를 살펴보면 3 개 크기가 2MB 씩 줄었다는 것을 보여줍니다.

[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)

따라서 외관상으로는 이전에 가정 한 것처럼 드라이브 하나에 부트 로더를 작성한 OS 설치 중 하나가 아니며 실제로 2MB 호스트를 만드는 새로운 마더 보드 ( ASUS P8P67 LE ) 였습니다 ZFS 메타 데이터를 엉망으로 만든 3 개의 드라이브 끝에 보호 영역이 있습니다 .

모든 드라이브에서 HPA를 작성하지 않은 이유는 무엇입니까? HPA 작성은 나중에 Seagate 하드 드라이브 BIOS 업데이트로 수정 된 버그가있는 구형 드라이브에서만 수행 되었기 때문입니다.이 전체 사건이 몇 주 전에 시작되면 Seagate의 SeaTools 를 실행 하여 드라이브에 물리적으로 문제가있는 것 (오래된 하드웨어에도 불구하고)에는 일부 드라이브에 BIOS 업데이트가 필요하다는 메시지가 표시됩니다. 지금은 그 메시지와 펌웨어 업데이트 다운로드 링크의 정확한 세부 사항을 재현하기 위해 노력하고, 메인 보드가 HPA를 생성하기 때문에, 모두 SeaTools는 DOS 버전이 문제의 하드 드라이브가 2 개이고을 감지하는 데 실패 할 것 같다 - 빠른 invalid partition또는 이와 유사한 그들이 시작할 때 깜박입니다. 아이러니하게도 그들은 삼성 드라이브 세트를 발견합니다.

(네트워크에 연결되지 않은 시스템의 FreeDOS 셸에서 나사로 조이는 고통스럽고 시간이 많이 걸리고 결과적으로 결실이없는 부분은 건너 뛰었습니다.) 결국 SeaTools Windows를 실행하기 위해 별도의 컴퓨터에 Windows 7을 설치했습니다. 버전 1.2.0.5. DOS SeaTools는 약 그냥 마지막 발언 : 마 그들을 부팅을 시도하고 귀찮게하지 독립형 - 대신, 몇 분을 투자하고 멋진로 부팅 가능한 USB 스틱을 만드는 궁극적 인 부팅 CD - 떨어져 DOS SeaTools는에서도 정말 많은 많은 다른 얻는다 유용한 도구.

Windows 용 SeaTools가 시작되면이 대화 상자가 나타납니다.

SeaTools 펌웨어 업데이트 대화 상자

이 링크는 일련 번호 검사기 (어떤 이유로 보안 문자에 의해 보호됩니다-광산은 '침습적 사용자'였습니다) 및 펌웨어 업데이트에 대한 기술 자료 문서로 연결 됩니다. 아마도 하드 드라이브 모델 및 일부 다운로드에 대한 추가 링크가있을 수 있습니다.

파티션이 잘리고 손상된 스토리지 풀의 일부인 한 번에 세 개의 드라이브의 펌웨어를 업데이트하지는 않겠습니다. 문제가 생겼습니다. 우선 펌웨어 업데이트를 취소 할 수 없으며 데이터를 다시 가져올 수있는 기회를 잃을 수도 있습니다.

따라서 다음으로 할 첫 번째 작업은 드라이브 이미지를 만들고 복사본으로 작업하는 것이므로 문제가 발생하면 다시 돌아 가야 할 원본이 있습니다. ZFS는 동일한 하드 드라이브 모델에 비트 dd 사본이 있더라도 드라이브 일련 번호 또는 다른 UUID 등을 통해 드라이브가 스왑되었음을 알 수 있으므로 추가 복잡성이 발생할 수 있습니다. 게다가 zpool은 살아 있지도 않습니다. 소년, 이것은 까다로울 수 있습니다.

그러나 다른 옵션은 원본을 사용하여 미러링 된 드라이브를 백업으로 유지하는 것이지만 원본에 문제가있을 경우 복잡성을 극복 할 수 있습니다. 아냐, 좋지 않아

깨진 풀에있는 버그가있는 BIOS로 3 개의 드라이브를 대체 할 이미지로 사용되는 3 개의 하드 드라이브를 지우려면 지금 존재하는 항목에 대한 저장 공간을 만들어야합니다. 하드웨어 상자와 일부 오래된 드라이브에서 임시 zpool을 조립합니다. ZFS가 dd'd 드라이브 교체를 처리하는 방법을 테스트하는 데 사용할 수도 있습니다.

시간이 좀 걸릴 수 있습니다 ...


20111213-1930 + 1100

업데이트 02 :

실제로 시간이 걸렸습니다. 나는 책상에 여러 개의 열린 컴퓨터 케이스를 가지고 여러 달 동안 하드 드라이브 스택이 매달려 있고 귀마개로 몇 밤을 잤다. . 그러나 나는 마침내 승리했다! :-) 나는 또한 그 과정에서 많은 것을 배웠으며 비슷한 상황에있는 누군가를 위해 그 지식을 공유하고 싶습니다.

이 기사는 ZFS 파일 서버를 사용하지 않는 사람이 읽을 시간이있는 것보다 이미 더 길기 때문에 여기에서 자세한 내용을 살펴보고 아래에서 더 중요한 결과를 얻을 수 있습니다.

구식 하드웨어 상자를 깊이 파고 들어가서 결함이있는 드라이브가 미러링 된 단일 500GB 드라이브에서 물건을 옮길 수있는 충분한 저장 공간을 조립했습니다. 또한 USB 케이스에서 몇 개의 하드 드라이브를 제거해야했기 때문에 SATA를 통해 직접 연결할 수있었습니다. 더 관련이없는 관련 문제가 있었으며 zpool 교체가 필요한 조치로 되돌릴 때 오래된 드라이브 중 일부가 실패하기 시작했지만 건너 뛸 것입니다.

팁 : 어떤 단계에서는 총 30 개의 하드 드라이브가 관여했습니다. 하드웨어가 많으면 제대로 쌓아 두는 것이 큰 도움이됩니다. 케이블이 느슨해 지거나 하드 드라이브가 책상에서 떨어지면 프로세스에 도움이되지 않으며 데이터 무결성이 더 손상 될 수 있습니다.

나는 물건을 분류하는 데 실제로 도움이되는 임시 변통 하드 드라이브 비품을 만드는 데 몇 분을 보냈습니다.

임시 저장 공간의 일부 많은 나사와 골판지 팬이 꼭 필요한 것은 아니며 스택은 이전 프로젝트의 것입니다. 거리 조각도 필요하지 않습니다 ...

아이러니하게도, 구식 드라이브를 처음 연결할 때 구식 zpool이 있다는 것을 깨달았습니다. 구식 zpool은 구 버전의 일부로 테스트하기 위해 만들어야했지만 누락 된 모든 개인 데이터가 아니기 때문에 데이터 손실이 발생했습니다. 다소 줄어든다는 것은 파일의 앞뒤로 추가 이동을 의미했습니다.

마지막으로 문제가있는 드라이브를 백업 드라이브에 미러링하고 zpool 용 드라이브를 사용하고 원래 드라이브를 연결 해제했습니다. 백업 드라이브에는 최신 펌웨어가 있으며, 최소한 SeaTools는 필요한 펌웨어 업데이트를보고하지 않습니다. 한 장치에서 다른 장치로 간단한 dd를 사용하여 미러링을 수행했습니다.

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

ZFS는 (하드 드라이브 UUID 등으로 인해) 하드웨어 변경을 인식하지만 신경 쓰지 않는 것 같습니다.

그러나 zpool은 여전히 ​​동일한 상태에 있었으며 복제본이 불충분하고 데이터가 손상되었습니다.

앞에서 언급 한 HPA Wikipedia 기사에서 언급했듯이 호스트 보호 영역의 존재는 Linux 부팅시보고되며 hdparm을 사용하여 조사 할 수 있습니다 . 내가 아는 한 FreeBSD에는 hdparm 툴이 없지만, 지금까지 FreeBSD 8.2와 Debian 6.0을 듀얼 부트 시스템으로 설치 했으므로 리눅스로 부팅했습니다 :

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 매뉴얼 페이지에서 매개 변수 -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.

그 후 zpool이 원래 생성 된 FreeBSD 7.2 가상 머신을 다시 시작하고 zpool 상태가 작업 풀을 다시보고했습니다. 예! :-)

가상 시스템에서 풀을 내보내고 호스트 FreeBSD 8.2 시스템에서 다시 가져 왔습니다.

일부 주요 하드웨어 업그레이드, 다른 마더 보드 스왑, ZFS 4/15 로의 ZFS 풀 업데이트, 철저한 스크러빙 및 이제 zpool은 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

그렇습니다, 그것은 아주 좋은 지적입니다! 그리고 그것은 또한
제가이

답변:


24

문제는 새로운 마더 보드의 BIOS가 일부 드라이브에 호스트 보호 영역 (HPA)을 생성했으며, 이는 OEM이 시스템 복구를 위해 사용하는 작은 섹션으로, 일반적으로 하드 드라이브의 끝에 있습니다.

ZFS는 파티션 메타 정보가있는 4 개의 레이블을 유지하고 HPA는 ZFS가 상위 2 개를 보지 못하게합니다.

해결 방법 : Linux를 부팅하고 hdparm을 사용하여 HPA를 검사하고 제거하십시오. 데이터를 쉽게 파괴 할 수 있으므로주의하십시오. 자세한 내용은 기사 및 hdparm 매뉴얼 페이지 (매개 변수 -N)를 참조하십시오.

문제는 새 마더 보드에서만 발생했을뿐 아니라 드라이브를 SAS 컨트롤러 카드에 연결할 때 비슷한 문제가있었습니다. 해결책은 동일합니다.


5

가장 먼저해야 할 일은 dd명령을 사용하여 하드 드라이브를 더 확보하고 데이터가있는 8 개의 드라이브를 복제하여 사본을 만드는 것 입니다. 이렇게하면 복구하려는 시도로 인해 상황이 악화되는 경우에도이 기준으로 돌아갈 수 있습니다.

내가 전에 이런 짓을 한 내가 필요하지 않은 시간이 있었다, 그러나 나는 시간 필요는 노력은 완전히 가치가했다.

그물 없이는 일하지 마십시오.


사실, 나는 ddrescue이상 을 추천 합니다 dd. 드라이브가 완벽하게 작동 할 때 실제로 크게 다르게 작동하지는 않지만 멋진 진행 상황을 표시하지만 문제가있는 섹터 또는 이와 유사한 것이 있으면 ddrescue는 dd보다 훨씬 나은 상황을 처리합니다 (또는 나 들었습니다).
CVn

2

당신은 이것을 해결하기 위해 궤도에있는 것 같습니다. 다른 새로운 관점을 원한다면 Solaris 11 Express 라이브 CD를 사용해보십시오. 더 새로운 코드가 실행 중일 가능성이 높으며 (Solaris의 zpool은 현재 버전 31이지만 버전 6 임) 더 나은 복구 가능성을 제공 할 수 있습니다. zpool upgrade풀을 FreeBSD에서 마운트 가능하게 유지하려면 Solaris에서 실행하지 마십시오 .


그 팁 감사합니다! :-) 2009 년에 OpenSolaris를 살펴보면서 ZFS 비즈니스 전체를 시작했지만 불행히도 사용중인 컨트롤러를 지원하지 않았습니다. 결국 소비자 용 하드웨어입니다. 최근에 OpenIndiana도 살펴 보았지만 상황이 바뀌 었는지 확실하지 않습니다. 어떤 단계에서 컨트롤러를 SAS로 업그레이드 한 다음 마이그레이션을 고려할 수 있습니다.
ssc

OpenIndiana는 새로운 모습의 가치가 있다고 생각합니다. 다른 것들은 Oracle보다 "저렴한"하드웨어에 더 친숙 할 것입니다 ... 라이브 CD는 시험해보기 쉽기 때문에 추천했습니다. VM에서도 실행할 수 있습니다.
Jakob Borg

1

FreeBSD 메일 링리스트는 검색을위한 좋은 출발점이 될 수 있습니다. FreeBSD-Stable과 -Current에서 비슷한 요청을 보았던 것을 기억합니다. 데이터의 중요성에 따라 액세스 할 수없는 데이터 스토리지 풀을 변경하면 상황이 악화 될 수 있으므로 전문 복구 회사에 문의하십시오.


1

FreeBSD 10.3에서 11.1로 업그레이드 한 후에도 비슷한 문제가 발생했습니다. 그 후 zpool에 오류가 발생하여 zdb -lll4 개의 레이블을 모두 반환 했지만 데이터를 복구 할 방법이 없었습니다 .

이 업데이트로 인해 인텔 스토리지 관리 드라이버가 디스크에서 소프트 레이드 미러를 생성하도록 트리거했으며 (아마도 geom업데이트 이후까지 인텔 공급 업체 가 지원하지만 지원되지 않았 습니까?) ZFS가 디스크를 마운트하지 못하도록 차단했습니다.

Intel RST 부팅시 펌웨어가 활성화 된 상태에서 다른 PC에 연결하고 softraid 비활성화 ( 매우 중요 : softraid를 해제하는 가지 방법 이 있습니다 . 기본값은 디스크를 초기화합니다 (일명 포맷!). 옵션을 선택해야합니다. 대신 데이터를 건드리지 않고 비활성화 한 다음 ZFS가 미러의 첫 번째 디스크를 인식하도록 허용하지만 나머지 디스크를 머신 사전 업데이트와 동일한 것으로 식별하는 것은 허용되지 않습니다. 다행히도 미러링 된 zpool이었고 문제의 풀에 디스크를 분리했다가 다시 연결할 수 있었으며 이벤트없이 리 실버가 완료되었습니다.

참고 사항 : 필자의 경우 hdparm(라이브 Ubuntu Server ISO에서 실행) HBA가 모든 디스크에서 비활성화되어 도움을 줄 수 없다고보고했습니다.


-2

그것이 어떤 종류의 파티션 문제 일 경우 드라이브 파티션 + MBR을 복사하고 파티션을 올바른 크기로 만들 것입니다 ...

파티션을 만들거나 파티션 테이블을 변경하지 않아도 파티션 테이블을 만들거나 변경해도 아무런 영향을 미치지 않습니다 (따라서 롤백 할 수 있습니다!) 드라이브의 끝에 당신은 새로운 물건이 쓰여진 곳에서 손상된 파일을 가지고있을 수 있습니다. 그래서 포맷 할 때까지 그 트릭에 유일한 이유는 무엇입니까 (새로운 mbr, 파일 테이블 등 ...)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.