Làm thế nào để phục hồi các tập tin trên phân vùng btrfs?


19

Làm cách nào để khôi phục (khôi phục) tệp đã xóa trên phân vùng btrfs?

Tôi chưa chụp ảnh nhanh, vì vậy tôi không thể sử dụng tính năng đó. Tôi biết có một số công cụ cho các hệ thống tệp Linux khác, nhưng google chưa đưa ra bất cứ điều gì cụ thể cho btrfs. Tôi đã bắt gặp một đề cập mơ hồ rằng btrfs bao gồm một công cụ chưa hoàn thành, nhưng tôi không thể tìm thấy nó. Trước khi thử các công cụ cho một hệ thống tập tin khác, tôi hỏi ở đây.

Thêm thông tin:

  • (Hai) tập tin bị xóa đã bị xóa bởi một rsynclệnh từ xa đã sai.
  • Đây là những tập tin văn bản nhỏ.
  • Tôi biết tên của các tập tin.
  • Tôi có thể nhớ một số chuỗi trong các tập tin.
  • Đĩa là ổ cứng thông thường, nhưng dung lượng lớn (2TB).
  • Tôi đang chạy Kubfox 12.04 (beta2) với tất cả các bản cập nhật mới nhất.
  • Tôi chưa ghi bất kỳ dữ liệu mới nào vào phân vùng mà các tập tin đã bị xóa.
  • Tôi không có ảnh chụp nhanh hoặc bản sao lưu của các tệp này. (Bản sao lưu cuối cùng chỉ cũ hơn các tệp này vài giờ.)
  • Thật kỳ lạ, một hệ thống tệp COW dường như có ít tùy chọn phục hồi tệp hơn ext3 / 4 ...

Câu trả lời:


7

Vì các tệp của bạn là văn bản nhỏ và đơn giản, tôi sẽ thử quét đầu ra của "chuỗi" vào thiết bị nơi hệ thống tệp cư trú, nghĩa là,

strings /dev/sda1 | less

sau đó sử dụng "/" để tìm kiếm các chuỗi có thể có trong tệp đó. Khi bạn tìm thấy văn bản, hãy phân định bắt đầu của nó bằng "m", sau đó di chuyển đến cuối và sử dụng "| cat> file" để lưu nó vào một tệp.

Tôi đã thực sự làm điều đó khi tôi gặp tình huống tương tự trên một hệ thống tập tin khác mà không bị xóa, một vài năm trước, và nó hoạt động rất tốt với tôi.


4

Jörg Walter đã triển khai một btrfs-undeletetập lệnh shell bằng cách sử dụng các công cụ find-rootrestoretừ btrfs-progsđó, có thể tìm thấy ở đây và sẽ giúp những người khác ở vị trí tương tự.

Vì nó được cấp phép theo GPLv2, tôi không thể đưa nó vào đây.


3
Đáng chú ý là tập lệnh đã nói có ít nhất một đường dẫn được mã hóa cứng (có lẽ do nhầm lẫn) và có một vài vấn đề khác, vì vậy người mua hãy cẩn thận rằng nó phải được chỉnh sửa trước khi sử dụng.
gamen

2
Đây là phiên bản đã được dọn sạch của tập lệnh gốc: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco

"Vì nó được cấp phép theo GPLv2, tôi không thể đưa nó vào đây" - có lẽ bạn nên đọc những gì GPLv2 nói, bởi vì điều đó chẳng có ý nghĩa gì.
tiếng lóng

4
@slang có lẽ bạn nên đọc điều khoản dịch vụ của trang này? Đóng góp phải được cấp phép theo giấy phép Creative Commons Attribution Share Alike 3.0.
suriv

@suriv - Tôi đoán tôi có thể hiểu lý do của họ để làm điều đó, nhưng điều đó khá khó chịu. Đặc biệt vì CC-BY-SA chỉ hạn chế hơn một chút so với GPL (ngoài công cụ bằng sáng chế của GPLv3).
Omnifarious

2

Nếu ổ đĩa btrfs của bạn có subvolume, bạn cần chuyển -r <subvol-id>tùy chọn bổ sung tới btrfs restore. Thật không may, các tập lệnh ngoài đó, như một user414471 đã đăng ( http://oelkers.de/tips/undeleteBtrfs.sh ), không có tùy chọn để làm điều này, nhưng có lẽ chúng có thể được điều chỉnh theo cách này.

Nếu bạn muốn làm điều này bằng tay, bạn cần phải có đúng subvol-id, với:

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

hoặc thay thế bằng:

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

Sau đó, bạn sử dụng btrfs-find-rootđể lấy số khối mà bạn muốn hoàn nguyên (thường là số ngay trước số tối đa là gốc hiện tại). Để làm điều này, trước tiên bạn cần đặt subvolume mặc định thành tệp con mà bạn muốn hoàn nguyên các tệp (và hoàn nguyên thay đổi này sau đó):

# 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

Cuối cùng bạn có thể sử dụng btrfs restorevới -r <subvol-id>cho việc thu hồi (ban đầu với --dry-runlập luận nếu bạn muốn):

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

Thông tin thêm về tất cả điều này tại đây: https://btrfs.wiki.kernel.org/index.php/Restore


Đã thử nghiệm điều này trên hệ thống Fedora 26 - và ở đó btrfs-find-rootbước không bao giờ chấm dứt (tức là chạy với CPU 100% trong 3 giờ trên <250 GB FS). Xem thêm một câu chuyện tương tự spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.