Quản lý file tạm tự động với systemd-tmpfiles: Đừng để server “chết” vì rác

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

Cú sốc ổ cứng đầy và sự ra đời của systemd-tmpfiles

Tôi từng vã mồ hôi hột khi một con server Production bỗng dưng lăn đùng ra chết. Log báo lỗi No space left on device, dù ổ cứng còn tận 200GB trống trước đó vài ngày.

Sau khi quét bằng du -sh, tôi phát hiện thư mục /tmp đang chứa hơn 10 triệu file session nhỏ li ti, tổng dung lượng lên tới 80GB. Lúc đó, tôi xử lý kiểu “nông dân”: viết một script Bash chạy rm -rf rồi ném vào crontab. Kết quả là script chạy quá mạnh tay, xóa luôn cả socket đang hoạt động của database, khiến hệ thống downtime thêm 30 phút.

Nếu bạn đang loay hoay dọn rác thủ công như vậy, hãy làm quen với systemd-tmpfiles. Đây là công cụ chuẩn chỉ tích hợp sâu trong systemd. Nó giúp quản lý vòng đời file và thư mục tạm thời một cách khoa học, an toàn và hoàn toàn tự động.

Công cụ này không chỉ biết xóa. Nó còn tự động tạo các thư mục cần thiết khi boot máy, gán quyền (permission) chuẩn xác cho file socket, hoặc tạo symbolic link theo yêu cầu của ứng dụng. Mọi thứ được gói gọn trong các file cấu hình khai báo, thay vì những dòng script rời rạc, khó quản lý.

Kiểm tra systemd-tmpfiles trên hệ thống

Các distro phổ biến như Ubuntu, CentOS/AlmaLinux hay Fedora đều kích hoạt sẵn tính năng này. Để biết hệ thống có đang được bảo vệ hay không, bạn hãy gõ lệnh:

systemctl status systemd-tmpfiles-setup.service systemd-tmpfiles-clean.timer

Hai thành phần này đóng vai trò then chốt:

  • systemd-tmpfiles-setup.service: Chạy ngay lúc boot để khởi tạo các file/thư mục tạm.
  • systemd-tmpfiles-clean.timer: Thường chạy định kỳ mỗi 24 giờ để quét và dọn dẹp các file đã hết hạn (expired).

Cấu hình: Hiểu luật chơi để tránh lỗi hệ thống

Systemd quản lý cấu hình theo thứ tự ưu tiên rõ ràng. Đừng bao giờ sửa trực tiếp file trong /usr/lib vì chúng sẽ bị ghi đè khi bạn cập nhật hệ điều hành.

Vị trí đặt file cấu hình

  1. /usr/lib/tmpfiles.d/: Nơi chứa cấu hình mặc định của các gói phần mềm. Cấm đụng vào.
  2. /run/tmpfiles.d/: Các cấu hình tạm thời sinh ra trong quá trình máy đang chạy.
  3. /etc/tmpfiles.d/: “Đất diễn” của bạn đây. Hãy tạo các file .conf tại đây để tùy chỉnh theo ý mình.

Giải mã cú pháp

Một dòng cấu hình chuẩn thường trông như thế này:

# Type  Path            Mode  User  Group  Age  Argument
d       /run/my_app     0755  nginx nginx  -    -

Chi tiết các cột:

  • Type: Hành động thực hiện. d là tạo thư mục, f là tạo file, e là chỉ dọn nội dung bên trong, X là loại trừ không xóa.
  • Path: Đường dẫn tuyệt đối.
  • Mode: Quyền hạn (ví dụ 0755).
  • User/Group: Chủ sở hữu.
  • Age: Tuổi thọ của file. Ví dụ 7d (7 ngày), 12h (12 giờ). Nếu để -, file sẽ không bao giờ bị xóa tự động.
  • Argument: Thường dùng để chỉ định đích đến cho symbolic link.

Ví dụ thực tế: Dọn dẹp 50GB cache sau 1 tuần

Giả sử ứng dụng của bạn liên tục tạo file tại /var/cache/my-app/. Để tránh đầy ổ cứng, bạn muốn tự động xóa các file cũ sau 7 ngày.

Đầu tiên, tạo file cấu hình:

sudo nano /etc/tmpfiles.d/my-app-cleanup.conf

Thêm nội dung sau:

# Chỉ dọn dẹp nội dung, giữ lại thư mục gốc
e  /var/cache/my-app  0750  webapp  webapp  7d  -

Tại sao dùng e? Vì nếu dùng d kèm theo Age, systemd có thể xóa luôn cả thư mục mẹ my-app nếu thư mục đó không có thay đổi gì trong 7 ngày. Dùng e (empty) sẽ an toàn hơn, chỉ dọn rác bên trong.

Một mẹo khác: Nếu bạn cần tạo thư mục socket cho Redis trên RAM (thư mục /run sẽ mất sạch khi reboot), hãy dùng:

d  /run/redis  0755  redis  redis  -  -

Vận hành an toàn: Đừng phó mặc cho số phận

Đừng viết cấu hình xong rồi ngồi chờ. Hãy kiểm tra ngay để tránh những sai sót đáng tiếc.

1. Chạy thử (Dry-run)

Lệnh này cực kỳ quan trọng. Nó cho bạn biết systemd định làm gì mà không thực sự xóa hay tạo bất cứ thứ gì:

systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/my-app-cleanup.conf

2. Ép hệ thống thực thi ngay

Nếu muốn tạo thư mục ngay lập tức:

sudo systemd-tmpfiles --create

Hoặc muốn dọn dẹp các file quá hạn ngay bây giờ:

sudo systemd-tmpfiles --clean

Cảnh báo: Cẩn thận với --clean. Nếu bạn lỡ set Age là 1s cho một thư mục quan trọng, dữ liệu sẽ bốc hơi sạch sẽ chỉ sau một cú Enter.

Kinh nghiệm thực tế về cách tính Age

Nhiều người lầm tưởng Age chỉ tính theo thời gian sửa file. Thực tế, systemd-tmpfiles kiểm tra cả 3 mốc: atime (truy cập), mtime (sửa nội dung) và ctime (đổi metadata). Mặc định, nó chỉ xóa khi cả 3 mốc này đều vượt quá thời gian bạn đặt. Điều này giúp bảo vệ các file đang được một tiến trình nào đó đọc nhưng không sửa.

Quản lý file tạm tuy nhỏ nhưng là kỹ năng phân biệt giữa một người biết Linux và một DevOps chuyên nghiệp. Hy vọng bài viết này giúp bạn tự tin dẹp bỏ các script Bash cũ kỹ để chuyển sang dùng systemd-tmpfiles chuẩn bài hơn.

Share: