Odbuduj masowo pofragmentowane pliki z częściowym obrazem i listą ich sektorów

1

Próbując odzyskać jak najwięcej danych z uszkodzonego dysku twardego o pojemności 3 TB, postąpiłem następująco:

  • Wykonałem skan powierzchni za pomocą HD Sentinel, który zidentyfikował dwa małe uszkodzone obszary i około 100 uszkodzonych sektorów (wcześniej liczba ta wynosiła 16).
  • Następnie określiłem, które pliki dotknęły uszkodzone sektory, używając różnych metod .
  • Przeniosłem te pliki (sześć dużych plików wideo) do specjalnego folderu i skopiowałem pozostałe pliki i foldery, zmniejszając ich kolejność; wszystko zostało pomyślnie skopiowane, z wyjątkiem jednego nieistotnego pliku .eml, który akurat znajdował się w pobliżu już zidentyfikowanych uszkodzonych sektorów.
  • Potem pomyślałem, że najbezpieczniejszym sposobem na maksymalne wykorzystanie pozostałych plików (programów telewizyjnych, które nie są już online i dla których nie mam kopii zapasowej) byłoby użycie ddrescue - ale ponieważ jedyny pusty dysk twardy, jaki miałem, to 500 GB , Nie mogłem wyobrazić sobie wszystkiego. Niektóre z tych plików są masowo pofragmentowane (6000 do 12000 fragmentów każdy - zostały pobrane jednocześnie, tak sądzę, dlatego właśnie zostały zapisane we wzorcu „z przeplotem” powodującym taki poziom fragmentacji, ponieważ w przeciwnym razie HDD miałby dużo wolnego miejsca), więc Nie mogłem ich odzyskać po prostu przez wyodrębnienie sektorów, które zajmowały, ale pomyślałem, że obrazując pierwsze 10 GB, zwykle zawierające cały plik MFT i wszystkie inne pliki systemowe, a także cztery obszary, w których te pliki były zlokalizowane, będę w stanie łatwo wyodrębnij je z obrazu, używając WinHex lub R-Studio.

Ale niestety nie dostałem całego MFT: niektóre z nich (jak później dowiedziałem się, sprawdzając pełną listę nfi.exe tej partycji, którą utworzyłem wcześniej) znajdują się wokół znaku 200 GB, a trzeci fragment znajduje się na sam koniec partycji, blisko znaku 3 TB. Nie sądziłem, że stan dysku twardego pogorszy się tak szybko podczas próby odzyskania (teraz ma ponad 12000 przeniesionych sektorów plus 9000 oczekujących sektorów, zaledwie kilka godzin później! ...), i nie podjąłem żadnych środków ostrożności aby zapisać MFT z WinHex, kiedy mogłem. Teraz, gdy ddrescue stało się boleśnie powolne, prawdopodobnie nie dostanę całego MFT. Ponadto, jeśli otworzę ten częściowy obraz za pomocą WinHex, użyje on tej samej migawki woluminu, która została utworzona podczas badania urządzenia fizycznego, pliki, które chcę, zostaną wyświetlone z poprawnym rozmiarem i datami,

Ale odzyskałem sporą część fragmentów danych zawierających te sześć plików i dla każdego z nich mam szczegółową listę zajmowanych sektorów / klastrów (uzyskanych za pomocą trzech różnych narzędzi: nfi.exe, Recuva, HD Sentinel) . W jaki sposób mogę odbudować te pliki przy użyciu tych informacji za pomocą automatycznego skryptu? (Wykonanie tego ręcznie byłoby niemożliwe).

Z ddrescue mógłbym użyć przełączników -i (pozycja wejściowa) -o (pozycja wyjściowa) i -s (rozmiar wejściowy), ale jak mogę zautomatyzować proces i uruchomić te tysiące poleceń jednocześnie?

W systemie Windows znam narzędzie wiersza polecenia o nazwie dsfo, które może wyodrębnić dane z dowolnego źródła do pliku docelowego za pomocą polecenia takiego:

dsfo [source] [offset] [size] [destination]

Mógłbym edytować moją listę sektorów / klastrów za pomocą kombinacji Calc i TEDNotepad, aby utworzyć listę poleceń dsfo, ale utworzyłoby to tysiące fragmentów, do których musiałbym jakoś dołączyć. Czy jest lepszy sposób na zrobienie tego w jednym kroku?



EDYTOWAĆ :

Wziąłem więc listę klastrów / sektorów dla jednego z tych plików, wygenerowaną przez HD Sentinel, która jest przedstawiona w następujący sposób:

