일부 불량 섹터가 있는 디스크를 구입하여 이를 수리한 다음 RAID 6 클러스터의 일부로 사용할 계획이었습니다. Windows에서는 불량 섹터 복구를 수행할 수 있고 좋은 불량 블록 복구 도구가 있지만 Windows에서는 프로세스가 매우 느려서 한 섹터를 복구하는 데 15분이 걸립니다.
내 경험에 따르면 Linux는 응답하지 않는 장치를 더 잘 처리하므로 Linux에서 작업 속도가 더 빨라집니다. 그러나 fsck
매뉴얼을 확인했지만 표면 및 불량 블록 검색 또는 불량 블록 재할당에 대한 유용한 옵션을 찾지 못했습니다.
하드 디스크 표면을 스캔하고 명령줄에서 Linux의 불량 섹터를 복구/재할당하는 방법은 무엇입니까?
답변1
이 답변은 디스크에 관한 것입니다. SSD는 다릅니다. 또한 해당 디스크에 데이터가 없습니다(또는 보관하려는 데이터가 없습니다)."명령 하나로 하드 드라이브의 불량 블록을 복구할 수 있습니까?"에 대한 나의 답변디스크에 중요한 데이터가 있는 경우 수행할 작업을 알아보세요.
적어도 1990년대 후반 이후 생산된 디스크는 자체적으로 불량 블록을 관리할 수 있습니다. 즉, 디스크는 불량 블록을 예비 섹터로 투명하게 교체하여 불량 블록을 처리합니다. (a) 읽을 때 블록이 "약함"을 발견했지만 ECC는 데이터를 복구하기에 충분합니다. (b) 쓸 때 섹터 헤더가 불량한 것으로 나타났습니다. 읽을 때 이전에 감지되었습니다. 섹터가 손상되었지만 데이터를 복구할 수 없습니다.
디스크 펌웨어를 사용하면 일반적으로 SMART 속성을 통해 이 프로세스(적어도 개수)를 모니터링할 수 있습니다. 일반적으로 재할당된 섹터 수가 하나 이상 있고 보류 중인 섹터 수가 두 개 있습니다(읽기 시 오류 발견, ECC 실패, 아직 기록되지 않음).
디스크의 불량 섹터를 검색하는 방법에는 두 가지가 있습니다.
smartctl -t offline /dev/sdX
디스크 펌웨어에 오프라인 표면 검색을 수행하도록 지시하는 데 사용됩니다 . 그런 다음 완료될 때까지 디스크를 그대로 유지합니다(완전히 유휴 상태가 가장 빠릅니다)(에서 "오프라인 데이터 수집 상태" 확인smartctl -c /dev/sdX
). 이는 일반적으로 SMART의 "수정할 수 없는 오프라인" 개수를 업데이트합니다. (참고: 정기적으로 오프라인 검사를 자동으로 실행하도록 드라이브를 구성할 수 있습니다.)예를 들어 Linux가 전체 디스크를 읽도록 합니다
badblocks -b 4096 -c 1024 -s /dev/sdX
. 그러면 일반적으로 SMART에서 "현재 보류 중인 섹터" 수가 업데이트됩니다.
위 시나리오 중 하나라도 재할당된 섹터 수를 늘릴 수 있습니다. 이것이 ECC가 데이터를 복구하는 시나리오 (b)입니다.
이제 이러한 섹터를 복구하려면 해당 섹터에 쓰기만 하면 됩니다. 일반적으로 이는 단순 pv -pterba /dev/zero > /dev/sdX
(또는 일반 cat
, 또는 dd
) 입니다 .하지만RAID 어레이의 일부로 사용할 계획입니다.RAID init는 어쨌든 전체 디스크에 쓰기 때문에 의미가 없습니다. 유일한 예외는 디스크의 시작과 끝 부분으로, 수십 메가바이트가 손실될 수 있습니다(정렬, 헤더 등으로 인해). 그래서:
disk=/dev/sdX
end=$(echo "$(/sbin/blockdev --getsize64 "$disk")/4096-32768" | bc)
dd if=/dev/zero bs=4096 count=32768 of="$disk" # first 128 MiB
dd if=/dev/zero bs=4096 seek="$end" count=32768 of="$disk" # last 128 MiB
위의 가장 간단한 펜스 오류 1 을 피할 수 있었으므로 디스크의 첫 번째와 마지막 128MiB를 지워야 합니다. 그런 다음 mdadm raid init가 나머지를 작성하도록 합니다. 그래도 원하는 경우 전체 디스크를 0으로 설정해도 아무런 해가 없습니다(사소한 마모 및 몇 시간의 시간 낭비 제외).
디스크가 지원하는 경우 수행해야 할 또 다른 작업: ( smartctl -l scterc,40,100
또는 임의의 숫자) 디스크에생각하다읽기 오류 수정을 더 빨리 포기합니다. 40은 4초입니다. 이 두 숫자는 각각 읽기 오류와 쓰기 오류입니다. mdraid는 패리티를 통해 읽기 오류를 쉽게 수정합니다(그리고 실패한 섹터를 다시 디스크에 기록하여 재할당할 수 있습니다). 그러나 쓰기 오류로 인해 디스크가 어레이에서 배출될 수 있습니다.
PS: 재할당된 섹터 수에 주의하세요. 이 속성의 실패는 나쁜 소식입니다. 계속해서 증가한다면 그것도 나쁜 소식입니다.
PPS: RAID 어레이를 정기적으로 청소하십시오(모든 섹터를 읽고 모든 패리티를 확인하십시오). 많은 배포판에서는 이미 매월 이 작업을 수행하는 스크립트를 게시하고 있습니다. 이는 새로운 불량 블록을 감지하고 복구합니다. 그렇지 않으면 거의 읽지 않은 불량 블록이 남아 결국 재구축이 실패할 수 있습니다.
1- 펜스 오류 - 끝 중 하나를 계산하지 못해 발생한 오프원 오류입니다. 이름은 다음과 같습니다.3피트마다 울타리 기둥이 하나씩 있다면 9피트 독립형 울타리에는 울타리 기둥이 몇 개 있습니까?정답은 4입니다. 울타리 기둥 오류는 시작 기둥이나 끝 기둥이 계산되지 않기 때문에 3입니다.
답변2
눈에 보이는 불량 블록이 발견되면 디스크가 곧 손상될 수 있습니다. 매우 오래된 디스크가 아닌 이상 불량 블록 교체는 내부적으로 처리되므로 표시되지 않습니다. 이러한 내용이 표시되면 대체 블록 캐시가 확실히 소진된 것입니다.
이 상태에서는 디스크를 사용하지 않고 아마도 지우고 버릴 것입니다.