Sử dụng DD để nhân bản đĩa


182

Có một số câu hỏi liên quan đến các công cụ nhân bản đĩa và ddđã được đề xuất ít nhất một lần. Tôi đã cân nhắc việc sử dụng ddbản thân mình, chủ yếu là vì dễ sử dụng và nó có sẵn trên hầu hết các bản phân phối Linux có khả năng khởi động.

Cách tốt nhất để sử dụng ddđể nhân bản một đĩa là gì? Tôi đã thực hiện một tìm kiếm nhanh trên Google và kết quả đầu tiên là một nỗ lực thất bại rõ ràng . Có bất cứ điều gì tôi cần làm sau khi sử dụng dd, tức là có bất cứ điều gì KHÔNG THỂ đọc được ddkhông?


Tôi biết cách thức hoạt động của dd, câu hỏi của tôi hướng nhiều hơn đến bất kỳ vấn đề nào đã biết liên quan đến dd khi sao chép đĩa (như được mô tả bởi liên kết), có lẽ điều này không rõ ràng. Câu trả lời của anh ấy chứa đựng và câu trả lời của bạn không phải là "Tôi chưa bao giờ gặp vấn đề gì với nó". Tôi cũng đã đưa ra câu trả lời của bạn, vì bạn chắc chắn đã trình bày một số điểm thú vị (tôi thích câu trả lời về việc không có dấu hiệu tiến bộ).
falstro

1
Có vẻ như bạn đã nhận được Bump Spolsky: joelonsoftware.com/items/2009/05/29.html
Kyle Cronin

đã không thấy điều này ở đây khi tôi hỏi (và trả lời) một câu hỏi tương tự trên superuser - superuser.com/questions/11453/ mẹo
warren

3
Thật trớ trêu khi Joel liên kết với câu hỏi như một ví dụ tốt về lỗi máy chủ, mặc dù không có câu trả lời nào là tốt. Không có một câu trả lời nào trong số 25 (không bao gồm các bình luận) với các ddtùy chọn phù hợp để bỏ qua các khối xấu - điều này rất cần thiết khi sao chép đĩa để phục hồi. Tôi đã thêm một câu trả lời tốt hơn, có thể sao chép các đĩa có khối xấu:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins

Tôi nghĩ rằng khôi phục dd có thể "thất bại" nếu nói về hệ thống tệp phụ thuộc hình học ổ đĩa và khôi phục được thực hiện trên các ổ đĩa cứng không giống nhau? Tôi đã trải qua một số thất bại khi khôi phục dd và tôi nghĩ rằng đây là vấn đề trong trường hợp của tôi.
Marco

Câu trả lời:


160

dd chắc chắn là công cụ nhân bản tốt nhất, nó sẽ tạo bản sao 100% chỉ bằng cách sử dụng lệnh sau. Tôi chưa bao giờ có bất kỳ vấn đề với nó.

dd if=/dev/sda of=/dev/sdb bs=32M

Xin lưu ý rằng trong khi nhân bản từng byte, bạn không nên sử dụng điều này trên một ổ đĩa hoặc phân vùng đang được sử dụng. Đặc biệt là các ứng dụng như cơ sở dữ liệu không thể đối phó với điều này rất tốt và bạn có thể kết thúc với dữ liệu bị hỏng.


12
Tất nhiên, miễn là / dev / sdb ít nhất là bằng / dev / sda ...
Eddie

22
thêm một "bs = 100M conv = notrunc" và nó nhanh hơn nhiều theo kinh nghiệm của tôi.
Tim Williscroft

127
chỉ cần cẩn thận với các chữ cái 'i' và 'o' ...
bandi

17
Dường như không ai biết thủ thuật này ... dd là một chương trình sao chép bất đối xứng, có nghĩa là nó sẽ đọc trước, sau đó viết, sau đó quay lại. Bạn có thể đặt ống dd vào chính nó và buộc nó thực hiện sao chép đối xứng, như thế này : dd if=/dev/sda | dd of=/dev/sdb. Trong các thử nghiệm của tôi, việc chạy lệnh mà không có đường ống cho tôi thông lượng ~ 112kb / s. Với đường ống, tôi nhận được ~ 235kb / s. Tôi chưa bao giờ gặp bất kỳ vấn đề với phương pháp này. Chúc may mắn!
Mistiry

13
@Mistiry, đó không phải là nghĩa của từ đối xứng.
psusi

113

Để tiết kiệm dung lượng, bạn có thể nén dữ liệu được tạo bởi dd bằng gzip, ví dụ:

dd if=/dev/hdb | gzip -c  > /image.img

Bạn có thể khôi phục đĩa của mình bằng:

gunzip -c /image.img.gz | dd of=/dev/hdb

