Sao lưu hệ thống Ubuntu: Đừng chờ đến khi mất dữ liệu mới hối hận
Mình đã cài Ubuntu Server 22.04 trên hơn 20 con VPS và luôn bắt đầu bằng một thứ — thiết lập snapshot tự động, trước khi cài bất cứ gì khác. Lý do đơn giản: một lần apt upgrade đụng vào kernel, mình mất gần 3 tiếng khôi phục thủ công từ rescue mode. Từ đó, Btrfs snapshot thành bước số một trong checklist setup server.
So sánh các approach sao lưu phổ biến trên Ubuntu
Trước khi chốt với Btrfs + Snapper, mình đã thử qua ba cách. Mỗi cái ổn trên giấy — nhưng dùng thực tế trên server mới thấy chỗ hổng.
1. rsync — Sao lưu file truyền thống
rsync quen thuộc, dễ script, không cần setup gì nhiều. Nhưng hỏng ở chỗ quan trọng nhất:
- Không phải snapshot thật — không capture trạng thái hệ thống tại một thời điểm chính xác
- Khôi phục chậm: phải copy ngược lại toàn bộ, mất nhiều thời gian
- Không rollback được boot loader nếu kernel hỏng hoặc grub bị lỗi
- Dung lượng backup tăng theo kích thước partition, không tiết kiệm
2. Timeshift — Dễ dùng nhưng thiếu linh hoạt
Nhìn qua thì Timeshift có vẻ hơn: GUI thân thiện, hỗ trợ cả rsync mode lẫn Btrfs mode. Thực tế trên server thì:
- rsync mode vẫn chậm và tốn storage như rsync thông thường
- Btrfs mode chỉ snapshot
/và/home, không tùy chỉnh được nhiều - Không tích hợp tự động với
apt— phải nhớ tạo snapshot thủ công trước khi update - Cleanup policy khá đơn giản, không linh hoạt bằng Snapper
3. Btrfs + Snapper — Snapshot cấp filesystem
Cách này mình dùng trên hết thảy server quan trọng. Snapshot hoạt động ở tầng filesystem, không phải file-by-file. Tức thì — dưới 1 giây, bất kể partition bao nhiêu GB. Chỉ lưu phần thay đổi về sau, không duplicate toàn bộ. Và rollback được ngay từ GRUB boot menu, kể cả khi hệ thống không boot vào nổi.
Phân tích ưu nhược điểm của Btrfs + Snapper
Ưu điểm thực tế
- Tốc độ snapshot gần tức thì: Copy-on-write filesystem — tạo snapshot không cần copy data
- Tiết kiệm storage: Snapshot chỉ lưu phần thay đổi so với trạng thái trước, không duplicate toàn bộ
- Rollback từ GRUB: Ngay cả khi hệ thống không boot được, vẫn chọn snapshot cũ từ menu boot
- Tự động hóa hoàn toàn: Timeline snapshots theo giờ/ngày/tuần, cleanup policy tự động dọn snapshot cũ
- Tích hợp apt hook: Tự snapshot trước và sau mỗi lần
apt install/upgrade— không cần nhớ
Nhược điểm cần biết trước khi triển khai
- Partition phải được format Btrfs ngay từ lúc cài Ubuntu — không convert từ ext4 dễ dàng
- Cần hiểu khái niệm subvolume Btrfs (không phức tạp, nhưng cần đọc qua)
- Snapshot nằm cùng đĩa với hệ thống — không phải backup thật sự nếu đĩa hỏng vật lý
- Database đang chạy (MySQL, PostgreSQL) cần backup riêng — snapshot filesystem không đảm bảo consistency
Chọn cách nào phù hợp?
Tóm lại nhanh cho từng trường hợp:
- Server production, cần rollback nhanh khi update hỏng → Btrfs + Snapper (bài này)
- Desktop Ubuntu, cần backup /home đơn giản → Timeshift rsync mode dễ hơn
- Backup data ra server/cloud khác → rsync, restic, hoặc borgbackup
Từ đây bài đi thẳng vào Btrfs + Snapper cho Ubuntu Server.
Hướng dẫn triển khai từng bước
Điều kiện tiên quyết: Ubuntu cài với Btrfs
Khi cài Ubuntu 22.04, ở bước chọn disk hãy chọn Custom Storage Layout → format partition root là Btrfs. Ubuntu Installer tự tạo subvolume @ cho root và @home cho /home.
Kiểm tra hệ thống hiện tại đã dùng Btrfs chưa:
df -T /
# Cột Type phải là btrfs
sudo btrfs subvolume list /
# Phải thấy subvolume @ và @home
Bước 1: Cài Snapper và snapper-support
sudo apt update
sudo apt install -y snapper snapper-support
snapper-support kéo theo grub-btrfs — tự động thêm danh sách snapshot vào GRUB boot menu.
Bước 2: Tạo cấu hình Snapper cho root
sudo snapper -c root create-config /
# Kiểm tra cấu hình vừa tạo
sudo snapper -c root get-config
Bước 3: Điều chỉnh policy giữ snapshot
Mặc định Snapper giữ hơi nhiều — không tune thì storage tăng nhanh hơn bạn nghĩ. Mình thường sửa lại như này:
sudo nano /etc/snapper/configs/root
Tìm và sửa các dòng sau:
# Snapshot manual tối đa giữ lại
NUMBER_LIMIT="5"
# Bật tự động tạo và dọn snapshot theo timeline
TIMELINE_CREATE="yes"
TIMELINE_CLEANUP="yes"
# Số lượng snapshot theo mốc thời gian giữ lại
TIMELINE_LIMIT_HOURLY="3"
TIMELINE_LIMIT_DAILY="5"
TIMELINE_LIMIT_WEEKLY="2"
TIMELINE_LIMIT_MONTHLY="1"
TIMELINE_LIMIT_YEARLY="0"
Bước 4: Bật các timer của Snapper
sudo systemctl enable --now snapper-timeline.timer
sudo systemctl enable --now snapper-cleanup.timer
# Kiểm tra timer đang chạy
sudo systemctl status snapper-timeline.timer
Bước 5: Cài apt-btrfs-snapper để snapshot tự động trước mỗi lần apt
Phần mình thích nhất của setup này. Mỗi lần chạy apt install hay apt upgrade, hệ thống tự tạo snapshot trước và sau — không cần nhớ gì cả:
sudo apt install -y apt-btrfs-snapper
# Test ngay: cài một package và xem snapshot tự tạo
sudo apt install -y htop
sudo snapper -c root list
# Sẽ thấy 2 snapshot mới: "pre" và "post" của lần apt vừa rồi
Bước 6: Cập nhật GRUB để thêm snapshot vào menu boot
sudo update-grub
# Kiểm tra grub-btrfs đã generate entry chưa
grep -i btrfs /boot/grub/grub.cfg | head -5
Từ giờ khi boot, GRUB có thêm submenu “Ubuntu Snapshots” với danh sách snapshot để chọn boot vào.
Cách rollback khi gặp sự cố
Rollback từ hệ thống đang chạy bình thường
# Xem danh sách snapshot hiện có
sudo snapper -c root list
# ID | Type | Date | Description
# 0 | single | 2026-10-08 10:00:00 +0900 | current
# 1 | pre | 2026-10-08 11:00:00 +0900 | apt: apt-get upgrade
# 2 | post | 2026-10-08 11:05:00 +0900 | apt: apt-get upgrade
# Xem những file nào thay đổi giữa snapshot 1 và hiện tại
sudo snapper -c root diff 1..0
# Rollback lại trạng thái snapshot số 1 (hoàn tác tất cả thay đổi từ đó đến nay)
sudo snapper -c root undochange 1..0
Rollback khi hệ thống không boot được
- Khởi động lại máy, vào GRUB menu (nhấn giữ
ShifthoặcEsc) - Chọn Ubuntu Snapshots → chọn snapshot muốn rollback về
- Hệ thống boot vào snapshot đó (read-only để kiểm tra)
- Sau khi vào được, chạy lệnh để rollback thật sự và reboot:
# Rollback về snapshot ID 5 (thay số ID tùy theo list của bạn)
sudo snapper -c root rollback 5
sudo reboot
Quản lý snapshot thủ công
# Tạo snapshot thủ công trước khi làm gì đó quan trọng
sudo snapper -c root create --description "truoc-khi-cai-docker"
# Xem dung lượng tổng dùng bởi Btrfs
sudo btrfs filesystem usage /
# Xóa snapshot thủ công không cần nữa
sudo snapper -c root delete 3
# Xóa nhiều snapshot cùng lúc
sudo snapper -c root delete 3 4 5
Một số lưu ý thực tế từ kinh nghiệm dùng lâu dài
- Snapshot ≠ backup đầy đủ: Snapshot nằm cùng đĩa với hệ thống — đĩa hỏng vật lý thì snapshot cũng mất. Với data quan trọng (database, uploads), vẫn cần rsync hoặc restic backup ra ngoài.
- Theo dõi dung lượng định kỳ: Chạy
btrfs filesystem usage /mỗi tháng một lần. CoW snapshot tích lũy theo thời gian — cleanup timer tự dọn, nhưng kiểm tra thêm không hại gì. - /home snapshot riêng: Nếu muốn snapshot cả /home, tạo thêm config:
sudo snapper -c home create-config /homerồi điều chỉnh policy tương tự. - Database consistency: MySQL hay PostgreSQL đang chạy không đảm bảo consistent khi snapshot filesystem. Với database production, dùng thêm
mysqldumphoặcpg_dumpchạy cron riêng.
Setup này mất khoảng 15 phút nhưng đã cứu mình không ít lần — đặc biệt những lần apt full-upgrade đụng vào kernel hoặc thư viện hệ thống quan trọng. Rollback xong, server về trạng thái sạch trong vòng 2 phút, không cần mò rescue mode hay reinstall.