R:\fichiers corrompus\2017_07_2223_58 - Arte - Pink Floyd - The Dark Side of the Moon Live.mp4
Total Size: 883 787 365 bytes   Position: 0     Attributes: Arc
Number of file fragments: 6040
VCN: 0  LCN: 516530293  Length: 4288    sectors: 4132506536 - 4132540839
VCN: 4288   LCN: 516534613  Length: 16  sectors: 4132541096 - 4132541223
VCN: 4304   LCN: 516534645  Length: 64  sectors: 4132541352 - 4132541863
VCN: 4368   LCN: 516534725  Length: 16  sectors: 4132541992 - 4132542119
VCN: 4384   LCN: 516534757  Length: 48  sectors: 4132542248 - 4132542631
VCN: 4432   LCN: 516534853  Length: 32  sectors: 4132543016 - 4132543271
VCN: 4464   LCN: 516534901  Length: 16  sectors: 4132543400 - 4132543527
VCN: 4480   LCN: 516534933  Length: 48  sectors: 4132543656 - 4132544039
VCN: 4528   LCN: 516535013  Length: 16  sectors: 4132544296 - 4132544423
...
VCN: 215760 LCN: 568126709  Length: 9   sectors: 4545277864 - 4545277935

Pierwsze pole prawdopodobnie oznacza „Wirtualny numer klastra” (nie znalazłem szczegółowego opisu w zintegrowanej pomocy), w każdym razie ta wartość oczywiście reprezentuje numer klastra w stosunku do początku pliku. Druga wartość musi być „logicznym numerem klastra” i jest numerem klastra w stosunku do początku partycji (patrz poniżej, na początku pomyliłem się, sądząc, że ta wartość dotyczy całego urządzenia). Trzecia wartość reprezentuje długość każdego fragmentu, również mierzoną w klastrach. Te trzy wartości powinny wystarczyć dla moich zamiarów i celów.

Zaimportowałem to do TED Notatnika i użyłem funkcji „Narzędzia”> „Linie”> „Kolumny, liczby”, wybrałem kolumny 2, 3, 1 z tabulatorami jako separatory, co dało wynik:

LCN: 516530293  Length: 4288    VCN: 0
LCN: 516534613  Length: 16  VCN: 4288
LCN: 516534645  Length: 64  VCN: 4304
LCN: 516534725  Length: 16  VCN: 4368
LCN: 516534757  Length: 48  VCN: 4384
LCN: 516534853  Length: 32  VCN: 4432
LCN: 516534901  Length: 16  VCN: 4464
LCN: 516534933  Length: 48  VCN: 4480
LCN: 516535013  Length: 16  VCN: 4528
...
LCN: 568126709  Length: 9   VCN: 215760 

Następnie zaimportowałem to do Calc z tabulatorami i spacjami jako separatorami, dodałem kolumnę do obliczenia przesunięcia wejściowego od numeru klastra (= LCN * 8 * 512), kolejną do obliczenia długości w bajtach na podstawie długości w klastrach (= długość * 8 * 512) i wreszcie inny, aby uzyskać przesunięcie wyjściowe od wartości VCN (= VCN * 8 * 512), wkleił formuły do ​​wszystkich innych wierszy, usunął dodatkowe kolumny, zastąpił „LCN:” słowem „ddrescue / media / sdb1 / ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i ”, zamieniono„ Length: ”na„ -s ”, zastąpiono„ VCN: ”na„ -o ”...
Teraz mam to ( z wyjątkiem tego, że dla każdego pliku istnieje 6000-12000 wierszy):

ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115708080128 -s 17563648 -o 0
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115725774848 -s 65536 -o 17563648
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115725905920 -s 262144 -o 17629184
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115726233600 -s 65536 -o 17891328
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115726364672 -s 196608 -o 17956864
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115726757888 -s 131072 -o 18153472
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115726954496 -s 65536 -o 18284544
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115727085568 -s 196608 -o 18350080
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2115727413248 -s 65536 -o 18546688
...
ddrescue /media/sdb1/ST3000DM001-2.dd /media/sdb1/201707222358.mp4 -i 2327047000064 -s 36864 -o 883752960

Więc jaki jest najprostszy sposób uruchamiania tej ogromnej serii poleceń w systemie na żywo Knoppix? Co w systemie Linux jest odpowiednikiem skryptu wsadowego dla wiersza polecenia w systemie Windows?

(Mógłbym znaleźć ten konkretny plik w sieci P2P, więc pozwoli mi to sprawdzić, czy ta metoda działa bezbłędnie, a jeśli tak, aby ocenić poziom uszkodzeń. Brak szczęścia dla pozostałych pięciu. Jeden z nich nie jest pofragmentowane, aby wyodrębnić je jako jeden fragment danych: pod koniec jest wiele pustych sektorów, ale reszta jest czytelna. Pozostały więc cztery pliki do wyodrębnienia w ten sposób.)

