Co się dzieje z plikami po ich usunięciu? (poetycznie)

Poetycznie: czyli bez większych szczegółów technicznych.

Z jednej strony pytanie z tego wpisu wydaje nam się oczywiste i mało istotne, z drugiej jednak strony sama odpowiedź nie jest aż tak prosta i oczywista.

W części poetycznej (pojawi się jeszcze „bezduszna”) będę starał się przedstawić to zagadnienie w ten sposób, aby nie-informatyk czuł także jakąś frajdę z czytania tego artykułu i będę stosował tutaj dość spore uproszczenie. Nieco „głębiej” wejdziemy w części bezdusznej (tutaj pojawi się link jak powstanie stosowny artykuł).

W poniższych paragrafach skupiam się głównie na Windowsie (czy raczej NTFS), a to dlatego że większość użytkowników domowych posiada właśnie ten system i jest im bliższy.

Chciałbym też zauważyć, że nie jestem specem w tej dziedzinie (czy to samego systemu, czy systemu plików) i mimo moich starań mogły pojawić się błędy, za których zauważenie i zgłoszenie byłbym wdzięczny (część rzeczy jest celowo uproszczona, co jest dość dokładnie zaznaczone).

 

Intuicja


Nie wiem ilu z Was zastanawiało się co się właściwie dzieje z plikami po ich usunięciu? Po chwili zastanowienia się nad tym pytaniem, wyłania się kilka innych: Czym się różni zwykłe usunięcie pliku od tego co oferują nam np antywirusy („usuń na zawsze”)? Oraz Dlaczego jest ono dużo wolniejsze od usuwania domyślnie wspieranego przez system?

Mając na uwadze te pytania, które są jednocześnie pewnymi spostrzeżeniami możemy dojść do pewnych wniosków:

  • istnieją pewne różnice pomiędzy usuwaniem plików tradycyjną metodą oraz „na zawsze”;
  • skoro „usunięcie na zawsze” działa wolniej to pewnie usuwa pliki dokładniej;
  • sama nazwa: „na zawsze” sugeruje, że pliki usunięte tradycyjnym sposobem można odzyskać!

Na razie skupmy się na usuwaniu „tradycyjnym” i spróbujmy na jakimś przykładzie zrozumieć co się dzieje (sorry, ale korzystam z anglojęzycznego Windowsa, dlatego menu jest po angielsku):

delete-menu

Więc: mam plik, klikam „Usuń” i co się właściwie teraz dzieje z moim plikiem?

delete-confirm

Mamy informację o tym, że plik jest „przenoszony” do Kosza. To istotna wskazówka: plik nie jest usuwany jeszcze w tym momencie lecz przenoszony!

Co to dla nas oznacza? Otóż, możemy założyć że na dysku istnieje specjalny folder (tak będzie łatwiej nam o tym myśleć) do którego są przenoszone pliku w momencie kliknięcia „Usuń”, w tym pseudo-folderze wyłączone są uprawnienia odnośnie odczytu pliku (dla użytkownika), wykonywania itd. Jedynie co użytkownik może zrobić to „przywrócić plik(i)” (przenieść do lokacji, w której był pierwotnie plik) lub „opróżnić kosz”.

Zauważmy, że Kosz ma swój określony limit i jeżeli pliki w nim osiągną większą wartość niż XX Mb to zostaną „utracone” (cokolwiek to w tym momencie znaczy).

trash-limit

Załóżmy, że nasza teoria jest poprawna, a więc jak właściwie działa Kosz? Już wiemy, że przetrzymuje on pliki przeznaczone do usunięcia, można je przywrócić lub sam Kosz „opróżnić”. Skąd Kosz „wie” gdzie były pliki trzymane przed usunięciem? Dlaczego nawet mimo „opróżnienia kosza” wciąż można te pliki odzyskać: może nawet niekoniecznie w całości, ale przynajmniej częściowo (np zewnętrznymi narzędziami)?

Pomysł wydaje się prosty (dla lepszego zrozumienia uprośmy sprawę jeszcze bardziej: niech pliki przeznaczone do usunięcia będą przenoszone do jednego miejsca w pamięci): Kosz przechowuje listę plików, które obecnie się w nim znajdują: ma informacje o tym w której części pamięci Kosza się zaczynają, w której kończą kończą (lub ma po prostu ich rozmiar) oraz trzyma informację o poprzedniej lokacji. Ideę przedstawia poniższy obrazek (na górze ogólny schemat dysku pokazujący uproszczoną ideę, na dole podgląd na pamięć kosza: Lista –  to lista plików z informacją o ich lokalizacji; na czerwono same pliki):

