it-swarm-vi.com

Làm cách nào tôi có thể tạo thư mục "lỗ đen" giống như / dev / null?

Tôi muốn tạo một "/dev/null "thư mục (hoặc thư mục" hố đen ") sao cho mọi tệp được ghi vào nó không thực sự được ghi mà chỉ biến mất.

Tôi có một ứng dụng ghi ra các tệp tạm thời lớn vào một thư mục. Tôi không kiểm soát tên của các tệp và tôi không thực sự quan tâm đến nội dung của các tệp này. Tôi có thể viết một tập lệnh định kỳ ghi đè các tệp này, nhưng các tệp được viết ra rất nhanh và lấp đầy đĩa của tôi. Tôi đang tìm kiếm một cái gì đó thông minh hơn. Tôi muốn ứng dụng "nghĩ" rằng nó đang viết ra những tập tin này, trong khi thực tế, việc ghi chỉ bị loại bỏ ở đầu kia.

Cũng xem này chủ đề liên quan cũ.

84
dogbane

Điều này không được hỗ trợ ngoài hộp trên bất kỳ unix nào tôi biết, nhưng bạn có thể làm được khá nhiều thứ với Fuse . Có ít nhất một lần thực hiện nullfs¹ , một hệ thống tệp trong đó mọi tệp tồn tại và hoạt động như /dev/null (đây không phải là triển khai duy nhất tôi từng thấy).

¹ Đừng nhầm lẫn với * BSD nullfs , tương tự như bindfs .

Một cách tiếp cận khác sẽ là trình bao bọc LD_PRELOAD; về cơ bản là một thư viện chia sẻ nhỏ được tải trước libc.so và chặn các lệnh gọi "mở" bằng thứ gì đó kiểm tra đường dẫn tệp tiềm năng và thay thế "/ dev/null" nếu nó nằm trong thư mục đích.

Điều này có lợi thế là (a) hoàn toàn trong không gian người dùng - không yêu cầu hack kernel; và (b) chỉ ảnh hưởng đến ứng dụng sai lầm duy nhất.

Một ví dụ đơn giản là tại http://www.noah.org/wiki/LD_PRELOAD_notes , nhưng trong trường hợp của bạn, bạn sẽ muốn chặn các cuộc gọi hệ thống "mở" & "tạo".

8
Martin Kealey

Nếu chương trình quá ngu ngốc khi không cho phép bạn tắt các nhật ký đó, có thể nó cũng không kiểm tra lỗi sau khi mở tệp nhật ký? Tôi sẽ thử gắn một số hệ thống tệp chỉ đọc giả (ví dụ: sử dụng mount -o loop.)

1
alex

Bạn nói rằng việc xóa các tệp định kỳ bằng một tập lệnh không đủ nhanh. Bạn có thể sống với trình kích hoạt xóa một tệp tạm thời bất cứ khi nào ứng dụng của bạn viết xong và đóng nó không? Nếu vậy, bạn có thể sử dụng API "inotify".

(Xem http://en.wikipedia.org/wiki/Inotifyhttps://github.com/rvoicilas/inotify-tools/wiki/ )

1
Elliot Nelson

tôi đã tạo ra một mô-đun hạt nhân dựa trên ví dụ ramfs trong kernel linux, về cơ bản nó là một hệ thống tập tin lỗ đen được gọi là nullfsvfs. Việc triển khai hệ thống Fuse cần sao chép dữ liệu từ người dùng vào không gian hạt nhân và khá chậm, so với việc triển khai thẳng như mô-đun hạt nhân. Xem:

https://github.com/abbbi/nullfsvfs

1
michael