Case study: Phục hồi pool BTRFS 12 TB bị hỏng nặng bằng công cụ tùy chỉnh

06 tháng 4, 2026·2 phút đọc

Một kỹ sư đã chia sẻ hành trình cứu dữ liệu từ pool BTRFS 12 TB bị hỏng do mất điện, bao gồm bộ 14 công cụ C tùy chỉnh và 9 đề xuất cải tiến cho btrfs-progs để tránh tình trạng sửa chữa thất bại.

Case study: Phục hồi pool BTRFS 12 TB bị hỏng nặng bằng công cụ tùy chỉnh

Một vấn đề vừa được đăng trên GitHub của dự án btrfs-progs đã thu hút sự chú ý của cộng đồng hệ thống. Đó là bản phân tích chi tiết về quá trình phục hồi một pool dữ liệu 12 TB sử dụng hệ thống file BTRFS bị hỏng nặng sau sự cố mất điện đột ngột.

Bối cảnh sự cố

Pool lưu trữ bao gồm 3 thiết bị với cấu hình dữ liệu kiểu single và metadata DUP, sử dụng đĩa DM-SMR. Sau sự cố mất điện, cây dữ liệu (extent tree) và cây không gian trống (free space tree) bị đưa vào trạng thái hỏng hóc mà không có phương thức sửa chữa gốc nào có thể giải quyết được.

Khi cố gắng chạy lệnh btrfs check --repair, hệ thống đã rơi vào vòng lặp vô hạn với hơn 46.000 lượt commit mà không tiến triển gì. Thậm chí, quá trình này còn làm xoay vòng các vị trí backup_roots, khiến việc rollback về trạng thái trước khi sự cố xảy ra trở nên bất khả thi.

Giải pháp phục hồi độc đáo

Thay vì chấp nhận mất dữ liệu, tác giả đã xây dựng một bộ 14 công cụ tùy chỉnh được viết bằng ngôn ngữ C, dựa trên API nội bộ của btrfs-progs. Kết quả đạt được cực kỳ ấn tượng:

  • Tổng dữ liệu phục hồi: 4,59 TB.
  • Dữ liệu mất mát: Chỉ khoảng 7,2 MB (tỷ lệ mất mát 0,00016%).
  • Pool hiện đã hoạt động hoàn toàn bình thường trở lại.

9 đề xuất cải tiến cho btrfs-progs

Đi kèm với câu chuyện thành công là bản phân tích mang tính xây dựng nhằm giúp cộng đồng tránh gặp phải tình huống tương tự. Tác giả đã đề xuất 9 lĩnh vực cần cải thiện cho btrfs-progs, bao gồm:

  • Phát hiện tiến độ: Thêm cơ chế trong btrfs check --repair để tự động hủy bỏ nếu gặp vòng lặp vô hạn thay vì phá hủy các backup_roots.
  • Xử lý tham chiếu: Cải thiện cách xử lý BTRFS_ADD_DELAYED_REF trong reinit_extent_tree để tương thích với các ngoại lệ hiện có.
  • Lệnh Rescue mới: Đề xuất thêm các lệnh con như btrfs rescue rebuild-extent-tree hoặc btrfs rescue clean-orphan-inodes với chế độ dry-run an toàn.
  • Tài liệu rõ ràng hơn: Cần làm rõ cơ chế backup_roots (là cửa sổ trượt 4 commit, không phải bản sao lịch sử) và các quy tắc tính toán i_size cho thư mục.

Toàn bộ mã nguồn của 14 công cụ tùy chỉnh và bản phân tích chi tiết (INCIDENT-ANALYSIS.md) đều đã được công khai dưới giấy phép GPL-2.0. Đây là tài liệu tham khảo quý giá cho các quản trị viên hệ thống (sysadmin) và nhà phát triển làm việc với hệ thống file BTRFS trên Linux.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