diskmemory-scheme

A więc wychodziłoby że „opróżnienie kosza” to nic innego jak wyczyszczenie listy z informacjami o plikach znajdujących się w Koszu, co oznacza, że przy kolejnym przeniesieniu pliku do Kosza część pamięci, która mogła być wcześniej zajmowana przez inny plik zostanie po prostu nadpisana! Demonstruje to poniższy obrazek (na blado czerwony: pliki „usunięte”, które fizycznie istnieją, ale nie ma o nich informacji na Liście):

newdel

Nasza teoria tłumaczy też dlaczego mimo opróżnienia kosza wciąż można je odnaleźć: pliki wciąż istnieją, jednak nie wiadomo gdzie dokładnie są, mogą też zostać uszkodzone w wyniku przenoszeniu kolejnych plików do kosza. Aby je odnaleźć wystarczy przejść po całym obszarze pamięci Kosza poszukując charakterystycznych fragmentów formatów plików.

Podsumujmy: intuicja mówi, że istnieje specjalny obszar pamięci do którego przenoszone są pliki przeznaczone do usunięcia; w Koszu istnieje lista plików z informacjami o nich; opróżnienie kosza to wyczyszczenie tej listy w wyniku czego „usunięte” pliki są nadpisywane.

Teoria odpowiada na część pytań, jednak część pytań wciąż są kolejne, a i sama intuicja generuje też kolejne. W następnym paragrafie przyjrzymy się jak wygląda proces usuwania plików naprawdę (oraz odpowiemy na resztę pytań).

 

Życie


O dziwo intuicje były całkiem trafne ich błąd polegał głównie na pewnym uproszczeniu pewnych spraw, chociaż mamy tutaj spore zakłamania.

Przenoszenie plików do kosza

Otóż same dane nie są fizycznie przenoszone (nie ma sekcji danych kosza), jedynie co jest robione to sam wskaźnik na dane (wpis na liście z informacjami o plikach znajdujących się w folderze) jest przepinany z folderu do kosza, mamy tutaj niemalże identyczną sytuację jak w przypadku przenoszenia pliku z jednego folderu do innego (przenoszenia, nie kopiowania!).

 

Usuwanie plików z kosza (zwykłe)

Usunięcie pliku z kosza to nic innego jak usunięcie wpisu z folderu (czyli właśnie takiej specjalnej listy z informacjami o plikach), sama część dysku która była wcześniej zajęta przez plik pozostaje nietknięta, po prostu zniknął link informujący system o tym, że w danym miejscu znajduje się jakiś plik, a sam obszar który zajmuje plik jest oznaczano jako „niezajęty/wolny”; ponownie intuicja była bardzo bliska prawdy.

 

Usuwanie plików (na zawsze/bezpiecznie)

W przeciwieństwie do tradycyjnego usuwania plików to tutaj dane dodatkowo są nadpisywane przez 0 lub 1, dzięki temu sama wiedza gdzie znajdował się plik (po usunięciu linku) staje się bezużyteczna, a nie pozostaje ślad po usuniętym pliku (istnieją pewne dodatkowe problemy, które dla pozostawienia prostoty tego wpisu poruszymy dopiero w innym artykule).

Domyślnie usuwanie plików nie działa w ten sposób a to dlatego, że jest to metoda bardzo powolna i dodatkowo zużywa sam dysk (bo mamy tutaj normalne pisanie po dysku).

 

Odzyskiwanie plików

Jak się okazuje sprawa jest nieco bardziej złożona, bo same pliki nie są w jednym ciągłym miejscu a mogą znajdować się w wielu fragmentach dysku, co też zależy od samego systemu plików i stosowanych algorytmów. Ogólna zasada odzyskiwania jest podobna do tej z intuicji, czyli szukamy charakterystycznych miejsc/fragmentów, które mogą być naszym plikiem (ale nie muszą, stąd narzędzia znajdują też sporo śmieci), a czasami nawet korzysta się z algorytmów które szukają programów przez „zgadywanie” (algorytmy heurystyczne). Zaciekawionych szerzej tematem zapraszam do np. [1].

 

Podsumowanie


Mam nadzieję, że artykuł Wam się podobał, głodnych wiedzy zapraszam do źródeł w Lektorze dodatkowej. Tradycyjnie w razie pytań, uwag, sugestii (czy samej opinii, którą chcielibyście się podzielić) zapraszam do systemu komentarzy.

Code ON!

 

Lektura dodatkowa