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 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.

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ácbackup_roots. - Xử lý tham chiếu: Cải thiện cách xử lý
BTRFS_ADD_DELAYED_REFtrongreinit_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-treehoặcbtrfs rescue clean-orphan-inodesvớ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áni_sizecho 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.