Để tiết kiệm nhiều dung lượng hơn, hãy chống phân mảnh ổ đĩa / phân vùng mà bạn muốn sao chép trước (nếu thích hợp), sau đó loại bỏ tất cả không gian chưa sử dụng còn lại, giúp gzip dễ dàng nén hơn:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Đợi một chút, cuối cùng dd sẽ thất bại với thông báo "đĩa đầy", sau đó:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Ngoài ra, bạn có thể nhận được một tiến trình dd đang chạy trong nền để báo cáo trạng thái bằng cách gửi tín hiệu bằng lệnh kill, ví dụ:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Kiểm tra hệ thống của bạn - lệnh trên dành cho các lệnh dd Linux, OSX và BSD khác nhau trong các tín hiệu mà chúng chấp nhận (OSX sử dụng SIGINFO- bạn có thể nhấn Ctrl+ Tđể báo cáo trạng thái).


2
Điều này cũng hoạt động với các fs "hiện đại" như BTRFS, NILFS, [bất cứ điều gì bạn có thể mơ ước]?
Steve Schnepp

DD hoạt động trên các thiết bị khối, mức độ trừu tượng thấp hơn hệ thống tệp, do đó, nên có. Tôi đã không thực sự thử nó, mặc dù. Hmm, NILFS có vẻ thú vị, tôi sẽ phải xem xét điều đó.
David Hicks

4
+1 cho kill -SIGUSR1 %1và lệnh dd OSX vui vẻ chấp nhận SIGUSR1 ... siêu hữu ích, cảm ơn!
stuartc

1
+1 cho Kill -SIGUSR1 1234tôi đã tìm kiếm điều đó.
hot2use

2
Nó nên là: dd if=/dev/hdb | gzip -c > /image.img.gz?
Mike Causer

37

THẬN TRỌNG : khi một hệ thống tệp trực tiếp có thể làm hỏng các tệp. Lý do rất đơn giản, nó không có hiểu biết về hoạt động của hệ thống tập tin có thể đang diễn ra và không cố gắng giảm thiểu nó. Nếu một bài viết đang được thực hiện một phần, bạn sẽ nhận được một phần ghi. Điều này thường không tốt cho mọi thứ và thường gây tử vong cho cơ sở dữ liệu. Hơn nữa, nếu bạn làm hỏng các lỗi chính tả nếucủa các tham số, khốn cho bạn. Trong hầu hết các trường hợp, rsync là một công cụ hiệu quả tương đương được viết sau sự ra đời của đa nhiệm và sẽ cung cấp các chế độ xem nhất quán cho các tệp riêng lẻ.

Tuy nhiên, DD nên nắm bắt chính xác trạng thái bit của ổ đĩa chưa được đếm. Bộ tải khởi động, khối lượng llvm, UUID phân vùng và nhãn, v.v. Chỉ cần đảm bảo rằng bạn có một ổ đĩa có khả năng phản chiếu bit ổ đĩa đích một chút.


7
Tôi nghi ngờ đó synckhông phải là câu trả lời cho vấn đề tham nhũng. Chuyện gì xảy ra nếu một deamon hoặc một cái gì đó viết nhiều file sau khi sync, trong quá trình ddhoạt động?
Đã xóa

5
Đó là một ý tưởng tốt để vượt qua ổ đĩa trước (hoặc chỉ là ở chế độ chỉ đọc) nhưng không phải lúc nào cũng có thể
Alex Bolotov

1
Trong trường hợp đó, bạn sử dụng rsync và để nó xử lý tệp ma thuật để có được một tệp nhất quán và để cho ngữ nghĩa Copy On Write xử lý việc ghi đến.
jldugger

4
Tôi muốn thêm rằng việc chạy dd trên hệ thống tệp được gắn S W KHÔNG ĐÚNG các tệp trên hệ thống tệp được gắn, nhưng điều có ý nghĩa ở đây là bản sao của hệ thống tệp sẽ nhất thiết phải ở trạng thái tốt đã biết.
3molo

1
Sử dụng rsyncsẽ đảm bảo rằng dữ liệu nội bộ trong hệ thống tệp đích là nhất quán. Nó sẽ không đảm bảo rằng dữ liệu trong các tệp là nhất quán - để làm điều đó, bạn sẽ cần phải khóa các tệp và bất kỳ chương trình nào ghi vào tệp sẽ cần phải tôn trọng các khóa này.
Martin Geisler

26

Khi sử dụng dd để sao chép một đĩa có thể chứa các thành phần xấu, hãy sử dụng "conv = noerror, sync" để đảm bảo rằng nó không dừng khi gặp lỗi và điền vào (các) khu vực bị thiếu bằng byte rỗng. Đây thường là bước đầu tiên tôi thực hiện nếu cố gắng khôi phục từ đĩa bị lỗi hoặc bị lỗi - lấy một bản sao trước khi thực hiện bất kỳ nỗ lực khôi phục nào, và sau đó thực hiện khôi phục trên đĩa tốt (nhân bản). Tôi để nó cho công cụ khôi phục để đối phó với bất kỳ khu vực trống nào không thể được sao chép.

Ngoài ra, bạn có thể thấy tốc độ của dd có thể bị ảnh hưởng bởi cài đặt bs (kích thước khối). Tôi thường thử bs = 32768, nhưng bạn có thể muốn kiểm tra nó trên hệ thống của riêng bạn để xem cái gì hoạt động nhanh nhất cho bạn. (Điều này giả định rằng bạn không cần sử dụng kích thước khối cụ thể cho một lý do khác, ví dụ: nếu bạn đang ghi vào băng.)


