डिलीट की गई फाइल को रिलेक्स करना


33

कभी-कभी लोग उन फ़ाइलों को हटा देते हैं जिन्हें उन्हें नहीं करना चाहिए, एक लंबे समय से चल रही प्रक्रिया में अभी भी फ़ाइल खुली है, और डेटा को /proc/<pid>/fd/Nकेवल कैटिंग द्वारा पुनर्प्राप्त करना पर्याप्त भयानक नहीं है। यदि आप ln में कुछ मैजिक विकल्प चलाकर डिलीट को "अनडू" कर सकते हैं तो बहुत ही बढ़िया होगा जो आपको इनोड नंबर (lsof के माध्यम से पुनर्प्राप्त) से पुनः लिंक करने देगा।

मुझे ऐसा करने के लिए कोई भी लिनक्स टूल नहीं मिल सकता है, कम से कम सरसरी गोग्लिंग के साथ।

आपको क्या मिला, सर्वरफॉल्ट?

EDIT1: फ़ाइल को बिल्ली से जोड़ने का कारण इतना /proc/<pid>/fd/Nभयानक नहीं है, क्योंकि जिस प्रक्रिया में अभी भी फ़ाइल खुली है वह अभी भी इसे लिख रही है। एक डिलीट फाइल सिस्टम नेमस्पेस से इनोड के संदर्भ को हटा देता है। मैं जो चाहता हूं वह संदर्भ को फिर से बनाने का एक तरीका है।

EDIT2: 'debugfs ln' काम करता है लेकिन जोखिम बहुत अधिक है क्योंकि यह कच्चे फाइलसिस्टम डेटा को तोड़ देता है। बरामद फ़ाइल भी असंगत है। लिंक की संख्या शून्य है और मैं इसमें लिंक नहीं जोड़ सकता। मैं इस तरह से बदतर हूं क्योंकि मैं /proc/<pid>/fd/Nअपने एफएस को भ्रष्ट किए बिना डेटा तक पहुंचने के लिए उपयोग कर सकता हूं।

जवाबों:


14

यदि आप ln में कुछ मैजिक विकल्प चलाकर डिलीट को "अनडू" कर सकते हैं तो बहुत ही बढ़िया होगा जो आपको इनोड नंबर (lsof के माध्यम से पुनर्प्राप्त) से पुनः लिंक करने देगा।

इस awesomeness के लिए पेश किया गया था lnमें v8.0 के साथ (जीएनयू / coreutils) -L|--logicalविकल्प है जिसके कारण बनता है lnएक भिन्नता के लिए /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.39 में पूरी तरह से अक्षम हो गई है, कमिट देखें । तो इसलिए यह समाधान कर्नेल 2.6.39 या नए के साथ काम नहीं करेगा और पहले के संस्करणों में यह फाइलसिस्टम पर निर्भर करता है।
तनीमु

7
@tnimeu 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 चलाने की आवश्यकता होगी। मैंने इसे सफलतापूर्वक इनोड के साथ सफलतापूर्वक परीक्षण किया है और अभी भी लिखा है और यह एक डीरेल्ड इनोड के लिए एक नया हार्ड लिंक बनाने के लिए काम करता है।

फ़ाइल को ext3 में एक अनोपेन फ़ाइल के साथ अनलिंक किया गया है, तो डेटा खो गया है। मुझे यकीन नहीं है कि यह कितना सच है, लेकिन मेरे अधिकांश डेटा रिकवरी अनुभव ext2 के साथ हैं। Ext3 से

प्र: मैं अपने ext3 विभाजन से हटाई गई फ़ाइलों को कैसे हटा सकता हूं? वास्तव में, तुम नहीं कर सकते! यह डेवलपर्स में से एक है, एंड्रियास दिलगर ने इसके बारे में कहा:

यह सुनिश्चित करने के लिए कि ext3 किसी दुर्घटना के बाद सुरक्षित रूप से अनलिंक को फिर से शुरू कर सकता है, यह वास्तव में इनकोड में ब्लॉक पॉइंटर्स को शून्य करता है, जबकि ext2 इन ब्लॉकों को ब्लॉक बिटमैप में अप्रयुक्त के रूप में चिह्नित करता है और इनोड को "हटाए गए" के रूप में चिह्नित करता है और ब्लॉक को छोड़ देता है अकेले इशारा करते हैं।

आपकी एकमात्र उम्मीद आपकी फ़ाइलों के कुछ हिस्सों के लिए "grep" है जो हटा दी गई है और सर्वश्रेष्ठ के लिए आशा है।

इस प्रश्न में प्रासंगिक जानकारी भी है:

मैंने एक बड़ी फ़ाइल को एक लिनक्स सर्वर पर एक रिक्त के साथ ओवरराइड किया है। क्या मैं मौजूदा फ़ाइल को पुनर्प्राप्त कर सकता हूं?


टिप्पणी उम्मीद से हटा दी गई क्योंकि यह रहस्योद्घाटन नहीं था।
mdpc

1
हटाए गए लेकिन अभी भी खुली हुई फ़ाइल के मामले में मुझे नहीं लगता कि यह इनकोड में पॉइंटर्स को शून्य कर देगा। इसके अलावा, डिबगफ़्स में "ln" का उपयोग करने के बजाय मैं "undel" का उपयोग करूंगा ताकि इनकोड संदर्भ गणना सही ढंग से अपडेट हो जाए।
मार्क वैगनर

मुझे इस तरह से समझाने का मतलब नहीं था, एम्बोबो। यह नहीं है, मैंने प्रदर्शन का परीक्षण किया। मैंने अपनी भाषा स्पष्ट कर दी है।
वार्नर

चतुर, लेकिन मेरे फाइल सिस्टम को दूषित कर देता है। :)
mbac32768

इस परिदृश्य का एकमात्र समाधान है जैसा कि आप इसका वर्णन करते हैं। एक फाइल सिस्टम को निम्न स्तर पर हेरफेर करना जो आरडब्ल्यू पर चढ़ा हुआ है और सक्रिय रूप से लिखा जा रहा है, लगभग सभी परिदृश्यों में भ्रष्टाचार का कारण है।
वार्नर

8

डिबगफ़्स का तरीका जैसा आपने देखा वास्तव में काम नहीं करता है और रिबूट के बाद आपकी फ़ाइल स्वचालित रूप से हटा दी जाएगी (जर्नल के कारण) और सबसे खराब रूप से आप "मौत के रिबूट चक्र" के परिणामस्वरूप अपने फाइल सिस्टम को कचरा कर सकते हैं। राइट सॉल्यूशन (TM) VFS स्तर में एकतरफा प्रदर्शन करना है (जिसमें व्यावहारिक रूप से सभी मौजूदा लिनक्स फाइल सिस्टम के साथ काम करने का अतिरिक्त लाभ भी है)। एलकेएमएल में दिखाई देने वाली प्रणाली कॉल तरीका (फ्लिंक) को हर बार शूट किया गया है, इसलिए सबसे अच्छा तरीका एक मॉड्यूल + ऑक्टेल के माध्यम से है।

