Link do określonego i-węzła

14

Mam plik, który został usunięty, ale nadal jest otwarty przez program. Znalazłem numer i-węzła za pomocą lsof. Jak mogę utworzyć twardy link z powrotem do tego i-węzła?

Jeff Ferland
źródło

Odpowiedzi:

31

Nie możesz utworzyć linku do niego, ale możesz go odzyskać. Zróbmy eksperyment:

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

myfile.txt już nie ma, ale i-węzeł jest utrzymywany przy użyciu polecenia tail. Aby odzyskać plik, najpierw znajdź PID procesu zachowującego i-węzeł:

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

PID to 409. chdir do / proc / 409 / fd / i wypisz zawartość:

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

Katalogi / proc / [PID] / fd / zawierają dowiązania symboliczne do deskryptorów wszystkich plików używanych przez proces. W takim przypadku dowiązanie symboliczne „3” wskazuje na usunięty plik. Aby przywrócić plik, skopiuj zawartość do nowego pliku:

$ cat 3 >/home/mydir/saved_file.txt
słoneczny256
źródło
Zrobiłem to za pomocą debugera systemu plików w odległej przeszłości (np. „Zrzut debugfs”), ale koncepcja jest taka sama.
Gerald Combs
1
ładna odpowiedź, +1
asdmin
To mi nie działa. Biorąc pod uwagę, że „3” jest wiszącym dowiązaniem symbolicznym, a nie „prawdziwym” deskryptorem pliku, zawsze tworzy po prostu pusty plik.
Rob Chanter,
4
@Rob: Nie, nie ma. Jeśli używany jest deskryptor pliku, dowiązanie symboliczne wskazuje na prawidłowe dane, w przeciwnym razie dowiązanie symboliczne nie istniałoby w pierwszej kolejności. Po zamknięciu pliku dowiązanie symboliczne znika. Miałeś spację po „3”, prawda? Jeśli nie, wypiszesz zawartość deskryptora pliku 3 w bieżącej powłoce, a to prawdopodobnie jest puste.
sunny256
1
Jedynym problemem jest to, że jeśli plik jest nadal zapisywany, twoja kopia zostanie obcięta. Prawdopodobnie nie ma czasu pomiędzy zatrzymaniem zapisu a zamknięciem pliku, aby to zrobić, aby uzyskać pełny plik.
KayEss,
-8

Nie ma przenośnego sposobu na zrobienie tego pod Linuksem. Najlepszym sposobem byłoby prawdopodobnie zatrzymanie wszelkiej aktywności w systemie plików, zabicie programu, który utrzymuje plik otwarty, odmontowanie systemu plików i użycie debugera systemu plików, aby ponownie dołączyć go do katalogu. Jeśli system plików został wyeksportowany przez NFS, przynajmniej niektóre wersje NFS mogą pozwalać na odczyt danych pliku w NFS.

Vatine
źródło
2
możesz stracić plik po zabiciu programu
DukeLion