2010-03-05 10 views
13

Tôi đang viết tập lệnh sao lưu màLàm cách nào để xóa bộ nhớ cache của đĩa cứng và flash-disk (hoặc hệ thống tệp) khỏi dòng lệnh?

  1. Sao chép dữ liệu vào đĩa sao lưu.
  2. Làm phẳng đĩa sao lưu.
  3. Thực hiện kiểm tra tính toàn vẹn băm.

Trước khi tôi sử dụng để làm sleep(60) để chờ một phút để dữ liệu tự động được hạt nhân xả. Mà tôi đoán là quá mức cần thiết vì vậy bây giờ tôi đang cố gắng sudo hdparm -F --verbose /dev/disk nhưng nó báo cáo lỗi - HDIO_DRIVE_CMD(flushcache) failed: Invalid exchange nhiều lần.

Tôi tự hỏi là có cách nào tiêu chuẩn để xóa bộ đệm ẩn sang đĩa cứng. Tôi nghĩ rằng có bởi vì usb-creator-gtk hiện nó, umount hiện nó.

Tôi đang sử dụng Ubuntu x64 9.10

PS: Tôi đang cố gắng để tránh "đồng bộ hóa" bởi vì trang này nói rằng nó là không an toàn. http://ubuntuforums.org/showthread.php?t=589975

+2

Để rõ ràng, đó là lệnh 'echo 3>/proc/sys/vm/drop_caches' mà anh cho là không an toàn. Dù sao anh cũng sai. – Gabe

Trả lời

26

sync có đủ không?

Chỉnh sửa: liên quan đến chỉnh sửa của bạn - bạn đang cố gắng tránh đồng bộ hóa vì một số người trên internet đặt tuyên bố từ chối trách nhiệm CYA trên bài đăng của mình? Có lẽ có điều gì đó sai trái với việc đồng bộ hóa mà tôi không biết nhưng điều đó có thể đáng giá một bài đăng thứ 2 trong chính nó.

Tuy nhiên, từ các trang thông tin linux:

đồng bộ ghi bất kỳ dữ liệu nào được lưu vào bộ nhớ trong ổ đĩa. Điều này có thể bao gồm (nhưng không giới hạn) superblocks đã sửa đổi, inodes được sửa đổi, và trì hoãn việc đọc và ghi. Điều này phải được thực hiện bởi hạt nhân; Chương trình đồng bộ hóa không làm gì ngoài việc thực hiện cuộc gọi hệ thống 'đồng bộ'.

+1

Tôi nghĩ anh ấy phải chạy "đồng bộ", không phải "đồng bộ 1 người". :-) – bmargulies

+0

Vâng, đó là rõ ràng hơn. Đã thay đổi. – Duck

+1

Trên OSX fsync không đủ. Bạn cần sử dụng fcntl với F_FULLFSYNC. Tôi đã nói với một số người rằng fsync cũng không đủ trên Linux nhưng tôi không chắc chắn. Linux không có F_FULLFSYNC. –

2

Bạn muốn gọi hàm fsync (man section 2), nhưng nếu bạn làm điều này trong một tập lệnh, có thể bạn sẽ muốn sử dụng lệnh đồng bộ (phần 8), mà chỉ gọi sync().

+7

Trên thực tế dòng lệnh "đồng bộ" (phần 8) gọi hàm hệ thống "sync()" (section2), không phải chức năng hệ thống "fsync (int fd)" (phần 2). Trong một trường hợp, tất cả các tệp được đồng bộ hóa, trong một tệp khác chỉ là một tệp cụ thể vẫn mở được đồng bộ hóa. –

+1

Bạn đúng, Mark. Rất tiếc! – George

+0

cái nào là đồng bộ hóa tất cả các tệp và cái nào là tệp chỉ đồng bộ hóa một số tệp? Nếu fsync bạn đề cập là một đồng bộ hóa tất cả các ghi đang chờ xử lý thì làm thế nào để chúng ta truy cập nó? Có một lệnh cho fsync? – Neal

Các vấn đề liên quan