Tại sao dd mất quá nhiều thời gian?


17

Tôi cần phải sao chép một đĩa sang đĩa khác. Tôi đã thử với lệnh dưới đây và phải mất gần một ngày để sao chép 1 TB đĩa trong federo.

dd if=/dev/sda of=/dev/sdb 

Tôi đã thử tương tự trên hệ thống Unix (HP-UX) với lệnh bên dưới và nó sẽ hoàn thành trong vài giờ

dd if=/dev/sda of=/dev/rdsk

Sự thay thế tôi có thể sử dụng để sao chép từ đĩa này sang đĩa nhanh hơn là gì?


2
cp /dev/sda /dev/sdbhoặc ( pv /dev/sda > /dev/sdb để có được một thanh tiến trình) sẽ nhanh hơn rất nhiều. Tại sao bạn sẽ sử dụng ddở đây? ddsẽ chỉ có ích với những thứ như conv=sync,noerrorđể xử lý đĩa có lỗi, nhưng thậm chí sau đó nó sẽ có ý nghĩa hơn đối với những thứ sử dụng như ddrescuethay thế (xem cũng pv's -Etùy chọn).
Stéphane Chazelas

1
@ StéphaneChazelas catthậm chí có thể nhanh hơn nhưng sự khác biệt không quá lớn (có thể lớn hơn đối với thiết bị so với thiết bị so với tệp như trong thử nghiệm của tôi).
Gilles 'SO- ngừng trở nên xấu xa'

8
"Tôi đã thử tương tự trên hệ thống Unix" - Vậy bạn đã thử loại hệ thống nào đầu tiên, nếu không phải là Unix? Ngoài ra, những gì phần cứng, vv, yaddayadda.
marcelm

Chào mừng bạn đến ddcạm bẫy số 1
Dmitry Grigoryev

Được sử dụng đầu tiên trong HP-UX (lưỡi toàn vẹn) và trước đó cũng sử dụng máy Solaris.
KKD

Câu trả lời:


27

ddcó nhiều tùy chọn (lạ), xem dd (1) .

Bạn nên nói rõ kích thước bộ đệm, vì vậy hãy thử

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

IIRC, kích thước bộ đệm mặc định chỉ 512 byte. Lệnh trên đặt nó thành 16 megabyte. Bạn có thể thử một cái gì đó nhỏ hơn (ví dụ bs=1M) nhưng bạn nên sử dụng nhiều hơn mặc định (đặc biệt là trên phần cứng đĩa gần đây với các lĩnh vực 4Kbyte, tức là Định dạng Nâng cao ). Tôi ngây thơ đề nghị một số sức mạnh của hai mà ít nhất là một megabyte.

Với kích thước bộ đệm 512 byte mặc định, tôi đoán (nhưng tôi có thể rất sai) rằng phần cứng yêu cầu kernel chuyển 4K cho mỗi khối 512 byte.

Về rdsk, các trang man (4) cho biết:

Tại thời điểm này, chỉ có các thiết bị khối được cung cấp. Các thiết bị thô chưa được thực hiện.

Tăng kích thước bộ đệm của dd sẽ cung cấp cho bạn hiệu suất cao hơn cho các hoạt động đọc và ghi. Bây giờ tất cả các đĩa có bộ đệm đọc / ghi phần cứng. Nhưng nếu bạn sẽ tăng kích thước bộ đệm của dd nhiều hơn bộ đệm phần cứng thì hiệu suất của nó sẽ giảm vì dd sẽ đọc từ đĩa thứ nhất sang bộ đệm khi đĩa thứ hai sẽ ghi tất cả từ bộ đệm phần cứng của chính nó. Bạn cần đặt bstùy chọn lệnh dd mỗi lần giá trị khác nhau cho các thiết bị khác nhau.


Cho dù ndsk có sẵn trong các hệ thống Linux? Tôi đã sử dụng trong các hệ thống Unix.
KKD

1
Bộ nhớ cache của trang có thể sẽ xử lý các khối 4Kb bất cứ điều gì bạn làm, nhưng bạn có thể kiểm soát số lượng tòa nhà dd sử dụng để đọc 4Kb đó. Tôi chắc chắn có một số kích thước đọc ở trên mà chi phí cho việc viết bị đình trệ đắt hơn so với các tòa nhà được lưu, nhưng không biết điểm ngọt ở đâu.
Vô dụng

Kích thước khối của một vài MB tốt hơn so với 512B mặc định nhưng khi tôi đo điểm chuẩn này, tôi thấy điều đó catcũng tương tự (đối với chuyển hệ thống tập tin sang hệ thống tập tin, khối trực tiếp có thể có các đặc điểm hiệu suất khác nhau). Tuy nhiên, sự khác biệt là không đáng kể trong mọi trường hợp.
Gilles 'SO- ngừng trở nên xấu xa'

1
Thật thú vị, trong macOS (được chứng nhận bởi SUS, btw), nó nhanh hơn để sử dụng/dev/rdiskX làm mục tiêu khi thực hiện dd.
adib

1
trong trường hợp bạn tự hỏi điều gì đang xảy ra (như tôi đã làm) thì cũng status=progresssẽ thêm toàn bộ tiến trình hoạt động.
Aleksander Lech

16

Nhiều năm trở lại vùng đất Unix ddlà cách bắt buộc để sao chép một thiết bị khối. Điều đó đã được chuyển tiếp như kiến ​​thức sùng bái hàng hóa mặc dù (trên các hệ thống dựa trên Linux, ít nhất) catgần như luôn luôn nhanh hơn dd.

Tuy nhiên, ngay cả trong lịch sử, kích thước khối khá đã giúp giảm số lượng cuộc gọi hệ thống (chậm), với điều kiện là mỗi cuộc gọi hệ thống đã kích hoạt thao tác I / O. Kích thước khối mặc định là 512 byte (một rãnh đĩa). Việc thu thập nhiều khối đĩa lại với nhau thành một lần đọc là - và - cũng được chấp nhận. Ví dụ này sử dụng kích thước khối 32 MB:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

Tuy nhiên, trên các hệ thống dựa trên Linux hiện tại, các đĩa có thể được sao chép hiệu quả nhất với một cách đơn giản cat

cat /dev/source >/dev/target

(Như đã lưu ý trong các nhận xét về câu hỏi của bạn pvcó thể được thay thế catvà sẽ cho bạn một dấu hiệu về sự tiến bộ và thông lượng.)


2
Cụ thể, lý do dd phải được sử dụng là lỗi trong GNU cp và lỗi trong kernel linux vào đầu những năm 90. Lý do sử dụng dd trên các hệ thống unix lịch sử rất khác nhau và muốn sao chép toàn bộ thiết bị khối là một điều bất thường muốn làm.
Random832

1
@ Random832 muốn sao chép toàn bộ đĩa sẽ không bình thường, nhưng tôi nhớ cần phải sao chép các phân vùng xung quanh (những cái lớn - 150 hoặc thậm chí 200 MB)
roaima

2
. chặn trong nguồn của bạn sẽ có bất kỳ rác nào xảy ra trên đĩa)
Random832

