Systemy uniksowe potrafią współdzielić się zasobami dyskowymi z platformą Windows za pomocą usługi Samba. Jednak posiadają również własny protokół do wymiany plików i katalogów jakim jest Network File System (NFS). W porównaniu do SMB jest on natywnym rozwiązaniem dla systemów Unix. W systemie Linux NFS jest zaimplementowany jako moduł jądra, tak samo jak każdy lokalny system plików. Ponadto NFS od początku był zaprojektowany jako rozwiązanie łatwe do przeniesienia na inne platformy systemowe. Pierwsza wersja NFS powstała już w 1984 roku, a w tamtych czasach rozwiązaniem oferującym taką funkcjonalność był protokół RPC (Remote Procedure Call), który pozwalał na zdalne wywoływanie funkcji. Przez wiele lat NFS został znacznie zmodyfikowany oferując coraz to nowsze możliwości. Obecnie rozwijaną wersją jest NFSv4 i to właśnie nią będziemy tu omawiać.
NFS jest prostszy w konfiguracji niż SMB i zużywa mniej zasobów. Choć można go montować również w systemie Windows to najlepiej sprawdza się w środowisku uniksowym. Ponieważ NFS nie oferuje żadnego szyfrowania, to nie zaleca się jego używania poprzez publiczną sieć. Oczywiści można to obejść chociażby przez szyfrowany tunel VPN.
Instalację i konfigurację NFS omówimy na przykładzie najpopularniejszych dystrybucji systemu Linux i FreeBSD. Zaczniemy do dystrybucji Debian 9, której konfiguracja będzie taka sama jak Ubuntu 18.04.
Serwer NFS w Debianie i Ubuntu
Instalacja serwera NFS sprowadza się do zainstalowania poniższej paczki. W przypadku Ubuntu należy zrobić to przez sudo.
# apt install nfs-kernel-server
Wynikiem powyższego polecenia będzie zainstalowanie modułu jądra dla NFS oraz parę paczek powiązanych, w tym paczka kliencka nfs-common.
Dla wersji starszych niż 4 NFS pracował na kliku portach. Usługa rpcbind nasłuchiwała na porcie 111 TCP i UDP, natomiast rpc.mountd na losowych portach. W przypadku NFSv4 wykorzystywany jest tylko port 2049 TCP lub UDP.
Załóżmy, że chcemy wyeksportować katalog /srv/backup1 dla hosta z adresem IP 172.16.16.104. Zasób będzie do zapisu i odczytu, a uprawnienia będą mapowane na konto root (UID 0).
# cat /etc/exports
/srv/backup1 172.16.16.104(rw,sync,subtree_check,all_squash,anonuid=0,anongid=0)
Po dokonaniu zmian w pliku /etc/exports należy go przeładować poniższa komendą.
# exportfs -ra
Obecnie exportowane zasoby możemy sprawdzić w poniższy sposób.
# exportfs -s
Klient NFS w Debianie i Ubuntu
Po stronie klienta wystarczy zainstalować tylko jedną paczkę.
# apt install nfs-common
Następnie pozostaje wybór sposobu zamontowaniua zdalengo zasobu. Możemy zrobić to manualnie za pomocą komendy mount. W tym przypadku serwer NFS przez DNS zdefinionany jest jak storage1.
# mount.nfs4 storage1:/srv/backup1 /mnt/backup1/
# df -hT -F nfs4
Filesystem Type Size Used Avail Use% Mounted on
storage1:/srv/backup1 nfs4 57G 9.0G 45G 17% /mnt/backup1
Możemy również dodać powyższy zasób w /etc/fstab, dzięki czemu będzie on montowany podczas startu systemu lub po wydaniu komendy mount /mnt/backup1/. W tym celu musimy dodać poniższy wpis.
# cat /etc/fstab
storage1:/srv/backup1 /mnt/backup1 nfs4 rw,vers=4.2,proto=tcp 0 1
Wyłączenie starszych wersji NFS w Debianie i Ubuntu
Jak już wspominaliśmy domyślnie serwer NFS obsługuje również starsze wersje. Ponieważ ich obsługa wymagała otwarcia większej ilości portów być może zechcemy je wyłaczyć skoro nie będziemy z nich korzystać. Pokażemy jak można tego dokonac na przykładzie systemu Debian.
Po skonfigurowaniu serwera NFS w poniższym pliku należy dokonać poniższych zmian:
# cat /etc/default/nfs-kernel-server
# add
RPCNFSDOPTS=”-N 2 -N 3″
NEED_STATD=”no”
NEED_IDMAPD=”yes”
# change
# RPCMOUNTDOPTS=”–manage-gids”
RPCMOUNTDOPTS=”–manage-gids -N 2 -N 3″
Następnie możemy wyłaczyć nieużywane procesy.
# systemctl mask rpcbind.service
Created symlink /etc/systemd/system/rpcbind.service → /dev/null.
# systemctl mask rpcbind.socket
Created symlink /etc/systemd/system/rpcbind.socket → /dev/null.
# systemctl stop rpcbind.service
Po zresetowaniu usługi serwera NFS serwer będzie nasłuchiwał tylko na porcie 2049 i obsługiwał tylko protokółw NFSv4.
# systemctl restart
nfs-idmapd.service
# systemctl restart nfs-kernel-server.service
Serwer NFS w CentOS 7
W przypadku systemu CentOS instalujemy jedną pczkę, która odpowiada jednocześnie za serwer i klienta.
# yum install nfs-utils
Eksportowane zasoby definiujemy w ten sam sposób.
# cat /etc/exports
/srv/share1 172.16.16.104(rw,sync,subtree_check,all_squash,anonuid=0,anongid=0)
Następnie pozostaje uruchomić usługę serwera NFS.
# systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
# systemctl start nfs-server
Ponieważ CentOS 7 domyślnie instalowany jest z predefiniowana zaporą to musimy dodać do niej wyjątek dla usługi NFS.
# firewall-cmd –add-service=nfs –zone=public –permanent
# firewall-cmd –reload
Połączenia klienckie z systemu CentOS wykonuje się w ten sam sposób jak w przypadku Debiana i innego systemu GNU/Linux.
Wyłączenie starszych wersji NFS w CentOS 7
W pliku /etc/sysconfig/nfs musimy dodać poniższe opcje:
# grep „\-N 3” /etc/sysconfig/nfs
RPCNFSDARGS=”-N 2 -N 3″
RPCMOUNTDOPTS=”-N 2 -N 3″
Następnie wyłączyć zbędne usługi i włączyć tylko te niezbędne.
# systemctl stop {rpcbind,rpc-statd,nfs-mountd,nfs-server}.service
# systemctl stop rpcbind.socket
# systemctl disable rpcbind.service
# systemctl mask rpcbind.service
# systemctl start nfs-server.service
Serwer NFS we FreeBSD 12
W przypadku FreeBSD nie musimy niczego instalować. Należy dodać do pliku konfiguracyjnego za pomocą narzędzia sysrc następujące opcje:
# sysrc nfs_server_enable=”YES”
# sysrc nfsv4_server_enable=”YES”
# sysrc nfsuserd_enable=YES
Z kolei definicja eksportowanych zasobów we FreeBSD wygląda inaczej niż w systemach Linux. Co więcej FreeBSD uruchamia serwer NFS jak demon a nie jak proces jądra.
# cat /etc/exports
V4: / 172.16.16.104
/usr/local/srv/share2 -maproot=root: 172.16.16.104
Pierwszy wiersz definiuje tylko gdzie będzie zaczynać się drzewo udostępniane przez wersje NFSv4. Wybraliśmy główny katalog systemu, al to nie oznacza, iż został on weksportowany. O tym decyfuje drugi wiersz.
Po zdefiniowanu eksportowanych zasobów pozostaje uruchomienie usługi NFS.
# service nfsd start
Jeżeli dokonamy zmian w pliku /etc/exports to należy przeładować usługe mountd aby zmiany zostały uwzględnione.
# service mountd restart
Klient NFS we FreeBSD 12
Uruchomienia klienta jest dość proste, wystarczy właczyć odpowiednią opcję systemu:
# sysrc nfs_client_enable=”YES”
Teraz można już zamontować zdalny zasób w poniższy sposób.
# mount_nfs -o nfsv4 db1:/usr/local/srv/share2 /mnt/share2
# nfsstat -m
db1:/usr/local/srv/share2 on /mnt/share2
nfsv4,…
Wyłączenie starszych wersji NFS we FreeBSD 12
Poniższe polecenie ustawia najniższą akceptowaną wersję serwera na NFSv4, następnie zapisuje to ustawienie w pliku konfiguracyjnym na stałe.
# sysctl vfs.nfsd.server_min_nfsvers=4
# echo „sysctl vfs.nfsd.server_min_nfsvers=4” >> /etc/sysctl.conf
Jednak rozwiązanie to nie wyłącza demonów nasłuchujących na pozostałych portach. Możemy to zrobić ręcznie ale każde uruchomienie usługi nfsd spowoduje ponowne ich uruchomienie.
# service rpcbind stop
# service mountd stop
Podsumowanie
Pomimo swojego wieku i prostoty NFS zdobył pozycję standardu w środowiskach Uniksowych. Jest jednym z popularniejszych typów woluminów w klastrach Kubernetes jako system plików dla lokalnej sieci kontenrów. Spotkamy się również z nim w przypadku wielu urządzeń typu NAS, gdzie będzie jednym ze standardów wymiany plików. NFS oferuje również mechanizm ACL, który pozwala kontrolować dostęp do samych plików. Natomiast brak szyfrowania możemy rozwiązać prowadząc komunikację poprzez szyfrowane łącza, takie jak IPSec.
- Grzegorz Kuczyński – zawodowo zajmuje się informatyką. Jest członkiem społeczności open source, prowadzi blog nt. systemu GNU/Linux.
Zostaw komentarz
Musisz się zalogować lub zarejestrować aby dodać nowy komentarz.