আমি কীভাবে একটি / দেব / নাল-জাতীয় "ব্ল্যাকহোল" ডিরেক্টরি তৈরি করতে পারি?


81

আমি একটি " /dev/null" ডিরেক্টরি (বা "ব্ল্যাকহোল" ডিরেক্টরি) তৈরি করতে চাই যাতে এতে লিখিত কোনও ফাইল সত্যই লেখা হয় না, তবে কেবল অদৃশ্য হয়ে যায়।

আমার একটি অ্যাপ্লিকেশন রয়েছে যা একটি ডিরেক্টরিতে বড় অস্থায়ী ফাইলগুলি লিখে দেয়। ফাইলগুলির নামের উপর আমার কোনও নিয়ন্ত্রণ নেই এবং আমি এই ফাইলগুলির বিষয়বস্তু সম্পর্কে সত্যই যত্ন করি না। আমি এমন একটি স্ক্রিপ্ট লিখতে পারি যা পর্যায়ক্রমে এই ফাইলগুলি ক্লোবার করে তবে ফাইলগুলি খুব দ্রুত লেখা হয় এবং আমার ডিস্কটি পূরণ করে। আমি কিছু চালক খুঁজছি আমি অ্যাপ্লিকেশনটিকে "মনে" করতে চাই যে এটি এই ফাইলগুলি লিখছে, যখন আসলে, লেখকগুলি কেবল অন্য প্রান্তে ফেলে দেওয়া হচ্ছে।

আরো দেখুন এই পুরাতন সংশ্লিষ্ট থ্রেড।


দেখে মনে হচ্ছে FUSE একটি বিকল্প হতে পারে: কার্নেলট্রাপ.আর
2008/

আমি কেবল নিজের কাছে একই প্রশ্নটি জিজ্ঞাসা করেছি এবং যে ডিরেক্টরিটি আমি তৈরি করতে ব্যর্থ হয়েছিল তার জন্য একই নামটি ব্যবহার করেছি।
ixtmixilix

উত্তর:


48

এটি আমার জানা কোনও ইউনিক্সের বাইরে থাকা বাক্সটিকে সমর্থন করে না তবে আপনি ফুস দিয়ে বেশ কিছু করতে পারেন । নালফস- এর কমপক্ষে একটি বাস্তবায়ন রয়েছে , এমন একটি ফাইল সিস্টেম যেখানে প্রতিটি ফাইল উপস্থিত থাকে এবং এর মতো আচরণ করে /dev/null(এটি আমি কখনও দেখিনি এমন একমাত্র বাস্তবায়ন নয়)।

¹ সঙ্গে গুলিয়ে ফেলা যাবে না * বাসদ nullfs , যা অনুরূপ bindfs


কল্পনাপ্রসূত - আমি এটি উত্তরের
ফিল লেলো

