Tại sao chỉ định kích thước khối khi sao chép các thiết bị có kích thước hữu hạn?


14

Trong hướng dẫn trực tuyến, người ta thường đề xuất sử dụng lệnh sau để sao chép CDROM sang hình ảnh iso:

$ dd if=/dev/dvd of=foobar.iso bs=2048

Tại sao kích thước byte phải được chỉ định? Tôi nhận thấy rằng trên thực tế 2048 là kích thước byte tiêu chuẩn cho hình ảnh CDROM nhưng có vẻ như ddkhông có chỉ định bs=hoặc count=hoạt động tốt.

Trong trường hợp nào sẽ không có vấn đề gì khi không chỉ định bs=hoặc count=khi sao chép từ một thiết bị có kích thước hữu hạn?

Câu trả lời:


12

Khi nào dd thích hợp để sao chép dữ liệu? (hoặc, khi được đọc () và ghi () một phần) chỉ ra một cảnh báo quan trọng khi sử dụng count: ddcó thể sao chép các khối một phần, do đó, khi được cung cấp, countnó sẽ dừng sau số khối đã cho, ngay cả khi một số khối chưa hoàn thành. Do đó, bạn có thể kết thúc với ít hơn bs * countbyte được sao chép, trừ khi bạn chỉ định iflag=fullblock.

Kích thước khối mặc định cho dd là 512 byte. countlà một giới hạn; như câu hỏi của bạn gợi ý không cần thiết khi sao chép một thiết bị có kích thước hữu hạn và thực sự chỉ nhằm sao chép một phần của thiết bị.

Tôi nghĩ có hai khía cạnh để xem xét ở đây: hiệu suất và phục hồi dữ liệu.

Liên quan đến hiệu suất, lý tưởng nhất là bạn muốn kích thước khối ít nhất bằng và bội số của kích thước khối vật lý cơ bản (do đó là 2048 byte khi đọc CD-ROM). Trong thực tế hiện nay bạn cũng có thể chỉ định kích thước khối lớn hơn để cung cấp cho các hệ thống bộ đệm ẩn bên dưới cơ hội để đệm mọi thứ cho bạn. Nhưng việc tăng kích thước khối có nghĩa là ddphải sử dụng nhiều bộ nhớ hơn và nó có thể phản tác dụng nếu bạn sao chép qua mạng vì phân mảnh gói.

Theo như phục hồi dữ liệu, bạn có thể lấy thêm dữ liệu từ một đĩa cứng bị lỗi nếu bạn sử dụng kích thước khối nhỏ hơn; đây là những gì các chương trình như dd-rescuetự động thực hiện: ban đầu chúng đọc các khối lớn, nhưng nếu một khối bị lỗi, chúng sẽ đọc lại nó với kích thước khối nhỏ hơn. ddSẽ không làm điều này, nó sẽ thất bại toàn bộ khối.


2
Hiệu suất đặc biệt; viết một hình ảnh phân vùng vào thẻ SD, ví dụ, sử dụng dd bs=4m iflag=fullblockvs dd bs=1111và chú ý tốc độ dữ liệu cao hơn đáng kể mà trước đây sẽ cung cấp cho bạn. Điều này là do cái trước phù hợp với kích thước khối tự nhiên trên thẻ SD, trong khi cái sau đòi hỏi bộ điều khiển SD phải đọc, sao chép và phản xạ nhiều để viết các khối vật lý một phần. Tuy nhiên, tầm quan trọng của fullblockkhông nên được đánh giá thấp, vì nếu không có nó, bschỉ có một lần đọc tối đa và một phần có thể dẫn đến những sai lệch kéo dài sau đó.
Jason C

6

Có một chút của một giáo phái hàng hóa xung quanh dd. Ban đầu, có hai lỗi cpgây ra sự cố: Nó sẽ phát hiện sai các tệp là thưa thớt khi được báo cáo với kích thước khối khác 512 (Linux sử dụng kích thước khối 1024) và không xóa các khối trống từ đích khi sao chép từ tập tin thưa thớt đến một thiết bị khối.

Bạn có thể tìm thấy một số tài liệu tham khảo về điều này trong kho lưu trữ danh sách gửi thư Linux đầu tiên .

Vì vậy, mọi người đã quen với dd là cách chính xác để đối phó với hình ảnh đĩa, và cp rơi bên đường. Và vì dd sử dụng kích thước khối mặc định là 512, nên nó chậm (chậm hơn cp trên các hệ thống hiện đại). Nhưng không rõ ràng kích thước khối bạn nên sử dụng. Có thể trong trường hợp của bạn, ai đó đã đọc rằng 2048 là kích thước khối "tự nhiên" cho CD-ROM (nghĩa là, CD-ROM được chia thành 2.352 byte cung chứa 2.048 byte dữ liệu cùng với thông tin sửa lỗi) và đã quyết định rằng là kích thước "đúng" để sử dụng với dd, trong khi thực tế bạn có thể sẽ nhận được kết quả nhanh hơn nếu bạn sử dụng kích thước khối lớn hơn (vừa phải). Trong thực tế, GNU cp sử dụng kích thước khối mặc định là 64k vì lý do này.

tl; dr: cp /dev/dvd foobar.iso nên hoạt động tốt. Kích thước khối mặc định cho ddlà 512. Hiệu ứng duy nhất để nó một mình có khả năng có trong hầu hết các trường hợp hiện đại là làm cho quá trình sao chép chậm hơn.


nó có thể đã thay đổi, dù sao GNU cp sử dụng kích thước khối 128k theo mặc định (không phải 64k), xem eklitzke.org/ffic-file-copying-on-linux
apurkrt 7/12/19

5

Thay đổi kích thước khối là một cách tốt để thay đổi số lượng được đệm hoặc được đọc / ghi tại một thời điểm.

Không thực sự liên quan đến việc đó là một thiết bị khối thực hay vô hạn / ảo. Đó là về mức độ bạn muốn lưu trữ trong bộ nhớ trước khi ddviết nó ra. bs=thiết lập cả hai ibs=(bao nhiêu dữ liệu được đọc tại một thời điểm) và obs=(bao nhiêu dữ liệu được ghi ra cùng một lúc). Càng cao, obs=càng nhiều lần lặp lại ibs=sẽ được yêu cầu trước khi bạn có đủ dữ liệu ddđể bắt đầu ghi đến đích.

count=cũng không phụ thuộc vào bất cứ điều gì khác ngoài những gì bạn muốn làm. Nó kiểm soát số lượng "khối" (được đo bằng ibs=) sẽ được yêu cầu ddđể xem xét công việc của nó được thực hiện.


Lưu ý Điểm của Stephens ddsao chép các khối một phần - không phải lúc nào cũng vậy bs * count.
Drav Sloan 9/03/2015

Lưu ý rằng trên một số hệ thống unix, bạn phải đọc nhiều kích thước khối gốc; ddkhông có bs=2048hoặc một số bội số của nó sẽ báo lỗi khi đọc từ ổ đĩa cdrom của thiết bị khối.
wurtel

2

Sử dụng tùy chọn chặn kích thước trên ddchỉ định một cách hiệu quả lượng dữ liệu sẽ được sao chép vào bộ nhớ từ hệ thống phụ I / O đầu vào trước khi cố gắng ghi lại vào hệ thống phụ I / O đầu ra. Đầu ra giống nhau (vì toàn bộ đĩa đang được sao chép), các khối chỉ được đọc ở kích thước khác nhau mà bạn chỉ định (hầu hết các ddcài đặt đều đi với kích thước khối mặc định là 512 byte).

Nếu bạn có số lượng lớn bộ nhớ dự phòng và tăng kích thước khối, thì các khối dữ liệu lớn hơn có thể được đọc liên tiếp, được đệm và chuyển đến đích đầu ra. Một kích thước khối thấp hơn đòi hỏi nhiều chi phí hơn về từng lseek, memset, v.v.

Số dặm của bạn có thể thay đổi tùy thuộc vào vị trí của bạn if=of=được đặt, và phần cứng bạn đang trải qua, nếu bạn có bộ nhớ thấp và vv.


1

Các bs = đại diện cho kích thước khối để đọc hoặc viết. Để nguyên trường hoặc không chỉ định nó có vẻ thực hiện cùng một công việc sao chép nhưng có một thực tế ẩn trong việc sử dụng nó. Ví dụ,

  • Có 1000000000000000 tệp với mỗi tệp chỉ 1 ~ 10 kb.
  • Có một tệp duy nhất cho 10 gb

Trong trường hợp đầu tiên sử dụng kích thước khối thấp hơn đã được tìm thấy để tăng tốc độ sao chép. Trong khi ở phần sau, kích thước khối cao hơn là một lựa chọn tốt hơn vì nó làm tăng kích thước cung để lại số sector changelệnh ít hơn , điều này thường dẫn đến các hoạt động I / O nhanh hơn.

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.