wtorek, 29 marca 2016

Zrozumieć niezrozumiałe: dd i... gdzie się podziały moje dane

W niektórych dystrybucjach jest prosto: ściągnij ISO, ściągnij unetbootin, uruchom unetbootin "nagraj" bootowalnego pendrive'a.  Prosto, szybko, skutecznie. Obraz ISO umieszcza się "obok" danych, które mamy na pendrive (jeśli starcza miejsca - jeśli nie - informuje o tym). Zwykle od unetbootina zaczynamy. Wieloplatformowy, intuicyjny, prosty w obsłudze i... polecany na wielu stronach z tymi najbardziej '"ludzkimi" dystrybucjami spod znaku pingwina. Nie wszystkie jednak dają się poprawnie nagrać przez unetbootin. Tak jest np. z Archem, Manjaro, Chakrą... Praktycznie każdą dystrybucją "archopodobną", czy archopochodną. Tutaj polecane jest konsolowe narzędzie dd. Niekiedy znajdziemy tajemnicze narzędzia GUI typu isousb, czy pochodzące z OpenSUSE lub Fedory podobne do niego. Wszystkie one stanowią wyłącznie nakładkę na dd.
Czytamy zatem, że należy wykonać:
dd if=ścieżka_do_iso of=/dev/sdX
To X, to jakaś literką symbolizująca napęd USB. I tyle. Gdzieniegdzie pojawi się jeszcze informacja, że działanie powyższe wykasuje wszystkie pliki na pendrive. Kto to czyta? Przyzwyczajenie jest drugą naturą człowieka. Rozum podpowiada: skoro mam 16GB pendrive'a i na nim zajęte jedynie 4GB, to na tym samym nośniku musi się zmieścić przecież np. 1GB dystrybucja. Oczywiście się zmieści. Zmieści się nawet taka 16GB. Zatem wklepujemy bezmyślnie w terminalu powyższe polecenie, a potem... Potem jest lament. Gdzie się podziały moje pliki, które tam przecież powinny zostać, bo miejsca na pendrive było pod dostatkiem. Nadto pendrive jest sformatowany w jakimś dziwnym formacie. Jest znacznie mniejszy niż 16GB. Nie daje się zapisać. Ba, nie daje się "normalnie" sformatować, by odzyskać utracone miejsce, nie mówiąc już o utraconych plikach.
Otóż dd to nie jest "zwykłe" narzędzie do kopiowania plików. Inaczej, pod linuksem wystarczyłoby cp (lub do przeniesienia mv). Inne systemy również mają swoje odpowiedniki. Po jakiego zatem diabła owe dd?
Nie będę się rozpisywać po co ono jest i jakie może mieć zastosowania. Przynajmniej nie tym razem. Konieczne jest natomiast uświadomienie sobie co powoduje jego zastosowanie w praktyce w odniesieniu do pliku ISO.
Trzeba zatem zrozumieć czym jest plik *.iso, czy też "obraz dysku".
Otóż najprościej mówiąc jest to cyfrowa kopia dysku CD bądź DVD umieszczona w jednym pliku. W czasach, gdy nośniki te były popularne, na nich otrzymywaliśmy różnego rodzaju systemy operacyjne, gry, cokolwiek... Wkładaliśmy do czytnika CD/DVD i... Dalej już było prosto. Jeśli był to dysk z zawartym tam systemem operacyjnym, który dawał się instalować (a najczęściej tak było), to dysk startował, a potem już tylko należało klikać "Dalej".
Problem  leży w tym, że taki dysk CD/DVD jest zestandaryzowany. Ma swój system plików. Ma swoją pojemność, która jest m.in. wynikiem owego systemu plików (w uproszczeniu). Całość natomiast zachowuje się w taki sposób, że gdy na nośniku DVD, którego standard przewiduje 4,4GB danych nagramy obraz o wielkości 300MB, to... Wówczas DVD będzie miało pojemność 300MB i ani bajta więcej. Ponad 4GB "pojemności" nie będzie już nigdy widoczne, a nośnik zostanie zapełniony w 100%. Gdzie zatem się podziało 4,1GB? Nigdzie.  Po prostu tego, dla obrazu, który ma 300MB nie ma. Obraz, to obraz. Nie może być mniejszy lub większy, albowiem zajmuje całość. Cokolwiek staje się zrozumiałe?
Wróćmy zatem do plików *.iso oraz pendrive.
Kiedy popularne stały się pendrive i to w wielkości, która umożliwiła na nich zapisanie plików obrazów, stwierdzono, że najprościej jest trzymać się standardu. Mamy zatem pendrive oraz obraz dysku. Taki sam, jaki był wgrywany na CD/DVD. Trzeba było jeszcze stworzyć narzędzie, które z naszego pendive zrobi "udawane" CD/DVD. I takim właśnie jest dd. Starsze zresztą od nagrywania obrazów ISO na pendrive.
Co zatem robi dd? Najprościej mówiąc - zgodnie zresztą z nazwą (dd = disk dupe, czyli duplikowanie dysku) - tworzy fizyczną kopię dysku, który jest kopiowany. Jeśli takim "dyskiem" jest jego obraz zawarty w pliku *.iso, to stworzy on na docelowym nośniku cyfrową kopię odpowiadającą obrazowi dysku zawartemu w ISO. Kopię dokładną. Bit w bit. Dlatego też jeśli obrazem dysku jest obraz CD bądź DVD, to po "wgraniu" go na pendrive, otrzymamy pendrive, który dla maszyn takich jak komputer wygląda tak samo jak CD, czy DVD. Ma taką samą strukturę, taki sam format plików i taką samą wielkość jak oryginał.
Teraz już nic dziwnego, że pendrive potraktowany przez dd przyjmuje fizyczną postać CD, czy DVD.
Musimy sobie jeszcze uświadomić tego konsekwencje. Otóż jeśli ów pendrive był sformatowany jako np. FAT32 (tak jak praktycznie 100% dostępnych w handlu), to po potraktowaniu go poleceniem dd otrzymamy pendrive, którego system plików nazywał się będzie ISO9660. Dlaczego? Bowiem jest to standard przyjęty przez międzynarodową instytucję standaryzującą. Użyte polecenie dd - w tym znaczeniu - jest równoważne usunięciu dotychczasowego systemu plików, wprowadzeniu nowego i sformatowaniu go do wielkości w bajtach odpowiadającej wielkości wgrywanego pliku ISO.
Czy można w takiej sytuacji odzyskać dane na pendrive "przypadkowo" utracone? W absolutnej większości przypadków nie. Przynajmniej nie "domowymi" sposobami. Zmianie uległa bowiem cała struktura dysku (pendrive'a), a nadto ta nowa struktura została zapisana danymi. Są wprawdzie instytucje, które podejmują się takich zabiegów jak odzyskanie danych potraktowanych w ten sposób, ale same nie ręczą za sukces, proces jest bardzo długi, a koszt jego olbrzymi dla "zwykłego użytkownika".
Cóż... "a nie mówiłem"? Trzeba najpierw czytać, zanim się coś na łapu capu zrobi.
Pozostaje jeden problem. Pendrive "potraktowany" przez dd "staje się" CD lub DVD. Standard ten nie przewidział jego fomatowania, stąd też proste pomysły typu użycie jakiegokolwiek narzędzia do fomatowania czy tworzenia partycji na dysku (jak np. gparted) na nic się nie zdadzą. Najpierw musimy komputer poinformować o tym, że udający CD/DVD pendrive nie jest takim nośnikiem. Musimy zatem wyzerować obszar pierwszych 512 bitów takiego pendrive. Zrobimy to tak:
# dd count=1 bs=512 if=/dev/zero of=/dev/sdX && sync
gdzie X jest literą pod jaką nasz system widzi napęd pendrive.
Potem już pójdzie prosto, albowiem taki dysk będzie dawał się sformatować pod wybrany przez nas system plików, w dowolnym, preferowanym przez nas programie.

Zob. też w moim starym wpisie oraz linkach w nim zawartych.