1
এই প্রোগ্রামটিতে সংকলিত ত্রুটিগুলি শেষ করে এমন লোকদের জন্য একটি নোট: g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`আমার পক্ষে কাজ করেছে।
ixtmixilix

আপনি কি আমাকে অন্যান্য বাস্তবায়নের দিকে নির্দেশ করতে পারেন? কারণ আমি কোনও খুঁজে পাই না
ফ্রিডো

@ ফ্রিডো আমার সন্দেহ হয় অনেকেই এটি একটি শেখার অনুশীলন হিসাবে করেছেন এবং এটিকে অব্যক্ত রাখতে দিন। তারা আর ওয়েবে নাও থাকতে পারে।
গিলস

7

অন্য পদ্ধতির একটি LD_PRELOAD মোড়ক হবে; মূলত একটি ছোট্ট শেয়ার্ড লাইব্রেরি যা libc.so এর আগে লোড করা হয় এবং সম্ভাব্য ফাইল পাথ এবং বিকল্প "/ dev / নাল" পরীক্ষা করে এমন কিছু দিয়ে "ওপেন" করতে কল করে যা এটি লক্ষ্য ডিরেক্টরিতে থাকে।

এটির (ক) সম্পূর্ণরূপে ব্যবহারকারী-স্থানে থাকার সুবিধা রয়েছে - কোনও কার্নেল হ্যাকিংয়ের প্রয়োজন নেই; এবং (খ) শুধুমাত্র একক ত্রুটিযুক্ত অ্যাপ্লিকেশনকে প্রভাবিত করছে।

এর একটি সহজ উদাহরণ হ'ল http://www.noah.org/wiki/LD_PRELOAD_notes , তবে আপনার ক্ষেত্রে আপনি "ওপেন" এবং "ক্রিয়েট" সিস্টেম কলগুলিকে বাধা দিতে চাইবেন।


3
... ধরে নিচ্ছি অ্যাপ্লিকেশনটি libc এর মাধ্যমে সিস্টেম কল করে, সরাসরি int 0x80/ syscall/ sysenter/ অন্য যে কোনও মাধ্যমে নয়।
রুসলান

1

প্রোগ্রামটি যদি আপনাকে এই লগগুলি স্যুইচ অফ না করতে মূর্খ হয়, তবে এটি লগ ফাইল খোলার পরে ত্রুটিগুলিও পরীক্ষা করে না? আমি কিছু ডামি পঠনযোগ্য ফাইল সিস্টেম মাউন্ট করার চেষ্টা করব (যেমন ব্যবহার করে mount -o loop))


দুর্ভাগ্যক্রমে এই পদ্ধতির কাজ করে না। এই ফাইলটিতে লিখতে না পারলে অ্যাপ্লিকেশনটি মারা যায়।
ডগবনে

1

আপনি বলছেন যে স্ক্রিপ্টের সাহায্যে ফাইলগুলি পর্যায়ক্রমে সরানো যথেষ্ট দ্রুত নয়। আপনি কি এমন ট্রিগার নিয়ে বেঁচে থাকতে পারেন যা আপনার অ্যাপ্লিকেশনটি লেখার কাজ শেষ করে এবং এটি বন্ধ করার পরে কোনও অস্থায়ী ফাইল মুছে দেয়? যদি তা হয় তবে আপনি "inotify" API ব্যবহার করতে পারেন।

( Http://en.wikedia.org/wiki/Inotify এবং https://github.com/rvoicilas/inotify-tools/wiki/ দেখুন )


1
অনেক সিস্টেমে, কোনও প্রক্রিয়া খোলে এমন কোনও ফাইল মুছে ফেলা হলে তার ডিরেক্টরি এন্ট্রি সরিয়ে ফেলা হয়, তবে এটি শেষ প্রক্রিয়াটি ব্যবহার না করা অবধি ফাইল নিজেই ডিস্কে থাকে। প্রক্রিয়াগুলি ফাইল লিখতে পারে এবং তারপরে শুরুতে চেষ্টা করে এবং সেগুলি আবার পড়তে পারে এবং সুতরাং ওএস কেবল ডেটা ফেলে দিতে পারে না।
interfect

0

আমি লিনাক্স কার্নেলের মধ্যে র‌্যামফস উদাহরণের উপর ভিত্তি করে একটি কার্নেল মডিউল তৈরি করেছি, এটি মূলত নালফসভিফস নামে একটি ব্ল্যাকহোল ফাইল সিস্টেম। FUSE সিস্টেম প্রয়োগের জন্য কার্নেলস্পেসে ব্যবহারকারী থেকে ডেটা অনুলিপি করা দরকার এবং কার্নেল মডিউল হিসাবে সরাসরি প্রয়োগের তুলনায় বেশ ধীর গতিতে। দেখা:

https://github.com/abbbi/nullfsvfs


-8

কেবল সেই ডিরেক্টরিটিতে সিমিলিং করুন /dev/null

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

/dev/null, ডিরেক্টরি হতে হবে না। যদি প্রোগ্রামটি লেখার চেষ্টা ~/.logs/log1.dumpকরে তবে এটি ঠিক পরে চলে যায় /dev/null
আমি গুগল ক্রোমের ক্যাশের জন্য এটি করি কারণ কিছুক্ষণ পরে এটি এত বড় হয়ে যায় যে ক্রোম শুরু হতে কয়েক মিনিট সময় নেয়।


3
এটি কাজ করবে না কারণ সিমলিংকগুলি ফাইল, ডিরেক্টরি নয়। চেষ্টা echo hello > ~/.logs/log1.dumpদেয় ~/.logs/log1.dump: Not a directory। তবে, echo hello > ~/.logsকাজ করে কারণ। লগগুলি একটি ফাইল।
ডগবনে

2
আপনি অবশ্যই আমাদের সাথে মজা করছেন $ ln -s /dev/null dev-null; touch dev-null/zzzআমাকে দেয়touch: cannot touch 'dev-null/zzz': Not a directory
অ্যালেক্স

1
আমি যেমন বলেছি, এটি ক্রোমের পক্ষে কাজ করে। এটি এটি ক্যাশে লিখতে বাধা দেয়। যদি এটির দ্বারা প্রশ্নকের প্রোগ্রামটি ক্রাশ হয়ে যায় তবে অবশ্যই ফাইল পয়েন্টারগুলি NULL কিনা তা যাচাই করে না।
জোনস্কবি

6
সম্ভবত এটির অর্থ এই যে ফাইলটি খোলার ক্ষেত্রে কোনও ত্রুটি থাকলে ক্রোম লেখার বিষয়টি এড়িয়ে যায়। আপনি ডাম্প ফাইল বা ডিরেক্টরিতে এটি লিখতে ডিরেক্টরি থেকে লেখার অনুমতি সরিয়ে একই প্রভাব অর্জন করতে পারেন
কেইথবি

সত্য, ডিরেক্টরিটির অনুমতিগুলি পরিবর্তন করা সম্ভবত আরও বোধগম্য হবে।
jonescb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.