Tại sao tắt nguồn máy của tôi sau khi `rm` xấu lưu tệp của tôi?


31

Tình huống kinh điển: Tôi đã chạy xấu rmvà nhận ra ngay sau đó rằng tôi đã xóa các tệp sai. (Không có gì quan trọng và tôi đã chấp nhận các bản sao lưu gần đây, nhưng vẫn gây phiền nhiễu.)

Biết rằng hoạt động đĩa tiếp theo là kẻ thù của tôi nếu tôi muốn khôi phục các tệp bằng extundeletehoặc các công cụ như vậy, tôi ngay lập tức tắt máy xuống (ví dụ, bằng nút nguồn, không phải bằng halthoặc bất kỳ lệnh nào như vậy). Đây là một máy tính xách tay không có nhiệm vụ quan trọng đang chạy hoặc bất cứ điều gì mở, vì vậy nó là một hoạt động chấp nhận được. (Nhân tiện, tôi đã học được từ đó rằng điều đầu tiên cần làm trong tình huống như vậy sẽ là ước tính trước nếu các tệp bị thiếu vẫn có thể được mở bằng một quy trình https://unix.stackexchange.com/a/101247 - nếu có, bạn nên khôi phục chúng theo cách này thay vì tắt nguồn máy.)

Tuy nhiên, một khi máy bị tắt nguồn, tôi đã suy nghĩ một lúc và quyết định các tập tin không đáng để đầu tư thời gian để khởi động một hệ thống trực tiếp cho pháp y thích hợp. Vì vậy, tôi cung cấp cho máy sao lưu. Và sau đó tôi phát hiện ra rằng các tập tin của tôi vẫn còn nằm trên đĩa: chúng rmkhông được truyền vào đĩa trước khi tôi tắt nguồn. Tôi đã làm một điệu nhảy nhỏ và cảm ơn thần sysadins vì sự tha thứ bất ngờ của anh ấy.

Câu hỏi của tôi bây giờ là hiểu làm thế nào điều này là có thể, và sự chậm trễ điển hình trước khi rmthực sự được truyền vào đĩa. Tôi biết rằng đĩa IO không bị xóa ngay lập tức nhưng nó sẽ nằm trong bộ nhớ một thời gian, nhưng tôi nghĩ rằng nhật ký đĩa sẽ đảm bảo nhanh chóng rằng các hoạt động đang chờ xử lý không bị mất hoàn toàn. https://unix.stackexchange.com/a/78766 dường như gợi ý về một cơ chế riêng biệt để xóa các trang bẩn và xóa các hoạt động của tạp chí nhưng không cung cấp đủ chi tiết về cách tạp chí sẽ tham gia rmvà sự chậm trễ dự kiến ​​trước đó hoạt động được tuôn ra.

Một số chi tiết khác: dữ liệu nằm trong một phân vùng ext4 bên trong một khối LUKS và khi khởi động lại máy, tôi đã thấy như sau syslog:

Sep 24 10:24:58 gamma kernel: [   11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [   11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [   11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)

nhưng tôi không tự tin nó có liên quan đến rm.

Một câu hỏi khác là liệu có cách nào để bảo kernel không thực hiện bất kỳ thao tác đĩa đang chờ xử lý nào không (nhưng nói đúng hơn là bỏ chúng ở đâu đó), thay vì tắt nguồn máy. (Tất nhiên, nghe có vẻ nguy hiểm khi không thực hiện các thao tác đang chờ xử lý, nhưng đây là điều sẽ xảy ra khi tắt nguồn máy, và một số trường hợp có thể cứu bạn.) Điều này sẽ "sạch" hơn, và cũng thú vị ví dụ như các máy chủ từ xa trong đó tắt nguồn vật lý không phải là một lựa chọn dễ dàng.

Câu trả lời:


22

Có vẻ như bạn đã nắm bắt được những gì đã xảy ra.

Có, bởi vì bạn đã tắt nguồn hệ thống trước khi các thay đổi của bạn được cam kết với đĩa, chúng sẽ ở đó khi bạn khởi động lại.

Hệ thống lưu trữ tất cả ghi trước khi xóa chúng ra đĩa. Có một số tùy chọn kiểm soát hành vi này, tất cả nằm ở /proc/sys/vm/dirty_* [ kernel doc ] . Trừ khi một ứng dụng được thực hiện rõ ràng bởi một ứng dụng thông qua fsync() [ man 2 fsync ] , dữ liệu được cam kết khi nó đủ cũ hoặc bộ đệm ghi được lấp đầy.
Định nghĩa của "dữ liệu" như được sử dụng ở trên bao gồm sửa đổi mục nhập thư mục để xóa tệp.

Bây giờ, đối với tạp chí, đó là một trong những quan niệm sai lầm phổ biến về những gì tạp chí dành cho. Mục đích của một tạp chí không phải là để đảm bảo các thay đổi được phát lại, hoặc dữ liệu đó không bị mất. Mục đích của một tạp chí là để ngăn chặn sự tham nhũng của chính hệ thống tập tin, chứ không phải các tập tin trong đó. Tạp chí chỉ đơn giản chứa thông tin về các thay đổi được thực hiện và không (thường) là toàn bộ dữ liệu của chính thay đổi đó. Các chi tiết chính xác phụ thuộc vào hệ thống tập tin và chế độ nhật ký. Đối với ext3 / 4, xem datatùy chọn gắn kết trong man 8 mount.


Để trả lời câu hỏi bổ sung của bạn về việc có cách nào để ngăn chặn việc ghi đang chờ xử lý mà không cần khởi động lại không:

Từ việc đọc nhanh thông qua mã nguồn kernel, có vẻ như bạn có thể sử dụng ulệnh sysrq ma thuật ([ wikipedia ], [ kernel doc ]) để thực hiện thao tác chỉ đọc lại khẩn cấp. Có vẻ như điều này sẽ ngay lập tức lặp lại tất cả các tập chỉ đọc mà không cần thao tác đồng bộ.

Để sử dụng, chỉ cần nhấn Alt+ SysRq+ u.


1
Cảm ơn câu trả lời này! Tôi vẫn còn bối rối một chút về tạp chí: tôi có nên nghĩ về nó như một thứ chỉ liên quan khi các thay đổi được chuyển sang đĩa, do đó, ghi bộ đệm là cơ chế duy nhất có liên quan để ước tính thời gian ân hạn trước khi rmđược viết? Nói cách khác, mọi thứ chỉ được cam kết với tạp chí khi một bài viết sắp được thực hiện? Hay là bức tranh phức tạp hơn thế? Đối với alt-sysrq-u, đây là một ý tưởng khá gọn gàng. Bạn có tài liệu tham khảo để đưa ra yêu cầu "Nó xuất hiện" không? (Có vẻ như không theo dõi từ các liên kết mà bạn đã đưa ra.) Cảm ơn! :)
a3nm

Ngoài ra, ma thuật sysrq cũng có một hạn chế là bạn vẫn không thể làm điều đó trên một máy từ xa.
a3nm

3
@ a3nm Bạn có thể sử dụng sysrq trên máy từ xa. echo u > /proc/sysrq-trigger(bạn có thể cần kích hoạt nó trước).
Paulo Almeida

Tạp chí không xử lý nội dung tệp (theo mặc định, nó có thể được thay đổi hoàn toàn bằng tạp chí), chỉ với siêu dữ liệu hệ thống tệp, nhưng trong trường hợp này, nó có thể đã xóa tệp , vì chúng tôi đang xử lý xóa mục nhập thư mục. Do đó, tạp chí phải đảm bảo rằng tệp tồn tại (với nội dung trước đó, giả sử rằng chúng không có thay đổi nào khác) hoặc không.
Ángel

@ a3nm Liên quan đến bình luận tạp chí của bạn. Bộ đệm ghi nằm giữa tạp chí và đĩa. Khi bạn ghi vào hệ thống tập tin, tạp chí được cập nhật, sau đó là hệ thống tập tin, nhưng chưa được cam kết vào đĩa.
Patrick

2

Từ: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt

commit = nrsec (*) Ext4 có thể được yêu cầu đồng bộ hóa tất cả dữ liệu và siêu dữ liệu của nó mỗi giây. Giá trị mặc định là 5 giây. Điều này có nghĩa là nếu bạn mất năng lượng, bạn sẽ mất nhiều nhất là 5 giây làm việc mới nhất (hệ thống tệp của bạn sẽ không bị hỏng mặc dù, nhờ vào nhật ký). Giá trị mặc định này (hoặc bất kỳ giá trị thấp nào) sẽ ảnh hưởng đến hiệu suất, nhưng nó tốt cho an toàn dữ liệu. Đặt nó thành 0 sẽ có tác dụng tương tự như để mặc định (5 giây). Đặt nó thành giá trị rất lớn sẽ cải thiện hiệu suất.

Cũng xem ở đây về cách làm sạch chúng: Làm thế nào để bạn làm trống bộ đệm và bộ đệm trên hệ thống Linux?

Trích dẫn từ liên kết trên:

LƯU Ý: dọn sạch bộ nhớ của những thứ không cần thiết (Kernerl 2.6.16 hoặc mới hơn). Luôn đảm bảo chạy đồng bộ hóa trước để tuôn ra những thứ hữu ích ra đĩa !!!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches

Cảm ơn câu trả lời này! Tuy nhiên, tôi không hiểu điều này: đối với "đồng bộ hóa" được đề cập trong này commit=nrsec, đó có phải là điều sẽ xảy ra sau khi kernel đã quyết định xóa các thay đổi từ bộ nhớ sang đĩa không? Hoặc cài đặt có commit=1đảm bảo rằng tất cả các thay đổi sẽ được xóa sau 1 giây bất kể cài đặt dirty_expire_centisecsdirty_writeback_centisecscài đặt không?
a3nm

Kernel sẽ tuôn ra (đồng bộ hóa) mọi bộ đệm / bộ đệm vào đĩa cứ sau 1 giây commit=1. Theo tôi hiểu, syncbuộc mọi thứ phải xảy ra bất kể Cài đặt bộ nhớ ảo mặc dù điều đó có thể xảy ra sớm hơn.
David

Ngoài ra, vì lý do hiệu suất, không khuyến nghị cài đặt (và tuổi thọ lưu trữ) thấp hơn mặc định.
David
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.