13
Nếu bạn có một đĩa có các thành phần xấu, bạn thực sự nên sử dụng 'ddresTHER' thay vì dd. Nó hiệu quả hơn nhiều và có cơ hội phục hồi nhiều dữ liệu hơn. (Đừng nhầm lẫn với dd_resTHER, điều này không tốt bằng)
davr

3
không nên sử dụng kích thước khối lớn nếu cố gắng bỏ qua các khối xấu, hoặc nó sẽ bỏ qua quá nhiều. 4096 là đủ lớn.
Sam Watkins

17

Để sao chép một đĩa, tất cả những gì bạn thực sự cần làm là chỉ định đầu vào và đầu ra cho dd:

dd if=/dev/hdb of=/image.img

Tất nhiên, đảm bảo rằng bạn có quyền thích hợp để đọc trực tiếp từ / dev / hdb (Tôi khuyên bạn nên chạy bằng root) và / dev / hdb không được gắn kết (bạn không muốn sao chép trong khi đĩa được thay đổi - gắn dưới dạng chỉ đọc cũng được chấp nhận). Sau khi hoàn thành, image.img sẽ là một bản sao byte cho toàn bộ đĩa.

Có một vài hạn chế khi sử dụng dd để sao chép đĩa. Đầu tiên, dd sẽ sao chép toàn bộ đĩa của bạn, thậm chí cả không gian trống và nếu được thực hiện trên một đĩa lớn có thể dẫn đến một tệp hình ảnh cực kỳ lớn. Thứ hai, dd cung cấp hoàn toàn không có chỉ dẫn tiến bộ, có thể gây bực bội vì bản sao mất nhiều thời gian. Thứ ba, nếu bạn sao chép hình ảnh này sang các ổ đĩa khác (một lần nữa, sử dụng dd), chúng phải lớn hơn hoặc lớn hơn đĩa gốc, nhưng bạn sẽ không thể sử dụng bất kỳ không gian bổ sung nào bạn có thể có trên đĩa đích cho đến khi bạn Thay đổi kích thước phân vùng của bạn.

Bạn cũng có thể thực hiện sao chép trực tiếp từ đĩa sang đĩa:

dd if=/dev/hdb of=/dev/hdc

nhưng bạn vẫn phải chịu những hạn chế ở trên về không gian trống.

Theo như các vấn đề hoặc vấn đề về vấn đề này, dd, phần lớn, thực hiện một công việc tuyệt vời. Tuy nhiên, cách đây một thời gian tôi có một ổ cứng sắp chết, vì vậy tôi đã sử dụng dd để thử và sao chép thông tin nào tôi có thể tắt nó trước khi nó chết hoàn toàn. Sau đó, người ta đã biết rằng dd không xử lý lỗi đọc rất tốt - có một số cung trên đĩa mà dd không thể đọc được, khiến dd bỏ cuộc và dừng sao chép. Tại thời điểm đó, tôi không thể tìm cách nói với dd để tiếp tục mặc dù gặp phải lỗi đọc (mặc dù nó có vẻ như có cài đặt đó), vì vậy tôi đã dành khá nhiều thời gian để chỉ định bỏ qua và tìm cách nhảy qua phần không thể đọc được.

Tôi đã dành thời gian nghiên cứu các giải pháp cho vấn đề này (sau khi tôi đã hoàn thành nhiệm vụ) và tôi tìm thấy một chương trình có tên ddresTHER , theo trang web, hoạt động như dd nhưng vẫn tiếp tục đọc ngay cả khi gặp lỗi. Tôi chưa bao giờ thực sự sử dụng chương trình, nhưng nó đáng để xem xét, đặc biệt là nếu đĩa bạn sao chép từ cũ, có thể có các thành phần xấu ngay cả khi hệ thống xuất hiện tốt.


7
... dd cung cấp hoàn toàn không có chỉ dẫn tiến trình ... - điều này không đúng - có một cách khó khăn để làm thế nào để hiển thị tiến trình - bạn phải tìm ra pid của quá trình dd ('ps -a | grep dd') và sau đó gửi tín hiệu USR1 đến quá trình này - 'kill -USR1 <dd_pid_here>' (không có <>) để buộc dd hiển thị thông tin tiến trình.
Michal Bernhard

4
"Một số lĩnh vực trên đĩa mà dd không thể đọc": Tôi nghĩ điều đó conv=sync,noerrorsẽ giúp ích.
Gauthier

2
Các conv=sync,noerrortùy chọn là rất cần thiết, chúng cho phép dd bỏ qua các khối xấu và loại bỏ chúng trong hình ảnh để mọi thứ được căn chỉnh chính xác. Đạo cụ cho rất ít người bình luận điều gì đó về điều đó.
Sam Watkins

1
GNU ddrescuecung cấp chỉ báo tiến trình mà không có bất kỳ tùy chọn đặc biệt nào và bạn có thể dừng sao chép và tiếp tục nơi bạn rời đi.
endolith

2
Một cách ít khó khăn hơn để đạt được tiến bộ với dd là thêm tùy chọnstatus=progress
James

