GNU/Linux >> Belajar Linux >  >> Linux

Bisakah File yang Ditimpa Dipulihkan?

Saya tidak berbicara tentang memulihkan file yang dihapus, tetapi ditimpa file. Yaitu dengan cara sebagai berikut:

# move
mv new_file old_file

# copy
cp new_file old_file

# edit
vi existing_file
> D
> i new_content
> :x

Apakah mungkin untuk mengambil sesuatu jika salah satu dari tiga tindakan di atas dilakukan dengan asumsi tidak ada program khusus yang diinstal pada mesin linux?

Jawaban yang Diterima:

Jawabannya adalah “Mungkin ya, tetapi itu tergantung pada jenis sistem file, dan waktunya.”

Tak satu pun dari ketiga contoh tersebut akan menimpa blok data fisik dari file_lama atau file_yang ada, kecuali secara kebetulan.

  • mv new_file old_file . Ini akan memutuskan tautan old_file. Jika ada tautan keras tambahan ke old_file, blok akan tetap tidak berubah di tautan yang tersisa. Jika tidak, blok umumnya (tergantung pada jenis sistem file) ditempatkan pada daftar gratis. Kemudian, jika mv membutuhkan penyalinan (bukan hanya memindahkan entri direktori), blok baru akan dialokasikan sebagai mv menulis.

    Blok yang baru dialokasikan ini mungkin sama atau tidak sama dengan yang baru saja dibebaskan . Pada sistem file seperti UFS, blok dialokasikan, jika memungkinkan, dari grup silinder yang sama dengan direktori tempat file dibuat. Jadi, ada kemungkinan bahwa memutuskan tautan file dari direktori dan membuat file di direktori yang sama akan digunakan kembali ( dan menimpa) beberapa blok yang sama yang baru saja dibebaskan. Inilah sebabnya mengapa saran standar untuk orang yang secara tidak sengaja menghapus file adalah untuk tidak menulis data baru apa pun ke file di pohon direktori mereka (dan sebaiknya tidak ke seluruh sistem file) sampai seseorang dapat mencoba pemulihan file.

  • cp new_file old_file akan melakukan hal berikut (Anda dapat menggunakan strace untuk melihat panggilan sistem):

    open("old_file", O_WRONLY|O_TRUNC) = 4

    Bendera O_TRUNC akan menyebabkan semua blok data dibebaskan, seperti mv lakukan di atas. Dan seperti di atas, mereka umumnya akan ditambahkan ke daftar gratis, dan mungkin atau mungkin tidak digunakan kembali oleh penulisan berikutnya yang dilakukan oleh cp perintah.

  • vi existing_file . Jika vi sebenarnya vim , :x perintah melakukan hal berikut:

    unlink("existing_file~") = -1 ENOENT (No such file or directory)
    rename("existing_file", "existing_file~") = 0
    open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3

    Jadi itu bahkan tidak menghapus data lama; data disimpan dalam file cadangan.

    Di FreeBSD, vi apakah open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664) , yang akan memiliki semantik yang sama dengan cp , di atas.

Anda dapat memulihkan sebagian atau semua data tanpa program khusus; yang Anda butuhkan hanyalah grep dan dd , dan akses ke perangkat mentah.

Untuk file teks kecil, satu grep perintah dalam jawaban dari @Steven D dalam pertanyaan yang Anda tautkan adalah cara termudah:

grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1

Tetapi untuk file yang lebih besar yang mungkin berada di beberapa blok yang tidak bersebelahan, saya melakukan ini:

grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file

yang akan memberi Anda offset dalam byte dari baris yang cocok. Ikuti ini dengan serangkaian dd perintah, dimulai dengan

dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)

Anda juga ingin membaca beberapa blok sebelum dan sesudah blok itu. Di UFS, blok file biasanya berukuran 8KB dan biasanya dialokasikan secara berurutan, blok file tunggal disisipkan secara bergantian dengan blok 8KB dari file lain atau ruang kosong. Ekor file di UFS hingga 7 fragmen 1KB, yang mungkin bersebelahan atau tidak.

Terkait:Menggabungkan file tertentu menjadi satu file tunggal?

Tentu saja, pada sistem file yang mengompresi atau mengenkripsi data, pemulihan mungkin tidak semudah ini.

Sebenarnya ada sangat sedikit utilitas di Unix yang akan menimpa blok data file yang ada. Salah satu yang terlintas dalam pikiran adalah dd conv=notrunc . Lainnya adalah shred .


Linux
  1. Memindahkan file di Linux tanpa mv

  2. Menyembunyikan Data Dalam Sistem File?

  3. Mengapa file tidak dapat dimanipulasi oleh inode?

  1. Hitung baris dalam file besar

  2. Mengapa saya tidak bisa membuat file lebih besar dari 2 GB di Linux?

  3. Tidak dapat meng-unmount file yang didukung loop tetapi tidak ada file yang terbuka?

  1. Mengapa Rm Dapat Menghapus File Read-only?

  2. Bisakah Skrip Bash Dihubungkan ke File?

  3. Bagaimana saya bisa menghubungkan file di Linux?