Hệ thống tập tin ghi có thể được lưu trong bộ nhớ cache với ext4 trong bao lâu?


14

Cách đây một thời gian, đã có một số cuộc thảo luận về ext4 có khả năng để lại các tệp trống sau khi một lần xóa ô uế, được tóm tắt khá tốt trong bài viết này . Về cơ bản, do phân bổ chậm, ghi có thể được giữ trong bộ đệm ghi trong thời gian dài hơn nhiều so với khoảng thời gian cam kết mặc định của tạp chí ext (5 giây).

Các vấn đề dường như đã được khắc phục trong một bản vá buộc phân bổ khối trong các tình huống nhất định, do đó buộc dữ liệu vào đĩa sau tối đa 5 giây theo mặc định.

Tôi đang tự hỏi điều gì sẽ xảy ra khi một ứng dụng ghi đè lên các phần hiện có của tệp mà không cắt bớt hoặc nối thêm tệp đó. Điều đó cũng sẽ bị buộc vào đĩa trong vòng 5 giây chứ?

Có vẻ như một tình huống khác với việc thêm vào một tệp: khi nối thêm, kích thước tệp thay đổi, đó là thay đổi siêu dữ liệu; do đó, một cam kết nhật ký sẽ cần thiết trong vòng 5 giây và vì dữ liệu = đã ra lệnh, dữ liệu sẽ phải được ghi trước đó vì lo ngại bảo mật (nếu không, các phần của các tệp đã bị xóa của người dùng khác có thể hiển thị cho chủ sở hữu của phần bổ sung tập tin).

Khi chỉ ghi đè dữ liệu tệp, không có lý do tại sao việc ghi dữ liệu phải xảy ra trước khi nhật ký siêu dữ liệu cam kết, vì dữ liệu cũ thuộc về cùng một người dùng với dữ liệu mới. Vì vậy, việc viết có xảy ra trước khi cam kết hay không, hoặc nó có thể bị trì hoãn lâu hơn khoảng thời gian cam kết tạp chí không? Nếu vậy thì bao lâu?

Cập nhật: Tôi biết rằng tất cả điều này là không liên quan khi thực hiện đúng, đó là sử dụng fsync (). (Đây là lý do chính cho tất cả các cuộc thảo luận về ext4 và mất dữ liệu - vấn đề chỉ liên quan đến các ứng dụng không phải là fsync () hoặc không đúng lúc.) Tôi không viết ứng dụng của riêng mình, tôi hỏi vì không biết liệu tất cả các ứng dụng của tôi có làm đúng hay không và tôi muốn biết một khung thời gian gần đúng cho các bài viết "nguy hiểm" như vậy. Lý do để hỏi là trình điều khiển đồ họa của tôi gây ra sự hoảng loạn hạt nhân thường xuyên và tôi muốn biết liệu tôi có phải lo lắng nhiều hơn 5 giây cuối cùng của việc ghi dữ liệu hay không.

Câu trả lời:


16

Bạn có thể đặt khoảng thời gian cam kết thành một giá trị tùy chỉnh, theo tôi, có thể cao bằng số nguyên không dấu 32 bit của giây; khoảng 4 tỷ giây, tương đương 136 năm. Điều này có sẵn thông qua committùy chọn gắn kết, mà bạn có thể thực hiện có hiệu lực như sau (đây chỉ là một ví dụ; bạn cũng có thể đặt tùy chọn này fstab):

mount /dev/sda1 -t ext4 -o rw,data=writeback,nobh,commit=12345678

Khoảng thời gian cam kết không dựa trên bất kỳ loại điều kiện nào như liệu dữ liệu được nối thêm hay ghi đè dữ liệu hiện có hay bất cứ điều gì. Các committùy chọn gắn kết (mặc định là 5 giây nếu bạn không cung cấp tùy chọn gắn tại tất cả) tương đương với làm một cái gì đó như thế này trong một vỏ bash:

#!/bin/bash
while :
do
    echo "Syncing all uncommitted data and journal to disk"
    sync
    sleep 5
done

Đừng nhầm lẫn data=orderedvà khoảng thời gian đồng bộ hóa hệ thống tệp toàn cầu này ("khoảng thời gian cam kết" có lẽ là một thuật ngữ ít ý nghĩa hơn đối với những người trong chúng ta hiểu chức năng của chương trình dòng lệnh sync, trong trường hợp đó có thể được đặt tên tốt hơn là "khoảng thời gian đồng bộ hóa"). data=orderedlà về thứ tự cập nhật dữ liệu và siêu dữ liệu (trong đó data=writeback"kém an toàn / nhanh hơn" và data=journal"an toàn hơn / chậm hơn"). commit=12345678là về tần suất mà trình điều khiển hệ thống tập tin tự buộc đồng bộ ĐẦY ĐỦ TẤT CẢ dữ liệu bẩn / tạp chí / siêu dữ liệu / bất cứ điều gì với phương tiện vật lý. Và bạn chắc chắn có thể đặt nó thành 136 năm nếu bạn muốn, và gắn kết với data=writeback,nobhvà các chương trình không gọi fsync()hoặc sync()sẽ có các trang bẩn ngồi trong RAM cho ...

