Dlaczego w Linuxie mogę usunąć plik, który nadal jest używany?
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.
