Làm chủ AutoFS trên Linux: Tự động Mount NFS và SMB theo nhu cầu để chống treo hệ thống

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

Khai báo cứng remote storage vào /etc/fstab thường là thủ thuật đầu tiên mà một quản trị viên Linux học được. Nó hoạt động tốt, cho đến một ngày mọi thứ đổ bể. Nếu storage node đột ngột offline trong lúc reboot, máy chủ của bạn sẽ bị treo để chờ đợi TCP timeout suốt 90 giây.

Các cron job định kỳ bị đóng băng, còn kernel thì lãng phí socket để duy trì các network mount đã chết. AutoFS sinh ra để giải quyết triệt để vấn đề này. Nhờ kết hợp giữa bộ chặn VFS ở tầng kernel với một user-space daemon gọn nhẹ, AutoFS chỉ gắn kết network share khi có tiến trình truy cập vào và tự động unmount sạch sẽ sau một khoảng thời gian nhàn rỗi.

Bắt đầu nhanh (5 phút)

Hãy thiết lập target automount đầu tiên của bạn ngay bây giờ. Trong phần hướng dẫn này, bạn sẽ mount một NFS export từ xa mà không cần đụng đến /etc/fstab dù chỉ một lần.

1. Cài đặt Package AutoFS

Cài đặt các gói cần thiết cho bản phân phối của bạn:

# Debian / Ubuntu
sudo apt update
sudo apt install -y autofs nfs-common

# RHEL / AlmaLinux / Rocky Linux
sudo dnf install -y autofs nfs-utils

2. Cấu hình Master Map

File điều khiển chính là /etc/auto.master. File này ánh xạ các thư mục mount cha với các quy tắc mapping tương ứng. Mở file này bằng trình soạn thảo:

sudo nano /etc/auto.master

Thêm dòng sau vào cuối file:

/mnt/nfs  /etc/auto.nfs  --timeout=60

Dòng khai báo này trao toàn quyền kiểm soát /mnt/nfs cho AutoFS. Nó yêu cầu daemon đọc /etc/auto.nfs để lấy danh sách target và unmount bất kỳ share nào không hoạt động sau 60 giây.

3. Định nghĩa Map File

Bây giờ, hãy tạo file /etc/auto.nfs để chỉ định mount point và target:

sudo nano /etc/auto.nfs

Thêm dòng sau, nhớ thay đổi địa chỉ IP và đường dẫn từ xa cho phù hợp với mạng của bạn:

backups   -fstype=nfs4,rw,soft,timeo=50,retrans=3   192.168.1.50:/srv/nfs/backups

4. Khởi động và Kiểm tra

Khởi chạy service thông qua systemd:

sudo systemctl enable --now autofs

Kiểm tra các ổ đĩa đã mount bằng lệnh df -h. Bạn sẽ thấy /mnt/nfs/backups chưa xuất hiện. Mount point lúc này vẫn ở trạng thái ngủ đông. Hãy kích hoạt nó ngay lập tức bằng cách liệt kê các file bên trong đường dẫn mục tiêu:

ls -la /mnt/nfs/backups

Chạy lại lệnh df -h. Remote share giờ đã được mount và sẵn sàng cho các thao tác I/O. Hãy để yên hệ thống trong 60 giây mà không thực hiện thao tác nào trên thư mục đó, AutoFS sẽ âm thầm detach filesystem.

Phân tích chuyên sâu

Hiểu rõ cách các thành phần tương tác bên dưới hệ thống sẽ giúp bạn chẩn đoán sự cố mount dễ dàng hơn rất nhiều.

Kernel Module và User-Space Daemon

AutoFS phân chia nhiệm vụ giữa hai lớp: kernel module autofs4 và user-space daemon automount. Khi một ứng dụng tìm cách truy cập vào một đường dẫn đã cấu hình, kernel module sẽ chặn VFS path lookup lại.

