Hướng dẫn sử dụng Snapper trên Btrfs: Tự động Snapshot và Rollback Linux khi update lỗi

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Khi một lệnh apt upgrade làm sập server production

Hồi mới vào nghề, mình từng mất nguyên buổi chiều cứu một cụm web server. Lý do rất ngớ ngẩn: chủ quan chạy apt upgrade mà không test trước. Bản kernel mới xung đột driver mạng khiến máy mất IP. Không SSH được, mình phải cắm KVM cứu hộ toát mồ hôi suốt 4 tiếng.

Sự cố đó dạy mình một bài học: mọi thay đổi trên production đều phải có đường lui. Nếu server dùng filesystem Btrfs, Snapper chính là cứu cánh đắc lực nhất. Công cụ này tự động lưu trạng thái hệ thống trước và sau khi cài package. Nếu có lỗi phát sinh, bạn có thể quay ngược thời gian chỉ với một lệnh rollback.

Hiểu nhanh về Btrfs Subvolume và cơ chế Snapshot

Để vận hành Snapper hiệu quả, bạn chỉ cần nắm vững hai khái niệm nền tảng sau:

1. Btrfs Subvolume và Copy-on-Write (CoW)

Btrfs chia ổ đĩa thành các subvolume độc lập nhưng dùng chung tổng dung lượng. Nhờ cơ chế Copy-on-Write (CoW), snapshot vừa tạo chiếm đúng 0 MB dung lượng thực tế. Ổ cứng chỉ tốn thêm dung lượng khi có dữ liệu phát sinh hoặc bị ghi đè. Bạn có thể tạo 50 snapshot mà không sợ đầy đĩa ngay lập tức.

2. Ba loại Snapshot của Snapper

Snapper phân loại snapshot rất rõ ràng theo mục đích sử dụng:

  • Single: Bản chụp độc lập tại một thời điểm cụ thể, thường dùng để backup định kỳ hàng ngày.
  • Pre: Tạo tự động ngay trước khi bạn chạy lệnh cài đặt hay cập nhật phần mềm.
  • Post: Tạo ngay sau khi lệnh cài đặt hoàn tất. Snapper sẽ ghép cặp Pre và Post để bạn so sánh chính xác từng file bị thay đổi.

Thực hành: Cài đặt, cấu hình và thử nghiệm Rollback

Bước 1: Cài đặt Snapper và công cụ bổ trợ

Với Debian/Ubuntu (yêu cầu phân vùng root đang chạy trên Btrfs layout @):

sudo apt update
sudo apt install snapper inotify-tools grub-btrfs

Với Fedora, CentOS Stream hoặc RHEL clone (dùng DNF):

sudo dnf install snapper python3-dnf-plugin-snapper

Plugin DNF này rất tiện lợi. Mỗi lần bạn gõ dnf update, nó sẽ tự động tạo cặp snapshot Pre/Post.

Bước 2: Tạo cấu hình quản trị cho phân vùng root

Khởi tạo cấu hình Snapper cho thư mục gốc /:

sudo snapper -c root create-config /

Mặc định, Snapper tạo thư mục /.snapshots. Hãy chỉnh lại chính sách dọn dẹp để tránh tình trạng snapshot cũ tích tụ đầy ổ cứng:

sudo nano /etc/snapper/configs/root

Thiết lập số lượng bản lưu hợp lý cho server thông thường:

# Giữ snapshot tối thiểu 30 phút trước khi quét dọn
TIMELINE_MIN_AGE="1800"

# Giới hạn số snapshot theo chu kỳ thời gian
TIMELINE_LIMIT_HOURLY="6"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="2"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"

# Tự dọn dẹp theo tỷ lệ chiếm dụng đĩa
EMPTY_PRE_POST_CLEANUP="yes"
NUMBER_CLEANUP="yes"

Kích hoạt timer của systemd để hệ thống tự động dọn rác:

sudo systemctl enable --now snapper-timeline.timer snapper-cleanup.timer

Bước 3: Tạo snapshot thủ công và so sánh thay đổi

Trước khi sửa file config quan trọng của Nginx hay database, hãy chủ động tạo một điểm phục hồi:

sudo snapper -c root create --description "Truoc khi sua config Nginx"

Xem danh sách các snapshot hiện có:

sudo snapper -c root list

Kết quả hiển thị trên terminal:

 # | Type   | Pre # | Date                     | User | Cleanup  | Description
---+--------+-------+--------------------------+------+----------+-----------------------------
 0 | single |       |                          | root |          | current
 1 | single |       | Thu 02 Oct 2026 09:00:00 | root | timeline | timeline
 2 | single |       | Thu 02 Oct 2026 10:15:30 | root |          | Truoc khi sua config Nginx

Giả sử bạn vừa sửa file cấu hình nhưng service không khởi động được. Hãy kiểm tra xem có những file nào đã thay đổi giữa snapshot #2 và hiện tại (#0):

sudo snapper -c root status 2..0

Ý nghĩa các ký tự đầu dòng:

  • +: File mới được tạo thêm.
  • -: File đã bị xoá.
  • c: File bị chỉnh sửa nội dung.

Xem chi tiết từng dòng diff trong file cấu hình:

sudo snapper -c root diff 2..0 /etc/nginx/nginx.conf

Bước 4: Rollback khôi phục hệ thống

Nếu lỗi chỉ nằm ở vài file cấu hình trong /etc, bạn chỉ cần hoàn tác nhanh bằng lệnh:

sudo snapper -c root undochange 2..0

Snapper sẽ ngay lập tức khôi phục toàn bộ file về đúng nội dung tại snapshot #2.

Nếu gặp sự cố nghiêm trọng như lỗi kernel hoặc hỏng glibc sau khi update, hãy tiến hành rollback toàn bộ subvolume:

sudo snapper rollback 2
sudo reboot

Quá trình rollback hoàn tất trong chưa đầy 30 giây. Máy tính sẽ khởi động lại và tải thẳng vào trạng thái ổn định tại snapshot #2 như chưa từng có sự cố.

Lời kết

Btrfs và Snapper là cặp đôi không thể thiếu khi vận hành Linux. Chúng biến những đợt bảo trì rủi ro thành quy trình an toàn, có kiểm soát. Bạn chỉ cần đặt cấu hình dọn dẹp snapshot hợp lý là đã có sẵn một hệ thống tự phục hồi gọn nhẹ mà không tốn tài nguyên.

Share: