디스크를 읽을 수없는 섹터에 매핑 해제하는 방법


10

smartd에 따르면 읽을 수없는 섹터가있는 디스크가 있습니다. 디스크를 다시 매핑하고 불만을 제기하는 가장 쉬운 방법은 무엇입니까?

오늘 저는 매시간마다 두 가지를 얻습니다.

9 월 10 일 23:15:35 hylton smartd [3353] : 장치 : / dev / sdc, 1 현재 읽을 수없는 (보류중인) 섹터

시스템은 Ubuntu Linux 9.10 (jaunty)을 실행하는 x86 시스템입니다. 디스크는 LVM 그룹의 일부입니다. 이것이 smartctl이 디스크를 식별하는 방법입니다.

모델 군 : Western Digital Caviar 2 세대 직렬 ATA 제품군
장치 모델 : WDC WD5000AAKS-00TMA0
일련 번호 : WD-WCAPW4207483
펌웨어 버전 : 12.01C01
사용자 용량 : 500,107,862,016 바이트

2
이 문제는 스스로 해결되었습니다. 디스크가 더 크게 불평하기 시작하여 교체했습니다.
dkagedal

답변:


15

읽을 수없는 보류 섹터는 읽기 오류를 반환했으며 첫 번째 가능한 기회에서 드라이브가 다시 매핑하도록 표시 한 섹터입니다. 그러나 다음 두 가지 중 하나가 발생할 때까지 다시 매핑을 수행 할 수 없습니다.

  1. 섹터는 성공적으로 다시 읽습니다
  2. 섹터가 다시 작성되었습니다

그때까지 섹터는 계속 보류 중입니다. 따라서이를 처리하는 두 가지 방법이 있습니다.

  1. 성공할 때까지 섹터를 다시 읽으십시오
  2. 해당 섹터를 새로운 데이터로 덮어 쓰기

분명히, (1)은 비파괴 적이므로 드라이브를 심각하게 실패하기 시작하면 나쁜 영역에서 지속적으로 읽는 것이 훨씬 빨리 실패 할 수 있음을 명심하지만 먼저 시도해야합니다. . 보류중인 섹터 및 기타 오류가 많고 드라이브의 데이터에 관심이있는 경우 서비스를 중단하고 우수한 도구 ddrescue 를 사용하여 가능한 많은 데이터를 복구하는 것이 좋습니다. 그런 다음 드라이브를 폐기하십시오.

해당 섹터에 관심이 없거나 백업에서 복원 할 수있는 데이터가 포함되어 있으면 덮어 쓰기가 가장 빠르고 간단한 솔루션 일 것입니다. 그런 다음 드라이브의 재 할당되고 보류중인 카운트를보고 섹터를 처리했는지 확인할 수 있습니다.

파일 시스템에서 해당 섹터가 무엇인지 어떻게 알 수 있습니까? smartmontools 웹 사이트에서 훌륭한 기사를 찾았 지만 여기는 상당히 기술적이고 ext2 / 3 / 4 및 reiser 파일 시스템에만 해당됩니다.

내가 소유 한 (Mac) 드라이브 중 하나에서 사용한 더 간단한 방법 find / -xdev -type f -print0 | xargs -0 ...은 시스템의 모든 파일을 읽는 데 사용 하는 것입니다. 이를 실행하기 전에 보류중인 수를 기록해 두십시오. 섹터가 파일 안에 있으면 파일을 읽는 데 사용한 도구 (예 : md5sum)에서 오류 메시지가 표시됩니다. 그런 다음 성공적으로 읽을 때까지이 파일 만 다시 읽는 데주의를 집중할 수 있습니다. 자주 사용하지 않는 파일 인 경우 몇 번 다시 읽어야하는 경우 종종 문제가 해결됩니다. 오류가 사라지거나 모든 파일을 읽는 동안 오류가 발생하지 않으면 보류중인 수를 확인하여 감소했는지 확인하십시오. 그렇다면 문제를 읽고 해결했습니다.

