Czasami ludzie usuwają pliki, których nie powinni, długotrwały proces nadal ma otwarty plik, a odzyskiwanie danych przez catting /proc/<pid>/fd/N
po prostu nie jest wystarczająco niesamowite. Wystarczająco niesamowite byłoby, gdybyś mógł „cofnąć” usunięcie, uruchamiając jakąś magiczną opcję ln, która pozwoliłaby ci ponownie połączyć się z numerem i-węzła (odzyskanym przez lsof).
Nie mogę znaleźć żadnych narzędzi do Linuksa, aby to zrobić, a przynajmniej pobieżnego Googlinga.
Co masz, błąd serwera?
EDYCJA 1: Powodem, dla którego catowanie pliku /proc/<pid>/fd/N
nie jest wystarczająco niesamowite, jest to, że proces, który wciąż ma otwarty plik, wciąż do niego zapisuje. Usunięcie usuwa odwołanie do i-węzła z przestrzeni nazw systemu plików. To, czego chcę, to sposób na odtworzenie referencji.
EDYCJA 2: „debugfs ln” działa, ale ryzyko jest zbyt wysokie, ponieważ frobuje surowe dane systemu plików. Odzyskany plik jest również szalony niespójny. Liczba linków wynosi zero i nie mogę dodawać do nich linków. Mam gorzej, ponieważ mogę po prostu /proc/<pid>/fd/N
uzyskiwać dostęp do danych bez uszkadzania mojego fs.
/path/to/deleted/file
znajduje się w tym samym systemie plików, co plik tuż przed jego usunięciem, w przeciwnym razie to - w rzeczy samej - nie powiedzie się. (Możesz dostać starą ścieżkę za pomocąls -l /proc/<pid>/fd/<handle>
)tmpfs
systemach plików, ale nie na npext3
. Ponadto ta funkcja została całkowicie wyłączona w 2.6.39, zobacz zatwierdzenie . Dlatego to rozwiązanie nie będzie działać z jądrem 2.6.39 lub nowszym, a we wcześniejszych wersjach zależy to od systemu plików.ln -L
nie działa dla mnie. Mam usunięty plik i próbowałem ponownie połączyć go z pierwotną ścieżką.ln
daje miln: failed to create hard link /my/path/file.pdf => /proc/19674/fd/16: No such file or directory
. Ale mogę np. Z powodzeniemcat /proc/19674/fd/16
Wygląda na to, że już dużo rozumiesz, więc nie będę wchodził w szczegóły. Istnieje kilka metod znalezienia i-węzła i zwykle można cat i przekierować STDOUT. Możesz użyć
debugfs
. Uruchom to polecenie w ciągu:ln <$INODE> FILENAME
Upewnij się, że masz kopie zapasowe systemu plików. Prawdopodobnie będziesz musiał później uruchomić fsck. Przetestowałem to z powodzeniem, gdy i-węzeł wciąż jest zapisywany i działa, aby utworzyć nowe twarde łącze do dereferencyjnego i-węzła.
Jeśli plik zostanie rozłączony z nieotwartym plikiem w ext3, dane zostaną utracone. Nie jestem pewien, jak konsekwentnie jest to prawda, ale większość moich możliwości odzyskiwania danych dotyczy ext2. Z ext3 FAQ:
W tym pytaniu znajdują się również istotne informacje:
Nadpisałem duży plik pustym plikiem na serwerze Linux. Czy mogę odzyskać istniejący plik?
źródło
debugfs, jak widzieliście, tak naprawdę nie działa, a co najwyżej plik zostanie automatycznie usunięty (z powodu dziennika) po ponownym uruchomieniu komputera, aw najgorszym wypadku możesz zniszczyć system plików, co spowoduje „ponowny cykl śmierci”. Właściwe rozwiązanie (TM) polega na przeprowadzeniu cofnięcia usunięcia na poziomie VFS (co ma również dodatkową zaletę pracy z praktycznie wszystkimi obecnymi systemami plików Linux). Systemowy sposób wywoływania (flink) był zastrzelony za każdym razem, gdy pojawiał się w LKML, więc najlepszym sposobem jest moduł + ioctl.
Projekt, który implementuje to podejście i ma dość mały i czysty kod, to fdlink ( https://github.com/pkt/fdlink.git dla wersji testowanej z jądrem Ubuntu Maverick). Dzięki niemu po wstawieniu modułu (sudo insmod flink_dev.ko) możesz po prostu zrobić „./flinkapp / proc // fd / X / my / link / path” i zrobi dokładnie to, co chcesz.
Możesz także użyć przekierowanej wersji vfs-undelete.sourceforge.net, która również działa (i może również automatycznie łączyć się ponownie z oryginalną nazwą), ale kod fdlink jest prostszy i działa równie dobrze, więc to moja preferencja.
źródło
Nie wiem, jak zrobić dokładnie to, co chcesz, ale chciałbym:
Oczywiście nie idealne, ale możliwe. Inną opcją jest bawienie się debugfami (za pomocą
link
polecenia), ale to trochę przerażające na maszynie produkcyjnej!źródło
link
nie działał w moich testach, ale działałln
.Wpadłem dzisiaj na ten sam problem. Najlepsze, co mogłem wymyślić, to biegać
w sesji tmux / screen aż do zakończenia procesu.
źródło
>
) do usuniętego pliku?Interesujące pytanie. Ankieter zadał mi to samo pytanie podczas rozmowy o pracę. Powiedziałem mu, że nie było łatwego sposobu na zrobienie tego i ogólnie nie było warte poświęconego czasu i wysiłku. Zapytałem go, co według niego jest rozwiązaniem tego problemu ...
źródło
Użyj icat Sleuthkit.
źródło
Szybkie rozwiązanie, które zadziałało dla mnie bez zastraszania narzędzi:
1) znajdź proces + fd, patrząc bezpośrednio w / proc:
2) Następnie technika podobna do @ nickray's,
pv
wrzucona:Po
ls /proc/{procnum}/fd/{fdnum}
zakończeniu może być konieczne naciśnięcie klawiszy Ctrl + C ( poinformuje cię, że plik już nie istnieje)), ale jeśli znasz dokładny rozmiar w bajtach, możesz go użyć,pv -S
aby zakończyć działanie po osiągnięciu liczby.źródło