Gdzie idą otwarte uchwyty plików po ich śmierci?

15

Co dzieje się z plikami usuwanymi, gdy mają otwarty uchwyt pliku?

Zastanawiam się nad tym, odkąd wymyśliłem, że mogę usunąć plik wideo podczas odtwarzania w MPlayerze i nadal będzie on odtwarzany do końca. Skąd bierze dane? Czy nadal pochodzi z dysku twardego? Czy plik został skopiowany do pamięci RAM po usunięciu pliku?

Jeśli nadal znajduje się na dysku twardym, co się stanie, jeśli zapełnię system plików, gdy program działa w trybie odczytu z zasadniczo nieprzydzielonego miejsca? Jeśli jest buforowane w pamięci RAM, co się stanie, jeśli opróżnię bufory?

Co się stanie, jeśli plik był w udziale NFS - czy jest przechowywany na serwerze? (Czy to nie jest zagrożenie bezpieczeństwa - DoS przez mnóstwo otwartych uchwytów plików zdalnych?)

Robi lsof -n |grep '(deleted)' czasem przynosi ciekawe rezultaty; jeśli aktualizuję pakiety, które wymieniają pliki bibliotek współużytkowanych, wówczas uruchomione programy, które korzystały z tych bibliotek, nadal będą mogły ich używać, jakby nic się nie zmieniło.

Pytanie dodatkowe: Czy istnieje sposób na odzyskanie danych z martwych w tej sytuacji?

amfetamachina
źródło

Odpowiedzi:

13

I-węzły nadal pozostają na dysku, chociaż nie ma już żadnych twardych linków do i-węzłów. Zostaną usunięte, gdy deskryptor pliku zostanie zamknięty. Do tego czasu plik może być modyfikowany jak zwykle, blokując operacje wymagające podania nazwy pliku / twardego łącza.

debugfs i podobnych narzędzi można użyć do odzyskania zawartości i-węzłów.

Ignacio Vazquez-Abrams
źródło
10
Jest to poprawne, jednak jeśli plik jest nadal otwarty, możesz go odzyskać, przechodząc do / proc / <PID> / fd, gdzie PID jest pid programu, w którym plik jest nadal otwarty. Ten katalog zawiera wszystkie otwarte deskryptory plików programu i można uzyskać do nich dostęp tak jak normalne pliki, dzięki czemu można utworzyć twardy link do „przywrócenia” pliku.
Patrick
Należy pamiętać, że /procjest on specyficzny dla Linuksa (jak jest debugfs).
Ignacio Vazquez-Abrams,
1
Solaris ma również / proc, a technika działa dobrze. Nie wiem o BSD.
Patrick,
2
Muszę tylko dodać, że to jest niesamowite.
n0pe
1
@Patrick: Nie można utworzyć twardego łącza do „przywrócenia” pliku /proc. Twarde dowiązania działają tylko na tym samym systemie plików, a nie między systemami plików, a ponieważ /procjest to osobny system plików, w którym nie można zapisywać, nie można na nim tworzyć twardych dowiązań. Możesz jednak skopiować plik /proc.
camh
5

Jądro wykonuje referencje licząc na referencje do i-węzła. Zobacz moją odpowiedź na Co się stanie, gdy zamknę () deskryptor pliku? .

Usuwanie otwartych plików prawdopodobnie nie będzie bardziej skutecznym mechanizmem DOS niż tylko otwieranie plików. ulimitNa otwartych plikach zapewnia pewną ochronę przeciwko tej próbie DOS. Dotyczy wszystkich otwartych plików, usuniętych lub nie.

BillThor
źródło
5

Plik jest usuwany z systemu plików dopiero po zniknięciu każdego odwołania do niego. Zarówno nazwy, jak i otwarte uchwyty liczą się jako odniesienia. Tak długo, jak plik jest otwarty w programie, nie jest usuwany, chociaż większość systemów nie pozwala na odtworzenie jego nazwy.

Dane nadal znajdują się na dysku, ale plik jest oznaczony jako mający liczbę linków równą 0. Jeśli system ulegnie awarii, fsck przy następnym restarcie wie, że musi usunąć dane. Nie prowadzi to do odmowy usługi tak samo, jak nie usunięty plik.

O ile mi wiadomo, nie można odtworzyć łącza do pliku w standardowym systemie Linux (pomijając sterownik systemu plików za pomocą debugfslub podobnych metod), ale można łatwo odzyskać zawartość: cat /proc/12345/fd/42gdzie 12345 jest identyfikatorem procesu, który ma otwarty plik a 42 to numer deskryptora pliku.

W systemie NFS po usunięciu pliku, który jest nadal otwarty w niektórych klientach, serwer NFS zmienia nazwę pliku na serwerze, ale nie usuwa go, dopóki wszyscy klienci go nie zwolnią. Z mojego doświadczenia wynika .nfs…, że nowa nazwa to , chociaż nie wiem, czy nazwa jest taka sama we wszystkich implementacjach NFS.

Gilles „SO- przestań być zły”
źródło