여러 번의 시도 (예 : 20) 후에 파일을 읽을 수없는 경우 드라이브가 섹터를 재 할당 할 수 있도록 파일 또는 파일 내의 블록을 덮어 써야합니다. 파티션이 아닌 파일에서 ddrescue를 사용하여 임시 파일에 복사 한 다음 다시 복사하여 한 섹터 만 덮어 쓸 수 있습니다. 이 시점에서 파일을 제거하는 것은 나쁜 생각입니다. 불량 섹터는 찾기 어려운 목록으로 이동하기 때문입니다. 섹터를 다시 사용 가능 목록으로 이동하기 때문에 완전히 덮어 쓰기도 나쁩니다. 기존 블록을 다시 작성해야합니다. notrunc의 옵션은 dd이 작업을 수행 할 수있는 한 가지 방법입니다.

오류가 발생하지 않고 보류 카운트가 감소하지 않으면 섹터는 프리리스트 또는 파일 시스템 인프라의 일부 (예 : inode 테이블)에 있어야합니다. 모든 여유 공간을로 채우고 cat /dev/zero >tempfile보류 카운트를 확인할 수 있습니다. 다운되면 문제가 무료 목록에 있었고 이제 사라졌습니다.

섹터가 인프라에있는 경우 더 심각한 문제가 있으며 디렉토리 트리를 걷는 것만으로 오류가 발생할 수 있습니다. 이 상황에서는 드라이브를 다시 포맷하고 필요에 따라 ddrescue를 사용하여 데이터를 복구하는 것이 현명한 해결책이라고 생각합니다.

드라이브를 주시하십시오. 섹터 재 할당은 탄광에서 매우 좋은 카나리아로, 고장난 드라이브에 대해 조기에 경고 할 수 있습니다. 조기 조치를 취하면 나중에 치명적이고 매우 고통스러운 산사태를 예방할 수 있습니다. 몇 개의 섹터 재 할당이 드라이브를 폐기해야한다는 표시는 아닙니다. 모든 최신 드라이브는 재 ​​할당이 필요합니다. 그러나 드라이브가 오래되지 않았거나 (1 년 미만) 새로운 재 할당이 자주 발생하는 경우 (> 1 / 월) 최대한 빨리 교체하는 것이 좋습니다.

나는 그것을 증명할 경험적 증거는 없지만, 내 경험에 따르면 전체 디스크를 한 번에 한 번 dd, 원시 디스크로 읽거나를 사용하여 모든 파일을 읽음으로써 디스크 문제를 줄일 수 있다고 제안합니다 find. 지난 몇 년 동안 내가 경험했던 거의 모든 디스크 문제는 거의 사용하지 않는 파일이나 많이 사용하지 않는 시스템에서 처음 발생했습니다. 이것은 섹터를 자주 다시 읽는 경우 드라이브가 섹터를 완전히 읽을 수 없을 때까지 기다리지 않고 해당 섹터의 사소한 문제를 처음 감지 할 때 드라이브를 재 할당 할 기회가 있다는 점에서 발견 적으로도 의미가 있습니다. 호스트가 어떤 방식으로 읽거나 쓰거나 SMART 테스트 중 하나를 수행하여 액세스하지 않는 한 드라이브는 섹터에 대해 아무 것도 할 수 없습니다.

전체 디스크를 읽는 야간 또는 주간 크론 작업의 아이디어를 실험하고 싶습니다. 현재 저는 기계에 두 번째 하드 드라이브가있는 "가난한 사람의 RAID"를 사용하고 있으며 매일 밤 주 디스크를 백업합니다. 어떤면에서는 실수로 파일을 삭제하고 삭제하면 백업 디스크에서 어제 버전을 즉시 얻을 수 있기 때문에 실제로 RAID 미러링보다 낫습니다. 반면에, 하드웨어 RAID 컨트롤러는 디스크 문제가 발생할 때이를 모니터링,보고 및 수정하기 위해 백그라운드에서 많은 작업을 수행한다고 생각합니다. 현재 백업 스크립트는 rsync변경되지 않은 데이터 복사를 피하기 위해 사용 하지만 모든 섹터를 다시 읽을 필요성을 고려하여 모든 것을 복사하거나 매주 전체 원시 디스크를 읽는 별도의 스크립트를 갖는 것이 좋습니다.


