আমি কীভাবে একটি এক্সট 4 ফাইল সিস্টেমের অফসেটটি খুঁজে পাব?


9

আমার একটি ব্যর্থ হার্ড ড্রাইভ রয়েছে যা ডিস্কের প্রথম সেক্টর লিখতে বা পড়তে অক্ষম। এটি কেবল I / O ত্রুটি দেয় এবং এটাই আছে। ডিস্কে অন্যান্য ক্ষেত্রগুলি রয়েছে যা বেশিরভাগই সূক্ষ্ম বলে মনে হয়। আমি একটি পার্টিশন মাউন্ট করার চেষ্টা করছি (ext4) এবং আমি পুনরুদ্ধার করতে চাই এমন কিছু ফাইল অ্যাক্সেস করতে পারি কিনা তা দেখুন। যেহেতু mountকমান্ডটি কোনও offsetবিকল্পকে সমর্থন করে , তাই পার্টিশন টেবিলটি অপঠনযোগ্য এবং অলিখিতভাবে লেখা থাকা সত্ত্বেও আমার ফাইল সিস্টেম মাউন্ট করতে সক্ষম হওয়া উচিত। সমস্যাটি কীভাবে অফসেটটি খুঁজে পাওয়া যায়। Ext4 সরঞ্জামগুলির কোনওটিরই এই বিশেষ বৈশিষ্ট্যটি মনে হয় না।


1
টেস্টডিস্ক এবং তার সাথে ফোটোরেক চেষ্টা করুন ।
জিপ্পি

@ জিপ্পি পুরো ডিস্কটি স্ক্যান করতে d ঘন্টা টেস্টডিস্ক নিয়েছিল এবং শেষ পর্যন্ত এটি কোনও বিভাজন পেল না। আমি মনে করি সেরা কৌশলটি সরাসরি ফাইল সিস্টেমের অবস্থান সন্ধান করার এবং এটির মাউন্ট করার চেষ্টা করা।
আর্নেস্ট এ

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

উত্তর:


13

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

  1. (512-বাইট) সেক্টর 63 থেকে শুরু হচ্ছে This এটি অনেক দিন ধরেই traditionতিহ্য ছিল এবং কেউ 4K ডিস্ক নিয়ে না আসা পর্যন্ত কাজ করে ...
  2. 2048 (512-বাইট) সেক্টর থেকে শুরু হচ্ছে 4 কে ডিস্কের জন্য এটি নতুন theতিহ্য।
  3. একটি বোনাস বিকল্প! ৫ sector সেক্টরে প্রবর্তন করা হচ্ছে someone৩-প্রারম্ভিক পার্টিশনটিকে 4K সেক্টরের সাথে সারিবদ্ধ করার জন্য যদি এমন হয় তবে এটি ঘটে।

এখন, এগিয়ে যেতে, আপনি আপনার পছন্দসই হেক্স-ডাম্প সরঞ্জামটি বেছে নিতে এবং ext4 ডিস্ক লেআউট সম্পর্কে কিছুটা জানতে চান । বিশেষত, এটি প্যাডিংয়ের 1024 বাইট দিয়ে শুরু হয়, যা ext4 উপেক্ষা করে। এরপরে সুপারব্লক আসে। আপনি অফসেট 0x38 এ 0xEF53 ম্যাজিক নম্বরটি পরীক্ষা করে সুপারব্লকটি সনাক্ত করতে পারবেন (সুপারব্লক শুরু থেকে, বা পার্টিশন শুরু হতে 0x438 বা দশমিকের মধ্যে 1080) The যাদু সংখ্যাটি সামান্য-এডিয়ান। সুতরাং এটি আসলে 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..........

দ্রষ্টব্য, আপনি যখন অফসেটটি মাউন্টকে (বা হার্টআপ) দেবেন তখন আপনাকে অবশ্যই অফসেটটি দিতে হবে যেখানে প্যাডিং শুরু হয় super সুপারব্লক নয়।

এখন, এটি যদি প্রথম পার্টিশন না হয়, বা অন্যথায় প্রত্যাশিত দুটি (তিন) দাগের কোনওটিতে না থাকে, আপনি মূলত যাদু নম্বর 0xEF53 অনুসন্ধান করতে পারেন। এটি testdisk(একটি মন্তব্যে প্রস্তাবিত) আপনার জন্য যা করে।


2
SUCCESS টি !!! আমাকে নিজের স্ক্রিপ্ট লিখতে হয়েছিল। testdiskএটি খুঁজে পাবেন না। সহায়তার জন্য আপনাকে ধন্যবাদ।
আর্নেস্ট এ

এর ভিত্তিতে, আপনি dd if=/dev/sda skip=$start_sector | xxd -a | grep '[02468]30: .... .... .... .... 53ef'কিছু সম্ভাব্য ম্যাচগুলি পেতে কিছু ব্যবহার করতে পারেন । সম্ভবত খুব দ্রুত নয়, তবে আপনি আরও ভাল পদ্ধতি খুঁজে পাওয়ার সময় এটি চালাতে দিতে পারেন।
mwfearnley

