내 SSD에 일종의 하드웨어 오류가 있어서 아직 보증 기간 중이므로 수리할 수 있지만 해당 서비스에는 데이터 복구가 포함되지 않습니다. 여기에서 작업 파일을 수집했지만 개인 파일과 플러그인이 여전히 남아 있어 복원하고 싶습니다.
문제는...대역폭과 총 복사 크기가 문제인 것 같습니다. 너무 많이 읽으면 드라이브가 충돌할 수 있습니다. 모든 곳에서 불량 섹터(오류)를 보고하거나 전체 운영 체제를 종료하세요. 그래서 메모리 버퍼에 문제가 있는 것으로 의심되어 드라이브를 핫스왑할 수 있도록 인클로저에 넣었습니다. 여기의 또 다른 질문에 따라 대역폭 제한이 있는 rsync를 사용하는 것을 고려했지만 버퍼가 스스로 지워지거나 냉각될 수 있도록 복사 프로세스에 시차를 두어야 한다고 생각합니다.
손실된 데이터를 복구하려면 스크립트나 도구가 필요합니다.
답변1
불량 섹터(오류)가 모든 곳에서 보고됨
SSD에는 "섹터"가 없습니다. "블록"은 그렇습니다. 드라이브가 이를 불량으로 보고하는 경우 이는 기계적으로 어떤 것도 실패할 수 없기 때문에 의미합니다.
- 블록의 이러한 비트를 얻으려면 주소 라인을 확인하십시오.
- "전압 판독 벡터를 얻었습니다"를 의미하는 메모리 셀을 읽습니다.
- 다소 복잡한 소프트 입력 오류 수정 코드를 적용하여 비트로 변환해 보세요.
- (성공 및 데이터) 또는 (오류)를 반환합니다.
- 이를 디코딩하려는 시도(반복)가 성공하면 어떤 지점에서 0이 되는 오류 용어(디코더의 "증후군")가 생성됩니다.
- 소프트 값이 실제로 수정되지 않고 오류가 없는 단어를 생성하기 위해 오류가 수정될 때 오류가 발생합니다.
따라서 오류가 발생합니다. 이는 내용을 읽을 수 없음을 의미합니다. "SSD는 없습니다.잘못된복구할 수 없는 데이터 정보": 항상 읽습니다.일부모든 것이 아무리 손상되었더라도 전압이 검사를 통과했는지 확인하고 필요한 경우 수정하십시오.그리고가능한.
그래서:
모든 곳에서 불량 섹터가 보고됨
SSD를 신뢰해야 합니다. SSD는 실제로 데이터를 읽을 수 없습니다. 메모리 셀(특정 전압으로 충전된 작은 커패시터)은 손상되지 않았지만 "전역적으로" 변경할 수 있는 유일한 것은 아날로그를 변환하는 ADC의 기준 전압을 "이동"하는 경우입니다. 읽기 전압을 디지털 값으로 변환하는 것이 어려워집니다. 그러면 실제 메모리가 양호하더라도 디코더가 잘못된 소프트 입력을 받게 됩니다.
하지만 이 전압이 발생합니다.같은 틀 안에서플래시 칩 내의 ADC는 공급 전압 등의 변화에 매우 탄력적이어야 하기 때문입니다.
따라서 이것은 실제로 열 문제이거나 일종의 실리콘 모드 오류일 수 있습니다.
어느 쪽이든 드라이브에서 데이터를 가져오기 위해 rsync나 파일 시스템 수준 도구를 사용하고 싶지 않은 것 같습니다. 이를 위해서는 어떤 데이터가 어떤 파일에 있는지 이해하기 위해 운영 체제가 동일한 데이터 포인트에 매우 자주 액세스할 수 있어야 합니다.
당신이 해야 할 일은 블록 장치 수준의 복사본을 만들고 작은 단계로 수행하는 것입니다. 예를 들어 16MB를 이미지 파일로 읽습니다. 잠시만 기다려주세요. 16MB 읽기 등.
dd
이는 청크를 순서대로 읽은 후 wait를 호출 하고 다음 청크를 읽는 등 의 루프를 사용하는 ZSH/bash 쉘 스크립트에서 sleep
또는 Python의 몇 줄로 수행할 수 있습니다. 나중에 같은 지점에서 다시 시작할 수 있도록 읽기 프로세스에 오류가 있는지 확인하고 오류가 발생하면 프로세스를 중단하는 것을 잊지 마십시오.
실제로 솔루션을 준비해야 하기 때문에:
#!/usr/bin/zsh
# Copyright 2022 Marcus Müller
# SPDX-License-Identifier: BSD-3-Clause
# Find the license text under https://spdx.org/licenses/BSD-3-Clause.html
# THIS SCRIPT IS UNTESTED AND COMES WITH NO WARRANTIES, FOLKS.
IN_DEVICE=/dev/yoursource_ssd
BACKUP_IMG=myimage
LOGFILE=broken_mbs.txt
# get size, round up to full MB
size_in_bytes=$(blockdev "${IN_DEVICE}")
size_in_MB=$(( ( ${size_in_bytes} + 2**20 - 1) / 2**20 ))
#check whether size > 0
if [[ ! ${size_in_MB} -gt 0 ]]; then
logger -p user.crit "Nope, can't determine size of ${IN_DEVICE}. I'm outta here."
echo "Failure on input" >&2
exit -1
else
logger -p user.info "Trying to back up ${IN_DEVICE}, size ${size_in_MB} MB"
fi
if fallocate -l "${size_in_MB}MiB" "${BACKUP_IMG}" ; then
logger -p user.info "preallocated ${BACKUP_IMG}"
else
logger -p user.crit "failed to preallocate ${BACKUP_IMG}"
echo "failure on output" >&2
exit -2
fi
failcounter=0
MB=$((2**20))
for i in {0..$((${size_in_MB}-1))}; do
if \
dd \
"if=${IN_DEVICE}" \
"of=${BACKUP_IMG}" \
"ibs=${MB}" "obs=${MB}" \
"skip=${i}" "seek=${i}" ; \
then
echo "backed up MB nr. ${i}"
else
failcounter=$(( ${failcounter} + 1 ))
echo "${failcounter}. error: couldn't backup MB nr. $i" > &2
echo "${i}" >> ${LOGFILE}
logger -p user.err "couldn't backup MB nr. $i"
fi
sleep 0.5
done
echo "Got ${failcounter} failures"
exit ${failcounter}