Làm cách nào tôi có thể tạo thư mục / dev / null-like giống như black black


81

Tôi muốn tạo một /dev/nullthư 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, nhưng chỉ biến mất.

Tôi có một ứng dụng ghi 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 các tệp này, trong khi thực tế, phần ghi chỉ bị loại bỏ ở đầu kia.

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


Nghe có vẻ như FUSE có thể là một lựa chọn: kerneltrap.org/mailarchive/linux-kernel/2008/2/15/868564/thread
Stefan Lasiewski

tôi chỉ tự hỏi mình cùng một câu hỏi và sử dụng cùng tên cho thư mục mà tôi không thể tạo được.
ixtmixilix

Câu trả lời:


48

Đ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 triển khai nullfs¹ , một hệ thống tệp trong đó mọi tệp tồn tại và hoạt động như thế /dev/null(đây không phải là triển khai duy nhất tôi từng thấy).

¹ Không nên nhầm lẫn với các nullfs BSD * , mà là tương tự như bindfs .


Tuyệt vời - Tôi đã sử dụng điều này như một phần của câu trả lời trên SO
Phil Lello

1
một lưu ý cho những người kết thúc với lỗi biên dịch trên chương trình đó: g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`đã làm việc cho tôi.
ixtmixilix

Bạn có thể chỉ cho tôi để thực hiện khác? Bởi vì tôi không thể tìm thấy bất kỳ
Freedo

@Freedo Tôi nghi ngờ nhiều người đã thực hiện nó như một bài tập học tập và để nó không bị ảnh hưởng. Họ có thể không ở trên web nữa.
Gilles

7

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".


3
... Giả sử ứng dụng thực hiện các cuộc gọi hệ thống qua libc, không trực tiếp qua int 0x80/ syscall/ sysenter/ bất cứ điều gì khác.
Ruslan

1

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.)


Cách tiếp cận này không hiệu quả. Ứng dụng sẽ chết nếu không thể ghi vào tập tin này.
dogbane

1

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 kết thúc việc viết 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
Trên nhiều hệ thống, việc xóa một tệp mà một tiến trình đã mở sẽ loại bỏ mục nhập thư mục của nó, nhưng chính tệp đó vẫn nằm trên đĩa cho đến khi nó bị đóng bởi quá trình cuối cùng sử dụng nó. Các quy trình có thể ghi các tệp và sau đó tìm kiếm lại từ đầu và đọc lại chúng, và vì vậy HĐH không thể vứt dữ liệu đi.
xen vào

0

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


-8

Chỉ cần symlink mà thư mục đến /dev/null

rm -rf ~/.logs
ln -s /dev/null ~/.logs

/dev/null, không phải là một thư mục. Nếu chương trình cố gắng viết vào ~/.logs/log1.dump, nó vẫn đi thẳng vào /dev/null.
Tôi làm điều này cho bộ nhớ cache của Google Chrome vì sau một thời gian nó trở nên lớn đến mức Chrome sẽ mất vài phút để bắt đầu.


3
Điều này sẽ không hoạt động vì symlink là tập tin, không phải thư mục. Cố gắng echo hello > ~/.logs/log1.dumpcho ~/.logs/log1.dump: Not a directory. Tuy nhiên, echo hello > ~/.logshoạt động vì .logs là một tệp.
dogbane

2
Bạn phải đùa chúng tôi. $ ln -s /dev/null dev-null; touch dev-null/zzzcho tôitouch: cannot touch 'dev-null/zzz': Not a directory
alex

1
Như tôi đã nói, nó hoạt động cho Chrome. Nó ngăn nó ghi vào bộ đệm. Nếu nó khiến chương trình của người hỏi bị sập, thì rõ ràng nó không kiểm tra xem con trỏ tệp có phải là NULL không.
jonescb

6
Điều này có thể có nghĩa là Chrome bỏ qua việc viết nếu có lỗi khi mở tệp. Bạn có thể đạt được hiệu quả tương tự bằng cách xóa quyền ghi từ tệp kết xuất hoặc thư mục mà nó ghi.
KeithB

Đúng, thay đổi quyền của thư mục có thể sẽ có ý nghĩa hơn.
jonescb
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.