나는 SATA 드라이브를 가지고 있고 프로그램은 총 8개의 불량 블록을 식별했습니다 badblocks
. 아마도 드라이브 펌웨어는 이를 다시 매핑하고 예비 부품을 교체할 수 있어야 합니다. 문제의 파티션을 다시 작성하고 e2fsck를 여러 번 실행하기 위해 모드 badblocks
에서 실행 했습니다 . -n
아무것도 변하지 않고 항상 동일한 8개의 불량 블록입니다.
실행하면 에 smartctl
표시됩니다 .Reallocated_Sector_Ct
0
8개의 불량 블록을 실제로 다시 매핑하도록 펌웨어를 얻으려면 어떻게 해야 합니까?
답변1
드라이브는 전체 섹터 쓰기 요청에 새 데이터가 제공되는 경우에만 읽을 수 없는 섹터를 다시 쓰거나 재할당하려고 시도할 수 있습니다. badblocks
이렇게 하지 마세요. 아무것도 바뀌지 않습니다.
"비파괴" 읽기 및 쓰기 모드는 다음과 같이 작동합니다.
- 원시 데이터 읽기
- 테스트 패턴 작성
- 테스트 패턴 읽기
- 원시 데이터 쓰기
첫 번째 단계가 실패하면, 즉 데이터를 읽을 수 없으면 이후에 원본 데이터를 복구할 수 없으므로 해당 섹터에서 쓰기 작업을 수행할 수 없습니다. 이것은 파괴적인 쓰기가 될 것이지만 특별히 비파괴적인 변형을 요청했기 때문에 아직 완료되지 않았습니다.
"비파괴적" 방법은 다른 이유로 인해 원본 데이터를 복구하지 못할 수 있으므로 어떠한 경우에도 데이터를 보존하려는 드라이브에서 불량 블록을 실행해서는 안 됩니다.
어쨌든 이 작업을 수행하려면 쓰기 모드를 badblocks
사용해야 합니다. 기본적으로 모든 데이터를 덮어쓰므로 선택적 인수를 사용하여 덮어써야 하는 특정 섹터 범위 형식 -w
으로 범위를 좁히고 싶습니다 . badblocks -w device [last_block [first_block]]
먼저 읽기 전용 불량 블록 테스트를 실행하여 이러한 섹터를 식별할 수 있습니다.
읽기 전용 테스트:
# badblocks /dev/foobar
1000
블록 1000에 결함이 있으므로 해당 블록은 구체적으로 다룹니다.
# badblocks -w /dev/foobar 1000 1000
하지만,이것은 여전히 실패할 것이다. 왜? badblocks
기본 블록 크기인 1024바이트가 사용되기 때문입니다 .
이는 섹터 크기가 512바이트인 장치의 경우 올바르지 않습니다. 불량 블록은 하나가 아닌 두 개의 섹터를 덮어 추가 손상을 초래합니다. 또한 섹터 크기가 4096바이트인 장치에도 해당됩니다. 잘못됨 - 불량 블록은 쓰기만 합니다. 부분 섹터에 대해서는 전체 데이터 블록을 작성해야 하므로 재할당에는 작동하지 않습니다.
따라서 위의 두 명령 모두 드라이브의 올바른 블록 크기(물리적 섹터 크기)(512 또는 4096 등)를 지정해야 합니다.
블록 크기가 변경되면 보고된 블록 번호도 그에 따라 변경됩니다.
# badblocks -b 512 /dev/foobar
2000
# badblocks -b 4096 /dev/foobar
250
그에 따라 쓰기 명령을 조정할 수 있습니다.
# badblocks -b 512 -w /dev/foobar 2000 2000
# badblocks -b 4096 -w /dev/foobar 250 250
이렇게 하면 드라이브에 문제가 있는 섹터를 재할당할 수 있는 기회가 제공됩니다.
여전히 실패하면 또 다른 가능성이 있습니다. 지정된 장치가 파티션이거나 다른 논리 드라이브이고 물리적 드라이브와 정렬되지 않은 경우 모든 쓰기가 정렬되지 않으므로 결국 4096 단어 섹션이 두 개에 기록됩니다. 부분 4096바이트 섹터.
대상 섹터를 재배치하지는 않지만 인접 섹터의 데이터를 부분적으로 손상시킵니다.
따라서 이 방법에는 추가 데이터 손실 위험이 있습니다.
답변2
가장 쉬운 방법은 문제를 완전히 의도적으로 무시하는 것입니다.
펌웨어는 다음 쓰기 시 각 섹터를 다시 매핑하므로 그때까지는 걱정할 필요가 없습니다.
다른 SMART 속성에 주의하세요. 백업이 잘 되어 있는지 확인하세요. 교체 디스크에 투자하는 것을 고려해보세요.
답변3
8개의 불량 블록을 실제로 다시 매핑하도록 펌웨어를 얻으려면 어떻게 해야 합니까?
손상된 섹터에 씁니다.
sudo hdparm --yes-i-know-what-i-am-doing --repair-sector SECTOR_NUMBER /dev/device
이는 손상된 섹터를 0( )으로 바꾸는 파괴적인 작업입니다 0x00
.
SMART는 결국 그렇게 "스마트"하지 않으며 항상 실패하는 것을 봅니다. 즉, 대부분의 경우 손상된 섹터를 재할당할 수 없으며 수행할 작업을 지시해야 합니다.