Tautan ke inode tertentu

14

Saya memiliki file yang dihapus, tetapi masih dibuka oleh suatu program. Saya menemukan nomor inode menggunakan lsof. Bagaimana saya bisa membuat tautan keras kembali ke inode itu?

Jeff Ferland
sumber

Jawaban:

31

Anda tidak dapat membuat tautan ke sana, tetapi Anda bisa mendapatkannya kembali. Mari kita lakukan percobaan:

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

myfile.txt sekarang hilang, tetapi inode tetap hidup oleh perintah tail. Untuk mendapatkan file Anda kembali, pertama-tama temukan PID dari proses menjaga inode:

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

PID adalah 409. chdir ke / proc / 409 / fd / dan daftar isinya:

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)

Direktori / proc / [PID] / fd / berisi symlink ke file deskriptor semua file yang digunakan proses. Dalam hal ini symlink "3" menunjuk ke file yang dihapus. Jadi, untuk memulihkan file, salin konten ke file baru:

$ cat 3 >/home/mydir/saved_file.txt
sunny256
sumber
Saya sudah melakukan ini dengan debugger sistem file di masa lalu yang jauh (misalnya "debugfs dump"), tetapi konsepnya sama.
Gerald Combs
1
jawaban yang bagus, +1
asdmin
Ini tidak berhasil untuk saya. Mengingat bahwa '3' adalah symlink yang menjuntai, bukan deskriptor file "nyata", itu selalu hanya membuat file kosong.
Rob Chanter
4
@Rob: Tidak, tidak. Jika deskriptor file sedang digunakan, symlink menunjuk ke data yang valid, jika tidak symlink tidak akan ada di tempat pertama. Ketika file ditutup, symlink menghilang. Anda memang punya spasi setelah "3", kan? Jika tidak, Anda akan menampilkan konten deskriptor file 3 di shell saat ini, dan itu mungkin kosong.
sunny256
1
Satu-satunya masalah dengan ini adalah bahwa jika file tersebut masih ditulis untuk kemudian salinan yang Anda buat akan terpotong. Mungkin tidak ada waktu antara saat penulisan berhenti dan file ditutup untuk melakukan ini sehingga Anda mendapatkan file yang lengkap.
KayEss
-8

Tidak ada cara portabel untuk melakukan ini di Linux. Cara terbaik mungkin adalah dengan mendapatkan semua aktivitas pada sistem file untuk berhenti, membunuh program yang membuat file terbuka, unmount sistem file dan menggunakan debugger file-sistem untuk melampirkan kembali ke direktori. Jika Anda memiliki sistem file yang diekspor melalui NFS, setidaknya beberapa versi NFS memungkinkan Anda untuk membaca data file di NFS.

Vatine
sumber
2
Anda mungkin kehilangan file begitu Anda membunuh program
DukeLion