Cập nhật: Dựa trên ngữ cảnh của bạn trong chỉnh sửa câu hỏi của bạn, tôi muốn nói rằng bạn nên chạy hệ thống tệp của mình với các tùy chọn gắn kết data=journal,commit=1hoặc thậm chí với synctùy chọn gắn kết, cho đến khi bạn có thể giải quyết sự hoảng loạn của trình điều khiển đồ họa. Điều này sẽ duy trì tính toàn vẹn dữ liệu tối đa nhưng với chi phí hiệu suất. Bạn sẽ đặc biệt muốn làm điều này nếu bạn thường xuyên ghi dữ liệu vào đĩa mà bạn không thể để mất và điều đó thực sự quan trọng nếu bạn không "tin tưởng" các ứng dụng bạn đang sử dụng để sử dụng fsync()một cách thích hợp.

Nguồn: ở đây và kinh nghiệm cá nhân


1
Cảm ơn, phần "TẤT CẢ dữ liệu bẩn" chính xác là điều tôi lo lắng! Tôi đã lo lắng rằng có nhiều ngoại lệ hơn ngoài việc phân bổ bị trì hoãn (điều này có thể khiến dữ liệu mới vẫn còn trong bộ đệm ghi ngay cả sau khoảng thời gian cam kết).
lxgr

1
Tôi khá chắc chắn rằng việc phân bổ bị trì hoãn là hoàn toàn không liên quan khi gọi sync(hoặc, tương đương, khi bộ đếm thời gian cam kết được kích hoạt). Tại thời điểm synchoàn thành, hoàn toàn không có dữ liệu bẩn, siêu dữ liệu hoặc trang tạp chí. Mọi thay đổi đối với hệ thống tập tin trong quá trình truyền dữ liệu đồng bộ đều bị chặn cho đến khi hoàn thành.
allquixotic

1
Có thật không? Trong bugs.launchpad.net/ubuntu/+source/linux/+bug/317781/comments/45 nó đặc biệt được đề cập rằng các trang chưa phân bổ sẽ KHÔNG được ghi vào đĩa trên một cam kết (nhưng tất nhiên trên một fsync ()). Bản vá sửa một số trường hợp phổ biến trong đó hành vi đó có vấn đề bằng cách buộc phân bổ; tuy nhiên, không có gì nói về dữ liệu ghi đè.
lxgr

1
Ah, vậy commit=...syncKHÔNG tương đương? Hay tytso ngụ ý rằng ngay cả với syncnó không cam kết các trang không được phân bổ? Tôi không thể tưởng tượng rằng đó là trường hợp, vì nó sẽ vi phạm thông số kỹ thuật POSIX. Có lẽ bạn có thể sử dụng tập lệnh bash mà tôi đã cung cấp để bảo mật dữ liệu tốt hơn: P
allquixotic

1
Tôi khá chắc chắn rằng anh ta có nghĩa là cái trước, cái sau sẽ biến ext4 trên Linux thành một hệ thống tệp khá nguy hiểm để sử dụng;) Kịch bản trông giống như một cách giải quyết tốt; Tôi sẽ dùng thử và có thể đánh giá một số ứng dụng quan trọng nhất của tôi với strace - có thể tất cả chúng đều sử dụng fsync () và tôi lo lắng quá nhiều ...
lxgr

1

Dù câu trả lời cho câu hỏi của bạn là gì thì cũng không thành vấn đề.

Các đảm bảo tiếp xúc với hành vi của các hệ thống tập tin ext4 là "dữ liệu sẽ được trên đĩa sau khi một thành công sync/ fsynccuộc gọi". Vì vậy, nếu bạn có một ứng dụng khiến bạn phải đặt câu hỏi này, bạn nên chèn các cuộc gọi đồng bộ hóa tại các điểm quan trọng cần đảm bảo tính toàn vẹn dữ liệu. Nếu bạn là người dùng lo lắng về cùng một vấn đề, bạn có thể gọi synctiện ích dòng lệnh trước khi thực hiện bất kỳ hành vi nguy hiểm nào có thể gây ra tắt máy ô uế.


Tôi biết về fsync (); Tôi đang hỏi với tư cách là người dùng các ứng dụng có thể hoặc không thể sử dụng nó. Tôi đã cập nhật câu hỏi của mình.
lxgr
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.