Hướng dẫn sử dụng Btrfs snapshot trên Fedora: Backup và rollback hệ thống nhanh chóng

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Làm ngay trong 5 phút — Không cần setup phức tạp

Nếu máy bạn đang chạy Fedora 33 trở lên, filesystem gốc đã là Btrfs theo mặc định. Nghĩa là bạn có thể tạo snapshot ngay bây giờ mà không cần cài thêm gì cả.

Kiểm tra nhanh xem đang dùng Btrfs chưa:

df -T /
# Cột Type phải hiển thị "btrfs" là được

Tạo snapshot read-only của subvolume root:

# Tạo thư mục chứa snapshot (chỉ cần làm một lần)
sudo mkdir -p /.snapshots

# Tạo snapshot với tên theo ngày giờ
sudo btrfs subvolume snapshot -r / /.snapshots/root-$(date +%Y%m%d-%H%M)

Kiểm tra snapshot vừa tạo:

sudo btrfs subvolume list / | grep snapshots

Xong — bạn vừa có backup toàn bộ trạng thái hệ thống. Cần khôi phục file nào đó sau này, chỉ cần mount snapshot này lên và copy ra.

Tại sao cần snapshot — Câu chuyện từ thực tế

Mình dùng Fedora làm máy development chính đã 2 năm và khá hài lòng với tốc độ cập nhật package. Nhưng chính vì Fedora cập nhật nhanh, thỉnh thoảng một package nào đó sau khi upgrade lại phá vỡ thứ đang chạy ổn. Gặp nhất là driver NVIDIA, hoặc một thư viện Python bị thay đổi ABI.

Trước khi biết đến snapshot, mỗi lần gặp sự cố là phải ngồi debug hàng tiếng. Giờ thì đơn giản hơn nhiều: tạo snapshot trước khi dnf upgrade, nếu hỏng thì rollback trong vài phút, không mất gì cả.

Snapshot hoạt động như thế nào?

Btrfs snapshot không phải copy toàn bộ dữ liệu — nó dùng cơ chế Copy-on-Write (CoW). Khi tạo snapshot, Btrfs chỉ ghi nhớ trạng thái hiện tại bằng cách tham chiếu đến các data block đang tồn tại. Khi bạn thay đổi file sau đó, Btrfs mới thực sự copy block cũ sang chỗ mới rồi ghi dữ liệu mới vào đó.

Nhờ cơ chế này, snapshot tạo xong trong chưa tới 1 giây và ban đầu gần như không chiếm thêm dung lượng. Dung lượng chỉ tăng dần theo mức độ thay đổi của hệ thống sau đó.

So với backup truyền thống

  • Tốc độ tạo: Snapshot Btrfs xong trong dưới 1 giây. Backup bằng rsync mất hàng chục phút.
  • Dung lượng ban đầu: Snapshot chiếm gần 0 byte khi vừa tạo. Backup copy là nhân đôi dữ liệu ngay lập tức.
  • Giới hạn: Snapshot chỉ hoạt động trên cùng một filesystem Btrfs. Muốn backup ra ổ ngoài vẫn cần công cụ bổ sung.

Dùng Snapper để tự động hóa — Cài một lần, chạy mãi về sau

Tạo snapshot thủ công ổn cho lần đầu thử, nhưng thực tế bạn sẽ quên trước khi chạy lệnh nguy hiểm. Snapper giải quyết chuyện đó — nó quản lý snapshot và quan trọng nhất là tích hợp với DNF để tự động chụp trạng thái hệ thống trước và sau mỗi lần update.

Cài đặt Snapper và DNF plugin

sudo dnf install snapper python3-dnf-plugin-snapper

Tạo cấu hình Snapper cho subvolume root:

sudo snapper -c root create-config /

Xem cấu hình mặc định vừa tạo:

sudo snapper -c root get-config

Tạo snapshot thủ công với Snapper

# Tạo snapshot với mô tả
sudo snapper -c root create --description "Trước khi thử config Nginx"

# Xem danh sách snapshot
sudo snapper -c root list

Output sẽ trông như thế này:

  # | Type   | Pre # | Date                      | User | Description
----+--------+-------+---------------------------+------+-------------------------
  0 | single |       |                           | root | current
  1 | single |       | 2025-03-15 09:30:12 +0900 | root | Trước khi thử config Nginx

Snapshot tự động khi chạy dnf

Sau khi cài python3-dnf-plugin-snapper, plugin sẽ tự động tạo cặp snapshot “pre” và “post” mỗi khi bạn chạy dnf. Không cần làm gì thêm:

sudo dnf upgrade
# Snapper tự tạo snapshot "pre" trước khi upgrade bắt đầu
# Và snapshot "post" sau khi hoàn tất

Xem kết quả sau khi upgrade xong:

