Dlaczego w Linuxie mogę usunąć plik, który nadal jest używany?

zrzut ekranu 2025 09 23 180133

Usuwasz plik w Linuxie… a proces wciąż go używa. Brzmi jak bug? To genialny feature, który ma ogromne znaczenie dla administratorów i bezpieczeństwa.

Jak to działa? W Linuksie plik to nie tylko nazwa w katalogu. To dwa elementy:

  • nazwa w katalogu – wskazuje na inode,

  • inode – struktura opisująca faktyczne dane (lokalizacja na dysku, prawa, metadane).

Kiedy proces otwiera plik, trzyma deskryptor (uchwyt) właśnie do inode. -> Usunięcie nazwy (rm) nie usuwa inode od razu – bo ktoś wciąż trzyma do niego odwołanie.

Dopiero gdy ostatni proces zamknie deskryptor, inode znika, a system zwalnia miejsce na dysku.

Co to oznacza w praktyce?

  • Logrotate – stare logi są usuwane, ale proces nadal pisze w ten sam deskryptor -> ciągłość działania.

  • Ukrywanie plików – można „zniknąć” plik z katalogu, a proces nadal z niego korzysta.

  • Zarządzanie przestrzenią – dopóki plik jest otwarty, miejsce się nie zwolni (częsty problem przy logach, które pożerają dysk).

To też jedna z przyczyn dlaczego suma rozmiaru wszystkich plików nie zawsze = zajęte miejsce na dysku.

Pro tip: żeby odzyskać przestrzeń, trzeba zrestartować proces.

Implikacje dla bezpieczeństwa i tu robi się najciekawiej:

  • Malware może uruchomić się i usunąć swój plik z dysku -> działa, ale nie zostawia śladów w katalogach.

  • Monitoring oparty tylko na plikach (np. ls, find) nic nie wykryje.

  • Podczas incident response analitycy muszą szukać informacji o plikach w /proc/<PID>/fd/, gdzie zobaczą wpisy z dopiskiem (deleted).

Jak to sprawdzić samemu? Uruchom w terminalu:

lsof -n | grep deleted

Zobaczysz listę procesów, które używają usunięte pliki.