মুছে ফেলা ফাইলটিকে আবার সংযুক্ত করে


33

কখনও কখনও লোকেরা তাদের করা ফাইলগুলি মুছতে পারে, দীর্ঘকাল চলমান প্রক্রিয়াটিতে এখনও ফাইলটি খোলা থাকে এবং /proc/<pid>/fd/Nকেবল ক্যাটিংয়ের মাধ্যমে ডেটা পুনরুদ্ধার করা যথেষ্ট দুর্দান্ত নয়। আশ্চর্যের পরিমাণ হ'ল যদি আপনি কিছু ম্যাজিক বিকল্প চালনা করে মুছে ফেলাটিকে "পূর্বাবস্থায়" ফেলতে পারেন যা আপনাকে ইনোড নম্বরটিতে পুনরায় লিঙ্ক করতে দেয় (এলএসফের মাধ্যমে পুনরুদ্ধার করা)।

এটি করার জন্য আমি কোনও লিনাক্স সরঞ্জাম খুঁজে পাচ্ছি না, কমপক্ষে কারসারি গুগলিংয়ের মাধ্যমে।

আপনি কী পেয়েছেন, সার্ভারফল্ট?

সম্পাদনা 1: ফাইলটি ক্যাটিংয়ের কারণটি /proc/<pid>/fd/Nযথেষ্ট দুর্দান্ত নয় কারণ যে প্রক্রিয়াটিতে এখনও ফাইলটি খোলা রয়েছে তা এখনও এটি লিখতে চলেছে। একটি মুছুন ফাইল সিস্টেমের নামস্থান থেকে ইনোডের উল্লেখটি সরিয়ে দেয় remove আমি যা চাই তা হল রেফারেন্সটি তৈরি করার একটি উপায়।

EDIT2: 'debugfs ln' কাজ করে তবে ঝুঁকিটি অনেক বেশি যেহেতু এটি কাঁচা ফাইল সিস্টেমের ডেটা frobs করে। পুনরুদ্ধার করা ফাইলটিও ক্রেজি বেমানান। লিঙ্কের সংখ্যা শূন্য এবং আমি এটিতে লিঙ্ক যুক্ত করতে পারি না। আমি এইভাবে আরও খারাপ হয়েছি যেহেতু আমি কেবল /proc/<pid>/fd/Nআমার এসএসকে ক্ষতিগ্রস্ত না করে ডেটা অ্যাক্সেস করতে ব্যবহার করতে পারি।

উত্তর:


14

আশ্চর্যের পরিমাণ হ'ল যদি আপনি কিছু ম্যাজিক বিকল্প চালনা করে মুছে ফেলাটিকে "পূর্বাবস্থায়" ফেলতে পারেন যা আপনাকে ইনোড নম্বরটিতে পুনরায় লিঙ্ক করতে দেয় (এলএসফের মাধ্যমে পুনরুদ্ধার করা)।

এই বিস্ময়ে চালু ছিল lnমধ্যে v8.0 সঙ্গে (গনুহ / coreutils) -L|--logicalবিকল্প যা ঘটায় lnএকটি dereference করতে /proc/<pid>/fd/<handle>প্রথম। খুব সহজ

ln -L /proc/<pid>/fd/<handle> /path/to/deleted/file

মুছে ফেলা ফাইলটিকে রিলিং করতে যথেষ্ট।


7
এটি কাজ করে না; যদি ফাইলটি মুছে ফেলা হয় তবে এটি ব্যর্থ হবে।
র্যান্ডম 832

1
না, তা হবে না। মুছে ফেলা হলেও এখনও খোলা ফাইলগুলিকে পুনরুদ্ধার করতে আমি নিয়মিত এটি ব্যবহার করি। কিন্তু আপনি নিশ্চিত করতে হবে, যে নতুন /path/to/deleted/fileচালু থাকে একই ফাইলসিস্টেম হিসাবে ফাইল ছিল ঠিক আগে এটি মোছা হয়েছে, অন্য এই ইচ্ছার - প্রকৃতপক্ষে - ব্যর্থ হয়। (আপনি এটি দিয়ে পুরানো পথটি পেতে পারেন ls -l /proc/<pid>/fd/<handle>)
tnimeu

2
এই ধরণের কার্যকারিতা ( এই প্রশ্নোত্তর দেখুন ) সুরক্ষা ঝুঁকি হিসাবে বিশেষত প্রত্যাখ্যান করা হয়েছিল [কোনও অনুমানিত সুরক্ষা প্রকল্পের চারপাশে ঘুরতে থাকা একটি অনুমানীয় সুরক্ষা স্কিমের কাছে আপনার প্রক্রিয়াটি আপনার নিজস্ব কোনও ফাইলে কেবল পঠনযোগ্য ফাইল হ্যান্ডেল দেয় তবে অন্যথায় অ্যাক্সেস নেই ]; আমি এটি চেষ্টা করেছি (যদিও প্রাসঙ্গিক সিস্টেম কলটি সরাসরি ব্যবহার করতে একটি ছোট সি প্রোগ্রাম সহ) এবং এটি কার্যকর হয়নি।
র্যান্ডম 832

7
আমি অবশ্যই আমার সমাধান পোস্ট করার আগে এটি পরীক্ষা করেছিলাম এবং সেই সময়টি আসলে আমার পক্ষে কাজ করেছিল। আমি যা সম্পর্কে অবগত ছিলাম না তা হ'ল এটি কেবল tmpfsফাইল সিস্টেমে কাজ করেছিল তবে উদাহরণস্বরূপ নয় ext3। তবুও এই বৈশিষ্ট্যটি ২. 2..৩৯ এ সম্পূর্ণ অক্ষম হয়ে গেছে, প্রতিশ্রুতি দেখুন । সুতরাং এই সমাধানটি আর কার্নেল ২.6.৩৯ বা আরও নতুনর সাথে কাজ করবে না এবং পূর্ববর্তী সংস্করণগুলিতে এটি ফাইল সিস্টেমের উপর নির্ভর করে।
tnimeu

7
@ টিনিমেউ ln -Lআমার পক্ষে কাজ করে না। আমার একটি মুছে ফেলা ফাইল রয়েছে এবং আমি এটিকে আসল পথে সংযুক্ত করার চেষ্টা করেছি। lnআমাকে একটা দেয় ln: failed to create hard link /my/path/file.pdf => /proc/19674/fd/16: No such file or directory। তবে আমি উদাহরণস্বরূপ সফল করতে পারিcat /proc/19674/fd/16
ইউজিন বেরেসোভস্কি

13

দেখে মনে হচ্ছে আপনি ইতিমধ্যে অনেক কিছু বুঝতে পেরেছেন তাই আমি অতিরিক্ত বিশদে যাব না। ইনোডটি সন্ধান করার বিভিন্ন পদ্ধতি রয়েছে এবং আপনি সাধারণত বিড়াল এবং STDOUT পুনর্নির্দেশ করতে পারেন। আপনি ব্যবহার করতে পারেন debugfs। এই আদেশটি এর মধ্যে চালান:

ln <$INODE> FILENAME

আপনার ফাইল সিস্টেমের ব্যাকআপ রয়েছে তা নিশ্চিত করুন। আপনার পরে সম্ভবত একটি fsck চালানো দরকার। আমি কোনও ইনোডের সাথে এখনও লিখিত থাকার সাথে এটি সফলভাবে পরীক্ষা করেছি এবং এটি কোনও ডিআরফারেন্সড ইনোডে একটি নতুন হার্ড লিঙ্ক তৈরি করার জন্য কাজ করে।

যদি এক্সট্রি 3 এ ফাইলটি একটি উন্মুক্ত ফাইলের সাথে লিঙ্কযুক্ত থাকে, তবে ডেটাটি নষ্ট হয়ে যায়। এটি কতটা ধারাবাহিকভাবে সত্য তা আমি নিশ্চিত নই তবে আমার বেশিরভাগ ডেটা পুনরুদ্ধারের অভিজ্ঞতা এক্সটাক্টের সাথে। Ext3 এফএকিউ থেকে:

প্রশ্ন: আমি কীভাবে আমার ext3 পার্টিশন থেকে মুছে ফেলা ফাইলগুলি (মুছে ফেলা) পুনরুদ্ধার করতে পারি? আসলে, আপনি পারবেন না! এটিকে সম্পর্কে ডেভেলপারদের মধ্যে একজন, আন্দ্রেস ডিলগার বলেছিলেন:

এক্সট 3 ক্র্যাশের পরে আনলিংকটি নিরাপদে পুনরায় শুরু করতে পারে তা নিশ্চিত করার জন্য, এটি আসলে ইনোডের ব্লক পয়েন্টারগুলিকে জিরোস করে, যেখানে ext2 কেবল এই ব্লকগুলিকে ব্লক বিটম্যাপে অব্যবহৃত হিসাবে চিহ্নিত করে এবং ইনোডটিকে "মুছে ফেলা" হিসাবে চিহ্নিত করে এবং ব্লকটি ছেড়ে দেয় পয়েন্টার একা।

আপনার একমাত্র আশা হ'ল আপনার ফাইলগুলির যে অংশগুলি মুছে ফেলা হয়েছে সেগুলির জন্য "গ্রেপ" করা এবং সেরাটির জন্য আশা।

এই প্রশ্নে প্রাসঙ্গিক তথ্যও রয়েছে:

আমি একটি লিনাক্স সার্ভারে একটি ফাঁকা ফাইল সহ একটি বড় ফাইল ওভাররোট করেছি। আমি কি বিদ্যমান ফাইলটি পুনরুদ্ধার করতে পারি?


মন্তব্যটি আশ্বাসজনকভাবে মুছে ফেলা হয়েছে কারণ এটি শ্রদ্ধাজনক ছিল না।
এমডিপিসি

1
মুছে ফেলা হলেও এখনও ফাইলটি খোলার ক্ষেত্রে আমার মনে হয় না যে এটি ইনোডের পয়েন্টারগুলিকে শূন্য করবে। এছাড়াও, ডিবাগগুলিতে "এলএন" ব্যবহার না করে আমি "আনডেল" ব্যবহার করব যাতে ইনোডের রেফারেন্স গণনাগুলি সঠিকভাবে আপডেট হয়।
মার্ক ওয়াগনার

আমি এইভাবে ইঙ্গিত করা মানে না। এটা হয় না, আমি পারফরম্যান্স পরীক্ষা করেছি। আমি আমার ভাষা স্পষ্ট করে দিয়েছি
ওয়ার্নার

চতুর, তবে আমার ফাইল সিস্টেমটিকে দূষিত করে। :)
mbac32768

আপনি দৃশ্যের বর্ণনা হিসাবে এটি একমাত্র সমাধান। নিম্ন স্তরে এমন একটি ফাইল সিস্টেম ম্যানিপুলেটেড যা ডাব্লু ডাব্লু মাউন্ট করা হয় এবং সক্রিয়ভাবে লিখিত হয়ে থাকে যা প্রায় সমস্ত পরিস্থিতিতে দুর্নীতি ঘটাতে পারে।
ওয়ার্নার

8

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

এমন একটি প্রকল্প যা এই পদ্ধতির প্রয়োগ করে এবং যুক্তিসঙ্গতভাবে ছোট এবং পরিষ্কার কোড রয়েছে fdlink ( উবুন্টু ম্যাভারিকের কার্নেলের সাথে পরীক্ষিত সংস্করণের জন্য https://github.com/pkt/fdlink.git )। এটির সাথে, আপনি মডিউলটি প্রবেশ করার পরে (sudo insmod flink_dev.ko) আপনি কেবল "./flinkapp / proc // fd / X / আমার / লিংক / পাথ" করতে পারেন এবং এটি আপনি যা চান ঠিক তা করবে।

আপনি ভিএফএস-undelete.sourceforge.net এর একটি ফরোয়ার্ড-পোর্টড সংস্করণও ব্যবহার করতে পারেন যা কাজ করে (এবং স্বয়ংক্রিয়ভাবে মূল নামের সাথে আবারও সংযোগ দিতে পারে), তবে fdlink এর কোডটি সহজ এবং এটি ঠিক পাশাপাশি কাজ করে, তাই এটি আমার পছন্দ।


3

আপনি যা চান ঠিক কীভাবে করবেন তা আমি জানি না, তবে আমি যা করব তা হ'ল:

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

আদর্শ নয়, স্পষ্টতই, তবে সম্ভব। অন্য বিকল্পটি হ'ল ডিবাগফ ( linkকমান্ডটি ব্যবহার করে ) নিয়ে খেলা করা , তবে এটি একটি প্রোডাকশন মেশিনে ভীতিজনক!


ডিবাগফ লিংক কমান্ড এই ব্যবহারের ক্ষেত্রে মোটেই সমর্থন করে না।
mbac32768

tldp.org/HOWTO/Ext2fs-Undeletion-11.html এর পরামর্শ দেয়। আমি এটি চেষ্টা করি নি, তবে এটি যুক্তিসঙ্গত বলে মনে হচ্ছে।
বিল ওয়েইস

linkআমার পরীক্ষায় কাজ lnকরেনি তবে করেছে।
ওয়ার্নার

3

আজ একই সমস্যার মধ্যে দৌড়ে। আমি যে সেরাটি নিয়ে আসতে পেরেছি তা হল চালানো

% tail -n +0 -f /proc/<pid>/fd/<fd> /path/to/deleted_file

প্রক্রিয়া শেষ হওয়া অবধি একটি টিএমউक्स / স্ক্রিন সেশনে।


2
গ্রহণযোগ্য উত্তরের মতো মূল ফাইলগুলির সাথে লিঙ্ক করা কাজ করা উচিত।
ক্রিস এস

1
এই প্রশ্নের কোনও গ্রহণযোগ্য উত্তর নেই, আপনি কোনটিকে উল্লেখ করছেন?
হামান স্যামুয়েল 4'15

>এটি কি মুছে ফেলা ফাইলটিতে পুনর্নির্দেশের প্রয়োজন হবে না ?
এনসিএসাস

1

আকর্ষণীয় প্রশ্ন। একজন সাক্ষাত্কার এক চাকরীর সাক্ষাত্কারে আমাকে একই প্রশ্ন করেছিলেন। আমি তাকে যা বলেছিলাম তা হ'ল এটি করার সহজ উপায় ছিল না এবং সাধারণভাবে জড়িত সময় এবং প্রচেষ্টার পক্ষে মূল্য ছিল না। আমি তাকে জিজ্ঞাসা করেছি যে তিনি এই সমস্যার সমাধান কী ভেবেছিলেন ...

  1. প্রক্রিয়াটির জন্য ডিস্কে ইনোড নম্বরটি খুঁজে পেতে lsof ব্যবহার করুন কারণ ফাইলটি মুছে ফেলা সত্ত্বেও এটি প্রদর্শিত হবে ... কীটি এটি এখনও খোলা রয়েছে।
  2. ফাইলসিস্টেম ডিবাগারের মাধ্যমে এটির ভিত্তিতে ফাইল সিস্টেম থেকে তথ্যটি বের করুন।

আমি / proc / <pid> / fd / N থেকে ঠিক সূক্ষ্ম তথ্য বের করতে পারি তবে আমি যা করার চেষ্টা করছি তা নয় not
mbac32768

1

স্লেউথকিট আইসিএটি ব্যবহার করুন ।

sudo icat /dev/rdisk1s2 5484287 > accidentally_deleted_open_file

এটি অপারেটিং সিস্টেমের ফাইল সিস্টেমের কার্যকারিতা বাইপাস করে এবং সরাসরি ডিস্ক বাইটগুলি পার্স করে কাজ করে।
Flimm

0

ভয়ঙ্কর সরঞ্জাম ছাড়াই আমার পক্ষে দ্রুত সমাধানটি কার্যকর হয়েছে:

1) সরাসরি / প্রোকে দেখে প্রোসেসটি + এফডি تلاش করুন:

ls -al /proc/*/fd/* 2>/dev/null | grep {filename}

2) তারপরে @ নিক্রে এর অনুরূপ কৌশলটি pvনিক্ষেপ করে:

tail -c +0 -f /proc/{procnum}/fd/{fdnum} | pv -s {expectedsize} > {recovery_filename}

হয়ে গেলে আপনার সিটিআরএল-সি প্রয়োজন হতে পারে ( ls /proc/{procnum}/fd/{fdnum}আপনাকে জানাতে হবে যে ফাইলটি আর নেই) তবে আপনি যদি বাইটের সঠিক আকারটি জানেন তবে আপনি pv -Sগণনাটি পৌঁছানোর পরে এটিকে প্রস্থান করার জন্য ব্যবহার করতে পারেন ।

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