Gabriel B.
źródło
Nalegając na pracę na dysku, którego dotyczy problem, pogarszasz sytuację. Sugeruję, abyś poświęcił trochę czasu na zakup nowego dysku 3 TB i uratował całą kopię uszkodzonego. Następnie możesz wyodrębnić pliki za pomocą RecuperaBit (ujawnienie: jestem autorem).
Andrea Lazzarotto
Właśnie w tym momencie może być za późno na zrobienie całej kopii, a ja nawet nie mogę uzyskać obszarów, w których znajduje się MFT (które byłyby konieczne do wyodrębnienia pofragmentowanych plików z dowolnego oprogramowania do odzyskiwania danych - wypróbowałem R-Studio bezskutecznie). Poza tym skopiowałem już prawie wszystko, gdy dysk był jeszcze w niezłym stanie. Właśnie dlatego próbuję uratować to, co jest możliwe do odzyskania z tych 6 pozostałych plików, wyodrębniając je z obrazu, tak jak jest, tylko z listą sektorów, które zajmują. Jestem pewien, że można to zrobić w ten sposób, po prostu potrzebuję odpowiedzi pogrubioną czcionką.
GabrielB
Rozumiem. Odpowiednikiem skryptu wsadowego w systemie Linux jest skrypt powłoki . Najczęstszą powłoką jest Bash.
Andrea Lazzarotto
Powinieneś również rozważyć dodanie końcowego polecenia do catplików wyjściowych razem.
Andrea Lazzarotto
W międzyczasie przeprowadziłem szybkie badanie: w rzeczywistości skrypt powłoki wydaje się dość łatwy w użyciu (jedyną różnicą w systemie Windows jest to, że musi on być wykonywalny i działać z „./” przed nazwą, w przeciwnym razie jest to tylko lista poleceń zwykłym tekstem). Zwykle przy sposobie pisania tych poleceń i sposobie działania ddrescue powinien on zapisywać wszystkie fragmenty razem w tym samym pliku wyjściowym, prawda? Dlatego wydaje się, że ta metoda jest lepsza niż Windows z dsfo, mimo że jestem mniej obeznany z Linuksem. Jeśli ktoś zna narzędzie Windows, które może to zrobić w jednym kroku, daj mi znać.
GabrielB

Odpowiedzi:

2

Uruchomiłem więc te skrypty ddrescue (najpierw uczyniłem je wykonywalnymi za pomocą polecenia „chmod + x”, a następnie wywołałem je za pomocą ./nazwa_skryptu):

- Na początku polecenia nie działały, ddrescue dawał tylko błędy, musiałem ponownie edytować skrypty, aby parametry były umieszczone przed nazwami plików wejściowych i wyjściowych. Polecenia wyglądały wtedy następująco:

ddrescue -P -i 2115843346432 -s 17563648 -o 0  ST3000DM001-2.dd 201707222358.mp4
ddrescue -P -i 2115861041152 -s 65536 -o 17563648  ST3000DM001-2.dd 201707222358.mp4
ddrescue -P -i 2115861172224 -s 262144 -o 17629184  ST3000DM001-2.dd 201707222358.mp4
ddrescue -P -i 2115861499904 -s 65536 -o 17891328  ST3000DM001-2.dd 201707222358.mp4
ddrescue -P -i 2115861630976 -s 196608 -o 17956864  ST3000DM001-2.dd 201707222358.mp4
ddrescue -P -i 2115862024192 -s 131072 -o 18153472  ST3000DM001-2.dd 201707222358.mp4
...
ddrescue -P -i 2327182266368 -s 36864 -o 883752960  ST3000DM001-2.dd 201707222358.mp4

(Total size of that file : 883787365, or 883789824 with the slack space.)
(“-P” stands for “preview”, “-i” for “input position”, “-s” for “size”, “-o” for “output position”.)
(The paths could be omitted as the scripts, the image file and the expected output files were all in the same directory.)

- Następnie pierwsza próba wygenerowała nieczytelny plik bez poprawnego nagłówka MP4. Dlaczego ? Ponieważ lista dostarczona przez Hard Disk Sentinel podaje fizyczne / absolutne numery sektorów, ale logiczne numery klastrów (zweryfikowałem, otwierając plik obrazu za pomocą WinHex), więc musiałem dodać 264192x512 do obliczenia przesunięcia wejściowego (przesunięcie partycji to 264192 sektory lub 129 MB).

- Więc zadziałało. Zajęło to tylko kilka minut i wyprodukowałem pięć plików wideo, które są w większości czytelne, możliwe do pominięcia do końca, wraz z ich oczekiwaną zawartością - nie obejrzałem ich całkowicie, ale wydaje się tak bezbłędny, jak to tylko możliwe.

wprowadź opis zdjęcia tutaj

(Zrobiłem to wszystko na drugim komputerze działającym na Knoppixie na żywo z karty pamięci i użyłem TeamViewera do polecenia z mojego podstawowego komputera na Windows 7, a także aby móc łatwo przesyłać pliki skryptów. Może jest prostsza konfiguracja dla takie cele, ale cóż, działa!: ^ p)

- Ale oczywiście są części uszkodzone, ponieważ na tym częściowym obrazie były nieczytelne sektory. Skąd mam wiedzieć, gdzie szybko i niezawodnie? Cóż ...
wpadłem na pomysł, aby użyć trybu „generowania” ddrescue, który tworzy pliki dziennika (lub pliki map, jak się je teraz nazywa), analizując dane wyjściowe i biorąc pod uwagę, że całkowicie puste sektory to sektory nieprzeczytane, oznaczone jako „?”, Reszta oznaczenie „+”. Ponieważ ddrescue oczekuje pliku wejściowego i pliku wyjściowego, ale tylko plik wyjściowy jest w rzeczywistości analizowany w tym trybie, stworzyłem fałszywe pliki wejściowe za pomocą tego polecenia, które kopiuje tylko 1 MB, ale rozszerza rozmiar do rozmiaru plików wyjściowych (tylko w celu oszczędność czasu i miejsca):

ddrescue -s 1048576 -x 883789824 201707222358.mp4 201707222358copy.mp4

Następnie uruchomiłem polecenie „generuj”:

ddrescue -G 201707222358copy.mp4 201707222358.mp4 201707222358-generate.log

A potem otworzyłem te pliki za pomocą ddrescueview:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

(Trzy z sześciu plików są poważnie uszkodzone, podobnie jak pierwszy powyżej, z dużymi fragmentami pustych danych, pozostałe trzy mają tylko kilka uszkodzonych sektorów, takich jak drugi. Drugi to ten, który nie został podzielony, wyodrębniłem go za pomocą pojedynczego polecenia ddrescue).

A potem poklepałem się jedną ręką po plecach, a drugą uderzyłem się w twarz za to, że codziennie korzystałem z tego dysku twardego o pojemności 3 TB codziennie przez wiele miesięcy bez kopii zapasowej ... (Początkowo miało to przechowywać tylko tymczasowe rzeczy, podczas gdy Robiłbym miejsce na innych dyskach twardych, ale zabierało to więcej czasu, niż się spodziewano, i zabrakło mi miejsca na przechowywanie takich filmów, a nawet moich osobistych zdjęć i filmów w pewnym momencie, mogła to być poważna katastrofa, ale „to tylko usterka ”, jak powiedziałby Dick Jones).

Gabriel B.
źródło
1
Możesz zmienić swoje pytanie i odpowiedź, aby pytanie jasno określało początkowy problem, a odpowiedzią jest rozwiązanie krok po kroku jako całość. Na razie wydaje się, że pytanie zawiera część rozwiązania, a odpowiedź po prostu trwa. Nie zrozum mnie źle; edycji pytanie wskazują na pewien postęp było słuszne wtedy , sprzątania tych rzeczy jest miłą rzeczą do zrobienia teraz . Ale niezależnie od tego, czy to zrobisz, czy nie, masz ode mnie +1. Prawie nigdy nie pracuję z NTFS, prawdopodobnie nigdy nie użyję ani nie przetestuję twojego rozwiązania, ale wierzę, że działa i doceniam, że je udostępniasz.
Kamil Maciorowski
Dzięki za miły komentarz! Przynajmniej moje wysiłki tego wieczoru nie były całkowicie bezcelowe ... Jeśli chodzi o twoją sugestię, zastanawiam się, czy warto teraz zmienić to w przewodnik krok po kroku: był to bardzo konkretny problem, w którym był zarówno bardzo ostrożny (dla zapisywania list sektorów / klastrów), jak i bardzo nieostrożny (dla braku kopii zapasowej i nie zapisując całego MFT, kiedy mogłem, zanim spróbowałem poważnego odzyskania problematycznych plików, które, jak wiedziałem, były wysoce fragmentowane). Jest to jednak interesujący problem, a rozwiązanie może mieć zastosowanie do innych zadań.
GabrielB,
OK, może nie jest to warte kłopotu. Tak czy inaczej to pytanie i odpowiedź (czytane jako całość) to dobra robota.
Kamil Maciorowski