GNU/Linux >> Tutoriels Linux >  >> Linux

Restauration de disques fractionnés Windows (LDM) avec Linux ?

Voici la réponse (beaucoup plus facile), maintenant que ldmtool existe.

ldmtool lit les métadonnées LDM (alias Windows Dynamic Disks) et (entre autres) crée des entrées de mappeur de périphérique pour les disques, partitions et matrices RAID correspondants, vous permettant ensuite d'y accéder et de les monter comme d'autres périphériques de bloc sous Linux.

Le programme a quelques limitations, principalement dues au fait qu'il ne modifie pas du tout les métadonnées LDM. Vous ne pouvez donc pas créer de disques LDM sous Linux (utilisez Windows pour cela), et vous ne devez pas monter en mode lecture-écriture des volumes RAID dont les disques manquent. (ldmtool ne modifiera pas les métadonnées pour refléter que cela s'est produit, et la prochaine fois que Windows assemblera la matrice RAID, des problèmes surgiront, car tous les disques ne seront pas synchronisés.)

Voici les étapes à suivre :

  1. Pour installer ldmtool sur les systèmes Debian et Ubuntu, tapez apt-get install ldmtool . Cela devrait être tout aussi facile sur la plupart des autres distributions Linux récentes.
  2. Exécuter ldmtool create all .
  3. Vous devriez maintenant avoir un tas de nouvelles entrées dans /dev/mapper. Localisez le bon (dans mon cas, une matrice RAID1, donc /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2 ), et montez-le simplement avec quelque chose comme mount -t ntfs /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2 .

Pour que cela se fasse automatiquement au démarrage, vous devrez probablement insérer un appel à ldm create all au bon endroit dans la séquence de démarrage, avant le contenu de /etc/fstab est monté. Une bonne façon de faire l'appel serait :

[ -x /usr/bin/ldmtool ] && ldmtool create all >/dev/null || true

Mais la façon dont cet extrait s'exécute au bon moment pendant le démarrage varie beaucoup en fonction de la distribution que vous utilisez. Pour Ubuntu 13.10, j'ai inséré ladite ligne dans /etc/init/mountall.conf , juste avant le exec mountall ... appel à la fin de la section de script. Et je peux maintenant monter ma partition Windows LDM RAID1 en /etc/fstab . Amusez-vous !


Très bien, je vais répondre à ma propre question pour éviter la même douleur aux autres.

0. AVERTISSEMENT

Si vous effectuez une récupération, COPIEZ TOUJOURS VOS DONNÉES et travaillez sur la copie. Ne modifiez PAS les données « cassées » d'origine. Cela dit, continuez à lire.

1. Votre partition ressemble à ...

Installez le kit de détective et le disque de test. J'espère qu'il y aura des packages pour votre distribution :)

# mmls -t gpt LUN01
GUID Partition Table (EFI)
Offset Sector: 0
Units are in 512-byte sectors

    Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Safety Table
01:  -----   0000000000   0000000033   0000000034   Unallocated
02:  Meta    0000000001   0000000001   0000000001   GPT Header
03:  Meta    0000000002   0000000033   0000000032   Partition Table
04:  00      0000000034   0000002081   0000002048   LDM metadata partition
05:  01      0000002082   0000262177   0000260096   Microsoft reserved partition
06:  02      0000262178   1048576966   1048314789   LDM data partition
07:  -----   1048576967   1048576999   0000000033   Unallocated

Remarque :testdisk vous donnera les mêmes informations avec moins de détails# testdisk /list LUN01

2. Extraire les métadonnées des disques

Toutes les informations sur l'ordre des disques, la taille des données et d'autres attributs chiffrés sur la partition se trouvent dans la partition de métadonnées LDM. W2k8 n'a pas tellement changé depuis ce document [2] même si certaines tailles sont différentes et certains attributs sont nouveaux (et évidemment inconnus)...

# dd if=LUN01 skip=33 count=2048 |xxd -a > lun01.metadata
# less lun01.metadata 

À la ligne 0002410, vous devriez voir le nom du serveur. Rassurant ? Mais nous sommes après l'ordre des disques et l'ID du disque. Faites défiler vers le bas.

2.1. Commande de disques

À la ligne 0003210, vous devriez voir 'Disk1' suivi d'une longue chaîne.

0003200: 5642 4c4b 0000 001c 0000 0006 0000 0001  VBLK............
0003210: 0000 0034 0000 003a 0102 0544 6973 6b31  ...4...:...Disk1
0003220: 2437 3965 3830 3239 332d 3665 6231 2d31  $79e80293-6eb1-1
0003230: 3164 662d 3838 6463 2d30 3032 3662 3938  1df-88dc-0026b98
0003240: 3335 6462 3300 0000 0040 0000 0000 0000  [email protected]
0003250: 0048 0000 0000 0000 0000 0000 0000 0000  .H..............

Cela signifie que le premier disque de ce Volume est identifié par l'Unique ID (UID) suivant :79e80293-6eb1-11df-88dc-0026b9835db3Mais pour le moment, nous ne savons pas lequel des disques possède cet UID !Alors passez au Disk2 entrée et notez son UID et ainsi de suite pour tous les disques que vous aviez dans votre volume. Remarque :D'après mon expérience, seuls les 8 premiers caractères changent, le reste reste le même. En effet, W2k8 semble incrémenter l'ID de 6. $ est un séparateur.

Par exemple. :

Windows Disk1 UID : 79e80293-6eb1-11df-88dc-0026b9835db3
Windows Disk2 UID : 79e80299-...
Windows Disk3 UID : 79e8029f-...

2.2. Trouver l'UID du disque

Allez à la ligne 00e8200 (lun01.metadata). Vous devriez trouver 'PRIVHEAD'.

00e8200: 5052 4956 4845 4144 0000 2c41 0002 000c  PRIVHEAD..,A....
00e8210: 01cc 6d37 2a3f c84e 0000 0000 0000 0007  ..m7*?.N........
00e8220: 0000 0000 0000 07ff 0000 0000 0000 0740  [email protected]
00e8230: 3739 6538 3032 3939 2d36 6562 312d 3131  79e80299-6eb1-11
00e8240: 6466 2d38 3864 632d 3030 3236 6239 3833  df-88dc-0026b983
00e8250: 3564 6233 0000 0000 0000 0000 0000 0000  5db3............
00e8260: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00e8270: 3162 3737 6461 3230 2d63 3731 372d 3131  1b77da20-c717-11
00e8280: 6430 2d61 3562 652d 3030 6130 6339 3164  d0-a5be-00a0c91d
00e8290: 6237 3363 0000 0000 0000 0000 0000 0000  b73c............
00e82a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00e82b0: 3839 3164 3065 3866 2d64 3932 392d 3131  891d0e8f-d929-11
00e82c0: 6530 2d61 3861 372d 3030 3236 6239 3833  e0-a8a7-0026b983
00e82d0: 3564 6235 0000 0000 0000 0000 0000 0000  5db5............
00e82e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Ce que nous recherchons, c'est l'UID de ce disque particulier. Nous voyons :- ID de disque :79e80299-6eb1-11df-88dc-0026b9835db3- ID d'hôte :1b77da20-c717-11d0-a5be-00a0c91db73c- ID de groupe de disques :891d0e8f-d929-11e0-a8a7-0026b9835db5

Donc, ce disque avec l'UID 79e80299-... est Windows Disk2 mais pour nous c'était le disque physique 1. En effet, trouvez cet UID dans l'ordre des disques que vous avez trouvé ci-dessus. Remarque :Il n'y a pas d'ordre logique. Je veux dire que Windows décide comment configurer l'ordre des disques, pas vous. Il n'y a donc AUCUNE logique humaine et ne vous attendez pas à ce que votre premier disque soit Disk1.

Ne présumez donc pas que l'ordre ci-dessus suivra une logique humaine. Je vous recommande de parcourir toutes les données LDM de vos disques et d'extraire leur UID. (Vous pouvez utiliser la commande suivante pour extraire les informations PRIVHEAD :dd if=LUNXX skip=1890 count=1 |xxd -a)

ex :

(Windows) Disk1 : 79e80293-... == Physical disk 2
(Windows) Disk2 : 79e80299-... == Physical disk 1
(Windows) Disk3 : 79e8029f-... == Physical disk 3

Je suis sûr que quelque part dans les métadonnées LDM, vous pouvez trouver le type de volume (spanned, RAID0, RAIDX et les tailles de bande associées) Cependant, je ne l'ai pas creusé. J'ai utilisé une méthode "essayer et réessayer" pour trouver mes données. Donc, si vous savez comment configurer votre configuration avant le drame, vous gagnerez beaucoup de temps.

3. Trouvez le système de fichiers NTFS et vos données

Maintenant, nous nous intéressons au gros morceau de données que nous voulons restaurer. Dans mon cas, il s'agit d'environ 512 Go de données, nous ne convertirons donc pas l'ensemble en ASCII. Je n'ai pas vraiment cherché comment Windows trouve le début de sa partition NTFS. Mais ce que j'ai trouvé, c'est qu'il commence logiquement par le mot clé suivant :R.NTFS. Trouvons cela et trouvons le décalage que nous devrons appliquer plus tard pour voir notre NTFS FS.

