![이미 `/dev/sdq1`에서 데이터를 백업한 경우 ddrescue를 `/dev/sdq1`에서 `/dev/sdq`로 전환하는 방법은 무엇입니까?](https://rvso.com/image/1518674/%EC%9D%B4%EB%AF%B8%20%60%2Fdev%2Fsdq1%60%EC%97%90%EC%84%9C%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EB%B0%B1%EC%97%85%ED%95%9C%20%EA%B2%BD%EC%9A%B0%20ddrescue%EB%A5%BC%20%60%2Fdev%2Fsdq1%60%EC%97%90%EC%84%9C%20%60%2Fdev%2Fsdq%60%EB%A1%9C%20%EC%A0%84%ED%99%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
/dev/sdq1
HDD 복구에 익숙하지 않았을 때 복구를 시작했습니다 . 뭐, 충분히 조심해서 500번 정도 실행하면 85% 정도 회복됩니다.
나중에 Windows에서 첨부하고 읽을 수 있는 이후에 실제로 /dev/sdq
변환하려면 (1개 제외) 콘텐츠가 필요 하다는 것을 알게 되었습니다..vhd
VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD
.vhd
VBoxManage
분할변환 및 요구 사항가득 찬 하드 드라이브원시 데이터를 입력으로 사용합니다. 즉, ddrescue를 시작 /dev/sdq
하지 않고 ddrescue를 시작했어야 했습니다 /dev/sdq1
.
/dev/sdq1
fdisk를 사용 하여 32256바이트에서 시작하는 내용을 알아냈습니다 /dev/sdq
. 파일 을 분리하기 dd
위해 처음에 이 바이트를 편집 했고 begin.raw
이제는 .cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.raw
/dev/sdq1
이전 구조 로그를 사용하여 ddrescue
새 버전을 계속 실행하는 더 쉬운 방법이 있습니까 ? 그게 여기에 맞을지 ./sdq.raw
잘 모르겠습니다 . --output-position
(정확히 어떻게 작동하나요? - 이는 문서에서 output-position
구조 로그 해석에 어떤 영향을 미칠지 명확하지 않습니다.) ../sdq.raw
다음은 데이터를 복구하는 데 사용하는 스크립트입니다. 때로는 USB 허브가 포트의 완전한 전원 끄기를 지원하지 않기 때문에 HDD를 물리적으로 분리해야 했습니다.
#!/bin/bash
function run {
ddrescue -T 5s --max-error-rate=10MB --skip-size=512KiB,10MiB \
--direct -vv -P /dev/sdq1 ./fixed.vdi ./rescue.log
}
while true; do
run &
JOBPID=$!
while true; do
dmesg | tail -1 | grep 'reset high-speed USB device number' > /dev/null
CODE=$?
if [ $CODE -eq 0 ]; then
break
fi
kill -0 "$JOBPID" > /dev/null
CODE=$?
if [ $CODE -ne 0 ]; then
break
fi
sleep 3
done
./uhubctl -i -a 2 -p 1 -l 1
wait $JOBPID
echo "MSG: waiting for re-attach"
until dmesg | tail -1 | grep 'Attached SCSI disk'; do sleep 1; done
sleep 5
done
감사해요!
PS Logitech USB 2.0 허브가 있지만 uhubctl
. 어쩌면 그걸 사용할 수 있는 다른 도구가 있을까요?
답변1
--output-position
그것이 옳은 ddrescue
선택인지 아닌지 에 관계없이 ,결과를 디스크에 쓰지 않고 두 파일을 연결하는 일반적인 Linux 방법을 제시합니다.
도구는 입니다 dmsetup
. 내 쿠분투 패키지 에 있고 dmsetup
데비안에도 있습니다.
begin.raw
우리는 크기를 가지고 32256 B
있으며 fixed.vdi
크기의 파티션에 해당합니다 <X>
( 500 GB
정확한 값은 나에게 알려지지 않음). 크기를 512 B
단위 로 표현해야 합니다 . 결과는 각각 63
과 입니다 <Y>
. 아래 코드에서는 계산된 값으로 바꿔야 하므로 <Y>
무심코 복사하여 붙여넣지 마세요.
# Creating loop devices and storing their names.
BEGIN_LOOP=$(sudo losetup -f --show begin.raw)
FIXED_LOOP=$(sudo losetup -f --show fixed.vdi)
# Creating a map to feed to `dmsetup` later.
# !!! REPLACE <Y> WITH THE PROPER VALUE !!!
echo "0 63 linear $BEGIN_LOOP 0" > whole.map
echo "63 <Y> linear $FIXED_LOOP 0" >> whole.map
# Creating a concatenated "file".
sudo dmsetup create whole.raw < whole.map
ln -s /dev/mapper/whole.raw
이제 계속 작업하면서 whole.raw
전체 디스크의 이미지로 사용할 수 있습니다 . 의 모든 I/O 작업은 및 에 매핑됩니다 .ddrescue
fixed.vdi
whole.raw
begin.raw
fixed.vdi
이 매핑은 영구적이지 않습니다. 재부팅 후에는 을 제외한 전체 절차를 반복해야 합니다 ln -s
.
재부팅하지 않고 이 설정을 정리하려면 다음을 호출하십시오.
rm whole.raw # removes the symlink
sudo dmsetup remove whole.raw # removes /dev/mapper/whole.raw
sudo losetup -d $FIXED_LOOP # removes /dev/loop1 (or so)
sudo losetup -d $BEGIN_LOOP # removes /dev/loop0 (or so)
어떤 식으로든(예: 터미널 에뮬레이터를 닫아서) 변수가 손실된 경우 의 출력을 검사하고 그에 따라 losetup -a
수행하십시오 sudo losetup -d /dev/loopX
.