Bagaimana cara membatalkan penghapusan file pada partisi btrfs?

19

Bagaimana saya membatalkan penghapusan (memulihkan) file yang dihapus pada partisi btrfs?

Saya belum mengambil snapshot, jadi saya tidak bisa menggunakan fitur itu. Saya tahu ada beberapa alat untuk sistem file Linux lainnya, tetapi google belum menemukan sesuatu yang spesifik untuk btrfs. Saya menemukan satu penyebutan yang kabur bahwa btrf termasuk alat yang tidak terhapus, tetapi saya tidak dapat menemukannya. Sebelum mencoba alat untuk sistem file lain, saya bertanya di sini.

Info lebih lanjut:

  • (Dua) file yang dihapus dihapus oleh rsyncperintah jarak jauh yang salah.
  • Ini adalah file teks biasa kecil.
  • Saya tahu nama-nama file.
  • Saya mungkin dapat mengingat beberapa string dalam file.
  • Disk adalah HDD biasa, tetapi besar (2TB).
  • Saya menjalankan Kubuntu 12.04 (beta2) dengan semua pembaruan terbaru.
  • Saya belum menulis data baru ke partisi tempat file dihapus.
  • Saya tidak memiliki snapshot atau cadangan file-file ini. (Cadangan terakhir hanya beberapa jam lebih tua dari file-file ini.)
  • Anehnya, sistem file COW tampaknya memiliki lebih sedikit opsi hapus file daripada ext3 / 4 ...
MountainX untuk Monica Cellio
sumber

Jawaban:

7

Karena file Anda berukuran kecil dan teks biasa, saya akan mencoba memindai output "string" ke perangkat tempat sistem file berada, yaitu,

strings /dev/sda1 | less

lalu gunakan "/" untuk mencari string yang bisa ada di file itu. Ketika Anda menemukan teks, batasi permulaannya dengan "m" kemudian pindah ke akhir dan gunakan "| cat> file" untuk menyimpannya ke file.

Saya benar-benar telah melakukannya ketika saya memiliki situasi yang serupa pada sistem file lain tanpa membatalkan penghapusan, beberapa tahun yang lalu, dan itu bekerja dengan baik untuk saya.

Menu Durval
sumber
4

Jörg Walter menerapkan btrfs-undeleteskrip shell menggunakan find-rootdan restorealat dari btrfs-progs, yang dapat ditemukan di sini , dan harus membantu orang lain dalam posisi yang sama.

Karena dilisensikan di bawah GPLv2, saya tidak dapat memasukkannya di sini.

Sameer
sumber
3
Yang perlu diperhatikan adalah bahwa skrip tersebut memiliki setidaknya satu jalur hardcode (mungkin karena kesalahan) dan memiliki beberapa masalah lain, jadi pembeli berhati-hati bahwa itu harus diedit sebelum digunakan.
gamen
2
Ini versi bersih dari skrip asli: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco
"Karena ini dilisensikan di bawah GPLv2, saya tidak dapat memasukkannya di sini" - mungkin Anda harus membaca apa yang dikatakan GPLv2, karena itu tidak masuk akal sama sekali.
gaul
4
@slang mungkin Anda harus membaca ketentuan layanan situs ini? Kontribusi harus dilisensikan di bawah lisensi Creative Commons Attribution Share Alike 3.0.
suriv
@ Suriv - Saya kira saya bisa mengerti alasan mereka melakukan itu, tapi itu cukup menjengkelkan. Terutama karena CC-BY-SA hanya sedikit lebih ketat daripada GPL (selain dari hal-hal paten GPLv3).
Mahakuasa
2

Jika drive btrf Anda memiliki subvolume, Anda harus meneruskan -r <subvol-id>opsi tambahan btrfs restore. Sayangnya skrip di luar sana, seperti yang ditulis pengguna414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ), tidak memiliki opsi untuk melakukan ini, tetapi mereka mungkin dapat disesuaikan dengan ini.

Jika Anda ingin melakukan ini dengan tangan, Anda perlu mendapatkan subvol-id yang tepat, baik dengan:

# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah

atau sebagai alternatif dengan:

# btrfs restore -l /dev/sdXY | grep ROOT_ITEM

Setelah itu Anda gunakan btrfs-find-rootuntuk mendapatkan nomor blok yang ingin Anda kembalikan (biasanya yang tepat sebelum yang maksimum yang merupakan root saat ini). Untuk ini, Anda perlu mengatur subvolume default menjadi yang ingin Anda kembalikan file (dan kembalikan perubahan ini setelahnya):

# mount /dev/sdXY /mnt/blah
# btrfs subvolume set-default <subvol-id> /mnt/blah
# umount /mnt/blah
# btrfs-find-root /dev/sdXY
Well block 4321280 seems great, but generation doesn't match, have=400760, want=400984 level 0
...
Well block 9928704 seems great, but generation doesn't match, have=400764, want=400984 level 1
Well block 1094836224 seems great, but generation doesn't match, have=400983, want=400984 level 1
Found tree root at 1095270400 gen 400984 level 1

Anda akhirnya dapat menggunakan btrfs restoredengan -r <subvol-id>untuk pemulihan (awalnya dengan --dry-runargumen jika Anda mau):

# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery

Informasi lebih lanjut tentang semua ini di sini: https://btrfs.wiki.kernel.org/index.php/Restore

Catalin Hritcu
sumber
Menguji ini pada sistem Fedora 26 - dan di sana btrfs-find-rootlangkahnya tidak pernah berakhir (yaitu berjalan pada 100% CPU selama 3 jam pada <250 GB FS). Lihat juga kisah serupa spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig