하드 드라이브의 오류를 수정하려고 합니다. 수동으로 수정할 수도 있지만 몇 시간 정도 걸릴 수 있습니다.
이 명령을 입력하면 sudo badblocks -b 512 /dev/sda
수백 개의 결과가 나오므로 수동으로 수정하는 것을 피하고 싶습니다.
내 오류에 대한 자세한 내용을 확인할 수 있습니다.여기
그렇다면 오류를 수정하는 데 사용할 수 있는 도구가 있나요? 아니면 나를 위해 쉘 스크립트를 작성해 주실 수 있나요?
답변1
음, 몇 가지 상황이 있습니다:
- 디스크가 RAID 배열의 일부입니다. 좋아요 md가 다음과 같이 배열을 "수정"하도록 하십시오
echo 'repair' > /sys/block/md0/md/sync_action
. 문제가 해결되었으며 데이터가 손실되지 않았습니다. (귀하의 경우에는 그렇지 않을 것 같지만 변경하는 것을 정말로 고려해야 합니다.) - 디스크의 데이터(또는 데이터)에는 전혀 관심이 없습니다. dd를 사용하여 전체 디스크를 0으로 만드세요.
- 불량 블록은 디스크에서 사용 가능한 공간의 일부입니다. 예를 들어
cat /dev/zero > tempfile
사용 가능한 공간을 0으로 채웁니다. 루트로 이 작업을 수행합니다(루트에 대해서만 공간 예약). 아마도 단일 사용자 모드일 것입니다(그러므로 공간 부족으로 인한 중단이 없음). 공간이 부족해지면 파일(rm tempfile
)을 삭제하세요. - 불량 블록은 디스크에 있는 데이터(파일) 또는 메타데이터(파일 시스템 구조)의 일부입니다. 데이터가 손실되었습니다.
fsck -fc
(최악의 경우 파일 시스템을 마운트하지 않고 실행하거나 루트 파일 시스템의 경우 초기 부팅 중에 읽기 전용 모드로 실행) 어떤 파일이 있는지 알려줍니다. 백업에서 교체하십시오.
또한 badblocks -n
이것이 반드시 이루어져야 할 수도 있습니다.오직에 완료됨설치되지 않음파일 시스템이 강제로 다시 매핑됩니다. 데이터가 손실되어서는 안 됩니다(이미 손실된 불량 블록의 데이터 제외).
불량 블록을 기준으로 출력하려는 경우(여기서안전하지 않음, 이로 인해 조용한 손상이 발생할 수 있음) 이는 상당히 쉽습니다. badblocks 출력의 각 줄은 블록 크기(예에서는 512)를 기반으로 블록 번호를 제공합니다. dd 에 동일한 블록 크기를 사용하십시오 bs
. 블록 번호는 귀하의 seek
dd입니다. 값 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