chờ lệnh dd ghi đầy đủ vào đĩa


13

Tôi đang sử dụng lệnh dd để tạo một USB có thể khởi động từ tệp iso:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M

Sau khi nhấn enter, nó thoát ra trong giây lát và đưa cho tôi:

915+0 records in 915+0 records out 959447040 bytes (959 MB) copied,
0.539375 s, 1.8 GB/s

Vì vậy, nó giống như chạy trong nền vì tôi có thể thấy rằng ổ đĩa flash đang hoạt động. Cuối cùng, nó sẽ dừng sao chép và tôi có thể xóa ổ đĩa thành công nhưng câu hỏi đặt ra là tại sao lệnh dd không chờ sao chép xong. Tại sao nó chạy trong nền. Và làm thế nào tôi có thể làm cho nó chờ đợi?


4
Bạn đã thử syncchưa
choroba

1
@choroba Có nghĩa là chạy 'đồng bộ hóa' nếu hệ thống đã ghi dữ liệu vào ổ đĩa flash?
Kir Ivlev

Tôi không chắc chắn, byt synccó thể chờ đợi.
choroba

2
ddcũng có một số tùy chọn đồng bộ, ví dụ conv=fsync. Điều đó nói rằng, tôi không bao giờ phải sử dụng nó với /dev/sd*các ổ đĩa bản thân mình. Nếu bạn thực sự sử dụng /dev/sdxdự đoán của tôi thì bạn đã có một tệp 959 MB vô dụng trong /dev(ramdisk) ngay bây giờ ...
frostschutz

1
@frostschutz Tôi đã sử dụng / sdc cho ổ đĩa flash của mình
Kir Ivlev

Câu trả lời:


21

Mặc dù có niềm tin phổ biến, ddlà một mệnh lệnh hoàn toàn bình thường, nó không phải là cấp thấp hơn cathay cp. Lệnh của bạn đọc từ bộ đệm đĩa và ghi vào bộ đệm đĩa như bất kỳ lệnh nào khác.

Để đảm bảo rằng dữ liệu được ghi đầy đủ vào phương tiện vật lý, bạn cần gọi sync. Lệnh syncxóa tất cả các bộ đệm đầu ra vào (các) đĩa. Khi synclệnh trả về, dữ liệu đã được ghi đầy đủ.

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M; sync

Hầu hết thời gian, bạn không cần phải gọi sync, bởi vì việc ngắt kết nối một hệ thống tập tin thực hiện cùng một công việc. Khi umountlệnh trả về hoặc khi bạn nhận được thông báo xác nhận sau khi nhấp vào Eject, thì bộ đệm đã được ghi vào đĩa. Tại đây, bạn đang trực tiếp ghi vào đĩa mà không thông qua hệ thống tập tin được gắn kết, vì vậy bạn cần phải xóa bộ đệm một cách rõ ràng.

Lưu ý rằng thay vì dd, bạn có thể sử dụng tee. Điều này có hai ưu điểm: có ít rủi ro đảo ngược nguồn và đích do lỗi đánh máy và có lẽsẽ nhanh hơn một chút .

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync

1
Làm thế nào về các nút / biểu tượng "Eject" hoặc "Loại bỏ an toàn". Họ cũng sẽ không gọi đồng bộ hóa trước khi đưa ra thông báo "OK để xóa"?
dùng68186

1
Bạn có thể muốn sử dụng sudo tee /dev/sdx >/dev/null, nếu không, quá trình sao chép vẫn sẽ rất chậm do dữ liệu được ghi vào đầu ra của bàn điều khiển.
Lekensteyn

1
@ user68186 Họ không gọi synclệnh, nhưng họ thực hiện cùng một công việc dưới mui xe.
Gilles 'SO- ngừng trở nên xấu xa'

5
Câu trả lời này là sai. Không có conv=fdatasync, ddlệnh không chờ kết thúc cho đến khi dữ liệu được ghi vào đĩa, như OP yêu cầu. Hơn nữa, synclệnh lên lịch một hoạt động đồng bộ, nhưng nó ngay lập tức trả về; nó không chờ đợi để trở lại cho đến khi dữ liệu được ghi vào đĩa.
vy32

1
@ vy32 bạn ddsẽ không chờ bộ đệm được xóa mà không có conv=fdatasyncvv, nhưng trên Linux không cổ, bạn không chính xác về việc synckhông chờ đợi. Bạn có thể thấy coreutils' sync(8)làm cho sync(2)syscall . Trang sync(2)con người nói "Trước phiên bản 1.3.20 Linux không đợi I / O hoàn thành trước khi quay lại." vì vậy sync(8)sẽ không trở lại cho đến khi đĩa xác nhận ghi (hoặc một lỗi được kích hoạt).
Anon

13

Thử đi:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx conv=fdatasync bs=1m

Các conv=fdatasynckể ddđể sử dụng các tùy chọn đặc biệt để đảm bảo rằng các dữ liệu được ghi vào thiết bị vật lý.

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.