Làm thế nào tôi có thể hợp nhất hai hình ảnh ddresTHER?


7

Tôi có hai hình ảnh ddresTHER được tạo từ các nỗ lực khôi phục liên tục của cùng một phương tiện. Hai hình ảnh có cùng kích thước nhưng có dữ liệu bổ sung:

$ od part-one/ddrescue_image --skip-bytes 227966006774 --read-bytes 32
3242365232766 113056 016517 102014 074371 144073 000000 000000 000000
3242365233006 000000 000000 000000 000000 000000 000000 000000 000000
3242365233026
$ od part-two/ddrescue_image --skip-bytes 227966006774 --read-bytes 32
3242365232766 000000 000000 000000 000000 000000 124616 163450 064251
3242365233006 074567 134433 012742 022160 044301 054235 140604 020633
3242365233026

Làm thế nào tôi có thể hợp nhất chúng thành một hình ảnh duy nhất, hoàn chỉnh?

Chi tiết

  • Hình ảnh thứ hai chỉ đơn giản là sự tiếp nối của nỗ lực phục hồi đầu tiên, à la:

    $ ddrescue corrupt-partition part-one/ddrescue_image part-one/ddrescue_log
    $ mkdir part-two; cp part-one/ddrescue_log part-two/ddrescue_log
    $ ddrescue corrupt-partition part-two/ddrescue_image part-two/ddrescue_log
    
  • Hình ảnh thứ hai gần như hoàn toàn là số không, nhưng chứa 18 KB dữ liệu được phục hồi trải rộng trên 1847 khu vực bị cô lập.

  • Tôi đã thử sử dụng kỹ thuật được đề cập trong danh sách gửi thư này ,

    $ ddrescue --domain-logfile=part-two/ddrescue_log part-two/ddrescue_image part-one/ddrescue_image part-one/ddrescue_log
    
    
    GNU ddrescue 1.16
    Press Ctrl-C to interrupt
    Initial status (read from logfile)
    rescued:   937286 MB,  errsize:   62976 B,  errors:     122
    Current status
    rescued:   937286 MB,  errsize:   62976 B,  current rate:        0 B/s
       ipos:         0 B,   errors:     122,    average rate:        0 B/s
       opos:         0 B,     time since last successful read:       0 s
    Finished
    

    nhưng nó dường như không thay đổi bất cứ điều gì.

Câu trả lời:


4

Nếu bạn biết chính xác vùng dữ liệu bạn muốn sao chép, bạn có thể sử dụng dd:

dd conv=notrunc if=input of=output seek=123456 skip=123456 bs=4k count=128

Điều đó sẽ sao chép 128 khối 4k từ đầu vào sang đầu ra bắt đầu từ 123456.

Sẽ là khôn ngoan khi sao lưu các khối bạn sắp ghi đè lên trước:

dd if=output skip=123456 bs=4k count=128 of=output-backup-bs4k-pos123456

Nếu bạn KHÔNG biết vùng dữ liệu nào cần sao chép hoặc không chắc chắn về dữ liệu đó, thì GNU ddsẽ biết sparse.

dd conv=notrunc,sparse if=input of=output bs=4k

Điều đó sẽ sao chép mọi khối đầu vào 4k khác không vào đầu ra. Sử dụng bs=512nếu khối của bạn nhỏ hơn!

Lưu ý rằng không có bản sao lưu với phương thức này, vì vậy bạn nên sao chép tệp tốt hơn nếu nó quan trọng.


1

Hãy thử một cái gì đó như thế này?

dd if=part-one/ddrescue_image bs=1 count=227966006784 >result
dd if=part-two/ddrescue_image bs=1 seek=227966006785 >>result

Kích thước khối nhỏ sẽ làm điều này rất chậm; nếu bạn có thể tái cấu trúc để sử dụng kích thước khối lớn hơn và vẫn hạ cánh ở độ lệch chính xác, điều đó sẽ làm cho nó nhanh hơn rất nhiều.

Nếu bạn không thể làm điều đó, việc chia hoạt động thành nhiều lệnh khác ddcó lẽ là một ý tưởng tồi tệ - đọc với kích thước khối lớn như 65536 đến ranh giới 64K gần nhất, sau đó giảm tốc độ từ đó (có thể bước xuống khối 1K kích thước đến ranh giới 1K gần nhất trước khi chuyển sang từng byte riêng lẻ, sau đó đi nhanh hơn một lần nữa khi bạn hoàn thành thao tác chi tiết.


Với các thông tin cập nhật về các khu vực phân tán, điều này vẫn giữ như một bằng chứng về khái niệm. Lặp lại một danh sách các offset, chuyển sang hình ảnh thứ hai tại các offset nơi nó chứa dữ liệu bạn muốn.
tripleee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.