11

Nếu ổ đĩa nguồn bị hư hỏng ở tất cả, bạn sẽ có nhiều may mắn sử dụng dd_rhelpvới dd_rescue(sở thích cá nhân của tôi) hoặc GNU ddrescue.

Lý do đằng sau điều này là, về lỗi đọc, ddtiếp tục cố gắng và cố gắng - cố gắng trong một thời gian dài để thời gian chờ xảy ra. dd_rescuethực hiện những việc thông minh như đọc lỗi, sau đó chọn một điểm trên đĩa và đọc ngược lại lỗi cuối cùng, và dd_rhelpvề cơ bản là dd_rescuetrình quản lý phiên - khởi động và tiếp tục lại một cách khéo léo dd_rescueđể làm cho nó nhanh hơn một lần nữa.

Kết quả cuối cùng dd_rhelplà dữ liệu tối đa được phục hồi trong thời gian tối thiểu. Nếu bạn rời khỏi dd_rhelpchạy, cuối cùng nó sẽ thực hiện công việc chính xác như ddtrong cùng một thời gian. Tuy nhiên, nếu ddgặp phải lỗi đọc ở byte 100 trên đĩa 100Gb của bạn, bạn sẽ phải chờ rất lâu để khôi phục 9,999.900 byte * khác, trong khi dd_rhelp+ dd_rescuesẽ phục hồi phần lớn dữ liệu nhanh hơn nhiều.


1
Một số trợ giúp lựa chọn giữa dd_resTHER và ddresTHER
Johann

7

Đĩa nguồn không được có bất kỳ hệ thống tập tin gắn kết. Khi người dùng có thể đọc thiết bị khối (root hoạt động), hãy chạy 'dd if = / dev / sda ....'

Bây giờ, một trong những điều thú vị ở đây là bạn đang tạo ra một luồng byte ... và bạn có thể làm rất nhiều với điều đó: nén nó, gửi nó qua mạng, chia nó thành các đốm nhỏ hơn, v.v.

Ví dụ:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Nhưng mạnh mẽ hơn:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Ở trên sao chép một hình ảnh nén của ổ cứng nguồn vào một hệ thống từ xa, nơi nó lưu nó trong các đoạn 2G được đánh số bằng cách sử dụng tên của máy chủ nguồn trong khi vẫn cập nhật cho bạn về tiến trình.

Lưu ý rằng tùy thuộc vào kích thước của đĩa, tốc độ của cpu trên nguồn, tốc độ của cpu khi đến đích, tốc độ của mạng, v.v. Bạn có thể muốn bỏ qua việc nén hoặc thực hiện nén ở phía từ xa hoặc cho phép nén ssh.


+1 Đường ống qua gzip có thể tiết kiệm rất nhiều thời gian và băng thông!
M. Dudley

Tôi cũng cần lưu ý rằng việc thêm 'bs = 1M' vào lệnh dd thường sẽ cải thiện tốc độ rất nhiều.
retracile

6

Để sao chép đĩa, tất cả những gì bạn thực sự cần làm là chỉ định đầu vào và đầu ra là dd:

dd if=/dev/hdb of=hdb.img

Tất nhiên, đảm bảo rằng bạn có quyền thích hợp để đọc trực tiếp từ /dev/hdb(Tôi khuyên bạn nên chạy bằng root) và điều đó /dev/hdbkhông được gắn kết (bạn không muốn sao chép trong khi đĩa đang được thay đổi). Sau khi hoàn thành, hdb.imgsẽ là một bản sao byte cho toàn bộ đĩa.

Có một vài hạn chế khi sử dụng ddđể sao chép đĩa. Đầu tiên, ddsẽ sao chép toàn bộ đĩa của bạn, thậm chí cả không gian trống và nếu được thực hiện trên một đĩa lớn có thể dẫn đến một tệp hình ảnh cực kỳ lớn. Thứ hai, ddcung cấp hoàn toàn không có chỉ dẫn tiến bộ, có thể gây bực bội vì bản sao mất nhiều thời gian. Thứ ba, nếu bạn sao chép hình ảnh này sang các ổ đĩa khác (một lần nữa, sử dụng dd), chúng phải lớn hơn hoặc lớn hơn đĩa gốc, nhưng bạn sẽ không thể sử dụng bất kỳ không gian bổ sung nào bạn có thể có trên đĩa đích cho đến khi bạn Thay đổi kích thước phân vùng của bạn.

Bạn cũng có thể thực hiện sao chép trực tiếp từ đĩa sang đĩa:

dd if=/dev/hdb of=/dev/hdc

nhưng bạn vẫn phải chịu những hạn chế ở trên về không gian trống.

Hạn chế đầu tiên có thể được giải quyết bằng cách lấy dữ liệu khi bạn tạo bản sao. Ví dụ:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

Hạn chế thứ hai có thể được giải quyết bằng cách sử dụng pvcông cụ pipeview ( ). Ví dụ:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Tôi biết không có cách nào để khắc phục nhược điểm thứ ba.

