Tôi đã tốn quá nhiều thời gian ở giai đoạn đầu sự nghiệp để giải quyết một vấn đề đau đầu: cung cấp một hệ điều hành tiêu chuẩn cho các lập trình viên để họ có thể tùy chỉnh mà không làm hỏng hệ thống gốc. Sao lưu thì chậm. Nhân bản ổ đĩa (disk cloning) thì quá mức cần thiết. Sau đó tôi tìm thấy OverlayFS. Nó đã thay đổi mọi thứ bằng cách cho phép tôi phân lớp các hệ thống tệp — giữ cho một ‘golden image’ nguyên vẹn trong khi ghi lại mọi thay đổi trong một thư mục nhẹ.
Cuộc chiến Union Filesystem: OverlayFS và Những cái tên cũ
Trước khi OverlayFS xuất hiện trong nhân Linux (kernel) phiên bản 3.18, chúng ta đã phải vật lộn với AUFS (Advanced Multi-Layered Unification Filesystem). AUFS rất mạnh mẽ nhưng lộn xộn. Vì nó không bao giờ được đưa vào kernel chính thức, các quản trị viên hệ thống (sysadmin) đã phải duy trì các bản vá (patch) tùy chỉnh. Đó là một cơn ác mộng về sự ổn định.
Device Mapper snapshots là một lựa chọn khác. Những công cụ này hoạt động ở cấp độ khối (block level). Tuy nhiên, nếu bạn thay đổi một byte trong tệp 100MB, hệ thống phải quản lý các khối thay vì các tệp. Điều này không hiệu quả cho hầu hết các tác vụ. Thay vào đó, OverlayFS hoạt động ở cấp độ tệp (file level). Nó nhanh hơn đáng kể cho việc container hóa và môi trường Live USB.
Hãy tưởng tượng việc ‘gộp’ (merge) giống như một chồng kính. Bạn có một thư mục lower (chỉ đọc) và một thư mục upper (có thể ghi). Nhìn qua điểm gắn kết (mount point) merged, bạn sẽ thấy cả hai. Lớp trên cùng (upper) luôn thắng. Nếu một tệp tồn tại ở cả hai nơi, phiên bản trong thư mục upper là phiên bản bạn thấy và chỉnh sửa.
Ưu điểm, Nhược điểm và Inode
Trong môi trường triển khai thực tế (production), lợi ích là thấy ngay lập tức. Nhưng cũng có những cạm bẫy. Sau khi quản lý hơn 20 node Linux trong năm năm, tôi đã học được rằng việc khóa tệp (file locking) vẫn có thể là một ẩn số trên các mount overlay.
Ưu điểm
- Hiệu năng cực nhanh: OverlayFS bỏ qua chi phí chuyển đổi ở cấp độ khối. Nó giao tiếp trực tiếp với hệ thống tệp máy chủ của bạn, như ext4 hoặc XFS.
- Tiết kiệm bộ nhớ: Nhiều container có thể chia sẻ cùng các lớp ‘lower’ trong page cache. Trong một dự án với 30 container, chúng tôi đã cắt giảm mức sử dụng RAM gần 4GB.
- Dọn dẹp tức thì: Muốn khôi phục cài đặt gốc cho hệ thống? Chỉ cần xóa sạch thư mục ‘upper’. Quá trình này chỉ mất vài mili giây và an toàn hơn nhiều so với việc xóa đệ quy trên một hệ thống đang chạy.
Nhược điểm
- Cạn kiệt Inode: Mỗi tệp sử dụng một inode trên đĩa gốc. Nếu bạn duyệt qua hàng triệu tệp nhỏ giữa các lớp, bạn sẽ chạm giới hạn inode trước khi hết dung lượng GB.
- Các lỗi POSIX lạ: Các thao tác như
rename()có thể trở nên lộn xộn khi di chuyển tệp giữa các lớp. Hầu hết các ứng dụng hiện đại đều ổn, nhưng các công cụ cơ sở dữ liệu cũ có thể gặp lỗi. - Lỗi liên kết cứng (Hard Link): Việc chỉnh sửa một tệp có nhiều liên kết cứng sẽ kích hoạt cơ chế ‘copy up’. Điều này thực tế sẽ phá vỡ liên kết cho phiên bản đã chỉnh sửa trong chế độ xem đã gộp (merged).
Kiến trúc Lý tưởng
Thành công với OverlayFS phụ thuộc vào chiến lược thư mục của bạn. Một sai lầm phổ biến là đặt thư mục ‘work’ trên một phân vùng khác với thư mục ‘upper’. Chúng phải nằm trên cùng một hệ thống tệp để các thao tác di chuyển nguyên tử (atomic moves) hoạt động.
Cấu trúc thư mục tiêu chuẩn
/mnt/storage/base: Nguồn chỉ đọc của bạn (Lower)./mnt/storage/diff: Nơi lưu trữ các thay đổi (Upper)./mnt/storage/work: Một thư mục trống bắt buộc cho siêu dữ liệu nội bộ (Work)./mnt/unified: Nơi bạn thực sự làm việc với các tệp (Merged).
Mẹo về phần cứng
Đối với các máy chủ hiệu năng cao, hãy đặt thư mục upper và work của bạn trên ổ NVMe SSD. Mặc dù thư mục lower có thể nằm trên ổ HDD chậm hơn, việc giữ mọi thứ trên ổ cứng flash sẽ giảm độ trễ từ 10ms xuống còn micro giây trong các thao tác ‘copy up’.
Triển khai thực tế
Bạn không cần thêm phần mềm nào cả. Nếu bạn đang dùng Ubuntu, Debian hoặc AlmaLinux, module này đã có sẵn ở đó.
1. Gắn kết (Mount) cơ bản
Hãy xây dựng một môi trường thử nghiệm:
mkdir -p /tmp/overlay_test/{lower,upper,work,merged}
echo "Tệp lớp cơ sở" > /tmp/overlay_test/lower/base.txt
sudo mount -t overlay overlay \
-o lowerdir=/tmp/overlay_test/lower,upperdir=/tmp/overlay_test/upper,workdir=/tmp/overlay_test/work \
/tmp/overlay_test/merged
Kiểm tra /tmp/overlay_test/merged và bạn sẽ thấy base.txt. Tạo một tệp mới ở đó, và nó sẽ nằm trong thư mục upper về mặt vật lý. Thư mục lower vẫn được giữ nguyên.
2. Xếp chồng các lớp
Đây là “bí quyết” đằng sau Docker. Bạn có thể xếp chồng nhiều thư mục lower, chẳng hạn như một hệ điều hành cơ bản, một máy chủ web, và sau đó là mã ứng dụng của bạn.
sudo mount -t overlay overlay \
-o lowerdir=/dir3:/dir2:/dir1,upperdir=/upper,workdir=/work \
/merged
Thứ tự ưu tiên chảy từ trái sang phải: dir3 là lớp ưu tiên cao nhất ở đây.
3. Duy trì mount qua fstab
Để mount này vẫn tồn tại sau khi khởi động lại, hãy thêm dòng này vào /etc/fstab. Sử dụng đường dẫn đầy đủ và giữ các tùy chọn được ngăn cách bằng dấu phẩy.
overlay /mnt/unified overlay noatime,lowerdir=/mnt/base,upperdir=/mnt/diff,workdir=/mnt/work 0 0
4. Mẹo Live USB bền vững
Live USB thường chạy trên một tệp squashfs nén, chỉ đọc. Bằng cách sử dụng OverlayFS, bạn có thể dùng squashfs đó làm lowerdir và một phân vùng USB có thể ghi làm upperdir. Người dùng có thể cài đặt các gói và lưu trữ công việc mà vẫn tồn tại sau khi khởi động lại, trong khi hệ điều hành cốt lõi vẫn được bảo vệ tuyệt đối.
Xử lý lỗi ‘Wrong FS Type’
Nếu việc mount thất bại với một lỗi chung chung, hãy chạy dmesg | tail. Thông thường là do một trong hai nguyên nhân sau:
- Thư mục công việc không sạch (Dirty Workdir): Thư mục work không trống.
- XFS ftype: OverlayFS cần hỗ trợ
d_type. Nếu bạn đang dùng hệ thống CentOS 7 cũ sử dụng XFS, nó có thể đã được định dạng vớiftype=0. Bạn cầnftype=1để OverlayFS hoạt động. Kiểm tra điều này bằng lệnhxfs_info /mountpoint.
OverlayFS là một công cụ cấp thấp nhưng mang lại sự linh hoạt ở cấp độ cao. Cho dù bạn đang cắt giảm chi phí lưu trữ Docker hay xây dựng một kiosk chống can thiệp, nó đều cung cấp lưới an toàn mà mọi quản trị viên hệ thống đều cần.

