Açık dosya tanıtıcıları öldüklerinde nereye gider?


15

Bir dosya tanıtıcısı açıkken silinen dosyalara ne olur?

MPlayer'da oynarken bir video dosyasını silebildiğimi ve hala sonuna kadar oynayabileceğini anladığımdan beri bunu merak ediyorum . Verileri nereden alıyor? Hala sabit diskten mi geliyor? Dosyayı sildikten sonra RAM'e kopyalandı mı?

Hala sabit sürücüdeyse, program esasen ayrılmamış alandan okuma yaparken dosya sistemini doldurursam ne olur? RAM'de tamponlanmışsa, tamponları temizlersem ne olur?

Dosya bir NFS paylaşımındaysa - sunucuda depolanıyorsa ne olur? (Bu bir güvenlik riski değil mi - DoS tarafından tonlarca açık uzak dosya tanıtıcısı mı?)

lsof -n |grep '(deleted)'Bazen yapmak ilginç sonuçlar verir; paylaşılan kitaplık dosyalarını değiştiren paketleri yükseltirsem, o zaman bu kitaplıkları kullanan programları çalıştırmak, hiçbir şey değişmemiş gibi kullanmaya devam eder.

Bonus soru: Bu durumda verileri ölümden geri almanın bir yolu var mı?

Yanıtlar:


13

Düğümlere sabit bağlantılar kalmamasına rağmen, düğümler diskte hala kalır. Dosya tanımlayıcı kapatıldığında bunlar silinir. O zamana kadar, dosya normal olarak değiştirilebilir, dosya adı / sabit bağlantı gerektiren engelleme işlemleri.

debugfs ve inotların içeriğini kurtarmak için benzer araçlar kullanılabilir.


10
Bu doğrudur, ancak dosya hala açıksa, / proc / <PID> / fd adresine giderek dosyayı geri alabilirsiniz; burada PID, dosyayı hala açık olan bir programın pididir. Bu dizin, programın tüm açık dosya tanımlayıcılarını içerir ve bunlara normal dosyalar gibi erişebilirsiniz, böylece dosyayı 'geri yüklemek' için sabit bir bağlantı oluşturabilirsiniz.
Patrick

/procLinux'a özgü olduğunu unutmayın (olduğu gibi debugfs).
Ignacio Vazquez-Abrams

1
Solaris de bir / proc var ve teknik orada gayet iyi çalışıyor. BSD hakkında bilmiyorum.
Patrick

2
Sadece bunun harika olduğunu eklemeliyim.
n0pe

1
@Patrick: Bir dosyayı 'geri yüklemek' için sabit bir bağlantı oluşturamazsınız /proc. Sabit bağlantılar, dosya sistemlerinde değil, yalnızca aynı dosya sisteminde çalışır ve /procyazılamaz ayrı bir dosya sistemi olduğundan , üzerinde sabit bağlantılar oluşturamazsınız. /procYine de dosyayı kopyalayabilirsiniz .
camh

5

Çekirdek, inode referansları için sayma referansı yapar. Cevabımı bakın ne zaman close () bir dosya tanıtıcı ne olur? .

Açık dosyaları silmek muhtemelen bir DOS mekanizmasını sadece dosyaları açmaktan daha etkili değildir. ulimitAçık dosyalarda bu DOS girişimine karşı bir koruma sağlar. Silinmiş olsun olmasın tüm açık dosyalar için geçerlidir.


5

Bir dosya, dosya sistemine her başvuru referansı kaybolduktan sonra silinir. Hem adlar hem de açık tanıtıcılar başvuru olarak sayılır. Dosya bir programda açık olduğu sürece silinmez, ancak çoğu sistem bunun için bir ad oluşturmanıza izin vermez.

Veriler hala sürücüde, ancak dosya 0 bağlantı sayısına sahip olarak işaretlendi. Sistem çökerse, bir sonraki yeniden yüklemede fsck, verileri silmesi gerektiğini bilir. Bu, silinmemiş bir dosyadan daha fazla bir hizmet reddine yol açmaz.

Bildiğim kadarıyla (dosya sistemi sürücüsünü debugfsveya benzer yöntemlerle atlamaktan yoksun) kısa bir stok Linux sistemindeki dosya bağlantısını yeniden oluşturamazsınız , ancak içeriği kolayca kurtarabilirsiniz: cat /proc/12345/fd/42burada 12345, dosyanın açık olduğu işlem kimliğidir. ve 42 dosya tanımlayıcı numarasıdır.

NFS'de, bazı istemcilerde hala açık olan bir dosyayı sildiğinizde, NFS sunucusu dosyayı sunucudaki yeniden adlandırır, ancak tüm istemciler dosyayı bırakana kadar silmez. Deneyimlerime göre, yeni ad .nfs…, ancak tüm NFS uygulamalarında adın aynı olup olmadığını bilmiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.