Ngoài ra, bạn có thể tăng tốc thời gian sao chép bằng cách yêu ddcầu làm việc với khối dữ liệu lớn hơn. Ví dụ:

dd if=/dev/hdb of=hdb.img bs=1024

1
Bạn đã nói cách khắc phục nhược điểm thứ ba ... thay đổi kích thước các phân vùng. Mở rộng phân vùng nói chung là một hoạt động an toàn và nhanh chóng (so với thu hẹp hoặc di chuyển, chậm và nguy hiểm hơn vì nó di chuyển dữ liệu xung quanh).
davr

gzipping sẽ không hoạt động với một đĩa đã được sử dụng một thời gian, vì nó sẽ chứa đầy dữ liệu hiện tại hoặc bị xóa. gzip sẽ chỉ hoạt động nếu không gian trống bằng 0, đó chỉ là trường hợp với một đĩa hoàn toàn mới.
Tozz

3
@Tozz: Bạn có thể cải thiện khả năng nén của hình ảnh hệ thống tập tin bằng cách điền vào hệ thống tập tin với một tệp chứa 0, đồng bộ hóa nó vào đĩa, sau đó xóa nó. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Modulo thêm thông minh trong lớp hệ thống tập tin.)
retracile

5

Một điều tuyệt vời khác mà bạn có thể làm với dd và đĩa cứu hộ là sao chép dữ liệu qua mạng:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Bạn có thể dính gzip vào cả hai đường ống này nếu mạng không cục bộ. Để tiến bộ, sử dụng pv. Để khiến netcat của local_machine thoát ra sau khi sao chép xong, bạn có thể thêm -w 5hoặc một cái gì đó.


9
Điều này không hoàn toàn chính xác. Lệnh 'remote_machine' thiếu một cái gì đó, chẳng hạn như > disk_backup.imghay |dd of=/dev/sdbhay cái gì khác, tùy thuộc vào những gì bạn muốn làm. Tôi đoán bạn không muốn đổ hình ảnh đĩa vào thiết bị xuất chuẩn.
davr

1
Và ném gzip vào cả hai đầu để tiếp tục giảm thiểu dữ liệu đã gửi.
3molo

4

Hãy nhớ rằng dd tạo một bản sao chính xác , bao gồm tất cả các khoảng trống.

Điều đó có nghĩa là:

  1. Ổ đĩa thứ 2 ít nhất phải lớn như ổ đĩa thứ nhất
  2. Nếu ổ đĩa thứ 2 lớn hơn, dung lượng thừa sẽ bị lãng phí (hệ thống tập tin có thể được mở rộng cho bạn)
  3. Nếu ổ đĩa nguồn không đầy, dd sẽ lãng phí rất nhiều thời gian để sao chép không gian trống.
  4. Bạn có thể sao chép toàn bộ ổ đĩa hoặc một phân vùng theo cách này.
  5. Nếu đây là ổ đĩa có khả năng khởi động, tôi khá chắc chắn rằng bạn cần cài đặt bộ tải khởi động sau khi sử dụng dd

Hy vọng rằng nó hữu ích


8
Nếu bạn đang sao chép toàn bộ đĩa cứng, bạn cũng sẽ nhân bản bộ tải khởi động.
Cristian Ciupitu

Chà, chỉ là một người, nhưng bạn không thể sử dụng gparted để khôi phục lại phân vùng / đĩa được sao chép xuống bất cứ thứ gì được sử dụng - sau đó thả dd? Giả sử đó là hình ảnh một lần, nó sẽ giảm thiểu vấn đề này.
bbqchickenrobot

3

Để tham khảo trong tương lai, nó có thể được quan tâm để kiểm tra ddresTHER . Nó đã cứu ngày của tôi một vài lần.


3

Một tính năng lớn khác là sao chép MBR, bảng phân vùng và bản ghi khởi động.

Chỉ

dd if=/dev/sda of=parttable bs=512 count=1

và hướng khác xung quanh khi bạn viết nó. Ba Lan với fdisksau.

Bạn cảm thấy an toàn hơn nhiều khi sao lưu bảng phân vùng.

Ngoài ra, nó làm cho việc di chuyển sang một ổ đĩa cứng khác (trong khi thay đổi cấu trúc chia tay) là một niềm vui.


3

Đây là một loại hack rẻ tiền, nhưng nó là một cách nhanh chóng và bẩn thỉu để theo dõi quá trình DD của bạn.

Chạy lệnh dd của bạn. Mở một shell mới và thực hiện ps awx để tìm quy trình dd của bạn. Bây giờ trong đồng hồ kiểu vỏ mới -n 10 kill -USR1 {pid của quy trình DD của bạn}

Điều này sẽ không làm gì trong cửa sổ đầu ra của đồng hồ, nhưng trở lại trong vỏ DD gốc, DD sẽ bắt đầu xuất báo cáo trạng thái cứ sau 10 giây. Tất nhiên, bạn có thể thay đổi -n 10 trong lệnh xem sang bất kỳ khung thời gian nào khác.

Tê giác


OS X không có watchsẵn và -USR1giết chết dd. Lệnh sau hoạt động mặc dù: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco

Tôi không nghĩ rằng điều này rất thiết thực cho người mới, họ có thể được phục vụ tốt hơn với pvlệnh.
Robbie Mckennie

Tôi thấy rằng bạn cũng có thể gửi SIGINFO sử dụng CTRL-T trong dd. Nó dễ dàng hơn vòng lặp while và OSX 10.6 cd mà tôi không có killall. Đã học được điều này từ en.wikipedia.org/wiki/Unix_signal#Sending_signals
Công dân Kepler

3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Điều này sẽ sao chép đĩa và bỏ qua các khối có lỗi, điều này rất quan trọng.

Đây là các tùy chọn cơ bản và cần thiết để sử dụng dd để sao chép hoặc cứu đĩa.

Tôi không muốn đăng câu trả lời khác, nhưng không có câu trả lời hay với các tùy chọn "conv = sync, noerror" cần thiết trong số 25 câu đã được đăng.


1
Trên thực tế, nó đã được đề cập trước đó, trong một câu trả lời và ít nhất hai bình luận.
Michael Hampton

1
@Michael câu trả lời bạn liên kết không chứa lệnh ví dụ đầy đủ và có các lỗi khác - không nên sử dụng kích thước khối lớn conv=sync,noerrorvì nó sẽ bỏ qua quá nhiều dữ liệu cho mỗi khối xấu. Các tùy chọn này rất cần thiết cho "nhân bản phục hồi" và không cần phải tìm kiếm các bình luận cho chúng. Câu trả lời phổ biến nhất là đầy đủ nếu các đĩa không có khối xấu, ví dụ để nhân bản một đĩa nguyên sơ, nhưng không phục hồi.
Sam Watkins

@Michael ví dụ tôi đã đưa ra là một lệnh tôi đã sử dụng nhiều lần để phục hồi đĩa chuyên nghiệp. Mặc dù có các công cụ khác có thể thực hiện công việc tốt hơn một chút, ví dụ tôi đưa ra là nhân bản phục hồi đĩa tốt hơn mọi ddví dụ khác ở đây, đồng thời cũng phù hợp để sao chép đĩa không có lỗi. Do đó, tôi coi câu trả lời của mình là tốt nhất ở đây về cách "sử dụng DD để nhân bản đĩa". Tôi đã không thêm thông tin về tiến trình giám sát, nén, v.v., vì tôi muốn giữ cho nó đơn giản và tập trung vào việc cung cấp một câu trả lời ngắn, điều đó là cơ bản.
Sam Watkins

3

Bạn thực sự có thể thử một cái gì đó như thế này

dd if = / dev / sda2 of = / dev / sdb2 bs = 4096 conv = sync, noerror

bỏ qua tất cả các lỗi và có bản sao chính xác của một phân vùng hoặc ổ cứng


Nó phải là conv = sync, noerror Tùy chọn đồng bộ hóa là cần thiết hoặc các khối khác có lỗi sẽ bị xóa thay vì được sao chép dưới dạng số không.
Sam Watkins

2

dd không cung cấp thông tin tiến trình - hầu hết các phiên bản trong linux. Tôi đã thấy một số thứ không nhưng không nhớ lại hương vị unix.

Trang hướng dẫn cho biết: Gửi tín hiệu USR1 đến quy trình 'dd' đang chạy khiến nó in số liệu thống kê I / O thành lỗi tiêu chuẩn và sau đó tiếp tục sao chép.

Tôi sử dụng tính năng này thường xuyên.


Mặc dù hữu ích, tôi nghi ngờ tính thực tế của nó cho người mới bắt đầu.
Robbie Mckennie

2

Ai đó đã phải nói điều này: hãy thử Clonezilla (http: // clonezilla.org/)

Bạn được những gì? Để sao chép chỉ các phần được sử dụng của hệ thống tập tin. Clonezilla sử dụng dd, grub, sfdisk, parted, partimage, ntfsclone và / hoặc partclone. Tùy thuộc vào các tùy chọn bạn chọn.

Tài liệu về Decent có thể được tìm thấy tại: http: // clonezilla.org/clonezilla-live/doc/


Tôi thấy tài liệu này hơi thô và việc sao chép ổ đĩa PATA linux sang ổ đĩa SATA không để lại cho tôi thứ gì đó tôi có thể khởi động (chưa). Nhưng nhanh hơn nhiều so với kết quả tương tự như dd, và nó hoạt động rất tốt cho việc nâng cấp ổ đĩa máy tính xách tay của tôi.
jbdavid

2

Cách sao chép bằng dd (trong trường hợp này vào máy từ xa, nhưng nguyên tắc tương tự áp dụng cho bản sao cục bộ) cho thấy sự tiến bộ.

Nó hoạt động bằng cách lưu trữ pid thông qua bộ mô tả tệp 3 in / tmp / pid, sau đó được sử dụng cho các lần giết tiếp theo với tín hiệu USR1. Một nếp nhăn là để lọc đầu ra của tiến trình trên stderr thành chỉ một dòng thông qua lọc stderr thông qua một lớp con.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done

Không thực sự liên quan đến câu hỏi, nhưng đây là một thủ thuật shell gọn gàng bằng cách sử dụng trình mô tả tệp shell và cao (cao hơn stderr) để truyền dữ liệu ra khỏi nó, +1
falstro

Bản thân tôi đã đề cập đến trang này cho các tùy chọn dd khác nhau khi sao chép đĩa, vì vậy nó dường như là một nơi thích hợp vào thời điểm đó để đưa kết quả cuối cùng của những gì tôi sử dụng để nhân bản, đặc biệt là vì tôi nghĩ rằng nó khá gọn gàng :)
Edward Groenendaal

