NFS là một giao thức hệ thống tệp phân tán cho phép bạn gắn (mount) các thư mục từ xa lên máy chủ cục bộ của mình. Điều này giúp bạn quản lý không gian lưu trữ ở một vị trí khác và ghi dữ liệu vào không gian đó từ nhiều máy khách (client).
NFS cung cấp một phương pháp tiêu chuẩn và hiệu quả để truy cập các hệ thống từ xa qua mạng, đặc biệt hữu ích trong các tình huống cần truy cập tài nguyên chia sẻ thường xuyên.
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách thiết lập NFS Mount trên Ubuntu 18.04, cấu hình các NFS mount trên máy chủ (host) và máy khách (client), cũng như cách gắn và gỡ gắn các thư mục chia sẻ từ xa.
Hướng dẫn thiết lập NFS Mount trên Ubuntu 18.04
Chuẩn bị
Chúng ta sẽ sử dụng hai máy chủ trong hướng dẫn này: một máy chủ sẽ chia sẻ một phần hệ thống tệp của nó (gọi là host), và máy chủ còn lại sẽ gắn các thư mục này (gọi là client). Để hoàn thành hướng dẫn, bạn cần:
- Hai máy chủ Ubuntu 18.04: Mỗi máy chủ phải có một người dùng non-root với quyền
sudo
được cấu hình, tường lửa đã được thiết lập với UFW, và mạng riêng nếu có. - Địa chỉ IP giả định: Trong suốt hướng dẫn này, chúng ta sẽ sử dụng các địa chỉ IP sau làm đại diện cho máy host và client. Bạn hãy thay thế chúng bằng địa chỉ IP thực tế của mình:
- Host:
203.0.113.0
- Client:
203.0.113.24
- Host:
Khi các địa chỉ IP này xuất hiện trong lệnh và tệp cấu hình, hãy đảm bảo bạn thay thế chúng bằng địa chỉ IP máy chủ và máy khách tương ứng của bạn.
Bước 1: Tải xuống và cài đặt các thành phần
Đầu tiên, chúng ta sẽ bắt đầu bằng cách cài đặt các thành phần cần thiết trên mỗi máy chủ.
Trên máy chủ Host
Trên máy chủ host, bạn cần cài đặt gói nfs-kernel-server
. Gói này cho phép máy chủ chia sẻ các thư mục của mình. Vì đây là thao tác đầu tiên chúng ta thực hiện với apt
trong phiên này, bạn hãy làm mới chỉ mục gói cục bộ trước khi cài đặt:
sudo apt update
Tiếp theo, hãy cài đặt gói:
sudo apt install nfs-kernel-server
Khi các gói này đã được cài đặt, chúng ta sẽ chuyển sang máy chủ client.
Trên máy chủ Client
Trên máy chủ client, bạn hãy cài đặt gói nfs-common
. Gói này cung cấp chức năng NFS mà không bao gồm các thành phần máy chủ. Tương tự, bạn hãy làm mới chỉ mục gói cục bộ trước khi cài đặt để đảm bảo có thông tin cập nhật nhất:
sudo apt update
Sau đó, cài đặt gói:
sudo apt install nfs-common
Giờ đây, cả hai máy chủ đều đã có các gói cần thiết, chúng ta có thể bắt đầu cấu hình chúng.
Bước 2: Tạo các thư mục chia sẻ trên Host
Chúng ta :sẽ chia sẻ hai thư mục riêng biệt với các cài đặt cấu hình khác nhau để minh họa hai cách chính mà các NFS mount có thể được cấu hình liên quan đến quyền truy cập của người dùng root (superuser).
Người dùng root có thể làm mọi thứ ở bất kỳ đâu trên hệ thống của họ. Tuy nhiên, các thư mục được gắn NFS không phải là một phần của hệ thống mà chúng được gắn, vì vậy theo mặc định, máy chủ NFS từ chối thực hiện các thao tác yêu cầu đặc quyền root. Hạn chế mặc định này có nghĩa là người dùng root trên client không thể ghi tệp dưới quyền root.
Tuy nhiên, đôi khi có những người dùng đáng tin cậy trên hệ thống client cần thực hiện các hành động này trên hệ thống tệp được gắn nhưng không cần quyền truy cập root trên host. Bạn có thể cấu hình máy chủ NFS để cho phép điều này, mặc dù nó tiềm ẩn rủi ro, vì người dùng như vậy có thể giành quyền truy cập root
vào toàn bộ hệ thống host.
Ví dụ 1: Xuất thư mục chung
Trong ví dụ đầu tiên, bạn sẽ tạo một NFS mount mặc định để ngăn chặn người dùng có đặc quyền root
trên máy khách tương tác với máy chủ bằng các đặc quyền root
của máy khách đó. Bạn có thể sử dụng cài đặt này để lưu trữ các tệp được tải lên bằng hệ thống quản lý nội dung hoặc tạo không gian cho người dùng chia sẻ các tệp dự án.
Đầu tiên, hãy tạo một thư mục chia sẻ:
sudo mkdir /var/nfs/general -p
Vì bạn tạo nó với sudo
, thư mục này thuộc sở hữu của người dùng root
trên host:
ls -la /var/nfs/general
Output
total 8
drwxr-xr-x 2 root root 4096 Thg 2 7 23:21 .
drwxr-xr-x 3 root root 4096 Thg 2 7 23:21 ..
NFS sẽ chuyển đổi mọi thao tác root trên máy khách thành quyền của người dùng nobody:nogroup
như một biện pháp bảo mật. Do đó, bạn cần thay đổi quyền sở hữu thư mục để khớp với các thông tin xác thực này
sudo chown nobody:nogroup /var/nfs/general
Bây giờ, bạn đã sẵn sàng để xuất thư mục này.
Ví dụ 2: Xuất thư mục Home
Trong ví dụ thứ hai, mục tiêu là làm cho các thư mục home của người dùng được lưu trữ trên host có sẵn trên các máy chủ client, đồng thời cho phép các quản trị viên đáng tin cậy của các máy chủ client đó có quyền truy cập cần thiết để quản lý người dùng một cách thuận tiện.
Để làm điều này, bạn sẽ xuất thư mục /home
. Vì nó đã tồn tại, bạn không cần phải tạo nó. Bạn cũng sẽ không thay đổi các quyền truy cập, bởi nếu làm vậy có thể dẫn đến nhiều vấn đề cho bất kỳ ai có thư mục home trên máy chủ
Bước 3: Cấu hình NFS Exports trên máy chủ Host
Tiếp theo, chúng ta sẽ đi sâu vào tệp cấu hình NFS để thiết lập việc chia sẻ các tài nguyên này.
Trên máy chủ host, bạn hãy mở tệp /etc/exports
trong trình soạn thảo văn bản ưa thích của bạn với quyền root
. Ở đây, chúng ta sẽ sử dụng nano
:
sudo nano /etc/exports
Tệp này có các nhận xét hiển thị cấu trúc chung của mỗi dòng cấu hình. Cú pháp như sau:
directory_to_share client(share_option1,...,share_optionN)
Bạn cần tạo một dòng cho mỗi thư mục bạn định chia sẻ. Vì máy khách của chúng ta có IP là 203.0.113.24
, các dòng của chúng ta sẽ trông như sau. Hãy đảm bảo bạn thay đổi địa chỉ IP thành địa chỉ của máy khách của bạn:
/var/nfs/general 203.0.113.24(rw,sync,no_subtree_check)
/home 203.0.113.24(rw,sync,no_root_squash,no_subtree_check)
Ở đây, chúng ta đang sử dụng cùng các tùy chọn cấu hình cho cả hai thư mục ngoại trừ no_root_squash
. Hãy cùng xem xét ý nghĩa của từng tùy chọn này:
rw
: Tùy chọn này cấp cho máy khách cả quyền đọc và ghi vào volume.sync
: Tùy chọn này buộc NFS phải ghi các thay đổi vào đĩa trước khi phản hồi. Điều này mang lại một môi trường ổn định và nhất quán hơn. Tuy nhiên, nó cũng làm giảm tốc độ của các thao tác tệp.no_subtree_check
: Tùy chọn này vô hiệu hóa việc kiểm tra subtree. Đây là quá trình mà host phải xác minh xem tệp có còn tồn tại trong cây thư mục đã export cho mỗi yêu cầu hay không. Cơ chế này có thể gây ra nhiều vấn đề khi một tệp được đổi tên trong khi client vẫn đang mở nó. Trong hầu hết các trường hợp, tốt hơn là nên tắt kiểm tra subtree.no_root_squash
: Theo mặc định, NFS sẽ chuyển đổi các yêu cầu từ người dùng root trên máy client thành một người dùng không có đặc quyền trên máy chủ. Cơ chế này được thiết kế như một tính năng bảo mật nhằm ngăn chặn việc tài khoản root trên client có thể sử dụng hệ thống tệp của host với quyền root. Tùy chọnno_root_squash
sẽ vô hiệu hóa cơ chế này đối với một số chia sẻ nhất định.
Khi bạn hoàn tất việc thay đổi, hãy lưu và đóng tệp. Nếu bạn đang sử dụng nano
, bạn có thể thực hiện điều này bằng cách nhấn CTRL + X
sau đó Y
và ENTER
. Sau đó, để làm cho các thư mục chia sẻ có sẵn cho các máy khách bạn đã cấu hình, hãy khởi động lại máy chủ NFS bằng lệnh sau:
sudo systemctl restart nfs-kernel-server
Tuy nhiên, trước khi bạn thực sự có thể sử dụng các thư mục chia sẻ mới, bạn cần đảm bảo rằng lưu lượng truy cập đến các thư mục chia sẻ được phép bởi các quy tắc tường lửa.
Bước 4: Điều chỉnh tường lửa
Đầu tiên, hãy kiểm tra trạng thái tường lửa để xác nhận xem nó có được bật hay không và, nếu có, xem xét những gì hiện đang được phép:
sudo ufw status
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Trên hệ thống của chúng ta, chỉ lưu lượng SSH được cho phép, vì vậy chúng ta cần thêm một quy tắc cho lưu lượng NFS.
Với nhiều ứng dụng, bạn có thể dùng lệnh sudo ufw app list
và kích hoạt chúng theo tên, nhưng NFS thì không nằm trong số đó. Tuy nhiên, vì UFW cũng tham chiếu đến tệp /etc/services
để xác định cổng và giao thức của một dịch vụ, nên bạn vẫn có thể thêm NFS theo tên. Thực tiễn tốt nhất khuyến nghị rằng bạn nên bật quy tắc hạn chế nhất nhưng vẫn cho phép loại lưu lượng mà bạn muốn, do đó thay vì cho phép lưu lượng từ mọi nơi, bạn sẽ cần chỉ định cụ thể.
Sử dụng lệnh sau để mở cổng 2049
trên host, đảm bảo thay thế địa chỉ IP máy khách của bạn:
sudo ufw allow from 203.0.113.24 to any port nfs
Bạn có thể xác minh thay đổi bằng cách chạy lệnh sau:
sudo ufw status
Bạn sẽ nhận được một danh sách lưu lượng truy cập được phép từ cổng 2049
trong đầu ra:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.24
OpenSSH (v6) ALLOW Anywhere (v6)
Điều này xác nhận rằng UFW sẽ chỉ cho phép lưu lượng NFS trên cổng 2049
từ máy khách của bạn.
Bước 5: Tạo điểm Mount và thư mục Mount trên Client
Bây giờ máy chủ host đã được cấu hình và đang phục vụ các thư mục chia sẻ của nó, chúng ta sẽ chuẩn bị máy client của bạn.
Để làm cho các thư mục chia sẻ từ xa có sẵn trên máy khách, bạn cần gắn các thư mục trên máy chủ host mà bạn muốn chia sẻ vào các thư mục trống trên máy khách.
Lưu ý: Nếu trong mount point của bạn có sẵn tệp hoặc thư mục, chúng sẽ bị ẩn ngay khi bạn mount NFS share. Để tránh mất các tệp quan trọng, hãy đảm bảo rằng nếu bạn mount vào một thư mục đã tồn tại thì thư mục đó phải trống.
Tạo hai thư mục cho các mount của bạn. Chạy lệnh sau để tạo thư mục đầu tiên:
sudo mkdir -p /nfs/general
Sau đó, chạy lệnh này để tạo thư mục thứ hai:
sudo mkdir -p /nfs/home
Bây giờ bạn đã có một vị trí để đặt các thư mục chia sẻ từ xa và bạn đã mở tường lửa, bạn có thể gắn các thư mục chia sẻ bằng cách sử dụng địa chỉ IP của máy chủ host, trong hướng dẫn này là 203.0.113.0
:
sudo mount 203.0.113.0:/var/nfs/general /nfs/general
sudo mount 203.0.113.0:/home /nfs/home
Các lệnh này sẽ gắn các thư mục chia sẻ từ máy chủ host lên máy khách. Bạn có thể kiểm tra lại xem chúng đã được gắn thành công bằng nhiều cách. Bạn có thể kiểm tra điều này bằng lệnh mount
hoặc findmnt
, nhưng df -h
cung cấp đầu ra dễ đọc hơn, minh họa cách sử dụng đĩa được hiển thị khác nhau cho các NFS share:
df -h
Output
Filesystem Size Used Avail Use% Mounted on
udev 480M 0 480M 0% /dev
tmpfs 99M 5.6M 94M 6% /run
/dev/vda1 25G 1.3G 23G 6% /
tmpfs 493M 0 493M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 493M 0 493M 0% /sys/fs/cgroup
/dev/vda15 105M 4.4M 100M 5% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
203.0.113.0:/var/nfs/general 25G 1.3G 23G 6% /nfs/general
203.0.113.0:/home 25G 1.3G 23G 6% /nfs/home
Cả hai thư mục chia sẻ bạn đã gắn đều xuất hiện ở phía dưới. Vì chúng được gắn từ cùng một hệ thống tệp, chúng hiển thị cùng một mức sử dụng đĩa. Để kiểm tra xem bao nhiêu không gian thực sự đang được sử dụng dưới mỗi điểm mount, hãy sử dụng lệnh du
(disk usage) và đường dẫn của mount. Cờ -s
cung cấp bản tóm tắt về mức sử dụng thay vì hiển thị mức sử dụng cho mọi tệp. Cờ -h
in đầu ra dễ đọc cho con người:
du -sh /nfs/home
Output
44K /nfs/home
Điều này cho bạn thấy rằng nội dung của toàn bộ thư mục home chỉ đang sử dụng 44K không gian có sẵn.
Bước 6: Kiểm tra quyền truy cập NFS
Tiếp theo, chúng ta sẽ kiểm tra quyền truy cập vào các thư mục chia sẻ bằng cách ghi một cái gì đó vào mỗi thư mục.
Ví dụ 1: Thư mục chia sẻ chung
Đầu tiên, hãy tạo một tệp kiểm tra vào thư mục chia sẻ /var/nfs/general
:
sudo touch /nfs/general/general.test
Sau đó, kiểm tra quyền sở hữu của nó:
ls -l /nfs/general/general.test
Output
-rw-r--r-- 1 nobody nogroup 0 Thg 2 7 23:53 /nfs/general/general.test
Vì bạn đã gắn volume này mà không thay đổi hành vi mặc định của NFS và tạo tệp dưới quyền người dùng root
của máy khách thông qua lệnh sudo
, quyền sở hữu của tệp mặc định là nobody:nogroup
. Người dùng root của máy khách sẽ không thể thực hiện các hành động quản trị thông thường, như thay đổi chủ sở hữu của tệp hoặc tạo thư mục mới cho một nhóm người dùng, trên thư mục chia sẻ NFS được gắn này.
Ví dụ 2: Thư mục chia sẻ Home
Để so sánh quyền của thư mục chia sẻ Mục đích Chung với thư mục chia sẻ Home, hãy tạo một tệp trong /nfs/home
theo cùng một cách:
sudo touch /nfs/home/home.test
Sau đó, xem xét quyền sở hữu của tệp:
ls -l /nfs/home/home.test
Output
-rw-r--r-- 1 root root 0 Thg 2 7 23:56 /nfs/home/home.test
Bạn đã tạo home.test
dưới quyền root
bằng lệnh sudo
, chính xác như cách bạn tạo tệp general.test
. Tuy nhiên, trong trường hợp này, nó thuộc sở hữu của root
vì bạn đã ghi đè hành vi mặc định khi bạn chỉ định tùy chọn no_root_squash
trên mount này. Điều này cho phép người dùng root
của bạn trên máy khách hoạt động như root
và làm cho việc quản lý tài khoản người dùng thuận tiện hơn nhiều. Đồng thời, nó có nghĩa là bạn không phải cấp cho những người dùng này quyền truy cập root
trên máy chủ host.
Bước 7: Tự động Mount các thư mục NFS từ xa khi khởi động
Bạn có thể tự động gắn các thư mục chia sẻ NFS từ xa khi khởi động bằng cách thêm chúng vào tệp /etc/fstab
trên máy khách.
Bạn hãy mở tệp sau với quyền root trong trình soạn thảo văn bản ưa thích của bạn:
sudo nano /etc/fstab
Ở cuối tệp, hãy thêm một dòng cho mỗi thư mục chia sẻ của bạn, như sau:
. . .
203.0.113.0:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
203.0.113.0:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
Lưu ý: Bạn có thể tìm thêm thông tin về các tùy chọn được chỉ định ở đây trong manpage
của NFS. Bạn có thể truy cập điều này bằng cách chạy lệnh sau:
man nfs
Máy chủ client sẽ tự động gắn các phân vùng từ xa khi khởi động, mặc dù có thể mất vài giây để thiết lập kết nối và các thư mục chia sẻ có sẵn.
Bước 8: Ngắt Mount một thư mục NFS từ xa
Nếu bạn không còn muốn thư mục từ xa được gắn trên hệ thống của mình, bạn có thể gỡ gắn nó bằng cách di chuyển ra khỏi cấu trúc thư mục của thư mục chia sẻ và thực hiện lệnh umount
.
Đầu tiên, hãy chuyển vào thư mục home của bạn:
cd ~
Sau đó, hãy gỡ gắn /nfs/home
. Lưu ý rằng lệnh là umount
chứ không phải unmount
như bạn có thể mong đợi:
sudo umount /nfs/home
Tiếp theo, gỡ gắn /nfs/general
:
sudo umount /nfs/general
Điều này sẽ xóa các thư mục chia sẻ từ xa, chỉ để lại bộ nhớ cục bộ của bạn có thể truy cập:
df -h
Output
Filesystem Size Used Avail Use% Mounted on
udev 480M 0 480M 0% /dev
tmpfs 99M 5.5M 94M 6% /run
/dev/vda1 25G 1.3G 23G 6% /
tmpfs 493M 0 493M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 493M 0 493M 0% /sys/fs/cgroup
/dev/vda15 105M 4.4M 100M 5% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
Nếu bạn cũng muốn ngăn chúng được gắn lại khi khởi động lại lần sau, hãy chỉnh sửa /etc/fstab
và xóa dòng đó hoặc comment nó bằng cách đặt ký tự #
ở đầu dòng. Bạn cũng có thể ngăn tự động gắn bằng cách xóa tùy chọn auto
, điều này sẽ cho phép bạn gắn nó thủ công.
Kết luận
Trong hướng dẫn này, chúng ta đã tạo một máy chủ NFS và minh họa một số hành vi NFS quan trọng bằng cách tạo hai NFS mount khác nhau, sau đó chia sẻ chúng với máy khách NFS của bạn. Chúng ta đã đi qua từng bước từ cài đặt các thành phần cần thiết, cấu hình thư mục chia sẻ với các tùy chọn root_squash
và no_root_squash
để kiểm soát quyền truy cập, điều chỉnh tường lửa UFW, đến việc gắn và kiểm tra các thư mục chia sẻ trên máy khách.
Nếu bạn đang tìm cách triển khai NFS trong môi trường sản xuất, điều quan trọng cần lưu ý là bản thân giao thức NFS không cung cấp mã hóa cho dữ liệu truyền tải. Trong môi trường mạng riêng an toàn, điều này có thể không phải là vấn đề lớn.
Nhưng với các trường hợp nhạy cảm hơn hoặc qua mạng công cộng, việc triển khai VPN hoặc các đường hầm mã hóa khác là cần thiết để bảo vệ dữ liệu, dù điều này có thể ảnh hưởng đến hiệu suất.