Tại sao dd đôi khi không đợi cho đến khi dữ liệu được viết?


20

Đôi khi, khi tôi viết hình ảnh vào ổ đĩa flash, điều này xảy ra:

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

Về cơ bản, Linux lưu trữ mọi thứ, không viết gì và ddthoát. Sau khi tôi gõ sync, nó bắt đầu ghi dữ liệu (đèn LED ổ đĩa flash bắt đầu nhấp nháy).

Lý do tại sao điều này xảy ra?


3
Bạn có chắc chắn /dev/sdclà một thiết bị thực tế trên hệ thống của bạn và bạn không ghi vào tệp /dev/sdc? Làm một ls --color /dev- /dev/sdcnên có màu vàng nếu đó là một thiết bị.
LawrenceC

Câu trả lời:


21

Sử dụng cái này thay thế:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

Điều này gọi fsync()sau mỗi write()cuộc gọi hệ thống. Điều này buộc ddkhông lưu trữ bất cứ điều gì. Xem phần này của trang chủ của fsync ( man 2 fsync):

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

Đây là hành vi mặc định của hạt nhân. Các hạt nhân Linux quản lý các bộ đệm ghi và đọc như thế này: Khi tòa nhà write()được phát hành, dữ liệu sẽ nhanh chóng được ghi vào bộ đệm và trạng thái hoàn thành ghi được gửi đến quá trình. Khi bộ đệm là cần thiết hoặc khi có thời gian rảnh trên xe buýt, dữ liệu được ghi từ bộ đệm vào đĩa cứng.


1
Tôi thích câu trả lời của bạn và của tôi bao gồm các cách tiếp cận gần như hoàn toàn khác nhau. Đẹp, +1.
ChrisInEd hôm

1
@ChrisInEdmont dito +1
hỗn loạn

tất cả các câu trả lời là tốt trong câu hỏi này.
Francisco Tapia

@chaos Chỉ cần làm rõ: Đây là hành vi mặc định của hạt nhân. -Bạn có nghĩa conv=fsynclà mặc định khi ghi vào các thiết bị ddkhông lưu bộ đệm gì không? Tìm kiếm một câu trả lời tốt cho điều này: unix.stackexchange.com/questions/312687/iêu
Jonathan Komar

10

Điều này xảy ra bởi vì Linux và hầu hết các hệ điều hành khác, lưu trữ cả đọc và ghi. Trong hầu hết các trường hợp, điều này làm cho hệ điều hành của bạn phản ứng nhanh hơn.

Nếu bạn muốn đảm bảo dữ liệu được lưu trong bộ nhớ cache đã được ghi, bạn muốn sử dụng sync, như bạn biết. Linux cũng cho thấy một số lượng đáng kể các cài đặt mà bạn có thể điều chỉnh. Bài viết này cung cấp một cái nhìn tổng quan tốt về một số cài đặt. Ví dụ, bạn có thể đặt vm.denty_background_bytes thành 0 để đảm bảo hạt nhân khởi động các luồng flaker ngay lập tức.


7

đồng bộ hóa (8) - Trang người dùng Linux :

Nhân giữ dữ liệu trong bộ nhớ để tránh việc đọc và ghi đĩa (tương đối chậm). Điều này cải thiện hiệu suất, nhưng nếu máy tính gặp sự cố, dữ liệu có thể bị mất hoặc hệ thống tệp bị hỏng. đồng bộ hóa đảm bảo rằng mọi thứ trong bộ nhớ được ghi vào đĩa.

Lưu ý: unmount(hoặc đẩy ra) tự động gọi sync"ẩn" điều này trong việc sử dụng hệ thống tệp thông thường.

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.