Terkadang orang menghapus file yang tidak seharusnya, proses yang berjalan lama masih memiliki file terbuka, dan memulihkan data dengan catting /proc/<pid>/fd/N
tidak cukup mengagumkan. Cukup mengagumkan jika Anda dapat "membatalkan" penghapusan dengan menjalankan beberapa opsi ajaib ke ln yang akan memungkinkan Anda menautkan kembali ke nomor inode (dipulihkan melalui lsof).
Saya tidak dapat menemukan alat Linux untuk melakukan ini, apalagi dengan Googling sepintas.
Apa yang kamu dapat, serverfault?
EDIT1: Alasan catting file dari /proc/<pid>/fd/N
tidak cukup luar biasa adalah karena proses yang masih membuka file masih menulis untuk itu. Hapus menghapus referensi ke inode dari namespace sistem file. Yang saya inginkan adalah cara menciptakan kembali referensi.
EDIT2: 'debugfs ln' berfungsi tetapi risikonya terlalu tinggi karena ia merusak data sistem file mentah. File yang dipulihkan juga tidak konsisten gila. Jumlah tautan adalah nol dan saya tidak dapat menambahkan tautan ke sana. Saya lebih buruk dari ini karena saya hanya dapat menggunakan /proc/<pid>/fd/N
untuk mengakses data tanpa merusak fs saya.
/path/to/deleted/file
ada di sistem file yang sama dengan file itu sebelum dihapus, kalau tidak ini akan - memang - gagal. (Anda bisa mendapatkan jalan lama denganls -l /proc/<pid>/fd/<handle>
)tmpfs
sistem file tetapi tidak pada misalnyaext3
. Lebih jauh, fitur ini sepenuhnya dinonaktifkan di 2.6.39, lihat komit . Jadi karena itu solusi ini tidak akan berfungsi dengan kernel 2.6.39 atau lebih baru dan dalam versi sebelumnya tergantung pada sistem file.ln -L
tidak bekerja untuk saya. Saya memiliki file yang dihapus dan saya mencoba menghubungkannya kembali ke jalur asli.ln
memberi sayaln: failed to create hard link /my/path/file.pdf => /proc/19674/fd/16: No such file or directory
. Tapi saya bisa mis berhasilcat /proc/19674/fd/16
Sepertinya Anda sudah mengerti banyak hal, jadi saya tidak akan membahas terlalu banyak detail. Ada beberapa metode untuk menemukan inode dan Anda biasanya dapat mengecat dan mengarahkan STDOUT. Anda bisa menggunakannya
debugfs
. Jalankan perintah ini di dalam:ln <$INODE> FILENAME
Pastikan Anda memiliki cadangan sistem file. Anda mungkin perlu menjalankan fsck sesudahnya. Saya menguji ini berhasil dengan inode yang masih ditulis dan itu berhasil untuk membuat tautan keras baru ke inode dereferenced.
Jika file tidak terhubung dengan file yang belum dibuka di ext3, data akan hilang. Saya tidak yakin seberapa konsisten ini, tetapi sebagian besar pengalaman pemulihan data saya adalah dengan ext2. Dari FAQ ext3:
Ada juga informasi yang relevan dalam pertanyaan ini:
Saya menimpa file besar dengan yang kosong di server linux. Bisakah saya memulihkan file yang ada?
sumber
cara debugfs seperti yang Anda lihat tidak benar-benar berfungsi dan yang terbaik file Anda akan dihapus secara otomatis (karena jurnal) setelah reboot dan paling buruk Anda dapat membuang sistem file Anda yang mengakibatkan "reboot cycle of death". Solusi Tepat (TM) adalah untuk melakukan penghapusan yang dihapus pada tingkat VFS (yang juga memiliki manfaat tambahan untuk bekerja dengan hampir semua sistem file Linux saat ini). Cara panggilan sistem (flink) telah ditembak jatuh setiap kali muncul di LKML sehingga cara terbaik adalah melalui modul + ioctl.
Sebuah proyek yang mengimplementasikan pendekatan ini dan memiliki kode yang cukup kecil dan bersih adalah fdlink ( https://github.com/pkt/fdlink.git untuk versi yang diuji dengan kernel ubvernver maverick). Dengan itu, setelah Anda memasukkan modul (sudo insmod flink_dev.ko) Anda bisa melakukan "./flinkapp / proc // fd / X / my / link / path" dan itu akan melakukan apa yang Anda inginkan.
Anda juga dapat menggunakan versi vfs-undelete.sourceforge.net port-maju yang juga berfungsi (dan juga dapat secara otomatis menautkan kembali ke nama asli), tetapi kode fdlink lebih sederhana dan berfungsi dengan baik, jadi itu adalah pilihan saya.
sumber
Saya tidak tahu bagaimana melakukan persis apa yang Anda inginkan, tetapi apa yang akan saya lakukan adalah:
Jelas tidak ideal, tetapi mungkin. Pilihan lainnya adalah bermain-main dengan debugfs (menggunakan
link
perintah), tapi itu agak menakutkan pada mesin produksi!sumber
link
tidak bekerja dalam pengujian saya tetapiln
berhasil.Berlari ke masalah yang sama hari ini. Yang terbaik yang bisa saya lakukan adalah berlari
dalam sesi tmux / layar sampai proses berakhir.
sumber
>
) ke file yang dihapus?Pertanyaan menarik. Seorang pewawancara mengajukan pertanyaan yang sama kepada saya dalam wawancara kerja. Apa yang saya katakan kepadanya adalah bahwa tidak ada cara mudah untuk melakukan ini dan secara umum tidak sepadan dengan waktu dan upaya yang terlibat. Saya bertanya kepadanya apa yang dia pikir solusi untuk masalah ini adalah ....
sumber
Gunakan Sleuthkit icat.
sumber
Solusi cepat yang berhasil bagi saya, tanpa alat yang mengintimidasi:
1) temukan proses + fd dengan melihat langsung di / proc:
2) Kemudian teknik yang mirip dengan @ nickray, dengan
pv
dilemparkan ke:Anda mungkin perlu Ctrl-C saat selesai (
ls /proc/{procnum}/fd/{fdnum}
akan memberi tahu Anda bahwa file tidak ada lagi)), tetapi jika Anda tahu ukuran pasti dalam byte, Anda dapat menggunakannyapv -S
untuk keluar ketika hitungan tercapai.sumber