LINUX.ORG.RU

Восстановить внешний HDD

 , ,


1

2

Добрый день господа, принесли мне внешний USB жесткий диск, говорят после переустановки винды диск не читается (видимо при установке винды диск был подключен и винда распорядилась им по своему усмотрению), появились некие разделы которых вроде как не должно быть и в добавок ко всему винда просит его отформатировать, соответственно доступа к имеющимся данным на нём тоже нет.
Подключил его к Fedore

sudo fdisk -l
...
Диск /dev/sdg: 931,5 GiB, 1000202043392 байт, 1953519616 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x73696d20
более подробно не могу данные предоставить, запущен testdisk.
диск разбит на 4 области, первая свободная без раздела, вторая и третья области имеют разделы но при обращении говорят что не могут быть примонтированы т.к. имеются неполадки, 4 область свободная.
Подскажите у кого был опыт как при минимальных усилиях и максимально быстро восстановить прежнюю таблицу разделов или данные? Времени заниматься с ним катастрофически не хватает, взыграл чисто спортивный интерес.

Ответ на: комментарий от legolegs

ты чертовски прав, но для винды у меня только виртуальная машина на редкий случай, USB 3.0 не поддерживается, да и не надо оно мне. пусть сканируется проприетарщиной, вытащу фото, а потом поиграюсь малость уже родными утилитами линукса, от владельца разрешение получил.
fsck -n во время работы testdisk'a говорил что диск занят.

StellzZz ★★
() автор топика
Последнее исправление: StellzZz (всего исправлений: 1)
Ответ на: комментарий от StellzZz

кладёшь к себе образ, выкладываешь его на самбу или виртуалбоксе делаешь самбадоступ, из виртуалки большинство нормальных софтин хавают образ по сети или с подключенного сетевого диска.
быстро и удобно.

Deleted
()
Ответ на: комментарий от Deleted

В виртуалку можно и образ как диск подключить, безо всяких самб.

legolegs ★★★★★
()
Ответ на: комментарий от StellzZz

Можно было бы поискать (например утилитой ht(hte)) в образе диска сектора, заканчивающиеся на 0x55, 0xAA. В начале сектора есть сигнатуры файловых систем, поля с указанием размера раздела. По ним реконструировать записи MBR . Или проще вытащить куски из образа командой dd if=image.bin of=partiton.bin skip=offset_in_sectors bs=512 count=partition_size и монтировать их потом.

Инфа по NTFS (размер раздела 8 байт по 0x28), ExFAT и его VBR (размер раздела - 8 байт по 0x48). По FAT32 сейчас ссылки нет, там размер раздела - 4 байта по 0x20, по 0x52 строка «FAT32 ».

Достаточно просто на сях утилиту набросать для автоматизации процесса поиска.

bugs-bunny
()
Ответ на: комментарий от bugs-bunny

поискать ... в образе диска сектора, заканчивающиеся на 0x55, 0xAA.

Чего его искать эта сигнатура записывается в конце нулевого сектора диска после блока с таблицей разделов. Это последние символы первого (нулевого) 512 сектора.

В начале сектора есть сигнатуры файловых систем, поля с указанием размера раздела.

В нулевом секторе в последних 66 байтах находится 4-е 16-и байтных записи о параметрах разделов, номер начального, конечного сектора, тип файловой системы. Это в случае MBR разметки.

Но т.к. уже созданы другие разделы, то таблица разделов в нулевом секторе уже перезаписана.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

В 0-м секторе находится MBR (Master Boot Record), я даже ссылку на нее дал. И да, она уже повреждена. Остается надеяться, что виндовская прогармма разметки не попортила сильно старые разделы.

В 0-м секторе каждого виндовского раздела находится VBR (Volume Boot Record), которая также заканчивается 0x55, 0xAA, на их структуру я тоже ссылки дал. В ext2/3/4 по другому, там первый 1КБ пробит нулями. Из VBR-ов MS-разделов можно вытащить размеры разделов.

bugs-bunny
()
Ответ на: комментарий от bugs-bunny

Вот пример. Реальная загрузочная флешка с FAT32 разделом. По LBA=0x8000 находится сектор VBR для FAT32. Этот LBA и должна будет найти утилита.

0000 eb 58 90 53 59 53 4c 49-4e 55 58 00 02 40 40 00 |?X?SYSLINUX ?@@ 
0010 02 00 00 00 00 f8 00 00-20 00 40 00 00 08 00 00 |?    ?    @  ?  
0020 00 f8 37 07 c0 39 00 00-00 00 00 00 02 00 00 00 | ?7??9      ?   
0030 01 00 06 00 00 00 00 00-00 00 00 00 00 00 00 00 |? ?             
0040 80 01 29 1d 05 29 4c 4b-4e 4f 50 50 49 58 20 20 |??)??)LKNOPPIX  
0050 20 20 46 41 54 33 32 20-20 20 fa fc 31 c9 8e d1 |  FAT32   ??1???
0060 bc 76 7b 52 06 57 1e 56-8e c1 b1 26 bf 78 7b f3 |?v{R?W?V???&?x{?
0070 a5 8e d9 bb 78 00 0f b4-37 0f a0 56 20 d2 78 1b |????x ??7??V ?x?

01a0 2f 00 66 61 72 01 c3 e2-c9 31 f6 8e d6 bc 68 7b |/ far????1????h{
01b0 8e de 66 8f 06 78 00 be-da 7d ac 20 c0 74 09 b4 |??f??x ??}? ?t??
01c0 0e bb 07 00 cd 10 eb f2-31 c0 cd 16 cd 19 f4 eb |??? ????1???????
01d0 fd 8a 16 74 7b 06 cd 13-07 c3 42 6f 6f 74 20 65 |???t{?????Boot e
01e0 72 72 6f 72 0d 0a 00 00-00 00 00 00 00 00 00 00 |rror??          
01f0 00 00 00 00 00 00 00 00-fe 02 b2 3e 18 37 55 aa |        ???>?7U?

Вот она сигнатура VBR - 0x55, 0xAA по смещению 0x1FE, тип файловой системы «FAT32 » в 0x52. В 0x20 находим размер раздела в секторах - 0x737f800, это 62ГБ если помножить на размер сектора 512, что похоже на правду.

Итого, команда вытаскивания раздела будет.

dd if=image.bin of=part.bin skip=$((0x8000)) bs=512 count=$((0x737f800))

Про $((...)) вычитал тут

bugs-bunny
()
Ответ на: комментарий от bugs-bunny

И вот накропал в помощь утилю

findvbr.c

#include <stdlib.h>
#include <stdio.h>
#include <linux/types.h>

#define BUF_BLOCKS	256
#define SECT_SIZE	512
#define BUF_SIZE	(BUF_BLOCKS*SECT_SIZE)

__u8		buf[BUF_SIZE];

int main(int argc, char **argv)
{
    FILE		*himg = 0;
    __u32		offs, size, img_size, obuf;
    __u8		*vbr;
    __u8		*fstype;
    int			found;

    if(argc<2)
    {
	printf("Use\r\n\tfindvbr phys_drive_or_dump\r\n");
	return -1;
    }

    himg = fopen(argv[1],"rb");
    if(!himg)
    {
	printf("Cannot open device/image \"%s\"",argv[1]);
	return -1;
    }

    fseek(himg,0,SEEK_END);
    img_size = ftell(himg);

    for(offs=0; offs<img_size; offs+=BUF_SIZE)
    {
	fseek(himg,offs,SEEK_SET);
	fread(buf,BUF_SIZE,1,himg);

	for(obuf=0; obuf<BUF_SIZE; obuf+=SECT_SIZE)
	{
	    vbr = buf+obuf;
	    if(0xAA55==*((__u16*)(vbr+0x1FE)))
	    {
		found = 0;

		if(!strncmp(vbr+0x52,"FAT32",5))
		{
		    found = 1;
		    fstype = "FAT32";
		    size = *((__u32*)(vbr+0x20));
		}
		else if(!strncmp(vbr+0x03,"NTFS",4))
		{
		    found = 1;
		    fstype = "NTFS ";
		    size = *((__u64*)(vbr+0x28));
		}
		else if(!strncmp(vbr+0x03,"EXFAT",5))
		{
		    found = 1;
		    fstype = "ExFAT";
		    size = *((__u64*)(vbr+0x48));
		}

		if(found)
		{
		    printf("@LBA=0x%8.8X  fstype=%s  size=0x%8.8X[sect]",(offs+obuf)/SECT_SIZE,fstype,size);
		    printf("\r\n");
		}
	    }
	}

    }

    fclose(himg);
    return 0;
}

Конпеляем gcc findvbr.c -o findvbr

Запускаем

root@LIN:/home/user/PROJECTS/findvbr# ./findvbr /dev/sdd
@LBA=0x00000800  fstype=FAT32  size=0x0737F800[sect]
@LBA=0x00000806  fstype=FAT32  size=0x0737F800[sect]

bugs-bunny
()
Ответ на: комментарий от bugs-bunny

всем спасибо, почитаю, попробую, хард на работе остался, в понедельник помучаю его.

StellzZz ★★
() автор топика
Ответ на: комментарий от bugs-bunny

Ты тут в треде щас testdisk изобретёшь, остановись!

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.