Nơi xử lý tập tin mở đi khi họ chết?


15

Điều gì xảy ra với các tệp bị xóa trong khi chúng có một tệp xử lý mở cho chúng?

Tôi đã tự hỏi điều này kể từ khi tôi nhận ra rằng tôi có thể xóa một tập tin video trong khi nó đang phát trong MPlayer và nó vẫn sẽ phát đến hết. Nó lấy dữ liệu từ đâu? Nó vẫn đến từ ổ cứng? Có phải nó đã được sao chép vào RAM khi tôi xóa tệp không?

Nếu nó vẫn còn trên ổ cứng, điều gì xảy ra nếu tôi lấp đầy hệ thống tệp trong khi chương trình đang chạy đọc từ không gian cơ bản chưa được phân bổ? Nếu nó được đệm trong RAM, điều gì xảy ra nếu tôi xóa bộ đệm?

Điều gì xảy ra nếu tập tin được chia sẻ trên NFS chia sẻ trên máy chủ? (Không phải đó là rủi ro bảo mật của DoS do hàng tấn xử lý tệp mở từ xa sao?)

Làm một lsof -n |grep '(deleted)'đôi khi mang lại kết quả thú vị; nếu tôi nâng cấp các gói trao đổi các tệp thư viện dùng chung, thì các chương trình đang sử dụng các thư viện đó vẫn có thể sử dụng chúng như thể không có gì thay đổi.

Câu hỏi thưởng: Có cách nào để lấy lại dữ liệu từ người chết trong tình huống này không?

Câu trả lời:


13

Các nút vẫn tồn tại trên đĩa, mặc dù không còn liên kết cứng nào đến các nút. Chúng sẽ bị xóa khi mô tả tập tin được đóng lại. Cho đến lúc đó, tập tin có thể được sửa đổi như bình thường, các hoạt động chặn yêu cầu một tên tệp / liên kết cứng.

debugfs và các công cụ tương tự có thể được sử dụng để khôi phục nội dung của các nút.


10
Điều này là chính xác, tuy nhiên nếu tệp vẫn mở, bạn có thể lấy lại bằng cách truy cập / Proc / <PID> / fd trong đó PID là pid của chương trình có tệp vẫn mở. Thư mục này chứa tất cả các mô tả tệp mở của chương trình và bạn có thể truy cập chúng giống như các tệp thông thường, vì vậy bạn có thể tạo một liên kết cứng để 'khôi phục' tệp.
Patrick

Xin lưu ý rằng nó /proclà dành riêng cho Linux (như vậy debugfs).
Ignacio Vazquez-Abrams

1
Solaris cũng có / Proc và kỹ thuật hoạt động tốt ở đó. Không biết về BSD.
Patrick

2
Tôi chỉ cần thêm rằng điều này là tuyệt vời.
n0pe

1
@Patrick: Bạn không thể tạo một liên kết cứng để 'khôi phục' một tệp từ đó /proc. Liên kết cứng chỉ hoạt động trên cùng một hệ thống tệp, không phải trên các hệ thống tệp và vì /proclà một hệ thống tệp không thể ghi riêng biệt, bạn không thể tạo liên kết cứng trên đó. Bạn có thể sao chép các tập tin /procmặc dù.
camh

5

Hạt nhân không tham chiếu đếm trên các tham chiếu đến inode. Xem câu trả lời của tôi cho Điều gì xảy ra khi tôi đóng () một bộ mô tả tệp? .

Xóa các tệp đang mở dường như không có cơ chế DOS hiệu quả hơn là chỉ mở các tệp. Các ulimittệp đang mở cung cấp một số bảo vệ chống lại nỗ lực này của DOS. Nó áp dụng cho tất cả các tập tin mở, xóa hoặc không.


5

Một tệp chỉ bị xóa trên hệ thống tệp một khi mọi tham chiếu đến nó đã biến mất. Cả tên và tay cầm mở đều được tính là tài liệu tham khảo. Miễn là tệp được mở trong một chương trình, nó sẽ không bị xóa, mặc dù hầu hết các hệ thống không cho phép bạn tạo lại tên cho nó.

Dữ liệu vẫn còn trên ổ đĩa, nhưng tệp được đánh dấu là có số lượng liên kết là 0. Nếu hệ thống gặp sự cố, fsck trong lần khởi động lại tiếp theo biết rằng nó phải xóa dữ liệu. Điều này không dẫn đến việc từ chối dịch vụ nhiều hơn một tệp không bị xóa.

Theo như tôi biết, bạn không thể tạo lại liên kết đến tệp trên hệ thống Linux chứng khoán (bỏ qua trình điều khiển hệ thống tệp bằng debugfshoặc các phương thức tương tự), nhưng bạn có thể khôi phục nội dung một cách dễ dàng: cat /proc/12345/fd/42trong đó 12345 là ID tiến trình mở tệp và 42 là số mô tả tập tin.

Trong NFS, khi bạn xóa một tệp vẫn đang mở trong một số máy khách, máy chủ NFS sẽ đổi tên tệp trên máy chủ nhưng không xóa tệp đó cho đến khi tất cả các máy khách đã phát hành tệp. Theo kinh nghiệm của tôi, tên mới là .nfs…, mặc dù tôi không biết tên đó có giống nhau trong tất cả các triển khai NFS hay không.

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.