2

Hầu hết các thông tin được mô tả trong các lần nhận được chèn trước đó, nhưng không phải tất cả đều được mô tả.

Trong linux bạn có thể sao chép ổ cứng hoặc phân vùng bằng lệnh dd. Chú ý, khi bạn mắc lỗi, bạn sẽ mất tất cả dữ liệu của mình.

Lúc đầu, không nên sử dụng đích, không nên sử dụng nguồn thứ hai hoặc chuyển sang chế độ chỉ đọc. Nếu không, bản sao sẽ bị hỏng. Nếu không thể truy cập lại, vui lòng tạo ổ đĩa khởi động (hdd / ssd / Pendrive) bất kỳ bản phân phối trực tiếp linux nào. Tôi prever knoppix, nhưng đây là lựa chọn của bạn. Nếu có thể, bạn có thể khởi động hoặc thay đổi cấp độ hệ thống thành 1, đối với chế độ người dùng đơn hoặc bạn có thể trực tiếp khởi động lại hệ thống sang chế độ người dùng duy nhất, đó là bản phân phối phụ thuộc. Nếu bạn chỉ sao chép một phân vùng, phân vùng này sẽ được ngắt kết nối hoặc kết nối lại thành RO:

umount /mountpoint_or_device

hoặc là

remount -o,ro /mountpoint_or_device

Nếu bạn muốn sao chép toàn bộ ổ cứng, bạn phải đánh dấu hoặc đếm lại tất cả các phân vùng.

Bạn phải xác định thiết bị nguồn và đích. vui lòng xem dmesg, ở đây được lưu trữ tất cả thông tin cần thiết về thiết bị, với nhà cung cấp, vv việc xác định thay thế có thể dựa trên kích thước thiết bị, nếu nó khác. Tiếp theo, đích phải giống hoặc lớn hơn nguồn. bạn phải tính toán nguồn, ví dụ: fdisk -l / dev / sda ngoại trừ hình học phân vùng (có thể có GPT), bạn sẽ tìm nạp: 1. tổng kích thước đĩa với GB và byte 2. hình học lịch sử và tổng số ngành, thông tin rất quan trọng 3. kích thước khối tính theo byte, thường là 512.

ví dụ:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

Tiếp theo, hãy thử chia lớn hơn 512, chúng ta có 41943040 ngành vật lý:

41943040/256 = 163840, rất tốt, chúng tôi có thể sao chép số lượng lớn 256 lĩnh vực. chúng ta có thể nhiều hơn? Hãy thử: 41943040/1024 = 40960, tôi nghĩ thế là đủ, chúng tôi sẽ chọn cái này. Hãy tính kích thước của nhóm ngành: 512 (kích thước ngành) * 1024 = 524288 byte eq 512K. Sau đó, chúng ta có thể sử dụng tham số bs = 512K hoặc ít hơn, nhưng chia giá trị này cho 2 ^ x. Đối với các ổ đĩa cứng hiện đại với bộ nhớ cache lớn bên trong, điều này là đủ thực tế. đối với các ổ đĩa cũ có bộ đệm nhỏ hơn nhiều, giá trị từ 32K trở xuống là đủ.

Sau đó, sau khi chuẩn bị, chúng ta có thể thực hiện một bản sao: dd if = / dev / source_devide of = / dev / Destination_device bs = 32K và việc sao chép sẽ được thực hiện. Hãy chú ý, bất kỳ sai lầm sẽ ghi đè lên dữ liệu nhập khẩu của bạn. Về đích tất cả sẽ được ghi đè.

Nếu bạn thử cứu dữ liệu trên đĩa nguồn bị hỏng, tốt hơn nên sử dụng kích thước cung riêng, thường thì đây là 512 byte và thêm tùy chọn conv = notrunc. nếu không, các lỗ trong nguồn bị giảm bởi các thành phần xấu sẽ được nối bằng cách dịch chuyển theo điểm đến. Điều này sẽ làm hỏng bản sao với một vài cơ hội để sửa chữa. sau đó lệnh sẽ là:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

và chờ đợi thời gian dài khi ổ đĩa và hệ thống sẽ từ bỏ và sẽ đi từng khu vực đến cùng.

dd là công cụ hữu ích để di chuyển phân vùng vào nơi mới. Đơn giản chỉ cần tạo phân vùng, tạo dd thành phân vùng mới (cái này có thể lớn hơn, lớn hơn nhiều) và nếu có thể, hãy mở rộng hệ thống tệp đã sao chép để lấp đầy tất cả phân vùng mới, ext3 / ext4 / xfs / zfs / btrfs có cơ sở này. Cuối cùng, bạn phải thay đổi / etc / fstab, sau đó umount / mount nếu có thể hoặc khởi động lại hệ thống.

