Як знайти зрушення файлової системи ext4?


9

У мене несправний жорсткий диск, який не в змозі записати чи прочитати перші сектори диска. Він просто дає помилки вводу / виводу, і це все, що є. Є інші області на диску, які здаються (в основному) чудовими. Я намагаюся встановити розділ (ext4) і побачити, чи можу я отримати доступ до деяких файлів, які я хотів би відновити. Оскільки mountкоманда підтримує offsetопцію, я повинен мати можливість монтувати файлову систему, навіть якщо таблиця розділів не читається та не піддається написанню. Проблема полягає в тому, як знайти компенсацію. Жоден із інструментів ext4 не має такої особливості.


1
Спробуйте testdisk та супровідний фотореактор .
jippie

@jippie знадобилося testdisk 6 годин, щоб сканувати весь диск, і врешті-решт він не знайшов жодного розділу. Я думаю, що найкраща стратегія - спробувати знайти місце розташування файлової системи безпосередньо та встановити її.
Ернест А

photorec, ймовірно, зможе зняти ваші файли з диска, але імена файлів та імена будуть втрачені. Якщо вам вдасться змонтувати файлову систему, звичайно, ваш кращий варіант, але якщо testdisk не знайшов жодного шансу, що запуск файлової системи теж пошкоджений.
jippie

Відповіді:


13

Немає стандартного зсуву за себе, оскільки, звичайно, ви можете запустити розділ там, де вам захочеться. Але давайте на мить припустимо, що ви шукаєте перший розділ, і він був створений більш-менш прийнятим за замовчуванням. Тоді ви можете знайти два місця, якщо припустити, що ви використовували традиційну таблицю розділів DOS:

  1. Починаючи з (512-байтового) сектора 63. Це традиція була дуже давно, і вона працювала, поки хтось не придумав 4K-диски ...
  2. Починаючи з (512-байтового) сектору 2048 р. Це нова традиція розміщення 4К дисків.
  3. Бонусний варіант! Розміщення в секторі 56. Це те, що відбувається, якщо хтось перемістить розділ 63 запуску, щоб він вирівнявся з сектором 4K.

Тепер, щоб продовжити, ви захочете забрати свій улюблений інструмент з шестигранним демппом та дізнатись трохи про макет диска 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і сканувати кожний сектор на предмет того, що схоже на початок розділу 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 годин з тестдиском, можливо, варто спробувати.


Га, це дуже жорстока сила!
derobert

Це працює, але це повільно; Я спробував це на зображенні з декількома розділами, зміщення яких я знав, тож я міг розпочати його досить близько. Кинуто в echo "--->$i<---"рядок через це, оскільки в іншому випадку неможливо оцінити прогрес. Я думаю, ви могли б збільшити bszдо 4096, що пришвидшить справи.
goldilocks

Ви можете його значно пришвидшити, якщо припустити традиційне розташування, коли перегородки починаються на межі "доріжки" (чи це циліндр?).
дероберт

моя оцінка була поганою, щоб це рішення було практичним, але може працювати в інших умовах
Ернест А

2

Спробуйте інший варіант (наприклад, за допомогою налагодження та fsck.ext4):

налагодження:

Ви повинні спочатку встановити налагодження (не сам несправний жорсткий диск):

http://johnsofteng.wordpress.com/2013/11/20/sysfs-procfs-sysctl-debugfs-and-other-s 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/

Інший - "sleuthkit" ("sudo apt-get install sleuthkit"), який має таку команду, як "istat" для надання інформації про блоки про вкладиші - з якої можна отримати зсув і таким чином легко заблокувати вміст даних.

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

(BTW, якщо розмір блоку 1024, з команди "show_super_stats" debugfs, то випливає, що блок 1 - 1024 байти зміщено від запуску диска, і кожна група блоків може також мати кілька блоків.)


1

У мене було зображення мікропрограмного забезпечення електронної книги, яке включало зображення розділу розділу ext3fs, для того, щоб змонтувати та відредагувати, що мені довелося сканувати зображення за допомогою інструмента 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

Це неперевірено, але я думаю, ви можете використовувати метод, обговорений в цьому запитанні SU & Q під назвою: Зворотний пошук inode / file від зсуву в необробленому пристрої на Linux та ext3 / 4? .

Схоже, ви можете використовувати inode файлу + зміщення диска + розмір блоку, щоб визначити зміщення файлу.


1
я не бачу, як цей метод міг би допомогти мені зрозуміти, з чого починається файлова система.
Ернест А
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.