명령 하나로 하드 드라이브의 불량 블록을 수정할 수 있나요?

명령 하나로 하드 드라이브의 불량 블록을 수정할 수 있나요?

하드 드라이브의 오류를 수정하려고 합니다. 수동으로 수정할 수도 있지만 몇 시간 정도 걸릴 수 있습니다.

이 명령을 입력하면 sudo badblocks -b 512 /dev/sda수백 개의 결과가 나오므로 수동으로 수정하는 것을 피하고 싶습니다.

내 오류에 대한 자세한 내용을 확인할 수 있습니다.여기

그렇다면 오류를 수정하는 데 사용할 수 있는 도구가 있나요? 아니면 나를 위해 쉘 스크립트를 작성해 주실 수 있나요?

답변1

음, 몇 가지 상황이 있습니다:

  1. 디스크가 RAID 배열의 일부입니다. 좋아요 md가 다음과 같이 배열을 "수정"하도록 하십시오 echo 'repair' > /sys/block/md0/md/sync_action. 문제가 해결되었으며 데이터가 손실되지 않았습니다. (귀하의 경우에는 그렇지 않을 것 같지만 변경하는 것을 정말로 고려해야 합니다.)
  2. 디스크의 데이터(또는 데이터)에는 전혀 관심이 없습니다. dd를 사용하여 전체 디스크를 0으로 만드세요.
  3. 불량 블록은 디스크에서 사용 가능한 공간의 일부입니다. 예를 들어 cat /dev/zero > tempfile사용 가능한 공간을 0으로 채웁니다. 루트로 이 작업을 수행합니다(루트에 대해서만 공간 예약). 아마도 단일 사용자 모드일 것입니다(그러므로 공간 부족으로 인한 중단이 없음). 공간이 부족해지면 파일( rm tempfile)을 삭제하세요.
  4. 불량 블록은 디스크에 있는 데이터(파일) 또는 메타데이터(파일 시스템 구조)의 일부입니다. 데이터가 손실되었습니다. fsck -fc(최악의 경우 파일 시스템을 마운트하지 않고 실행하거나 루트 파일 시스템의 경우 초기 부팅 중에 읽기 전용 모드로 실행) 어떤 파일이 있는지 알려줍니다. 백업에서 교체하십시오.

또한 badblocks -n이것이 반드시 이루어져야 할 수도 있습니다.오직에 완료됨설치되지 않음파일 시스템이 강제로 다시 매핑됩니다. 데이터가 손실되어서는 안 됩니다(이미 손실된 불량 블록의 데이터 제외).

불량 블록을 기준으로 출력하려는 ​​경우(여기서안전하지 않음, 이로 인해 조용한 손상이 발생할 수 있음) 이는 상당히 쉽습니다. badblocks 출력의 각 줄은 블록 크기(예에서는 512)를 기반으로 블록 번호를 제공합니다. dd 에 동일한 블록 크기를 사용하십시오 bs. 블록 번호는 귀하의 seekdd입니다. 값 count은 1(또는 여러 개의 불량 블록이 연속적으로 있는 경우 더 높음)입니다. of불량 블록을 실행 중인 파티션(또는 디스크)입니다. 좋은 것은 if입니다 /dev/zero.

답변2

e2fsck -c -c블록 크기 보험을 사용하여 동일한 작업을 수행하는 것 같습니다.

답변3

단일 사용자 모드로 들어가서 다음을 수행하십시오.fsck -yvf /dev/sda

결국 fsck가 필요한 것 같습니다.

답변4

인터넷에서 일부 스크립트 솔루션을 본 적이 있으므로 단일 명령을 사용하여 이 작업을 수행할 수 있는지 잘 모르겠습니다.

아래 스크립트는 불량 섹터를 찾고 불량 블록 결과를 텍스트 파일에 넣은 다음 텍스트 파일 크기가 0이 아닌 경우e2fsck불량 섹터가 표시됩니다(따라서 운영 체제는 표시된 섹터를 사용하지 않습니다).

#!/bin/sh
target=/tmp/bad-blocks.txt
for disc in `fdisk -l | grep '^/' | awk '{ print $1 }'`; do
   badblocks -v $disc > $target
   if [ -s $target ]; then
       echo "badblock(s) found on $disc"
       e2fsck -l $target $disc
   else
       echo "no badblocks on $disc"
   fi
done

관련 정보