Tôi thích loại câu trả lời này. Cảm ơn bạn về thông tin. Đây là cập nhật của bạn.
catbadger

7

Nói chung, ddcó thể tránh được ủng hộ một số lựa chọn thay thế. Có một số lý do tốt để sử dụng GNU ddrescuethay thế. Trong Ubuntu, bạn có thể cài đặt nó với:

sudo apt-get install gddrescue

và chỉ đơn giản ddrescueđể sử dụng. Lưu ý rằng khác với tên gói, tệp thực thi không có chữ cái đầu g.

Sử dụng nó đơn giản như:

ddrescue inputFile outputFile logFile

Tệp nhật ký (được đặt tên bất cứ thứ gì bạn chọn) cho phép bạn tạm dừng / dừng và khởi động lại mà không cần làm lại công việc trước đó, điều này rất hữu ích khi thực hiện các bản sao lớn hoặc khôi phục đĩa. Theo mặc định, nó hiển thị tiến trình, tốc độ sao chép hiện tại, tốc độ sao chép trung bình và số khối xấu được tìm thấy.

Nó sử dụng mặc định hợp lý cho kích thước khối, do đó, tốc độ sao chép luôn nhanh như thiết bị có thể xử lý, theo kinh nghiệm của tôi ít nhất (tôi đã nhân bản hàng trăm ổ đĩa với nó, tất cả các kích cỡ và loại).

Thông thường, các ổ đĩa bắt đầu bị lỗi có vấn đề về tốc độ, chẳng hạn như các bản vá lỗi chậm, tốc độ trung bình thấp, tạm dừng dài đột ngột (các thành phần xấu) hoặc đặt lại hoàn toàn (lỗi bề mặt nghiêm trọng). ddrescuecó thể giúp bạn xác định tất cả các mục trên và khởi động lại bản sao của mình (miễn là bạn đã chỉ định tệp nhật ký) ngay cả khi ổ đĩa của bạn được đặt lại.


6

Câu hỏi rất hay. Giao diện thô được triển khai trên một số hệ thống unix (tru64, hpux, solaris) nhưng không phải trên linux. Giao diện thô giúp truyền nhanh hơn vì bỏ qua I / O unix. Giao diện khối ( /dev/dskhoặc /dev/disk) chậm hơn vì nó sử dụng hệ thống I / O unix. Để tăng tốc dd(gnu dd có thể) sử dụng bs=30Mhoặc bs=20Mtùy thuộc vào hw của bạn. Câu trả lời ngắn gọn là: KHÔNG nó không được thực hiện, ít nhất là theo như tôi biết. Tôi đang sử dụng linux từ thời cũ của phiên bản kernel 2.2 và chưa bao giờ thấy rdsksử dụng trên unix.


5
Tại sao bạn đề xuất một kích thước khối không phải là sức mạnh của hai?
Basile Starynkevitch

2
@Basile nhiều kích thước khối đĩa là đủ, vì vậy 20MiB sẽ ổn.
roaima
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.