Tôi đã hỏi câu hỏi trên #btrfs IRC, họ nói should be ok if your hw isn't "buggy"
không - "lỗi" nghĩa là gì your hw has correct flush/barrier semantics
.
TL; DR: Điều này có nghĩa là btrfs được bảo vệ chống tham nhũng dữ liệu do mất điện theo cách tương tự như ZFS.
Đây là lý do: Ý tưởng chung đằng sau ZFS và btrfs là tương tự nhau. Cả hai đều sử dụng cây Merkle làm cấu trúc dữ liệu . Ghi có thể yêu cầu nhiều khối trên đĩa được cập nhật. Hệ thống tệp đang xử lý việc này bằng cách ghi dữ liệu mới vào các khối trống (ngay cả khi tệp hiện có đang được sửa đổi, do đó không cần sửa đổi các khối phản ánh trạng thái cũ) và xây dựng cây cập nhật mới. Khi tất cả các công việc nặng được thực hiện và dữ liệu + cây cập nhật đã được ghi vào đĩa, con trỏ đầu được cập nhật vào cây mới để thay đổi hiển thị.
Đây là cách mọi thứ được cho là ứng xử khi ghi vào tệp:
- Ghi dữ liệu vào các khối miễn phí trên đĩa.
- Tạo một bản sao của cây Merkle *, cập nhật nó theo những thay đổi được ghi trong (1).
- Yêu cầu phần cứng chuyển dữ liệu vào đĩa - phần cứng ghi tất cả dữ liệu đang chờ xử lý.
- Cập nhật con trỏ đầu đến cây Merkle mới.
- Các khối cũ miễn phí không cần thiết nữa.
Nếu mất điện sau (4) giao dịch hoàn tất. Nếu mất điện trong các bước (1) đến (3), hệ thống tệp sẽ xuất hiện trạng thái cũ (dữ liệu được ghi ở bước (1) bị mất nhưng hệ thống tệp phù hợp). Lưu ý rằng không cần kiểm tra lỗi hệ thống tệp, điều đó có nghĩa là hệ thống tệp có sẵn ngay lập tức, đó là một lợi thế lớn (kiểm tra hệ thống tệp lớn có thể mất nhiều thời gian!).
Dưới đây là một ví dụ về cách mọi thứ có thể đi sai với phần cứng "lỗi":
- Ghi dữ liệu vào các khối miễn phí trên đĩa.
- Tạo một bản sao của cây Merkle *, cập nhật nó theo những thay đổi được ghi trong (1).
- Yêu cầu phần cứng xóa dữ liệu vào đĩa - phần cứng xác nhận hoàn thành nhưng không hoàn toàn xóa (ví dụ: dữ liệu có thể vẫn còn trong bộ đệm ghi lại của đĩa).
- Cập nhật con trỏ đầu đến cây Merkle mới. Dữ liệu này được ghi vào đĩa trước các dữ liệu đang chờ xử lý khác (ví dụ: do phần đầu của đĩa xảy ra ở đúng vị trí).
- Dữ liệu được ghi trong các bước (1) và (2) được ghi vào đĩa.
- Các khối cũ miễn phí không cần thiết nữa.
Hệ thống tập tin sẽ trở nên không nhất quán nếu mất điện giữa (4) và (5) hoặc trong khi thực hiện bước (5). Do đó, cây Merkle và / hoặc dữ liệu chỉ có thể được ghi một phần khiến hệ thống tệp trở nên không nhất quán.
Trong thực tế, bạn phải đặc biệt cẩn thận khi sử dụng bộ điều khiển RAID . Họ thường vô hiệu hóa bộ đệm ghi lại trên đĩa và sử dụng bộ đệm ghi lại của riêng họ để thay thế. Có hai cách phổ biến để mọi thứ đi sai ở đây:
* Tôi đang đơn giản hóa mọi thứ ở đây. Thật sự không cần thiết phải sao chép toàn bộ cây. Chỉ những phần đã thay đổi cần được thêm vào - những phần còn lại có thể được chia sẻ giữa cây cũ và cây mới .
zpool clear -F
lệnh