এখন "আরও ভাল পদ্ধতি" এর জন্য আমার উত্তরটি নীচে দেখুন। দ্রষ্টব্য: কেবল এলোমেলো ডেটাতে এই সংখ্যার জন্য স্ক্যান করা প্রতি 65536 সেক্টরে (32 এমবি) একটি মিথ্যা ধনাত্মক সন্ধান করবে।
mwfearnley

এর জন্য ধন্যবাদ. আমার নজরে পড়তে দ্বিতীয়বার সময় testdisktl;dr:
লাগার

5

উপর ভিত্তি করে @ derobert এর উত্তর , আমি একটি প্রোগ্রাম (লিখেছিলেন সারকথা ) যে থেকে একটি ইনপুট স্ট্রিম বিশ্লেষণ করতে হবে ddকিছু জন্য প্রতিটি খাতের স্ক্যান যে EXT পার্টিশন শুরুর মত দেখায়।

এটি 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 ঘন্টা টেস্টডিস্কের সাথে অতিবাহিত করেন তবে সম্ভবত এটি চেষ্টা করার মতো is


হাহ, এ তো অনেক নিষ্ঠুর শক্তি!
ডার্বোবার্ট

এটি কাজ করে তবে এটি ধীর; আমি এটি একটি বহু-বিভাগীয় চিত্রে চেষ্টা করেছি যার অফসেটগুলি আমি জানতাম, তাই আমি এটি মোটামুটি কাছাকাছি শুরু করতে পারি। সেই echo "--->$i<---"কারণেই লাইনে ফেলেছি অন্যথায় অগ্রগতি অনুমান করা অসম্ভব। আমি মনে করি আপনি bsz4096 এ বাড়তে পারেন যা জিনিসগুলিকে গতিময় করবে।
স্বর্ণলোকগুলি

আপনি যদি ট্র্যাডিশনাল লেআউট ধরে নেন যেখানে "ট্র্যাক" (বা এটি সিলিন্ডার?) সীমানায় পার্টিশনগুলি শুরু হয় তবে আপনি এটি প্রচুর গতি বাড়িয়ে দিতে পারেন।
ডার্বার্ট

আমার এই সমাধানটি ব্যবহারিক হওয়ার পক্ষে অনুমানটি ছিল তবে এটি অন্য পরিস্থিতিতে কাজ করতে পারে
আর্নেস্ট এ

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/

(মূলত, রাইটিং-সক্ষম মোডের সাথে "ডিবাগস-ডাব্লু" ব্যবহার করা এবং তারপরে সমস্ত মুছে ফেলা ফাইলগুলি তালিকাভুক্ত করার জন্য "lsdel" অনুসরণ করা)। বিকল্পভাবে আপনি ব্যবহার করতে পারেন

এবং এখানে fsck.ext4:

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

অন্যটি হ'ল "sleuthkit" ("sudo apt-get ইনস্টল sleuthkit") যা ইনোডগুলি সম্পর্কে ব্লক তথ্য সরবরাহ করার জন্য "ইসটাত" এর মতো কমান্ড রয়েছে - যা থেকে আপনি অফসেট পেতে পারেন এবং এভাবে ডেটা সামগ্রী সহজেই ব্লক করতে পারেন।

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

(বিটিডাব্লু, যদি ব্লগসাইজটি 1024 হয়, ডিবাগফসের "শো_সুপার_স্ট্যাটস" কমান্ড থেকে, তবে এটি অনুসরণ করে যে ব্লক 1টি ডিস্কের শুরু থেকে 1024 বাইট অফসেট, এবং প্রতিটি ব্লক গোষ্ঠীতে বেশ কয়েকটি ব্লকও থাকতে পারে))


1

আমার একটি ই-বুক ফার্মওয়্যার ইমেজ ছিল যার মধ্যে ext3fs পার্টিশন চিত্র অন্তর্ভুক্ত ছিল, মাউন্ট এবং সম্পাদনা করতে যে আমাকে এক্সগ্রাফিক্স ম্যাজিক নম্বরটির সমস্ত অবস্থান খুঁজে পেতে bgrep সরঞ্জাম ব্যবহার করে চিত্রটি স্ক্যান করতে হয়েছিল 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

এটি অনিস্টেটেড তবে আমি মনে করি আপনি এই এসইউ প্রশ্নোত্তর শিরোনামে আলোচিত পদ্ধতিটি ব্যবহার করতে পারেন: শিরোনামে লিনাক্স এবং ext3 / 4 এ অফসেট থেকে ইনোড / ফাইলের বিপরীত লক?

দেখে মনে হচ্ছে আপনি কোনও ফাইলের অফসেট নির্ধারণ করতে কোনও ফাইলের ইনোড + ডিস্কগুলি অফসেট + ব্লক আকার ব্যবহার করতে পারেন।


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