Comment trouver l'offset d'un système de fichiers ext4?

9

J'ai un disque dur défaillant qui est incapable d'écrire ou de lire les premiers secteurs du disque. Cela donne juste des erreurs d'E / S et c'est tout ce qu'il y a. Il y a d'autres zones sur le disque qui semblent (pour la plupart) correctes. J'essaie de monter une partition (ext4) et de voir si je peux accéder à certains fichiers que je voudrais récupérer. Étant donné que la mountcommande prend en charge une offsetoption, je devrais pouvoir monter le système de fichiers même si la table de partition est illisible et non inscriptible. Le problème est de savoir comment trouver le décalage. Aucun des outils ext4 ne semble avoir cette fonctionnalité particulière.

Ernest A
la source
1
Essayez testdisk et la photorec qui l'accompagne.
jippie
@jippie il a fallu 6 heures à testdisk pour analyser tout le disque et à la fin il n'a trouvé aucune partition. je pense que la meilleure stratégie est d'essayer de trouver l'emplacement du système de fichiers directement et de le monter.
Ernest A
photorec pourra probablement extraire vos fichiers du disque, mais les noms de fichiers et les chemins d'accès seront perdus. Si vous parvenez à monter le système de fichiers qui est bien sûr votre meilleure option, mais si testdisk n'en a pas trouvé, il y a de fortes chances que le démarrage du système de fichiers soit également corrompu.
jippie

Réponses:

13

Il n'y a pas de décalage standard en soi, car vous pouvez bien sûr démarrer la partition où vous le souhaitez. Mais supposons un instant que vous recherchez la première partition, et qu'elle a été créée en acceptant plus ou moins les valeurs par défaut. Vous pouvez alors le trouver à deux endroits, en supposant que vous utilisiez une table de partition DOS traditionnelle:

  1. À partir du secteur (512 octets) 63. C'était la tradition depuis très longtemps, et a fonctionné jusqu'à ce que quelqu'un vienne avec des disques 4K ...
  2. À partir du secteur (512 octets) 2048. C'est la nouvelle tradition, pour accueillir des disques 4K.
  3. Une option bonus! Commencer au secteur 56. C'est ce qui se passe si quelqu'un déplace la partition à 63 départs pour l'aligner sur un secteur 4K.

Maintenant, pour continuer, vous voudrez prendre votre outil de vidage hexadécimal préféré et en apprendre un peu plus sur la disposition du disque ext4 . En particulier, il commence par 1024 octets de remplissage, que ext4 ignore. Vient ensuite le superbloc. Vous pouvez reconnaître le superbloc en vérifiant le nombre magique 0xEF53 à l'offset 0x38 (depuis le début du superbloc, ou 0x438 depuis le début de la partition, ou 1080 en décimal.) Le nombre magique est petit-boutien. Il est donc réellement stocké sur le disque en tant que 0x53EF.

Voici à quoi cela ressemble 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..........

Notez que lorsque vous donnez l'offset à monter (ou losetup), vous devez donner l'offset à l'endroit où le remplissage commence - pas le superbloc.

Maintenant, si ce n'est pas la première partition, ou sinon n'est pas dans l'un des deux (trois) endroits attendus, vous pouvez essentiellement rechercher le nombre magique 0xEF53. C'est ce que testdisk(recommandé dans un commentaire) fait pour vous.

derobert
la source
2
SUCCÈS!!! J'ai dû écrire mon propre script. testdiskne le trouverait pas. Merci à tous pour l'aide.
Ernest A
Sur cette base, vous pouvez utiliser quelque chose comme dd if=/dev/sda skip=$start_sector | xxd -a | grep '[02468]30: .... .... .... .... 53ef'pour obtenir des correspondances probables. Probablement pas très rapide, mais vous pouvez le laisser fonctionner pendant que vous trouvez une meilleure méthode.
mwfearnley
Voir ma réponse ci-dessous pour la "meilleure méthode" maintenant. Remarque: il suffit de scanner ce nombre dans des données aléatoires pour trouver un faux positif tous les 65536 secteurs (32 Mo).
mwfearnley
Merci pour cela. en raison du fait qu'il m'a fallu une deuxième lecture pour remarquer testdisk, j'ai juste dû ajouter une modification pour un en- tl;dr:tête
Jan-Stefan Janetzky
5

Sur la base de la réponse de @ derobert , j'ai écrit un programme ( gist ) qui analysera un flux d'entrée à partir de ddet analysera chaque secteur pour quelque chose qui ressemble au début d'une partition ext.

Cela fonctionnera au moins aussi vite que ddpeut lire à partir de votre disque dur. Une version abrégée est ci-dessous.

L'utilisation la plus simple est juste sudo dd if=/dev/xxx | ext2scan, bien que vous souhaitiez probablement modifier la ddcommande pour améliorer la taille du bloc ou choisir une région à rechercher.

#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++;
  }
}

Remarque: il trouvera non seulement le début des partitions, mais également des superblocs à l' intérieur.

Dans les deux cas, je recommanderais d'utiliser dumpe2fspour analyser les résultats. Vous pouvez sauvegarder le début du superbloc suspect dans un fichier (au moins les six premiers secteurs, selon mon test informel), et s'il s'agit d'un superbloc, dumpe2fsvous dira (entre autres) l'emplacement relatif des autres superblocs .

mwfearnley
la source
2

Faites une supposition quant au début de la partition et appliquez une force brute:

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

J'imagine que cela pourrait prendre un certain temps, mais si vous avez déjà passé 6 heures avec testdisk, cela vaut peut-être la peine d'essayer.

boucle d'or
la source
Hah, c'est beaucoup de force brute!
derobert
Cela fonctionne mais c'est lent; J'ai essayé cela sur une image multi-partition dont je connaissais les décalages, donc je pouvais la démarrer assez près. Jeté dans la echo "--->$i<---"ligne à cause de cela car sinon, il est impossible de mesurer les progrès. Je pense que vous pourriez augmenter bszà 4096, ce qui accélérera les choses.
goldilocks
Vous pourriez l'accélérer beaucoup si vous supposez une disposition traditionnelle où les partitions commencent sur une limite de "piste" (ou est-ce un cylindre?).
derobert
mon estimation était
Ernest A
2

Essayez différentes options (par exemple, en utilisant debugfs et fsck.ext4):

debugfs:

Vous devez d'abord monter debugfs (pas le disque dur défaillant lui-même):

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/

(essentiellement, consiste à utiliser "debugfs -w" avec le mode activé en écriture, puis suivi de "lsdel" pour répertorier tous les fichiers supprimés). vous pouvez également utiliser

et voici fsck.ext4:

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

Un autre est "sleuthkit" ("sudo apt-get install sleuthkit") qui a une commande comme "istat" pour fournir des informations de blocs sur les inodes - à partir desquelles vous pouvez obtenir le décalage et ainsi bloquer facilement le contenu des données.

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

(BTW, si la taille du bloc est 1024, à partir de la commande "show_super_stats" de debugfs, il s'ensuit que le bloc 1 est décalé de 1024 octets par rapport au début du disque, et chaque groupe de blocs peut également avoir plusieurs blocs.)

Peter Teoh
la source
1

J'avais une image de micrologiciel de livre électronique qui comprenait une image de partition ext3fs, afin de monter et d'éditer que je devais numériser l'image à l'aide de l' outil bgrep pour trouver toutes les positions du nombre magique ext3fs 0x53EFet essayer de monter en utilisant les décalages trouvés.

Voici un script raccourci qui effectue le montage:

#!/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

Script complet situé ici .

taro
la source
0

Ceci n'est pas testé mais je pense que vous pouvez utiliser la méthode discutée dans ce SU Q&A intitulé: Recherche inversée d'inode / fichier à partir d'un décalage dans un périphérique brut sur linux et ext3 / 4? .

Il semble que vous pouvez utiliser l'inode d'un fichier + le décalage des disques + la taille du bloc pour déterminer le décalage d'un fichier.

slm
la source
1
je ne vois pas comment cette méthode pourrait m'aider à comprendre où commence le système de fichiers.
Ernest A