मैं एक ext4 फाइल सिस्टम की भरपाई कैसे करूँ?


9

मेरे पास एक असफल हार्ड ड्राइव है जो डिस्क के पहले सेक्टरों को लिखने या पढ़ने में असमर्थ है। यह सिर्फ I / O त्रुटियां देता है और यही सब कुछ है। डिस्क पर अन्य क्षेत्र हैं जो लगता है (ज्यादातर) ठीक है। मैं एक विभाजन (ext4) माउंट करने और यह देखने की कोशिश कर रहा हूं कि क्या मैं कुछ फ़ाइलों तक पहुंच सकता हूं जो मैं पुनर्प्राप्त करना चाहता हूं। चूंकि mountकमांड एक offsetविकल्प का समर्थन करता है, इसलिए मुझे फाइल सिस्टम को माउंट करने में सक्षम होना चाहिए, भले ही विभाजन तालिका अपठनीय और अनिर्दिष्ट हो। समस्या यह है कि ऑफसेट कैसे खोजें। Ext4 टूल में से कोई भी इस विशेष सुविधा के लिए नहीं लगता है।


1
Testdisk और साथ में फोटोरेक आज़माएँ ।
जिप्पी

@jippie को पूरी डिस्क को स्कैन करने में 6 घंटे का समय लग गया और अंत में उसे कोई विभाजन नहीं मिला। मुझे लगता है कि सबसे अच्छी रणनीति सीधे फाइलसिस्टम के स्थान को खोजने और इसे माउंट करने की कोशिश करना है।
अर्नेस्ट ए

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

जवाबों:


13

प्रति-से-अधिक मानक ऑफसेट नहीं है, जैसा कि आप जहाँ चाहें विभाजन को शुरू कर सकते हैं। लेकिन आइए एक पल के लिए मान लें कि आप पहले विभाजन की तलाश कर रहे हैं, और इसे कमोबेश स्वीकार किए जाते हैं। इसके बाद दो स्थान आपको मिल सकते हैं, यह मानते हुए कि आप एक पारंपरिक डॉस विभाजन तालिका का उपयोग कर रहे थे:

  1. सेक्टर (५१२-बाइट) सेक्टर ६३ पर शुरू। यह बहुत लंबे समय के लिए परंपरा थी, और तब तक काम किया जब तक कोई ४४० डिस्चार्ज के साथ नहीं आया ...
  2. (512-बाइट) सेक्टर 2048 से शुरू करना। 4K डिस्क को समायोजित करने के लिए यह नई परंपरा है।
  3. एक बोनस विकल्प! सेक्टर 56 में सार्टिंग। यह तब होता है जब कोई व्यक्ति 4K सेक्टर के साथ संरेखित करने के लिए 63-स्टार्ट विभाजन को स्थानांतरित करता है।

अब, आगे बढ़ने के लिए, आप अपने पसंदीदा हेक्स-डंप टूल को चुनना चाहेंगे, और ext4 डिस्क लेआउट के बारे में थोड़ा सीखेंगे । विशेष रूप से, यह 1024 बाइट्स की गद्दी से शुरू होता है, जो ext4 की अनदेखी करता है। इसके बाद सुपरब्लॉक आता है। आप जादू नंबर 0xEF53 के लिए ऑफसेट 0x38 पर (सुपरब्लॉक प्रारंभ से, या विभाजन प्रारंभ से 0x438 या दशमलव में 1080) की जादुई संख्या की जांच करके सुपरब्लॉक को पहचान सकते हैं। जादू की संख्या थोड़ी-सी है। तो यह वास्तव में 0x53EF के रूप में डिस्क पर संग्रहीत है।

यहाँ वह है जो इस तरह दिखता है xxd -a:

0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 0000400: 0040 5d00 0084 7401 33a0 1200 33db a600 .@]...t.3...3... 0000410: 4963 5300 0000 0000 0200 0000 0200 0000 IcS............. 0000420: 0080 0000 0080 0000 0020 0000 6637 0952 ......... ..f7.R 0000430: 6637 0952 0200 1600 53ef 0100 0100 0000 f7.R....S....... 0000440: 9938 f851 004e ed00 0000 0000 0100 0000 .8.Q.N..........

ध्यान दें, कि जब आप ऑफ़सेट माउंट (या लॉसेटअप) को देते हैं, तो आपको ऑफ़सेट वहीं देना होगा जहाँ से पेडिंग शुरू होती है - सुपरब्लॉक नहीं।

अब, अगर इसका पहला विभाजन नहीं है, या अन्यथा दो (तीन) अपेक्षित स्थानों में से एक में नहीं है, तो आप मूल रूप से जादू नंबर 0xEF53 के लिए खोज करें। यह वह है जो testdisk(एक टिप्पणी में अनुशंसित) आपके लिए करता है।


2
सफलता!!! मुझे अपनी स्क्रिप्ट खुद लिखनी थी। testdiskनहीं मिलेगा। मदद के लिए सभी का धन्यवाद।
अर्नेस्ट ए

इसके आधार पर, आप dd if=/dev/sda skip=$start_sector | xxd -a | grep '[02468]30: .... .... .... .... 53ef'कुछ संभावित मैचों को प्राप्त करने के लिए कुछ का उपयोग कर सकते हैं । शायद बहुत तेज नहीं है, लेकिन आप इसे एक बेहतर तरीका ढूंढने के दौरान चलने दे सकते हैं।
mwfearnley

"बेहतर विधि" के लिए अब मेरा जवाब नीचे देखें। नोट: रैंडम डेटा में इस नंबर के लिए स्कैन करने पर हर 65536 सेक्टर (32 एमबी) में एक पॉजिटिव पॉजिटिव मिलेगा।
mwfearnley

इसके लिए धन्यवाद। इस तथ्य के कारण मुझे नोटिस करने के लिए दूसरा पढ़ा गया testdisk, मुझे सिर्फ tl;dr:हेडर के लिए एक एड जोड़ना था
Jan-Stefan Janetzky

5

@ Derobert के उत्तर के आधार पर , मैंने एक प्रोग्राम ( gist ) लिखा, जो एक इनपुट स्ट्रीम को पार्स करेगा ddऔर प्रत्येक सेक्टर को किसी ऐसी चीज के लिए स्कैन करेगा, जो एक एक्सट्रा पार्टीशन की शुरुआत की तरह दिखती है।

यह कम से कम उतनी ही तेजी से काम करेगा जितना ddआपकी हार्ड डिस्क से पढ़ सकता है। एक संक्षिप्त संस्करण नीचे है।

सबसे सरल उपयोग बस है sudo dd if=/dev/xxx | ext2scan, हालांकि आप संभवतः ddब्लॉक आकार में सुधार करने या खोज के लिए एक क्षेत्र चुनने के लिए कमांड को संशोधित करना चाहेंगे ।

#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main() {
  unsigned char const MAGIC[2] = {0x53, 0xef};
  unsigned char const ZEROS[512] = {0};

  long long int sector = 0;

  char buf[4][512];
  int empty1, empty2;

  while (read(STDIN_FILENO, buf[sector&3], 512) > 0) {
    if (!memcmp(buf[sector&3] + 0x38, MAGIC, 2)) {
      printf("Found a possible ext2 partition at sector %lld", sector-2);

      empty1 = !memcmp(buf[(sector-2)&3], ZEROS, 512);
      empty2 = !memcmp(buf[(sector-1)&3], ZEROS, 512);

      if (empty1 && empty2) printf(" (first two sectors are empty :)\n");
    }
    sector++;
  }
}

नोट: यह न केवल विभाजन की शुरुआत पाएंगे, बल्कि उनके भीतर सुपरब्लॉक भी होंगे ।

या तो मामले में, मैं dumpe2fsपरिणामों का विश्लेषण करने के लिए उपयोग करने की सलाह दूंगा। आप किसी फ़ाइल पर संदिग्ध सुपरब्लॉक की शुरुआत (मेरे अनौपचारिक परीक्षण के अनुसार कम से कम पहले छह सेक्टर) कर सकते हैं, और यदि यह सुपरब्लॉक है, तो dumpe2fsआपको (अन्य बातों के अलावा) अन्य सुपरब्लॉक के सापेक्ष स्थान बताएगा। ।


2

एक अनुमान लगाएं कि विभाजन कहाँ शुरू होता है और कुछ क्रूर बल लागू होता है:

bsz=512 # or 1024, 2048, 4096 higher = faster

for i in {2..10000000}; do
    echo "--->$i<---"
    mount -o offset=$(($bsz*$i)) -t ext4 /dev/whatever /mnt/foo
    if [ $? == 0 ]; then # whahoo!
        echo Eureka
        break
    fi
done

मुझे लगता है कि इसमें कुछ समय लग सकता है, लेकिन अगर आप पहले ही टेस्टडिस्क के साथ 6 घंटे बिता चुके हैं, तो शायद यह एक कोशिश के लायक है।


हह, वह बहुत क्रूर बल है!
अपमानजनक

यह काम करता है लेकिन यह धीमा है; मैंने इसे एक बहु-विभाजन की छवि पर आज़माया, जिसके ऑफ़सेट मुझे पता थे, इसलिए मैं इसे काफी करीब से शुरू कर सकता था। इस echo "--->$i<---"वजह से लाइन में फेंक दिया क्योंकि अन्यथा यह प्रगति गेज करने के लिए असंभव है। मुझे लगता है कि आप bsz4096 तक बढ़ सकते हैं , जो चीजों को गति देगा।
गोल्डीलॉक्स

यदि आप पारंपरिक लेआउट जहां विभाजन "ट्रैक" (या यह सिलेंडर है?) सीमा पर शुरू होता है, तो आप इसे बहुत गति दे सकते हैं।
डेबोर्ट

मेरा अनुमान इस उपाय के व्यावहारिक होने के लिए खराब था, लेकिन अन्य परिस्थितियों में काम कर सकता है
Ernest A

2

विभिन्न विकल्प आज़माएं (जैसे, डीबगफ़्स और fsck.ext4 का उपयोग करके):

debugfs:

आपको पहले डिबगफ़्यू माउंट करना होगा (असफल हार्डडिस्क ही नहीं):

http://johnsofteng.wordpress.com/2013/11/20/sysfs-procfs-sysctl-debugfs-and-other-similar-kernel-interfaces/

http://afzalkhanlinuxtalk.wordpress.com/2013/08/07/how-to-recover-deleted-file-in-linux/comment-page-1/#comment-8

http://blesseddlo.wordpress.com/2010/10/12/using-debugfs/

(अनिवार्य रूप से, राइट-इनेबल मोड के साथ "debugfs -w" का उपयोग करना है, और फिर सभी डिलीट की गई फाइलों को सूचीबद्ध करने के लिए "lsdel" का उपयोग करना है)। वैकल्पिक रूप से आप उपयोग कर सकते हैं

और यहाँ fsck.ext4 है:

http://linuxexpresso.wordpress.com/2010/03/31/repair-a-broken-ext4-superblock-in-ubuntu/

एक और "स्लीथकिट" है ("सुडो एप्ट-गेट इंस्टॉल स्लीथकिट") जिसमें इनोड्स के बारे में ब्लॉक जानकारी प्रदान करने के लिए "istat" जैसी कमांड है - जिससे आप ऑफसेट प्राप्त कर सकते हैं और इस प्रकार डेटा सामग्री को आसानी से ब्लॉक कर सकते हैं।

https://www.ibm.com/developerworks/cn/linux/l-cn-ext4resize/

(बीटीडब्लू, यदि डिबगफिश के "show_super_stats" कमांड से ब्लॉकचेन 1024 है, तो यह इस प्रकार है कि ब्लॉक 1 डिस्क की शुरुआत से 1024 बाइट्स ऑफसेट है, और प्रत्येक ब्लॉक समूह में कई ब्लॉक भी हो सकते हैं।)


1

मेरे पास एक ई-बुक फर्मवेयर छवि थी जिसमें एक्सटर्फ़ एफटीपी विभाजन संख्या के सभी पदों को खोजने और पाए गए ऑफ़सेट्स का उपयोग करके माउंट करने का प्रयास करने के लिए bgrep टूल का उपयोग करके छवि को स्कैन करने और संपादित करने के लिए ext3fs विभाजन छवि शामिल थी 0x53EF

यहाँ एक संक्षिप्त स्क्रिप्ट है जो बढ़ते हुए प्रदर्शन करती है:

#!/bin/sh
FW_IMAGE=$1
MOUNT_POINT=$2

FS_TYPE=ext3
EXTFS_MAGIC_NUM=53ef
MAGIC_OFFSET=1080

OFFSETS=`bgrep $EXTFS_MAGIC_NUM $FW_IMAGE | awk '{print toupper($NF)}'`
for OFFSET in $OFFSETS; do
  OFFSET=`echo "ibase=16; $OFFSET" | bc`
  OFFSET=`expr $OFFSET - $MAGIC_OFFSET`
  sudo mount -t $FS_TYPE -o loop,offset=$OFFSET $FW_IMAGE $MOUNT_POINT 2>/dev/null
  if [ $? -eq 0 ]; then
    echo "Success!  Offset is: $OFFSET."
    break
  fi
done

पूरी स्क्रिप्ट यहां स्थित है


0

यह अप्रयुक्त है, लेकिन मुझे लगता है कि आप इस एसयू क्यू एंड ए शीर्षक में चर्चा की गई विधि का उपयोग कर सकते हैं: लिनेक्स पर कच्चे डिवाइस में ऑफसेट से इनोड / फ़ाइल का रिवर्स लुकअप और एक्स 3/4?

ऐसा लगता है कि आप किसी फ़ाइल की ऑफसेट को निर्धारित करने के लिए फ़ाइल के इनकोड + डिस्क ऑफ़सेट + ब्लॉक आकार का उपयोग कर सकते हैं।


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