2
백업을 수행하면 (내부 디스크와의 동기화는 계산되지 않습니다.) 전체 데이터 / 증가 백업 일정에 따라 특정 시간 간격으로 모든 데이터를 다시 읽습니다. RAID 또는 rsync는 대체 백업이 아닙니다. 그리고 btw, 나는 당신이 Hardware-RAID 벤더에 대해 너무 많은 믿음을 가지고 있다고 믿습니다. ;)
maxschlepzig

@ maxschlepzig : 맞습니다. 별도의 백업 기간도 있습니다. 그러나 필자의 경험으로는 드라이브 고장으로 인한 데이터 손실 가능성이 합쳐진 다른 모든 위험 (도난, 화재 등)을 능가한다는 것입니다. 현대의 하드 드라이브는 신뢰성이 떨어지기 때문에 요즘 완전히 편집증 적입니다. 그래서 두 번째 내부 드라이브는 내 전략의 주요 부분입니다.
Neil Mayhew

사용 dd if=/dev/sda ...중인 디스크의 내용을 읽고 다시 읽었 으며 섹터가 여전히 보류 중입니다. 이유가 무엇입니까?
dmansfield

@ dmansfield, 오류가 발생하지 않으면 이유가 확실하지 않습니다. 스마트 출력에서 ​​원시 값만 정확하다는 것을 알았습니다. 따라서 '요리 된'값만보고 있다면 보류중인 섹터가 없을 수 있습니다.
Neil Mayhew


1
  1. 데이터 백업
  2. LVM 그룹에서이 장치를 제거하십시오.
  3. dd if=/dev/zero of=/dev/sdc bs=4k- 모든 데이터지워 집니다/dev/sdc
  4. LVM 그룹에 다시 포함
  5. 백업 복원

3
0. 백업이 있습니다. :-)
Steven D

그러나 이것은 보류중인 읽기 오류이므로 모든 섹터를 읽는 것만으로는 충분하지 않습니까?
dkagedal

1
@dkagedal : 아니요, HD의 펌웨어는 이미이 한 섹터를 읽을 수 없음을 감지했습니다. 그것은 그것을 복구 할 수있는 방법이 없습니다 (아마도 재 시도하고 재 시도하고 운이 좋을 것입니다 ... 아마도 데이터가 손상되지 않았 으면 반환됩니다). 그러나 펌웨어가 해당 특정 섹터에 대한 쓰기를 감지하면이 섹터를 멀리 매핑 (더 이상 사용하지 않음)하고 대신 예비 (작동) 섹터를이 주소에 매핑합니다.
maxschlepzig

@dkagedal : 때로는 하나 또는 두 개의 추가 읽기만으로 섹터가 다시 나타납니다. 다른 경우에는 아무것도 다시 가져올 수 없습니다. 또한 드라이브는 원래 오류의 심각도 및 쓰기 후 성공적으로 다시 읽을 수 있는지 여부에 따라 섹터를 다시 매핑할지 또는 재사용 할지를 내부적으로 결정합니다. 말할 수있는 유일한 방법은 드라이브의 재 할당 된 수를 확인하는 것입니다. 드라이브는 데이터를 읽을 때 손상되지 않았는지 확인하기 위해 상당히 광범위한 체크섬을 사용하므로 재 할당되지 않은 섹터에 대해 합리적으로 확신 할 수 있습니다.
Neil Mayhew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.