एक परियोजना जो इस दृष्टिकोण को लागू करती है और इसमें छोटे और साफ कोड होते हैं, वह है fdlink ( https://github.com/pkt/fdlink.git , जिसे ubuntu maverick के कर्नेल के साथ परीक्षण किया गया है)। इसके साथ, आप मॉड्यूल (sudo insmod flink_dev.ko) डालने के बाद आप बस "/ ./flinkapp / proc // fd / X / my / link / path" कर सकते हैं और यह वही करेगा जो आप चाहते हैं।

आप vfs-undelete.sourceforge.net का एक अग्रेषित-पोर्टेड संस्करण भी उपयोग कर सकते हैं, जो काम भी करता है (और स्वचालित रूप से मूल नाम से भी राहत दे सकता है), लेकिन fdlink का कोड सरल है और यह ठीक वैसे ही काम करता है, इसलिए यह मेरी प्राथमिकता है।


3

मुझे नहीं पता कि आप जो चाहते हैं, ठीक वैसा ही करें, लेकिन मैं क्या करूंगा:

  • एक अन्य प्रक्रिया से फाइल आरओ खोलें
  • मूल प्रक्रिया से बाहर निकलने की प्रतीक्षा करें
  • अपने खुले FD से फ़ाइल में डेटा कॉपी करें

आदर्श नहीं, जाहिर है, लेकिन संभव है। अन्य विकल्प डिबगफ़ेट्स ( linkकमांड का उपयोग करके ) के साथ खेलना है , लेकिन यह एक उत्पादन मशीन पर डरावना है!


डीबगफ़ेट्स लिंक कमांड इस उपयोग के मामले में बिल्कुल भी समर्थन नहीं करता है।
mbac32768 16

tldp.org/HOWTO/Ext2fs-Undeletion-11.html बताता है कि यह करता है। मैंने इसकी कोशिश नहीं की है, लेकिन यह उचित लगता है।
बिल वीस

linkमेरे परीक्षण में काम नहीं किया, लेकिन lnकिया।
वार्नर

3

आज उसी समस्या में भाग गया। सबसे अच्छा मैं दौड़ने के साथ आ सकता था

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

प्रक्रिया समाप्त होने तक tmux / स्क्रीन सत्र में।


2
मूल फ़ाइलों को लिंक करना, जैसा कि स्वीकृत उत्तर में है, काम करना चाहिए।
क्रिस एस

1
इस प्रश्न का कोई स्वीकृत उत्तर नहीं है, आप किसका उल्लेख कर रहे हैं?
हम्मन सैमुअल

>हटाए गए फ़ाइल के लिए इसे पुनर्निर्देशन ( ) की आवश्यकता नहीं होनी चाहिए ?
nasasas

1

दिलचस्प सवाल। एक साक्षात्कारकर्ता ने नौकरी के साक्षात्कार में मुझसे यही प्रश्न पूछा। जो मैंने उनसे कहा था कि ऐसा करने का एक आसान तरीका नहीं था और सामान्य तौर पर इसमें शामिल होने का समय और प्रयास नहीं था। मैंने उनसे पूछा कि इस मुद्दे का हल क्या है?

  1. प्रक्रिया के लिए डिस्क पर इनोड संख्या ज्ञात करने के लिए lsof का उपयोग करें क्योंकि यह अभी भी दिखाई देगा भले ही फ़ाइल को हटा दिया गया हो ... कुंजी यह है कि यह अभी भी खुला है।
  2. फाइलसिस्टम डिबगर के माध्यम से इस पर आधारित फाइल सिस्टम से जानकारी निकालें।

मैं डेटा को सिर्फ / proc / <pid> / fd / N से ठीक कर सकता हूं, लेकिन ऐसा मैं नहीं कर रहा हूं।
mbac32768 16

1

उपयोग Sleuthkit ICAT।

sudo icat /dev/rdisk1s2 5484287 > accidentally_deleted_open_file

यह ऑपरेटिंग सिस्टम की फाइलसिस्टम कार्यक्षमता को दरकिनार कर और डिस्क बाइट्स को सीधे पार्स करके काम करता है।
फ्लिमल

0

त्वरित समाधान जो मेरे लिए काम करता है, बिना डराए उपकरण के साथ:

1) सीधे / proc देख कर प्रक्रिया + fd खोजें:

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

2) फिर @ निक्रे की एक समान तकनीक, जिसमें pvफेंका गया है:

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

हो जाने पर आपको Ctrl-C की आवश्यकता हो सकती है ( ls /proc/{procnum}/fd/{fdnum}आपको बताएगा कि फ़ाइल अब मौजूद नहीं है)), लेकिन यदि आपको बाइट्स में सटीक आकार पता है, तो आप pv -Sइसे काउंट होने पर बाहर निकलने के लिए उपयोग कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.