Tất nhiên bạn có thể sao chép bất kỳ loại phân vùng. Lệnh dd không nhìn vào loại hệ thống tệp, nó không làm gì với cấu trúc của nó. sau đó lệnh này có thể được sử dụng để nhân bản NTFS hoặc các loại phân vùng khác.

Có bất kỳ mẹo. Khi bạn không đặt tham số, thì dd sẽ đưa đầu ra vào thiết bị xuất chuẩn của nó. sau đó bạn có thể tạo bản sao thô của đĩa hoặc phân vùng, ví dụ:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Tất nhiên điều này nên được thực hiện ngoại tuyến. bạn có thể khôi phục điều này bằng cách:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, sau đó tất cả ổ cứng sda sẽ bị ghi đè bởi bản sao lưu này và tất cả dữ liệu hiện tại sẽ bị mất. Bạn cũng có thể làm điều này với phân vùng windows NTFS và ổ cứng được sử dụng bởi cái này. Tất nhiên bạn có thể sử dụng lệnh nén khác, tùy thuộc vào lựa chọn của bạn.


1

Bạn có thể tạo một tệp hình ảnh nén của phân vùng (hoặc đĩa) một cách nhanh chóng bằng cách sử dụng bzip2hoặc gzipthay vì dd. Điều này là tốt để lưu trữ hình ảnh trong phương tiện di động:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Nếu đĩa đã được sử dụng nhiều trước đó, bạn có thể tăng cường nén bằng cách lấp đầy tất cả không gian chưa sử dụng bằng số không trước khi chụp ảnh:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Để khôi phục hình ảnh vào đĩa khác, tất cả những gì bạn phải làm là:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY

Nâng cấp cho thủ thuật để lấp đầy không gian còn lại bằng số không. Thông minh!
Nhầm lẫn

Cái này, tôi cần cái này! Thẻ SD trước đây được sử dụng để quay video và đầy rác, việc nén không giúp ích gì cả.
Cody Smith

0

Vì một số lý do, dd thất bại khi tạo đĩa CD với các rãnh âm thanh. Bạn cần sử dụng cdrdao hoặc một cái gì đó tương tự để có được một hình ảnh + tệp TOC.


0

Một lưu ý về tốc độ: theo kinh nghiệm của tôi, dd nhanh gấp đôi nếu bạn chỉ định bs = 1024 thay vì mặc định bs = 512. Sử dụng kích thước khối thậm chí lớn hơn sẽ không tăng tốc đáng chú ý so với bs = 1024.


4
Hiện tại các cụm đĩa thường có giá khoảng 4k, vì vậy sử dụng 4096 có lẽ là một lựa chọn tốt và thậm chí là 8192 nếu bạn muốn đọc 2 cụm cùng một lúc. Mặc dù vậy, đừng quá lớn, khi bạn gặp phải các vấn đề về bộ nhớ bị phân mảnh
user4767

0

Một điều bạn phải lưu ý khi dd-ing một đĩa đầy đủ là làm như vậy sẽ ghi đè lên bản ghi khởi động chính của đĩa nhận. Điều này chứa bảng phân vùng và thông tin quan trọng khác. Nếu đĩa mới không giống với đĩa cũ, điều này có thể tạo ra tất cả các loại bảng. Sao chép trên các phân vùng thường an toàn hơn (và các phân vùng trao đổi không phải được sao chép qua)


0

Tôi đã rời khỏi vai trò quản trị viên trong nhiều năm nay, nhưng tôi biết rằng 'dd' phụ thuộc vào công việc. Tôi đã sử dụng kỹ thuật này thường xuyên vào cuối những năm 80 trên máy tính Sun Sparc và 386i. Tôi đã có một đơn đặt hàng của khách hàng trên 30 hệ thống 386i chạy phần mềm CAD được phân phối trên nhiều băng QIC.

Chúng tôi đã cài đặt trên máy tính đầu tiên, định cấu hình ứng dụng, chạy sys-unconfig của SunOS, đặt ổ đĩa trong hộp đựng giày với một địa chỉ SCSI khác và sau đó tiến hành 'dd' cho 30 ổ đĩa khác.


0

Như những người khác đã đề cập ở trên, một trong những vấn đề nhân bản với hệ thống tập tin được gắn kết là tham nhũng dữ liệu tiềm năng. Điều này rõ ràng sẽ không áp dụng cho các bản sao ổ đĩa đầy đủ, nhưng nếu bạn đang sử dụng LVM, bạn có thể Chụp nhanh LogicalVolume và dd từ ảnh chụp nhanh để có được hình ảnh nhất quán.



0

Chỉ là một cảnh báo cho những người mới bắt đầu cần phải nói: Ít nhất là với một số Phiên bản, bs = X có nghĩa là bộ nhớ theo kích thước của X sẽ được phân bổ theo nghĩa đen. bs = 2GB trên hệ thống có 1GB RAM và trao đổi không đủ SILL gây ra những điều tồi tệ xảy ra.

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.