이미 `/dev/sdq1`에서 데이터를 백업한 경우 ddrescue를 `/dev/sdq1`에서 `/dev/sdq`로 전환하는 방법은 무엇입니까?

이미 `/dev/sdq1`에서 데이터를 백업한 경우 ddrescue를 `/dev/sdq1`에서 `/dev/sdq`로 전환하는 방법은 무엇입니까?

/dev/sdq1HDD 복구에 익숙하지 않았을 때 복구를 시작했습니다 . 뭐, 충분히 조심해서 500번 정도 실행하면 85% 정도 회복됩니다.

나중에 Windows에서 첨부하고 읽을 수 있는 이후에 실제로 /dev/sdq변환하려면 (1개 제외) 콘텐츠가 필요 하다는 것을 알게 되었습니다..vhdVBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD.vhdVBoxManage분할변환 및 요구 사항가득 찬 하드 드라이브원시 데이터를 입력으로 사용합니다. 즉, ddrescue를 시작 /dev/sdq하지 않고 ddrescue를 시작했어야 했습니다 /dev/sdq1.

/dev/sdq1fdisk를 사용 하여 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 작업은 및 에 매핑됩니다 .ddrescuefixed.vdiwhole.rawbegin.rawfixed.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.

관련 정보