Vì target lúc này là một trigger của autofs chứ không phải inode đang hoạt động trên đĩa, kernel sẽ tạm ngưng tiến trình gọi và gửi tín hiệu đến automount daemon thông qua một pipe chuyên dụng. Daemon sẽ phân tích map, thực thi syscall mount tiêu chuẩn rồi trả lại file descriptor. Khi thao tác kết thúc và bộ đếm thời gian nhàn rỗi chạm mốc 0, daemon sẽ báo cho kernel tiến hành unmount volume.

Indirect Maps và Direct Maps

Môi trường production thường dựa vào hai chiến lược thiết lập riêng biệt:

  • Indirect Maps: Gom nhiều share vào chung một thư mục cha, ví dụ như /mnt/nfs. Các thư mục con hoàn toàn vô hình đối với lệnh ls /mnt/nfs thông thường cho đến khi một tiến trình truy vấn chính xác tên target. Thiết kế này tránh làm quá tải các remote filer bởi hàng chục handshake mount diễn ra cùng lúc.
  • Direct Maps: Trỏ trực tiếp đến các đường dẫn riêng lẻ nằm rải rác ở bất kỳ đâu trong cấu trúc filesystem, ví dụ như /var/log/remote hoặc /opt/app/data. Bạn định nghĩa direct map bằng cách chỉ định /- làm đường dẫn gốc trong /etc/auto.master.

Direct mapping yêu cầu một khai báo master như sau:

/-   /etc/auto.direct   --timeout=120

Bên trong /etc/auto.direct, hãy cung cấp đường dẫn tuyệt đối làm khóa:

/var/www/shared   -fstype=nfs4,ro,soft   192.168.1.50:/srv/www_assets

Mount Windows và Samba (SMB/CIFS) Share một cách an toàn

Môi trường kết hợp Linux và Windows đòi hỏi phải mount qua CIFS. Việc lưu mật khẩu dạng plaintext trong các map file tiềm ẩn rủi ro bảo mật lớn khi bị audit, vì vậy hãy sử dụng một file credentials riêng biệt.

Lưu thông tin xác thực vào /etc/autofs.credentials:

username=svc_backup
password=SuperSecurePassword123
domain=CORP

Giới hạn ngay quyền truy cập file cho tài khoản root:

sudo chmod 600 /etc/autofs.credentials
sudo chown root:root /etc/autofs.credentials

Thêm parent map cho SMB vào /etc/auto.master:

/mnt/smb   /etc/auto.smb   --timeout=90

Điền thông tin share đích và tùy chọn mount vào /etc/auto.smb:

finance   -fstype=cifs,credentials=/etc/autofs.credentials,uid=1000,gid=1000,iocharset=utf8   ://192.168.1.100/FinanceShare

Reload daemon bằng lệnh sudo systemctl reload autofs. Ngay khi người dùng truy cập vào /mnt/smb/finance, driver CIFS sẽ xác thực với domain controller và mount remote share với quyền sở hữu POSIX chính xác.

Sử dụng nâng cao

Các mô hình cấu hình này giúp mở rộng quy mô AutoFS mượt mà trên các cụm cluster với hàng trăm node.

Mount Wildcard động

Việc viết từng dòng map riêng lẻ cho năm mươi thư mục dự án hoặc thư mục home sẽ nhanh chóng trở thành gánh nặng bảo trì. Wildcard map tự động xử lý các target động bằng kỹ thuật so khớp mẫu:

# Bên trong /etc/auto.projects
*   -fstype=nfs4,rw,soft,timeo=50,retrans=3   192.168.1.50:/srv/exports/&

Dấu sao (*) sẽ bắt bất kỳ tên thư mục nào mà client yêu cầu, trong khi dấu và (&) sẽ chèn chuỗi đó vào đường dẫn export. Khi chạy lệnh cd /mnt/projects/alpha, AutoFS sẽ tự động mount 192.168.1.50:/srv/exports/alpha ngay tức thì.

Cải thiện hiệu năng rõ rệt khi chịu tải