sudo snapper -c root list
# Sẽ thấy cặp snapshot pre/post với type "pre" và "post"

So sánh thay đổi giữa hai snapshot

Tính năng mình dùng nhiều nhất là xem file nào đã thay đổi sau khi upgrade — đặc biệt hữu ích khi cần biết config nào bị ghi đè:

# So sánh snapshot số 3 (pre) và số 4 (post)
sudo snapper -c root status 3..4

# Xem diff chi tiết của một file cụ thể
sudo snapper -c root diff 3..4 /etc/nginx/nginx.conf

Rollback khi hệ thống gặp sự cố

Rollback file cụ thể — Nhanh nhất cho lỗi nhỏ

Lỡ tay xóa file hoặc config bị hỏng sau khi chỉnh sửa:

# Khôi phục một file cụ thể từ snapshot số 1 về trạng thái hiện tại (0)
sudo snapper -c root undochange 1..0 /etc/fstab

# Hoặc mount snapshot thủ công rồi copy file
sudo mount -o ro,subvol=/.snapshots/1/snapshot /dev/sda3 /mnt
cp /mnt/etc/fstab /etc/fstab
sudo umount /mnt

Rollback toàn bộ hệ thống qua GRUB

Trường hợp nặng hơn — kernel mới không boot được, hoặc upgrade phá vỡ desktop environment. Cài thêm grub-btrfs để GRUB hiển thị menu boot vào snapshot:

sudo dnf install grub-btrfs
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Khởi động lại, GRUB sẽ có thêm mục “Fedora snapshots” để chọn boot vào snapshot cũ. Sau khi boot thành công vào snapshot muốn giữ lại:

sudo snapper rollback
sudo reboot

Lưu ý: snapper rollback hoạt động tốt khi layout subvolume theo chuẩn Snapper. Với layout mặc định của Fedora (subvolume @@home), nên kiểm tra tài liệu của snapper để chắc chắn về khả năng tương thích trước khi dùng trong môi trường production.

Tips thực tế để dùng snapshot bền vững

Tạo alias cho thói quen snapshot-before

Thêm vào ~/.bashrc để tạo snapshot nhanh trước bất kỳ thao tác rủi ro nào:

# Thêm vào ~/.bashrc
alias snap-now='sudo snapper -c root create --description "Manual: $(date +%Y%m%d-%H%M)"'

# Reload bashrc
source ~/.bashrc

# Dùng: snap-now && sudo dnf upgrade

Quản lý dung lượng — Đừng để snapshot lấp đầy ổ cứng

Sau vài tuần update đều đặn, /.snapshots có thể ngốn 5–20GB tùy mức độ thay đổi hệ thống. Cấu hình Snapper tự dọn dẹp theo timeline để giữ số lượng snapshot hợp lý:

sudo snapper -c root set-config \
  TIMELINE_CREATE=yes \
  TIMELINE_LIMIT_HOURLY=5 \
  TIMELINE_LIMIT_DAILY=7 \
  TIMELINE_LIMIT_WEEKLY=2 \
  TIMELINE_LIMIT_MONTHLY=1 \
  TIMELINE_LIMIT_YEARLY=0

Xóa snapshot cũ không cần thiết:

# Xóa snapshot số 5
sudo snapper -c root delete 5

# Xóa nhiều snapshot cùng lúc
sudo snapper -c root delete 3-8

# Kiểm tra dung lượng snapshot đang dùng
sudo btrfs filesystem du -s /.snapshots/*

Backup snapshot ra ổ ngoài với btrfs send

Snapshot trên cùng ổ cứng chỉ bảo vệ bạn khỏi lỗi phần mềm, không bảo vệ khỏi hỏng phần cứng. Để backup thực sự, dùng btrfs send để gửi snapshot sang ổ ngoài:

# Giả sử ổ ngoài mount tại /backup (phải là filesystem Btrfs)
# Gửi snapshot đầy đủ
sudo btrfs send /.snapshots/1/snapshot | sudo btrfs receive /backup/

# Gửi incremental — chỉ phần thay đổi từ snapshot trước, cực kỳ nhanh
sudo btrfs send -p /.snapshots/1/snapshot /.snapshots/2/snapshot | \
  sudo btrfs receive /backup/

Backup incremental chỉ gửi phần dữ liệu đã thay đổi giữa hai snapshot — thay vì copy hàng chục GB, bạn chỉ truyền vài trăm MB cho mỗi lần backup hàng ngày.

Sau khi dùng workflow này một thời gian, mình gần như không còn lo lắng trước mỗi lần dnf upgrade. Snapshot tạo dưới 1 giây, rollback mất vài phút — đó là sự đánh đổi hoàn toàn xứng đáng so với hàng tiếng đồng hồ debug khi có sự cố.

Share: