Sao chép toàn bộ phân vùng hoặc ổ cứng vào một tệp thưa thớt


35

Tôi thích sao chép toàn bộ phân vùng hoặc toàn bộ ổ cứng vào một ổ đĩa ngoài lớn hơn nhưng muốn tạo một tệp thưa thớt. Tôi thường sử dụng ddđể nhân bản, nhưng nó không hỗ trợ các tệp thưa thớt. Như một cách giải quyết, tôi đã sử dụng một cái gì đó như:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Tuy nhiên, điều này hơi khó với sở thích của tôi và không cho phép tôi tiếp tục quá trình nếu bị hủy bỏ. Thật buồn cười khi có một công cụ NTFS cho cái này ( ntfsclone) nhưng không có công cụ nào như vậy tồn tại cho các hệ thống tệp gốc của Linux (EXT2-4).

Có một số công cụ tốt hơn cho việc này, ví dụ như một ddbiến thể với sự hỗ trợ thưa thớt? Tôi không tìm kiếm một số phần mềm độc quyền để sao lưu đĩa mà chỉ muốn tạo một bản sao sao chép thưa thớt mà tôi có thể gắn kết như một thiết bị lặp nếu cần.


7
+1 để sử dụng sáng tạo cp, tôi không bao giờ có thể sao chép một hình ảnh đĩa. Tôi luôn luôn nén chúng nếu tôi cần để tiết kiệm không gian. Bây giờ tại sao trong một câu hỏi không phải là một câu trả lời?
Caleb

Câu trả lời:


21

Bạn muốn dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
Tuyệt quá! Hướng dẫn nói "Nếu quá trình sao chép bị gián đoạn bởi người dùng, có thể tiếp tục ở bất kỳ vị trí nào sau đó." và "-a spArse ghi tập tin (default = no)". Chính xác những gì tôi muốn! Cảm ơn!
Martin Scharrer

3
Tìm kiếm dd_rescuetrực tuyến tôi phát hiện ra rằng cũng có một công cụ khác được gọi là ddrescue(không có dấu gạch dưới) được phát triển độc lập dd_rescuenhưng dường như về cơ bản là giống nhau. Tôi chỉ đề cập rằng ở đây là một FYI chung.
Martin Scharrer

Vâng, dd_rescueddrescuekhông phải điều tương tự. Về mặt lý thuyết họ làm cùng một công việc, nhưng nhìn chung tôi đã gặp may mắn hơn với người lớn tuổi / nguyên bản dd_rescue.
Steven Pritchard

1
Trong trường hợp bất cứ ai thắc mắc, bạn có thể dừng sao chép bất cứ lúc nào bằng Ctrl-C. Nó sẽ cho bạn thấy vị trí hiện tại của bạn và bạn có thể sử dụng giá trị đó để khởi động lại bằng cách thêm -svà vị trí vào lệnh ban đầu. (Vì vậy, nó sẽ trông như thế dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard

1
@Steven Pritchard: Không cần nhớ vị trí. Chỉ định tên tệp thứ ba, sẽ là tệp logfile và khi khởi động lại, nó sẽ đọc nó và chọn nơi nó rời đi.
Tanith Rosenbaum

20

Chỉ để hoàn thành cuộc gọi cho ddresTHER . Các --sparsehoặc -Scờ cho phép đích để được viết rải rác:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Hoặc với tùy chọn dài:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Hoặc nếu bạn thích MiBs :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Để cho phép giải cứu bị gián đoạn và tiếp tục, bạn cũng có thể sử dụng logfile:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Lưu ý rằng GNU ddrescuedd_rescuelà các chương trình khác nhau. Nhưng GNU ddrescuedường như phổ biến hơn. Ví dụ, nó đã được đóng gói với GRML .


Có cần phải có bất kỳ xử lý đặc biệt nào của hình ảnh khi khôi phục, bạn có thể cung cấp lệnh được sử dụng để khôi phục một ddresTHER không?
dùng12439

Về lý thuyết, phương tiện lưu trữ mà bạn đang sử dụng để giải cứu được cho là đáng tin cậy hơn, vì vậy bạn thường chỉ có thể sử dụng dd để ghi vào đĩa thay thế : dd if=sda1.raw of=/dev/sdb1. Tuy nhiên, để sử dụng ddresTHER để khôi phục, bạn chỉ cần thay đổi nguồn / đích bạn đã sử dụng để cứu thành nguồn / đích mới, tốt nhất là với tệp nhật ký mới. Nếu có thể (thường là không), tất nhiên bạn có thể sử dụng ddresTHER để sao chép dữ liệu trực tiếp từ đĩa nguồn xấu sang đĩa thay thế.
zaTricky

3

Có một bản vá được cung cấp vào năm 2007 để cung cấp hỗ trợ tệp thưa thớt trong GNU GNU, nhưng có vẻ như nó chưa biến nó thành coreutils (ít nhất là không phải là 8.4). Tôi nghi ngờ dd đã thay đổi quá nhiều kể từ đó, bản vá có thể áp dụng so với phiên bản hiện tại mà không có nhiều công việc.

Tôi cũng thực sự ấn tượng với cách sử dụng sáng tạo cptrong câu hỏi của bạn và nó đã giúp tôi theo dõi việc sử dụng nó để hoàn thành việc tiếp tục (ở đây tiếp tục từ ~ 80M vào nguồn):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Chỉnh sửa: cào mà. Thứ hai ddtất nhiên sẽ tìm kiếm vị trí sai trong tệp đầu ra, vì nó không cùng độ dài với đầu vào.


1
Như trường hợp với câu trả lời của bhinesley, tốt nhất nên ghi lại tiến trình của dd để tiếp tục chính xác. Nếu bạn đã sử dụng phương pháp này cho cả lần chạy đầu tiên và sơ yếu lý lịch, và đăng nhập độc lập cả hai dd song song, thì bạn có thể biết đầu ra cần tìm bao xa. Nếu tôi có thời gian tôi sẽ cố gắng làm việc này.
Eli Heady

2
Cảm ơn các liên kết đến các bản vá. Tôi đã bắt đầu nghĩ về việc lập trình một cái gì đó giống như bản thân mình :-) Các tệp thưa thớt không thể được xử lý để mã của bạn không hoạt động.
Martin Scharrer

Yup, tôi chỉ phát hiện ra rằng bản thân mình. Ồ, thật vui khi tìm thấy những công dụng mới điên rồ của cp- cảm ơn!
Eli Heady

1
dd cam kết vào năm 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/ triệt " nếu được yêu cầu. ")
osgx

1

Chỉ cần thêm 2 xu của tôi. Một cách khác để tạo một tệp thưa thớt từ đĩa thô là với qemu-img bằng cách sử dụng một cái gì đó như:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Bạn có thể sử dụng điều này trên một phân vùng duy nhất là tốt. Ngoài ra, bạn có tùy chọn chuyển đổi đĩa / phân vùng thô sang bất kỳ định dạng nào khác mà qemu-img hỗ trợ (QCOW2, VHD [x], vmdk, v.v.)


1

Một tùy chọn khác là rsync . Ví dụ:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Giải trình:

  • -S/ --sparseđể bỏ qua các khối thưa thớt trên viết
  • -P/ --partial --progressđể hiển thị tiến trình và giữ các tập tin được chuyển một phần
  • --copy-devices sao chép nội dung thiết bị

Bạn có thể thêm --appendđể tiếp tục một bản sao bị gián đoạn (hoặc --append-verifyđể xác nhận tổng kiểm tra trên cả dữ liệu mới và dữ liệu cũ).

Chỉnh sửa : Tôi mới nhận ra copy-device.diff đang được xem xét và có thể không có mặt trên nhiều hệ thống (mặc dù nó được bao gồm bởi Fedora , Ubuntu , Debian và các hệ thống khác)


0

Lưu ý: điều này không hoạt động vì những lý do được mô tả trong các bình luận, tôi để nó ở đây để tham khảo.

Theo dõi số liệu thống kê của dd bằng cách sử dụng kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Tiếp tục bằng cách sử dụng bỏ qua / tìm kiếm:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Không có $ i_bytes, việc tiếp tục lại sẽ khó khăn hơn. Có lẽ dễ dàng nhất để ghi lại số liệu thống kê dd vào một tệp trong trường hợp máy gặp sự cố hoặc bất cứ điều gì.


Thứ hai cpsẽ ghi đè lên tập tin hiện có, phải không? Tôi biết skipvà các tùy chọn khác của dd. Vấn đề là cpmột phần.
Martin Scharrer

Hừm, đúng rồi.
bhinesley


0

Tại sao không đơn giản:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
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.