কোনও ফাইলকে তার ইনোড দিয়ে পুনরুদ্ধার করা যেতে পারে?


27

আমি নির্দিষ্ট আদেশে নিম্নলিখিত কমান্ড দৌড়েছি:

$ln a b
$ls -i a b
523669 a 523669 b
$rm -f a
$ls -i b
523669 b

আমি এই পরীক্ষা থেকে এই সিদ্ধান্তে পৌঁছেছি যে কমান্ডটি rmআসলে ফাইলের aপরিবর্তে কেবলমাত্র ফাইলের নাম ( এই পরীক্ষায়) সরিয়ে দেয় , কারণ ইনোডটি এখনও বিদ্যমান রয়েছে এবং অন্য ফাইল-নাম ( b) এর মাধ্যমে পুনরুদ্ধার করা যেতে পারে ।

আমার প্রশ্নটি হ'ল, যদি কোনও ফাইল কেবল একটি ফাইলের সাথে শক্তভাবে লিঙ্কযুক্ত থাকে, যখন rmফাইলটির সাথে মৃত্যুদণ্ড কার্যকর করা হয়, তবে আসল ফাইলটি (যেমন, ইনোড) পুরোপুরি মুছে ফেলা হবে? এবং যদি তা না হয় তবে কোনও ফাইল নাম এবং কেবলমাত্র ইনোডের মাধ্যমে কোনও ফাইল ইনোড পুনরুদ্ধার করা যায়?


আমার কাছে ওএস-নির্দিষ্ট মনে হচ্ছে।
ইগনাসিও ওয়াজকেজ-আব্রামস

@ ইগনাসিও ওয়াজকেজ-আব্রামস। আপনি বোঝাতে চান এটি সংস্করণ উপর নির্ভর করে?
ব্যবহারকারী43312

না, আমি বলতে চাইছি এটি অপারেটিং সিস্টেমের উপর নির্ভর করে। প্রত্যেকের ভিএফএসে আলতো চাপার বিভিন্ন (যদি থাকে ) উপায় রয়েছে।
ইগনাসিও ওয়াজকেজ-আব্রামস

@ ইগনাসিও ওয়াজকেজ-আব্রামস আরএইচএল বা আরএইচএল সম্পর্কে আপনার কোনও ধারণা আছে?
ব্যবহারকারী43312

1
@ ব্রুসইডিগার ওস এক্স এর ধরণের কাজটি করে। আপনি "ফাইলের রেফারেন্স ইউআরএল" ব্যবহার করে একটি ফাইল সিস্টেম অ্যাক্সেস অ্যাক্সেস করতে পারেন যা মূলত, ফাইল সিস্টেম নম্বর এবং নোড নম্বর থেকে তৈরি। তবে আনুষ্ঠানিকভাবে এগুলি তৈরি করতে সমর্থিত নয়। পরিবর্তে আপনি কোনও ফাইলের জন্য একটি "ফাইলের রেফারেন্স ইউআরএল" পান এবং তারপরে একই রানটাইম সেশনে পরবর্তী অ্যাক্সেসগুলির জন্য প্যাথনামের পরিবর্তে এটি ব্যবহার করুন যাতে আপনার অ্যাপ্লিকেশনটি একই ভলিউমে ফাইল অন্যত্র স্থানান্তরিত হওয়ার বিষয়ে অজ্ঞ হয়ে যায়।
অ্যানালগ ফাইল

উত্তর:


29

আপনি যদি কোনও ফাইলকে এর ইনোডের মাধ্যমে খোলার চেষ্টা করেন তবে এটি কোনও ডিরেক্টরি ট্র্যাভারসালকে বাইপাস করে। ডিরেক্টরি ট্র্যাভারসাল ফাইল এবং ডিরেক্টরিগুলির দিকে পরিচালিত করার অনুমতিগুলি নির্ধারণের জন্য প্রয়োজনীয়। ডিরেক্টরি ট্র্যাভারসাল ব্যতীত কলিং প্রক্রিয়াটি ফাইলে অ্যাক্সেস করার অনুমতি দেয় কিনা তা নির্ধারণের কার্নেলের কোনও উপায় নেই।

লিনাক্স কার্নেলের কাছে একটি প্রস্তাবিত প্যাচ ছিল যা কোনও ফাইল বিবরণকারী থেকে কোনও ফাইলের লিঙ্ক তৈরি করতে দেয় । এটি প্রত্যাখ্যান করা হয়েছিল কারণ এটি নিরাপদে বাস্তবায়ন করা অত্যন্ত কঠিন ছিল

লিনাক্সের অধীনে (এবং সম্ভবত একই কারণে অন্যান্য ইউনিক্স রূপে) আপনি মুছে ফেলা ফাইলটির লিঙ্ক তৈরি করতে পারবেন না, সুতরাং যদি কোনও ফাইলটির আর কোনও নাম না থাকে তবে আপনি একটি পুনরায় যুক্ত করতে পারবেন না ¹ আপনি মুছে ফেলা খুলতে পারেন অধীনে যাদু লিঙ্কগুলি খোলার মাধ্যমে ফাইল /proc/$pid/fd/

যদি কোনও ফাইলের আর কোনও লিঙ্ক না থাকে এবং আর খোলা না থাকে তবে এটি আর বিদ্যমান নেই এবং এর ডেটা দ্বারা পূর্বে ব্যবহৃত স্থানটি যে কোনও সময় পুনরুদ্ধার করা যেতে পারে।

¹ আপনি এটি করতে পারবেন ফাইল-সিস্টেমগুলিতে সরাসরি ফাইল-সিস্টেমের উপর নির্ভরশীল উপায়ে বাইটগুলি গুঁড়িয়ে দিয়ে, উদাহরণস্বরূপ debugfsext2 / ext3 / ext4 সহ। এটির জন্য ডিভাইসটিতে অ্যাক্সেস প্রয়োজন যেখানে ফাইল সিস্টেমটি মাউন্ট করা (যেমন সাধারণত কেবল রুট এটি চেষ্টা করতে পারে)। যাইহোক, ডিবাগগুলি যখন ইনোড দ্বারা কোনও ফাইল অ্যাক্সেস করতে পারে তবে ফাইলটি মুছে ফেলা হলে এটি সাহায্য করবে না: অ্যাপ্লিকেশন এটি বন্ধ করে দিলে ফাইলটি সত্যিকার অর্থে মুছে ফেলা হবে এবং একটি মাউন্ট করা ফাইল সিস্টেমে রিড-রাইট মোডে ডিবাগগুলি চালানো একটি রেসিপি is বিপর্যয়.


11

লিনাক্সে, debugfsইন্টারেক্টিভ ext2 / ext3 / ext4 ফাইল সিস্টেম ডিবাগার একটি lnকমান্ড সরবরাহ করে যা একটি ইনোড নম্বর হিসাবে গ্রহণ করতে filespecপারে এবং সংশ্লিষ্ট ফাইলের সাথে একটি নতুন হার্ড লিঙ্ক তৈরি করতে পারে। যদিও অনুশীলনে, এটির জন্য একটি লিঙ্কযুক্ত ফাইলটি কোনও প্রক্রিয়া দ্বারা উন্মুক্ত রাখা উচিত এবং এতে একটি খোলার ফাইল বর্ণনাকারী বজায় রাখা উচিত /proc/[pid]/fd/[n]। মুছে ফেলা ফাইলটিতে এটি চেষ্টা করা সম্ভবত ফাইল সিস্টেমের দুর্নীতির দিকে পরিচালিত করবে।

কারণ এটি নিশ্চিত করার জন্য যে এক্সট 3 (এবং এক্সটেনশান এক্সট 4 এ) ক্র্যাশের পরে নিরাপদে একটি লিঙ্কটি পুনরায় চালু করতে পারে, এটি আসলে ইনোডের ব্লক পয়েন্টারগুলিকে জিরোস করে , যেখানে ext2 কেবল এই ব্লকগুলিকে ব্লক বিটম্যাপে অব্যবহৃত হিসাবে চিহ্নিত করে এবং চিহ্নিত করে "মোছা" হিসাবে ইনড করুন এবং ব্লক পয়েন্টারগুলি একা ফেলে দেয়। তবুও, হার্ড লিঙ্কটি তৈরি করার জন্য ফাইল সিস্টেমটিকে পঠন-লিখন স্থাপন করতে হবে, মোছা ফাইলটির জন্য সংরক্ষিত ব্লকগুলি ইতিমধ্যে পুনরায় স্থানান্তরিত হতে পারে।

কার্নেল সংস্করণ ২.6.৩৯ এর আগে এটি ব্যবহার করা হত যে জিএনইউ কোর্টিলস ভি ৮.০- এ প্রদর্শিত বিকল্পটি যদি একটি লিঙ্কযুক্ত ফাইল এবং নতুন হার্ডলিংক উভয়ই tmpfs ফাইল সিস্টেমে থাকতে পারে তবে একটি উন্মুক্ত ফাইল বর্ণনাকারীর মাধ্যমে একটি লিঙ্কযুক্ত ফাইল পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে । এই দক্ষতাটি তখন থেকে অক্ষম করা হয়েছে , কারণ গিলস উল্লেখ করেছেন যে, সুরক্ষা বিবেচনাগুলি সরাসরি কোনও ফাইল বর্ণনাকারীর মাধ্যমে কঠোর লিঙ্ক তৈরি করার অনুমতি দেওয়ার সাথে জড়িত।ln -L|--logical/proc/[pid]/fd/[n]


আমি ln -L/ প্রো থেকে একটি মুছে ফেলা ফাইলটি পুনরুদ্ধার করার চেষ্টা করেছি এবং ত্রুটিটি পেয়েছি: "এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই", সুতরাং আমি মনে করি না এটি আসলে এটি সমর্থন করে। আমার কোর্টিল 8.21 আছে।
wingedsubmariner

1
ln -Lআপনি যা বলেন তা করে না এটি জানায় lnযে উত্সটি যদি একটি প্রতীকী লিঙ্ক হয় তবে এটির লক্ষ্যটি হার্ড লিঙ্ক করা উচিত। এর মধ্যে প্রতীকী লিঙ্কগুলি /proc/$pid/fdবিশেষ, এবং কোনও (deleted)লিঙ্কটিকে কঠোরভাবে যুক্ত করা কার্যকর হয় না।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

এছাড়াও debugfsসাহায্যের যদি না ফাইলটি মুছে ফেলা হয়েছে হবে - যদি না আপনি রিড-রাইট মোডে এটি চলমান একটি ফাইল সিস্টেম মাউন্ট উপর, যা সম্পূর্ণরূপে পুরো ফাইলসিস্টেম কাপড় ইস্ত্রী করা সম্ভবত ঝুঁকি চাই।
গিলস 'অশুভ হওয়া বন্ধ করুন'

সম্পর্কিত উত্তর আপডেট ln -L। এটি /proc/[pid]/fd/[n]নির্দিষ্ট বিশেষ পরিস্থিতিতে এটি ব্যবহার থেকে কঠোর লিঙ্ক তৈরি করা সম্ভব হত , তবে এটি তখন থেকেই স্থির হয়ে গেছে।
থমাস নাইম্যান

1
debugfsএর lnসত্যই নিচু স্তর এবং এটি কেবল একটি নাম তৈরি করে, গণনা আপডেট করে না বা অবরুদ্ধ হিসাবে ব্লকগুলিকে চিহ্ন চিহ্ন করে না তাই এটি অত্যন্ত বিপজ্জনক । পছন্দ debugfsএর undelযা দেস যে সব। সতর্কতা: debugfsহয় চালানো যাবে না একটি ফাইল সিস্টেম মাউন্ট উপর, যদি না আপনি ছাই আপনার ফাঃ জ্বলন্ত পাওয়ার একটি সুযোগ তৈরি নিতে চান।
লোয়েকি

9

'Ln' এবং 'rm' কমান্ডগুলি 1970 সালের দশকের প্রথম থেকেই প্রতিটি ইউএনআইএক্স ফাইল সিস্টেমে ঠিক একইভাবে কাজ করে। ম্যাক ওএসএক্স, বিএসডি এবং লিনাক্স সকলেই এই মূল ডিজাইনের উত্তরাধিকারী।

নিজে, একটি UNIX ফাইল কোনো নাম, শুধুমাত্র একটি হয়েছে inode নম্বর বা inum। তবে আপনি কেবলমাত্র একটি বিশেষ "ডিরেক্টরি" ফাইলটিতে প্রবেশের মাধ্যমে এটি অ্যাক্সেস করতে পারবেন যা প্রশ্নযুক্ত ইনমের সাথে একটি নাম যুক্ত করে; আপনি সরাসরি ইনাম নির্দিষ্ট করতে পারবেন না।

ডিরেক্টরি নিজেই একটি ফাইল, সুতরাং আপনাকে অবশ্যই (অন্য) ডিরেক্টরিতে এবং এ জাতীয় প্রবেশাধিকার হিসাবে "ফর্মের নাম" হিসাবে পরিচিত ফরোয়ার্ড স্ল্যাশ (/) দ্বারা বিভাজনিত ডিরেক্টরিগুলির একটি সিরিজের মাধ্যমে এটি অ্যাক্সেস করতে হবে । নামটি "/" দিয়ে শুরু না করা হলে প্রক্রিয়াটির "বর্তমান ওয়ার্কিং ডিরেক্টরি" তে একটি পাথ শুরু হয়, সেই ক্ষেত্রে এটি ফাইল সিস্টেমের মূল ডিরেক্টরি থেকে শুরু হয় starts উদাহরণস্বরূপ, যদি पथের নামটিতে "/" অক্ষর না থাকে তবে এটি বর্তমান ডিরেক্টরিতে একটি প্রবেশিকা হিসাবে প্রত্যাশিত।

একটি ডিরেক্টরিবিহীন ফাইলে যে কোনও সংখ্যক পথের নাম থাকতে পারে, "হার্ড লিঙ্কস" হিসাবে পরিচিত এবং এটি তার অবধি চলতে থাকবে যতক্ষণ না তার সমস্ত পাথের নাম মুছে ফেলা হয় এবং শেষ প্রক্রিয়াটি ফাইলটি বন্ধ না করে। তারপরে ফাইলটি আসলে মুছে ফেলা হয়েছে এবং এর স্থানটিকে পুনরায় ব্যবহারের জন্য উপলভ্য হিসাবে চিহ্নিত করা হয়েছে। এটি হ'ল, আপনি একক-লিঙ্কযুক্ত ফাইলটি তৈরি করতে () বা () খুলতে পারবেন এবং তারপরে এটি লিঙ্কমুক্ত করতে পারেন) যাতে এটি আর ফাইল সিস্টেমের নাম জায়গাতে উপস্থিত না হয় তবে আপনি এটি বন্ধ না করা পর্যন্ত ফাইলটি বিদ্যমান থাকবে। এটি অস্থায়ী স্ক্র্যাচ ফাইলগুলির জন্য দরকারী যা অন্য কোনও প্রোগ্রাম দ্বারা পঠিত হবে না।

ডিরেক্টরিগুলিতে ইনোড নম্বর থাকলেও বেশিরভাগ ফাইল সিস্টেমগুলিতে তাদের সাথে হার্ড লিঙ্কগুলি নিষ্ক্রিয় করা হয়; তারা কেবলমাত্র অন্য একটি ডিরেক্টরিতে উপস্থিত হতে পারে। (একটি অসাধারণ ব্যতিক্রম হ'ল ম্যাক ওএসএক্স এইচএফএস + ফাইল সিস্টেম; এটি টাইম মেশিনের ব্যাকআপগুলি কাজ করতে দেয়)) আপনি এখনও ডিরেক্টরিতে (বা অন্য কোনও ফাইল) "নরম লিঙ্কগুলি" তৈরি করতে পারেন। একটি সফ্ট লিঙ্কটি ডিরেক্টরি এন্ট্রিটির সাথে সাদৃশ্যযুক্ত এটি ব্যতীত এটিতে ইনামের পরিবর্তে অন্য কোনও পাথের নাম রয়েছে।

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

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


1
ফরোয়ার্ডটি /নীরব, সুতরাং এটি "স্ল্যাশ" হিসাবে উচ্চারণ করা হবে।
ctrl-alt-delor

4

প্রশ্নটি তাত্ত্বিকভাবে নেওয়া যেতে পারে (যা দিয়ে অর্জন করা যেতে পারে debugfs) বা ব্যবহারিকভাবে (জরুরি অবস্থা)। পরবর্তী ক্ষেত্রে, আমি ধরে নিচ্ছি যে উদ্দেশ্যটি দিনটি সঞ্চয় করছে এবং সম্ভবত ফাইলটি যথাযথভাবে পুনরুদ্ধার করছে (যা এই প্রশ্নটিতে আমি কীভাবে অবতরণ করেছি, তাই আমি মনে করি এটি এখনও প্রাসঙ্গিক এবং দরকারী)।

যেহেতু কোনও কার্নেল এপিআই নেই, debugfsলাইভ ফাইল সিস্টেমে চালানো উচিত নয় কারণ এটি সরাসরি এফএস কাঠামো পরিচালনা করে। সুতরাং এটি লাইভ করতে আপনাকে অন্য ফাইলের নাম ধরে রাখতে হবে। ধরে নিচ্ছি যে ফাইলটি এখনও কিছু প্রক্রিয়া (যে কোনও প্রক্রিয়া) দ্বারা খোলা রয়েছে, এতে চিরকুটে সুবিধাজনক ফাইল বর্ণনাকারীদের কাছে পৌঁছানো যায় /proc:

$ lsof -F pf "$PWD/a" | sed 's/^p//' # find pid and file descriptor number of any process having the file open
$ pid=1234
$ ls -l /proc/$pid/fd/* | grep "$PWD/a" # find file descriptor number
$ fd=42
$ cat /proc/$pid/fd/$fd > "$PWD/a.restored" # read contents to a new filename

পরামর্শ:

  • যদি আপনার সঠিক এফডি সম্পর্কে সন্দেহ থাকে তবে আপনি fileএটির মতো কমান্ড চালাতে পারেন
  • যদি ফাইলটিতে কোনও প্রক্রিয়া লেখা থাকে তবে সেই প্রক্রিয়াটি ASAP বন্ধ করার বিষয়ে নিশ্চিত হন বা আপনি সর্বশেষ ডেটা পাবেন না। একটি (অপরিশোধিত) কৌশলটি অন্য কিছু প্রক্রিয়া সহ কেবলমাত্র এফডি এর মাধ্যমে ফাইলটি খোলার চেষ্টা করা যেতে পারে (চেষ্টা করুন tail -f < /proc/$pid/fd/$fd > /dev/null, লেখার প্রক্রিয়াটি প্রস্থান করুন যাতে এটি পরিষ্কারভাবে বেরিয়ে আসে এবং নতুন প্রক্রিয়াটির এফডি ব্যবহার করে)।

2
tail -f < /proc/...দ্বিতীয় টিপ এ হওয়া উচিত ।
মারে জেনসেন

অথবা লেখার প্রক্রিয়াটি কেবল যুক্ত হয়ে থাকলে (পিছনে ফিরে এবং পুনরায় লেখার জন্য নয়) এর পরিবর্তে প্রথম স্থানে এটি অনুলিপি করতে ব্যবহার করুন । অন্যান্য প্রক্রিয়াটি আগে প্রস্থান করুন , তারপরে ফাইলটির শেষে যাওয়ার জন্য অপেক্ষা করুন। tail -c +0 -fcattailtail
পিটার কর্ডেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.