GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana memulihkan file yang terhapus jika masih dibuka oleh beberapa proses?

... lebih baik daripada menyalin pada waktu tertentu (dan hanya mengumpulkan snapshot konten file pada waktu itu) adalah dengan "tail -f " file itu menjadi file baru:

tail -c +0 -f /proc/PIDofProgram>/fd/# > /new/path/to/file

(terima kasih kepada pemrogram tail yang berhati-hati, itu bahkan akan bekerja dengan keluaran biner.)

Selama waktu prosesnya, tail -f itu sendiri membuat file tetap terbuka, dengan aman mencegahnya dibersihkan dari disk saat program aslinya berakhir. Jadi, jangan hentikan tail -f segera setelah program asli Anda berakhir - periksa /new/path/to/file yang berekor pertama apakah itu adalah apa maumu. Jika tidak (atau tidak memuaskan karena alasan lain), Anda dapat menyalin file asli lagi, tetapi kali ini setelah semua penulisan untuk itu telah selesai dengan "Program" dan dari tail -f yang masih berjalan direktori /proc/PIDoftail/fd/.


Jika /home adalah NFS, akan ada file .nfsNNNNNNNNNN di /home/vi yang dapat Anda akses/salin. Jika home adalah sistem file lokal, Anda seharusnya dapat melakukan hal yang sama melalui tautan /proc/PID/fd/3:

cp /proc/PID/fd/3 /tmp/recovered_file

Jika Anda benar-benar ingin membatalkan penghapusan file, inilah entri blog tentang subjek tersebut.


Gunakan lsof untuk menemukan nomor inode, dan debugfs untuk membuat ulang tautan keras ke sana. Misalnya:

# lsof -p 12345 | grep /var/log/messages
syslogd 12345 root    3w   REG                8,3    3000    987654 /var/log/messages (deleted)
# mount | grep var
/dev/sda2 on /var type ext3 (rw)
# debugfs -w /dev/sda2
debugfs: cd log
debugfs: ln <987654> tmp
debugfs: mi tmp
                      Mode    [0100600] 
                   User ID    [0] 
                  Group ID    [0] 
                      Size    [3181271] 
             Creation time    [1375916400] 
         Modification time    [1375916322] 
               Access time    [1375939901]
             Deletion time    [9601027] 0
                Link count    [0] 1
               Block count    [6232] 
                File flags    [0x0] 
...snip...
debugfs:  q
# mv /var/log/tmp /var/log/messages
# ls -al /var/log/messages
-rw------- 0 root root 3301 Aug  8 10:10 /var/log/messages

Sebelum Anda mengeluh, saya memalsukan transkrip di atas karena saya tidak memiliki file yang dihapus untuk diserahkan sekarang;-)

Saya menggunakan mi untuk mengatur ulang waktu hapus dan jumlah tautan ke nilai yang masuk akal (masing-masing 0 dan 1), tetapi tidak berfungsi dengan baik - Anda dapat melihat jumlah tautan tetap nol di ls . Saya pikir kernel mungkin menyimpan data inode. Anda mungkin harus fsck pada kesempatan paling awal setelah menggunakan debugfs, agar aman.

Dalam pengalaman saya, Anda harus membuat tautan menggunakan nama file sementara dan kemudian mengganti nama menjadi nama yang tepat. Menautkannya langsung ke nama file asli tampaknya menyebabkan kerusakan direktori. YMMV!

  • http://glandium.org/blog/?p=87
  • http://www.cyberciti.biz/tips/linux-ext3-ext4-deleted-files-recovery-howto.html

Linux
  1. Bagaimana cara memulihkan semaphore ketika proses yang menurunkannya menjadi nol macet?

  2. Bagaimana cara memulihkan file yang dihapus di Linux?

  3. Bagaimana memulihkan file yang terbuka tetapi terhapus di Linux menggunakan ln, bukan cp?

  1. Cara Memulihkan File yang Dihapus di Linux

  2. Bagaimana cara mendapatkan kembali penyimpanan file yang dihapus, tetapi masih digunakan di Linux?

  3. Bagaimana cara mengurutkan keluaran ps berdasarkan waktu mulai proses?

  1. Memulihkan File yang Dihapus Secara Tidak Sengaja?

  2. Bagaimana Memulihkan Data Xfs Setelah Rm?

  3. Bagaimana Memulihkan Setelah Kate Crashes?