Trên một edge gateway chạy Ubuntu 22.04 với 4GB RAM, việc mount fstab cố định tới tám node backup và ingest đã tiêu tốn tới 180MB RAM và liên tục duy trì 48 TCP socket mở. Chuyển các target đó sang AutoFS với thời gian timeout 60 giây đã kéo mức sử dụng socket nhàn rỗi về con số 0.

Các tác vụ ingest chạy qua rsync chỉ kích hoạt mount khi có nhu cầu, xử lý xong 40GB dữ liệu và giải phóng toàn bộ kết nối sau 60 giây kể từ khi kết thúc. Khi NAS phụ reboot để bảo trì vào lúc nửa đêm, các script ingest của chúng tôi hoàn toàn tránh được tình trạng treo kernel kéo dài 15 phút thường thấy.

Mount chuyển đổi dự phòng sẵn sàng cao (High-Availability Failover)

AutoFS tích hợp sẵn tính năng failover theo cơ chế round-robin và độ trễ cho các bản mirror ở chế độ read-only. Bạn chỉ cần liệt kê nhiều server cách nhau bằng khoảng trắng trong một mục map duy nhất:

assets   -fstype=nfs4,ro,soft   192.168.1.51:/srv/assets 192.168.1.52:/srv/assets

AutoFS sẽ thăm dò từng host qua RPC trước khi mount và tự động chọn node có độ trễ mạng thấp nhất. Nếu máy chủ .51 ngừng phản hồi trước khi tiến hành mount, AutoFS sẽ tự động chuyển hướng dự phòng sang .52.

Lời khuyên thực tế

Hãy ghi nhớ những kinh nghiệm thực chiến sau trước khi triển khai AutoFS trên các production node:

1. Debug ở chế độ Foreground

Các lỗi mount âm thầm có thể rất khó truy vết. Hãy tạm dừng service chạy ngầm và khởi chạy daemon ở chế độ foreground debug để xem mã lỗi chi tiết:

sudo systemctl stop autofs
sudo automount -f -v -d

Kích hoạt mount từ một cửa sổ shell thứ hai. Màn hình console sẽ hiển thị theo thời gian thực quá trình RPC discovery, các lỗi phân quyền (như NFS EACCES) và DNS timeout.

2. Tránh treo Mount với tùy chọn ‘soft’ và Timeout rõ ràng

Theo mặc định, NFS mount sử dụng chế độ hard. Nếu filer bị ngắt kết nối, các tiến trình client sẽ rơi vào trạng thái ngủ không thể gián đoạn (D state), khiến các tác vụ như df, rsync hay thậm chí cả kill -9 đều bị đóng băng hoàn toàn. Để ngăn chặn điều này, hãy kết hợp soft với các giá trị timeout cụ thể:

shared   -fstype=nfs4,rw,soft,timeo=50,retrans=3   192.168.1.50:/srv/shared

Ở đây, timeo=50 đặt thời gian timeout là 5 giây (tính bằng decisecond), và retrans=3 sẽ hủy yêu cầu sau ba lần thử lại thất bại. Lưu ý rằng tùy chọn kế thừa intr hoàn toàn bị bỏ qua trên các nhân Linux hiện đại (NFSv4 và Linux 2.6.25+).

3. Giám sát AutoFS qua systemd Journal

Theo dõi quá trình kích hoạt automount và unmount sạch sẽ trực tiếp thông qua nhật ký hệ thống:

sudo journalctl -u autofs -f --no-tail

4. Lưu ý khi dùng phím Tab trên Shell

Nhấn phím Tab bên trong một thư mục indirect mount như /mnt/nfs/ sẽ không tự động hoàn thành (autocomplete) tên thư mục. Do các thư mục con chưa hề tồn tại trong bảng VFS cho đến khi được truy cập, shell sẽ chỉ nhìn thấy một thư mục trống. Các developer và admin mới thường nhầm tưởng đây là lỗi cấu hình. Hãy cung cấp tài liệu kèm đường dẫn rõ ràng, hoặc thiết lập quy ước đặt tên dễ đoán để team của bạn biết chính xác cần truy vấn những gì.

Share: