कैसे btrfs विभाजन पर फ़ाइलों को हटाना रद्द करें?


19

मैं कैसे हटाएं (पुनर्प्राप्त) एक btrfs विभाजन पर एक हटाई गई फ़ाइल?

मैंने अभी तक स्नैपशॉट नहीं लिया है, इसलिए मैं उस सुविधा का उपयोग नहीं कर सकता। मुझे पता है कि अन्य लिनक्स फ़ाइल सिस्टम के लिए कुछ उपकरण हैं , लेकिन Google ने btrfs के लिए कुछ खास नहीं किया है। मैं एक अस्पष्ट उल्लेख भर में आया था कि btrfs में एक undelete टूल शामिल है, लेकिन मैं इसे नहीं ढूँढ सकता। किसी अन्य फ़ाइल सिस्टम के लिए उपकरण आज़माने से पहले, मैं यहाँ पूछ रहा हूँ।

और जानकारी:

  • दूरस्थ rsyncकमांड गलत हो जाने से (दो) डिलीट की गई फाइलें डिलीट हो गईं ।
  • ये छोटे सादे टेक्स्ट फाइल थे।
  • मुझे फाइलों का नाम पता है।
  • मैं फ़ाइलों में कुछ तार याद करने में सक्षम हो सकता है।
  • डिस्क एक नियमित एचडीडी है, लेकिन यह बड़ा (2TB) है।
  • मैं सभी नवीनतम अपडेट के साथ कुबंटू 12.04 (बीटा 2) चला रहा हूं।
  • मैंने विभाजन के लिए कोई नया डेटा नहीं लिखा है, जिससे फाइलें हटा दी गई थीं।
  • मेरे पास इन फ़ाइलों का एक स्नैपशॉट या बैकअप नहीं है। (अंतिम बैकअप इन फ़ाइलों की तुलना में कुछ घंटों पुराना है।)
  • अजीब बात है, एक गाय फ़ाइल प्रणाली ext3 / 4 की तुलना में कम फ़ाइल undelete विकल्प है लगता है ...

जवाबों:


7

जैसा कि आपकी फ़ाइलें छोटी और सादे पाठ हैं, मैं उस डिवाइस में "स्ट्रिंग्स" के आउटपुट को स्कैन करने की कोशिश करूंगा जहां फाइल सिस्टम रहता है, अर्थात,

strings /dev/sda1 | less

फिर "/" का उपयोग उस फ़ाइल में मौजूद स्ट्रिंग्स को खोजने के लिए करें। जब आप पाठ को ढूंढते हैं, तो इसे "m" के साथ शुरू करें, फिर अंत में ले जाएँ और इसे एक फ़ाइल में सहेजने के लिए "cat> file" का उपयोग करें।

मैंने वास्तव में ऐसा किया है कि जब मैं कुछ वर्षों पहले बिना किसी अन्य फाइल सिस्टम पर एक समान स्थिति में था, और यह मेरे लिए बहुत अच्छा था।


4

Jörg Walter ने एक btrfs-undeleteशेल स्क्रिप्ट कार्यान्वित की find-rootऔर से restoreउपकरण का उपयोग किया btrfs-progs, जो यहां पाया जा सकता है , और एक समान स्थिति में दूसरों की मदद करनी चाहिए।

चूंकि इसे GPLv2 के तहत लाइसेंस प्राप्त है, इसलिए मैं इसे यहां शामिल नहीं कर सकता।


3
ध्यान देने योग्य बात यह है कि उक्त स्क्रिप्ट में कम से कम एक मार्ग हार्डकोडेड (संभवतः गलती से) है और इसमें कुछ अन्य समस्याएं हैं, इसलिए खरीदार सावधान रहें कि इसे उपयोग से पहले संपादित किया जाना चाहिए।
गमन

2
यहाँ मूल स्क्रिप्ट का एक साफ किया गया संस्करण है: gist.github.com/Changaco/45f8d171027ea2655d74
चांगको

"जैसा कि इसे GPLv2 के तहत लाइसेंस प्राप्त है, मैं इसे यहां शामिल नहीं कर सकता" - शायद आपको यह पढ़ना चाहिए कि GPLv2 क्या कहता है, क्योंकि इससे कोई मतलब नहीं है।
स्लैंग

4
@slang शायद आपको इस साइट की सेवा की शर्तें पढ़नी चाहिए? योगदान को क्रिएटिव कॉमन्स एट्रिब्यूशन शेयर अलाइक 3.0 लाइसेंस के तहत लाइसेंस प्राप्त होना चाहिए।
suriv

@suriv - मुझे लगता है कि मैं ऐसा करने के उनके कारणों को समझ सकता हूं, लेकिन यह बहुत कष्टप्रद है। विशेष रूप से चूंकि CC-BY-SA केवल GPL (GPLv3s पेटेंट सामग्री से अलग) की तुलना में थोड़ा अधिक प्रतिबंधक है।
सर्वव्यापी

2

यदि आपके btrfs ड्राइव में सबवॉल्म्स हैं, तो आपको अतिरिक्त -r <subvol-id>विकल्प पास करना होगा btrfs restore। दुर्भाग्य से स्क्रिप्ट वहाँ, जैसे एक user414471 ने पोस्ट किया ( http://oelkers.de/tips/undeleteBtrfs.sh ), के पास ऐसा करने के लिए कोई विकल्प नहीं है, लेकिन वे शायद इसके लिए अनुकूलित हो सकते हैं।

यदि आप ऐसा करना चाहते हैं, तो आपको सही सबवोल-आईडी प्राप्त करने की आवश्यकता है:

# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah

या वैकल्पिक रूप से:

# btrfs restore -l /dev/sdXY | grep ROOT_ITEM

बाद में आप btrfs-find-rootउस ब्लॉक नंबर को प्राप्त करने के लिए उपयोग करते हैं, जिसे आप वापस करना चाहते हैं (आमतौर पर अधिकतम एक से ठीक पहले जो वर्तमान रूट है)। इसके लिए आपको पहले डिफ़ॉल्ट सबवॉल्म को उस पर सेट करना होगा जिससे आप फ़ाइलों को वापस करना चाहते हैं (और इस परिवर्तन को आगे की ओर वापस लाएँ):

# mount /dev/sdXY /mnt/blah
# btrfs subvolume set-default <subvol-id> /mnt/blah
# umount /mnt/blah
# btrfs-find-root /dev/sdXY
Well block 4321280 seems great, but generation doesn't match, have=400760, want=400984 level 0
...
Well block 9928704 seems great, but generation doesn't match, have=400764, want=400984 level 1
Well block 1094836224 seems great, but generation doesn't match, have=400983, want=400984 level 1
Found tree root at 1095270400 gen 400984 level 1

आप अंत में उपयोग कर सकते हैं btrfs restoreके साथ -r <subvol-id>वसूली के लिए (शुरू के साथ --dry-runतर्क यदि आप चाहें):

# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery

इस सब के बारे में अधिक जानकारी यहाँ: https://btrfs.wiki.kernel.org/index.php/Restore


फेडोरा 26 प्रणाली पर इसका परीक्षण किया गया है - और वहां btrfs-find-rootकदम कभी समाप्त नहीं होता है (अर्थात <250 जीबी एफएस पर 3 घंटे के लिए 100% सीपीयू पर चलता है)। एक ऐसी ही कहानी spinics.net/lists/linux-btrfs/msg61361.html भी देखें ।
मैक्सक्लेपज़िग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.