Btrfs bölümündeki dosyaların silinmemesi nasıl yapılır?


19

Btrfs bölümündeki silinmiş bir dosyayı nasıl geri alırım (kurtarırım)?

Henüz bir anlık görüntü almadım, bu yüzden bu özelliği kullanamıyorum. Diğer Linux dosya sistemleri için bazı araçlar olduğunu biliyorum , ancak google btrfs’e özgü bir şey bulamadı. Btrfs'in silinmemiş bir araç içerdiğini belirten bir belirsizlikle karşılaştım, ancak bulamıyorum. Başka bir dosya sistemi için araçlar denemeden önce burada soruyorum.

Daha fazla bilgi:

  • (İki) silinen dosyalar rsyncyanlış giden bir uzaktan komutla silindi .
  • Bunlar küçük düz metin dosyalarıydı.
  • Dosyaların adlarını biliyorum.
  • Dosyalardaki bazı dizeleri hatırlayabilirim.
  • Disk normal bir HDD, ancak büyük (2TB).
  • En son güncellemelerle Kubuntu 12.04 (beta2) kullanıyorum.
  • Dosyaların silindiği bölüme yeni veri yazmadım.
  • Bir anlık görüntü veya bu dosyaların bir yedeğim yok. (Son yedekleme bu dosyalardan sadece birkaç saat daha eski.)
  • Garip bir COW dosya sistemi, ext3 / 4'ten daha az dosya geri alma seçeneğine sahip görünüyor.

Yanıtlar:


7

Dosyalarınız küçük ve düz metin olduğundan, "dizelerin" çıktısını dosya sisteminin bulunduğu aygıta taramayı denerim, yani

strings /dev/sda1 | less

daha sonra bu dosyada olabilecek dizeleri aramak için "/" kullanın. Metni bulduğunuzda, başlangıcını "m" ile sınırlandırın, daha sonra sonuna gidin ve bir dosyaya kaydetmek için "| cat> file" kullanın.

Aslında, birkaç yıl önce geri alınmadan başka bir dosya sisteminde benzer bir durum yaşadığımda ve benim için çok iyi çalıştı.


4

Jörg Walter hayata btrfs-undeletekullanarak shell script find-rootve restorearaçlarını btrfs-progsbulabilirsiniz, hangi burada ve benzer bir pozisyonda başkalarına yardım etmelidir.

GPLv2 kapsamında lisanslandığı için, buraya dahil edemiyorum.


3
Kayda değer olan, bahsedilen betiğin kodlanmış en az bir yolu (büyük olasılıkla yanlışlıkla) ve birkaç başka sorunu olduğu, bu nedenle alıcıların kullanımdan önce düzenlenmesi gerektiğine dikkat etmeleridir.
gamen

2
Orijinal betiğin temizlenmiş bir sürümü: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco

"GPLv2 altında lisanslandığı için buraya dahil edemiyorum" - belki de GPLv2'nin ne dediğini okumalısınız, çünkü bunun hiçbir anlamı yoktur.
argo

4
@slang belki bu sitenin hizmet şartlarını okumalısınız? Katkılar, Creative Commons Attribution Share Alike 3.0 lisansı altında lisanslanmalıdır.
suriv

@suriv - Sanırım bunun için nedenlerini anlayabiliyorum, ama bu oldukça can sıkıcı. Özellikle CC-BY-SA, GPL'den sadece biraz daha kısıtlayıcı olduğundan (GPLv3s patent materyalinin yanı sıra).
Omnifarious

2

Btrfs sürücünüzde alt hacimler varsa, ek -r <subvol-id>seçeneğe geçmeniz gerekir btrfs restore. Maalesef, dışarıdaki komut dosyaları, yayınlanan bir kullanıcı414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ) gibi, bunu yapmak için bir seçeneğiniz yok, ancak muhtemelen buna adapte edilebilirler.

Bu işlemi el ile yapmak istiyorsanız, aşağıdakilerden birini kullanarak doğru subvol kimliğini edinmeniz gerekir:

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

veya alternatif olarak:

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

Daha sonra btrfs-find-root, geri dönmek istediğiniz blok numarasını almak için kullanırsınız (genellikle geçerli kök olan maksimum olandan hemen önceki olandır). Bunun için önce varsayılan alt sesi, dosyaları geri almak istediğinize (ve daha sonra bu değişikliği geri almak istediğiniz) ayarlamanız gerekir:

# 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

Sonunda kullanabilirsiniz btrfs restoreile -r <subvol-id>(ile başlangıçta kurtarma için --dry-rundilerseniz argüman):

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

Tüm bunlar hakkında daha fazla bilgiyi burada bulabilirsiniz: https://btrfs.wiki.kernel.org/index.php/Restore


Bunu bir Fedora 26 sisteminde test etti - ve orada btrfs-find-rootadım hiçbir zaman sona ermiyor (örn. <250 GB FS'de 3 saat% 100 CPU'da çalışıyor). Ayrıca bkz . Benzer bir hikaye spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.