Hướng dẫn di chuyển Containerd sang partition khác để giải phóng dung lượng root filesystem Ubuntu
Hướng dẫn chi tiết di chuyển containerd từ root filesystem (/) sang partition khác để giải phóng dung lượng, tránh lỗi Disk Full trên Ubuntu Linux với Docker.
Khi root filesystem bị đầy do containerd snapshots chiếm quá nhiều dung lượng — dù các partition khác vẫn còn trống — bạn cần di chuyển containerd data sang partition có dung lượng trống để giải phóng dung lượng cho hệ thống. Hướng dẫn này giúp bạn thực hiện điều đó một cách an toàn và nhanh chóng.
1. Vấn đề gặp phải
Triển khai Docker trên Ubuntu, bạn có thể gặp tình huống:
Root filesystem đầy trên 80-90% trong khi các partition khác vẫn còn rất nhiều dung lượng trống.
Docker containers vẫn hoạt động bình thường nhưng hệ thống cảnh báo dung lượng thấp.
Lỗi
no space left on devicexuất hiện khi trying pull image hoặc tạo container mới.
Ví dụ thực tế:
df -h /
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 54G 47G 4.2G 92% /
df -h /mnt/e02
# /dev/mapper/vg01-lv_data 500G 100G 380G 21% /mnt/e02Root filesystem đã đầy 92% trong khi partition /mnt/e02 chỉ dùng 21%.
2. Nguyên nhân
Containerd lưu trữ snapshots của Docker images trên root filesystem tại đường dẫn mặc định:
Docker data: Có thể đã được cấu hình ở partition khác (ví dụ:
/mnt/e02/docker).Containerd snapshots: Vẫn nằm trên root filesystem tại
/var/lib/containerd/.Overlay Layers: Docker containers sử dụng overlay filesystem được store trong containerd snapshots.
Cấu trúc phụ thuộc:
Vì vậy dù Docker data đã ở partition khác, dung lượng root filesystem vẫn bị chiếm dụng bởi containerd snapshots.
3. Giải pháp
Di chuyển containerd data từ /var/lib/containerd sang partition có dung lượng trống (ví dụ: /mnt/e02/uenv/var/lib/containerd).
Lợi ích của phương pháp này:
Giải phóng root filesystem: Ví dụ từ 92% xuống còn 40%.
Tận dụng dung lượng partition khác: Partition trống trở thành nơi lưu trữ chính.
Không mất Docker containers: Containers vẫn hoạt động bình thường sau khi migrate.
Không cần thay đổi Docker config: Docker daemon vẫn sử dụng cấu hình hiện tại.
Thời gian thực hiện nhanh: Chỉ ~5-10 phút cho ~27GB dữ liệu trên SSD.
4. Yêu cầu trước khi thực hiện
Trước khi bắt đầu, đảm bảo hệ thống đáp ứng các yêu cầu sau:
Hệ điều hành: Ubuntu 24.04 LTS (hoặc các bản phân phối Linux khác).
Docker: Docker CE (latest version).
Containerd: v1.7 trở lên.
Filesystem: LVM + ext4 hoặc tương đương.
Quyền: sudo/root access.
Partition đích: Có dung lượng trống >20GB.
5. Hướng dẫn chi tiết
Bước 1: Kiểm tra tình trạng hiện tại
Trước khi thực hiện, kiểm tra dung lượng root filesystem, partition đích, dung lượng containerd, và Docker config:
Kết quả mong đợi:
Root filesystem: >80% used.
Containerd: >10GB.
Partition đích: >100GB available.
Bước 2: Dừng Docker và Containerd
Dừng các dịch vụ Docker và Containerd trước khi di chuyển dữ liệu:
Tất cả containers sẽ bị dừng trong quá trình thực hiện. Hãy thông báo cho team/users trước khi bắt đầu.
Bước 3: Tạo thư mục đích
Tạo thư mục trên partition đích để lưu containerd data:
Bước 4: Di chuyển dữ liệu
Di chuyển toàn bộ dữ liệu containerd từ root filesystem sang partition đích:
Kết quả mong đợi:
/var/lib/containerd= 4.0K (rỗng)./mnt/e02/uenv/var/lib/containerd= ~27GB.
Bước 5: Sửa cấu hình Containerd
Backup config hiện tại và sửa root = trong /etc/containerd/config.toml:
Thay đổi dòng root:
Bước 6: Khởi động lại services
Khởi động lại Containerd và Docker để áp dụng cấu hình mới:
Bước 7: Xác minh containers chạy bình thường
Sau khi khởi động, kiểm tra Docker hoạt động bình thường:
6. Xác minh kết quả
Sau khi hoàn thành, kiểm tra kỹ lưỡng các khía cạnh sau:
Kiểm tra dung lượng filesystem
Kiểm tra Containerd config
Kiểm tra Docker operation
7. Troubleshooting
Lỗi "permission denied" khi di chuyển dữ liệu
Docker không start sau khi config
Containers không start sau migration
Rollback nếu có vấn đề
Nếu gặp sự cố không thể giải quyết, hoàn nguyên về cấu hình cũ:
8. Best Practices
Lên kế hoạch trước: Thông báo team, chọn lịch giờ ít traffic, backup containers quan trọng.
Giám sát trong quá trình migrate: Sử dụng
watch -n 1 'df -h / | tail -1'vàsudo lsof | grep containerdđể theo dõi.Tối ưu thêm nếu cần: Chạy
sudo docker image prune -a -fđể dọn dẹp images không dùng, cleanup snapd cache.Document lại: Lưu note containerd root path mới, backup config, thêm vào runbook team.
Giám sát dài hạn: Thiết lập cron job kiểm tra dung lượng hoặc dùng monitoring tools (Prometheus + Grafana, Datadog).
9. Kết quả thực tế
Trên một máy Ubuntu 24.04 LTS với Docker CE và Containerd v1.7+:
Trước khi di chuyển
Root filesystem: 54G volume, 47G used (92%)
Containerd: 27G (trên root)
Status: FULL
Sau khi di chuyển
Root filesystem: 54G volume, 21G used (40%)
Containerd: Đã chuyển sang
/mnt/e02/uenv(27G)Status: HEALTHY
Kênh giải phóng: 26GB (+52% khả dụng root filesystem).
10. Tài liệu tham khảo
Containerd: https://containerd.io/docs/
Docker: https://docs.docker.com/
Systemd: https://systemd.io/
FAQ
Q: Có ảnh hưởng gì đến containers không?
A: Không. Containers sẽ restart tự động khi Docker start lại. Dữ liệu containers được lưu trên overlay filesystem, không bị mất.
Q: Nên chọn partition nào?
A: Chọn partition có dung lượng trống >50GB, SSD ưu tiên để đảm bảo hiệu năng I/O.
Q: Có cần thay đổi Docker config không?
A: Không. Docker chỉ phụ thuộc vào containerd config. Docker daemon vẫn sử dụng cấu hình hiện tại.
Q: Tốn bao lâu để di chuyển?
A: Với ~27GB dữ liệu trên SSD, thời gian di chuyển khoảng 5-10 phút.
Q: Có thể di chuyển lại không?
A: Được. Làm tương tự các bước trên với path đích khác. Lưu ý cập nhật config cho đúng.
Ghi chú
Hướng dẫn dựa trên Ubuntu 24.04 LTS, Docker CE, Containerd v1.7+, LVM + ext4.
Các bản phân phối Linux khác có thể cần điều chỉnh nhỏ về đường dẫn và tên package.
Luôn backup config trước khi thực hiện bất kỳ thay đổi nào.
Cập nhật lần cuối