Tại sao tùy chọn đồng bộ được sử dụng với lệnh `dd`?


13

Theo hướng dẫn trên này trang, trang này trình bày một ddlệnh và một synctùy chọn ở cuối. Lệnh này là như sau:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync

Tôi biết nó là gì ddvà hoạt động như thế nào nhưng tôi chưa bao giờ nghe hoặc sử dụng synctùy chọn này và mục nhập trang thủ công của nó giống như:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs

Nó là gì NULvà tại sao nó được đệm vào ibs-size, và tại sao phải đệm các khối dữ liệu và sử dụng synctùy chọn với ddlệnh? Tại sao không giữ nó đơn giản và dễ dàng?

Khi tôi cố chạy syncvới lệnh như với vị trí và giá trị phù hợp, tôi gặp lỗi sau:

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 

Câu trả lời:


21

Bạn đang đọc sai lệnh. Nó là:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync

synclà một lệnh riêng biệt, ở đây. Xem man 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.

Rõ ràng là tại sao nó được sử dụng một khi bạn nghĩ về bộ nhớ đệm.

Đối với các ddtùy chọn mà bạn đọc, đó là một giá trị cho các convtùy chọn :

Each CONV symbol may be:
   ascii  from EBCDIC to ASCII
   ...
   sync   pad every input block with NULs  to  ibs-size;  when  used  with
          block or unblock, pad with spaces rather than NULs

Nếu nó được sử dụng (cái mà nó không), thì nó sẽ được sử dụng:

dd ... conv=sync

3
Câu trả lời hay, rất chi tiết. Rất vui khi bạn thậm chí mô tả các dd ... conv=syncđối số.
Chỉ huy Byte

Đừng để họ chế nhạo bạn! ;-) Câu trả lời hay: bạn đã phát hiện ra vấn đề mà tôi thậm chí không nhìn thấy. > :-) +1
Fabby 6/12/2015

1
Cũng từ mô tả của conv=synctùy chọn, có vẻ như khá rõ ràng lý do tại sao nó không được sử dụng cho việc này. Tốt nhất là nó sẽ không làm gì cả, tệ nhất là nó sẽ làm hỏng hình ảnh trong khi sao chép.
kasperd

5
Thực sự hướng dẫn nên gọi cho các tùy chọn dd oflag=fsync(mà xả dd đầu ra đã viết) thay vì một synclệnh (mà xả tất cả mọi thứ trên hệ thống.
psusi

Câu trả lời này là sai lệch. Với dd, synclà một lập luận cho cả hai conviflaghoặc oflagtùy chọn.
Dan Loewenherz

3

Theo mặc định, dd sẽ đọc trong một khối dữ liệu tại một thời điểm, có thể đọc trong một khối ngắn hơn so với người dùng chỉ định, ở cuối tệp hoặc do hành vi của thiết bị nguồn; đây được gọi là bản ghi một phần . Sau đó, nó sẽ viết ra một khối có cùng kích thước với số lượng mà nó đọc.

Dd sẽ lặp lại điều này cho đến khi đạt được số lượng được chỉ định hoặc nó nhìn thấy eof trên đầu vào, hoặc lỗi trên đầu vào hoặc đầu ra. Khi nó kết thúc, dd báo cáo số lượng hồ sơ đầy đủ và một phần nó đọc và viết.

Hành vi này là tốt để sao chép một tệp thông thường trong một hệ thống tệp hoặc qua kết nối mạng TCP, vì đó được coi là một luồng byte. Nhưng các đối tượng hệ thống tập tin khác, chẳng hạn như DVD thô và băng từ, yêu cầu kích thước ghi nằm trong phạm vi nhất định và là bội số của một số lượng (chẳng hạn như 512 hoặc 2048 byte). Ví dụ: nếu bạn có hình ảnh đĩa là 255 rãnh của 63 cung 512 byte và muốn ghi vào băng yêu cầu kích thước khối 1024 byte, bạn cần thực hiện một số thứ như

dd if=disk.img of=/dev/rmt0 bs=1k conv=sync

để đảm bảo rằng dd không cố gắng viết ra một khối 512 byte ở cuối. Khối ngắn hơn ở cuối sẽ được đệm bằng số 0 hoặc khoảng trống. Đệm với số không là một lựa chọn an toàn, phổ biến. Tùy chọn cho dd để đệm với khoảng trống rất hữu ích trong một tình huống khác - chuyển đổi một tệp có các dòng có độ dài thay đổi thành một dòng có các dòng có độ dài cố định.


0

Tôi đã tìm thấy rằng hệ thống linux, không phải dd, lưu trữ bộ đệm. Do đó, khi lệnh dd hoàn thành, tôi chạy đồng bộ hóa như

sudo dd if=my.downloaded.iso of=/dev/sd(?) bs=1M && sync

Tôi đã không sử dụng bất kỳ tùy chọn dd nội bộ để gây ra lỗi bộ đệm. Thông thường, khi tôi đang tạo một phiên bản USB của một bản phân phối, tôi là người duy nhất trên máy tính, vì vậy tôi không hiểu gì về lệnh đã đăng của mình làm hại. Vì tôi chạy đồng bộ hóa dưới dạng &&, đồng bộ hóa được thực hiện với quyền sudo và tôi chắc chắn rằng USB tôi tạo đã hoàn tất.


0

Bạn có thể sử dụng synctùy chọn cho đầu ra, được bao gồm trong ddcomand, theo oflagký hiệu:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
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.