06:  02      0000262178   1048576966   1048314789   LDM data partition

Dans cet exemple, les données commencent à 262178 et ont une longueur de 1048314789 secteurs

Nous avons trouvé ci-dessus que Disk1 (du groupe de volumes) est en fait le 2ème disque physique. Nous allons extraire certaines de ses informations pour trouver où commence la partition NTFS.

# dd if=LUN02 skip=262178 count=4096 |xxd -a > lun02.DATASTART-4k
# less lun02.DATASTART-4k

0000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
*
00fbc00: eb52 904e 5446 5320 2020 2000 0208 0000  .R.NTFS    .....
00fbc10: 0000 0000 00f8 0000 3f00 ff00 0008 0400  ........?.......
00fbc20: 0000 0000 8000 8000 ffaf d770 0200 0000  ...........p....

Ici, nous pouvons voir que NTFS commence à 00fbc00. Sachant donc que nous pouvons commencer à extraire nos données du secteur 262178 + 00fbc00 octets. Faisons un peu de conversion hexadécimale en décimale avec également une conversion d'octets en secteur.

0xfbc00 octets =1031168 octets =1031168/512 secteurs =2014 secteurs

Donc, notre partition NTFS commence à 262178 + 2014 =264192 secteurs. Cette valeur va être un décalage que nous utiliserons plus tard sur tous les disques. Appelons-le le décalage NTFS. Évidemment, la taille totale est réduite par le décalage. La nouvelle taille est donc :1048314789 - 2014 =1048312775 secteurs

4. Essayez de monter/voir les données

À partir de maintenant, soit cela fonctionnera immédiatement parce que votre partition NTFS est saine, soit cela ne fonctionnera pas parce que vous faites cela pour récupérer des données. Le processus suivant est le même quel que soit votre statut. Tout ce qui suit est basé sur [1] (voir les liens en bas)

Un volume fractionné remplira un volume après l'autre. Alors qu'un striped (RAID0) copiera un morceau de données sur plusieurs disques (c'est-à-dire qu'un fichier est réparti sur plusieurs disques). Dans mon cas, je ne savais pas s'il s'agissait d'un volume fractionné ou rayé. Le moyen le plus simple de savoir si votre volume n'est pas plein est de vérifier si vous avez beaucoup de zéros à la fin de tous vos volumes. Si tel est le cas, il est rayé. Parce que s'il est étendu, il remplira le premier disque, puis le second. Je ne suis pas sûr à 100% mais c'est ce que j'ai observé. Ajoutez donc un tas de secteurs à partir de la fin de la partition de données LDM.

4.0 Préparatifs pour accéder à vos données

Montez d'abord votre fichier dd ou votre appareil via un périphérique de bouclage avec le NTFSoffset et la taille que nous avons calculée ci-dessus. Cependant, le décalage et la taille doivent être en octets et non dans les secteurs à utiliser avec losetup.offset =264192*512 =135266304size =1048312775*512 =536736140800

# losetup /dev/loop2 DDFILE_OR_DEVICE -o 135266304 --size 536736140800
# blockdev --getsize /dev/loop2
1048312775 <---- total size in sectors, same number than before

Remarque :vous pouvez ajouter '-r' pour monter en mode lecture seule.

Faites ce qui précède pour tous les disques physiques faisant partie de votre volume. Affichez le résultat avec :losetup -aRemarque :si vous n'avez pas assez de périphériques de boucle, vous pouvez facilement en créer d'autres avec :# mknod -m0660 /dev/loopNUMBER b 7 NUMBER &&chown root.disk /dev/loopNUMBER

Vérifiez votre alignement en ouvrant le premier disque du groupe (ex :Disk2) pour voir si la première ligne est R.NTFS. Si ce n'est pas le cas, votre alignement est faux. Vérifiez vos calculs ci-dessus et réessayez. Ou vous ne regardez pas le 1er disque Windows

ex :

First disk of the volume has been mounted on /dev/loop2 
# xxd /dev/loop2 |head
0000000: eb52 904e 5446 5320 2020 2000 0208 0000  .R.NTFS    ..... 
0000010: 0000 0000 00f8 0000 3f00 ff00 0008 0400  ........?.......

Tout bon. Passons à la partie ennuyeuse :)

4.1 Étendu

Les disques fractionnés sont en fait une chaîne de disques. Vous remplissez le premier puis vous utilisez le second et ainsi de suite. Créez un fichier qui ressemble à ceci, par exemple :

# Offset into   Size of this    Raid type       Device          Start sector
# volume        device                                          of device
0               1048312775  linear          /dev/loop2       0
1048312775      1048312775  linear          /dev/loop1       0
2096625550      1048312775  linear          /dev/loop3       0

Remarques :- N'oubliez pas d'utiliser le bon ordre de disque (que vous avez trouvé auparavant). Par exemple :Physical Disk2 suivi de Physical Disk1 et Physical Disk3 - 2096625550 =2*1048312775 et évidemment si vous avez un quatrième disque, il sera 3 fois plus grand pour le décalage du 4ème disque.

4.2 Rayé

Le problème avec le mode striped (alias RAID0) est que vous devez savoir quelle est votre taille de stripe. Apparemment, par défaut, c'est 64k (dans mon cas, c'était 128k mais je ne sais pas s'il a été réglé par l'administrateur système de Windows :). Quoi qu'il en soit, si vous ne le savez pas, il vous suffit d'essayer toutes les valeurs standard possibles et de voir laquelle vous donne un système de fichiers NTFS viable.

Créez un fichier comme celui-ci pour 3 disques avec une taille de bloc de 128 Ko

                       .---+--> 3 chunks of 128k
0 3144938240  striped  3  128      /dev/loop2 0 /dev/loop3 0 /dev/loop1 0 
   `---> total size of the volume      `----------+-----------+---> disk order

/!\ :La taille du volume n'est pas exactement la taille que nous avons calculée auparavant. dmsetup a besoin d'une taille de volume divisible par la taille du bloc (c'est-à-dire la taille de bande) ET par le nombre de disques dans le volume. Donc dans notre cas. Nous avons 3 disques de 1048312775 secteursDonc la taille "normale" est de 1048312775*3=3144938325 secteurs mais en raison de la contrainte ci-dessus nous allons recalculer la taille et l'arrondir# echo "3144938325/128*128" | bc3144938240 secteurs

  So 3144938240 is the size of your volume in a striped scenario with 3 disk and
  128 chunks (aka stripes)

4.3 Montez-le.

Maintenant, agrégeons tout avec dmsetup :

# dmsetup create myldm /path/myconfigfile
# dmsetup ls
myldm       (253, 1)

# mount -t ntfs -o ro /dev/mapper/myldm /mnt 

S'il ne monte pas. Ensuite, vous pouvez utiliser testdisk :

# testdisk /dev/mapper/myldm
--> Analyse
----> Quick search
------> You should see the volume name (if any). If not it seems compromised :)
--------> Press 'P' to see files and copy with 'c'

5. Conclusion

Ce qui précède a fonctionné pour moi. Votre kilométrage peut varier. Et il y a peut-être une façon meilleure et plus facile de le faire. Si c'est le cas, partagez-le afin que personne d'autre n'ait à traverser ce tracas :) De plus, cela peut sembler difficile, mais ce n'est pas le cas. Tant que vous copiez vos données quelque part, essayez et réessayez jusqu'à ce que vous puissiez voir quelque chose. Il m'a fallu 3 jours pour comprendre comment assembler tous les morceaux. J'espère que ce qui précède vous aidera à ne pas perdre 3 jours.

Remarque :Tous les exemples ci-dessus ont été inventés. Il y a peut-être des incohérences entre les exemples malgré ma minutie;)

Bonne chance.

6. Liens

  • [1] :http://www.kernel.org/doc/Documentation/filesystems/ntfs.txt
  • [2] :http://russon.org/ntfs/ldm/technical/index.html
  • [3] :http://svnweb.freebsd.org/base/stable/9/sys/geom/part/g_part_ldm.c
  • [4] :http://ntfs.com/ldm.htm
  • [5] :http://sourceforge.net/projects/linux-ntfs/files/LDM%20Documentation/

Linux
  1. Déverrouillez automatiquement les disques chiffrés sous Linux

  2. Comment effectuer un double démarrage de Windows 10 et de MX Linux

  3. Gérer les disques avec DiskPart

  4. Créer une image de la partition Windows sous Linux

  5. Comment puis-je enregistrer le serveur Linux avec le serveur DNS Windows

Comment démarrer Linux Mint 20 avec Windows 10

Comment sauver votre système Windows ou Linux avec Rescatux

Exécutez des applications Windows sur Linux avec Crossover 15

Comment cloner des disques avec la commande Linux dd

Comment exécuter un logiciel Windows sur Linux avec des bouteilles

Installer Windows 10 sur Linux avec VirtualBox