System Network File System (NFS) to rozproszone rozwiązanie pamięci masowej. Jest to protokół systemu plików, który umożliwia montowanie zdalnych katalogów na lokalnym serwerze i korzystanie z nich tak, jakby były lokalną pamięcią masową. NFS umożliwia wielu klientom współdzielenie zdalnej pamięci masowej. Doskonale nadaje się do środowisk, które regularnie wymagają współdzielonych zasobów. NFS opiera się na systemie ONC RPC (Open Network Computing Remote Procedure Call). Jest to otwarty standard zdefiniowany w dokumentach RFC (Request for Comments). Pozwala to każdemu na wdrożenie tego protokołu.
W tym poradniku omówimy kroki konfiguracji i montowania NFS na systemie Ubuntu 20.04.
Wymagania wstępne
Jak sugeruje opis NFS, konfiguracja NFS składa się z dwóch części:
-
Host: Fizycznie przechowuje dane i udostępnia pamięć masową systemom „klienckim”.
-
Klient: System, który łączy się z „hostem” i korzysta ze zdalnej pamięci masowej tak, jakby była lokalna.
W celach demonstracyjnych użyjemy dwóch serwerów, obu z systemem Ubuntu 20.04. Oto prosty poradnik, jak skonfigurować serwer Ubuntu. W tym poradniku serwery te będą określane jako host oraz klient. Należy pamiętać, że działania dla klienta będą takie same, nawet jeśli jest ich więcej niż jeden.
Serwerom przypisano następujące adresy IP. Serwery te są hostowane przez CloudSigma:
-
host: 31.171.240.79
-
client: 31.171.250.109
Pamiętaj, aby zastąpić je odpowiednimi adresami IP.
Instalacja NFS
NFS jest łatwo dostępny w oficjalnych repozytoriach Ubuntu. Istnieją różne pakiety oprogramowania dla systemów hosta oraz klienta .
-
Instalacja NFS na hoście
Na hoście potrzebujemy komponentów, które pozwolą maszynie działać jako host NFS. Są one dostarczane w postaci pakietu nfs-kernel-server. Ubuntu używa APT jako menedżera pakietów. Najpierw uruchom terminal i zaktualizuj bazę danych pakietów APT :
|
1 |
host$ sudo apt update |

Następnie zainstaluj pakiet nfs-kernel-server. W razie potrzeby APT zajmie się wszelkimi dodatkowymi zależnościami:
|
1 |
host$ sudo apt install nfs-kernel-server |

-
Instalacja NFS na kliencie
Na systemie klienta potrzebujemy funkcjonalności do łączenia się z katalogami hosta przez sieć. Nie wymaga to funkcjonalności serwera NFS. W systemie Ubuntu jest ona zawarta w pakiecie nfs-common. Zaktualizuj bazę danych pakietów APT :
|
1 |
client$ sudo apt update |

Następnie zainstaluj pakiet nfs-common :
|
1 |
$ sudo apt install nfs-common |

Udostępnione katalogi na hoście
Następnie udostępnimy dwa oddzielne katalogi, każdy z inną konfiguracją. Przedstawimy dwa kluczowe sposoby działania punktów montowania NFS w odniesieniu do uprawnień superużytkownika. Domyślnie superużytkownicy mają uprawnienia do wykonywania dowolnych czynności w całym systemie. Jednak katalogi zamontowane przez NFS nie są częścią systemu, w którym są montowane. Serwer NFS odmówi wykonania jakiejkolwiek operacji wymagającej uprawnień superużytkownika. Ograniczenie to oznacza, że klienci nie mają uprawnień do zapisu, zmiany właściciela i innych zadań superużytkownika w punktach montowania NFS.
Możliwe jest zezwolenie niektórym zaufanym użytkownikom na wykonywanie tych zadań na zamontowanych systemach plików. Wiąże się to jednak z pewnym ryzykiem, ponieważ taki klient może potencjalnie uzyskać pełny dostęp do hosta. Ryzyko to można ograniczyć poprzez odpowiednie zarządzanie uprawnieniami użytkowników. W systemie Linux plik sudoers kontroluje wszystkie uprawnienia użytkowników w systemie. Więcej informacji można znaleźć w naszym samouczku dotyczącym konfiguracji pliku sudoers w systemie Linux.
-
Montowanie ogólnego przeznaczenia
Pierwszym przykładem będzie montowanie NFS ogólnego przeznaczenia z domyślnym zachowaniem NFS. W tym podejściu klientowi niezwykle trudno jest wykonywać działania superużytkownika na zamontowanych zasobach. Ten typ montowania NFS jest powszechnie stosowany do przechowywania plików, przesyłania danych za pomocą systemu CMS (Content Management System), udostępniania plików projektów itp.
Poniższe kroki należy wykonać w systemie hosta. Najpierw utwórz katalog do udostępniania o nazwie nfs:
|
1 |
host$ sudo mkdir -pv /var/nfs/general |

Ponieważ katalog został utworzony z uprawnieniami sudo , właścicielem będzie root:
|
1 |
$ ls -la /var/nfs/general |

W domyślnej konfiguracji NFS przetłumaczy każdą operację użytkownika root po stronie klienta na dane uwierzytelniające nobody:nogroup ze względów bezpieczeństwa. Aby zachować spójność, zmień właściciela katalogu, aby odpowiadał tym danym uwierzytelniającym:
|
1 |
host$ sudo chown nobody:nogroup /var/nfs/general |
![]()
-
Katalog domowy
Drugim przykładem jest udostępnienie katalogu domowego użytkownika host dla klientów. Zaufani administratorzy z wybranych klientów mogą uzyskać do niego dostęp, aby wygodnie zarządzać użytkownikami. Katalog /home istnieje domyślnie, więc nie ma potrzeby tworzenia żadnego katalogu. Jeśli chodzi o uprawnienia do katalogu, nie ma potrzeby wprowadzania żadnych zmian, ponieważ przyniosłoby to więcej problemów niż korzyści.
Konfiguracja eksportów NFS
Katalogi do udostępnienia zostały utworzone. Następnie należy skonfigurować NFS, aby udostępnić je klientom. NFS używa pliku konfiguracyjnego do śledzenia, które katalogi mają być udostępniane. Otwórz następujący plik konfiguracyjny NFS w wybranym edytorze tekstu:
|
1 |
host$ sudo nano /etc/exports |

Sekcja komentarzy w pliku opisuje ogólną strukturę składni konfiguracji. Krótko mówiąc, każdy katalog musi być zadeklarowany w następującym formacie:
|
1 |
$ <directory> <client>(<option_1>,<option_2>,...,<option_N>) |
Dla dwóch katalogów, które zdecydowaliśmy się udostępnić, konfiguracja będzie wyglądać następująco. Oba katalogi mają prawie takie same opcje konfiguracyjne:
|
1 2 3 |
host$/var/nfs/general 31.171.250.221(rw,sync,no_subtree_check) host$ /home 31.171.250.221(rw,sync,no_root_squash,no_subtree_check) |

Oto krótkie omówienie opcji konfiguracyjnych:
-
rw: Klient otrzymuje uprawnienia zarówno do odczytu, jak i zapisu woluminu.
-
sync: Zmusza NFS do zapisania zmian na dysku przed udzieleniem odpowiedzi. Oferuje to bardziej stabilne i spójne działanie. Odpowiedź będzie odzwierciedlać rzeczywisty stan zdalnego woluminu. Jednak operacje na plikach będą wolniejsze.
-
no_subtree_check: Zapobiega sprawdzaniu poddrzewa (subtree checking). Jeśli ta opcja nie zostanie wyłączona, hosty będą zmuszone sprawdzać istnienie pliku w wyeksportowanym drzewie przy każdym żądaniu klienta. Może to prowadzić do wielu problemów, na przykład zmiany nazwy pliku, gdy klient go używa. W większości przypadków wyłączenie sprawdzania poddrzewa jest najlepszym rozwiązaniem.
-
no_root_squash: Jak wspomniano wcześniej, NFS przetłumaczy każde żądanie zdalnego użytkownika root na użytkownika bez uprawnień. Jest to zamierzona funkcja bezpieczeństwa zapobiegająca niepożądanemu dostępowi do systemu hosta. Jednak użycie tej opcji wyłączy to zachowanie.
Zapisz plik konfiguracyjny i wyjdź z edytora. Aby zmiany weszły w życie, zrestartuj serwer NFS:
|
1 |
host$ sudo systemctl restart nfs-kernel-server |
![]()
Dostosowywanie zapory sieciowej
Dla każdego serwera właściwa konfiguracja zapory sieciowej to podstawa. Zakładając, że masz odpowiednio skonfigurowany serwer Ubuntu 20.04, zapora UFW powinna być aktywna. Jest to prosta, ale potężna zapora sieciowa, w którą wyposażona jest większość dystrybucji Linuksa. Dla początkujących przygotowaliśmy krótki przewodnik wyjaśniający UFW, sposób jego działania oraz typowe przykłady użycia UFW.
Domyślnie zapora sieciowa blokuje cały ruch przychodzący i wychodzący. Aby upewnić się, że serwer NFS może się prawidłowo łączyć i wymieniać ruch, musimy dodać wyjątek dla protokołu NFS. Najpierw sprawdź status zapory sieciowej. Spowoduje to również wyświetlenie wszystkich aktualnych reguł:
|
1 |
host$ sudo ufw status |

Jak widać, do systemu dozwolony jest tylko ruch SSH. Musimy dodać wyjątek, aby zezwolić na ruch NFS.
W większości przypadków zdecydowanie zaleca się stosowanie najbardziej restrykcyjnej reguły, która nadal zezwala na niezbędny ruch. Dlatego zezwolimy na połączenie z hostem tylko wybranym klientom:
|
1 |
host$ sudo ufw allow from 31.171.250.221 to any port nfs |

Następnie ponownie sprawdź status zapory sieciowej:
|
1 |
host$ sudo ufw status |

Tworzenie punktu montowania
Serwer jest teraz gotowy, aby zezwolić klient systemowi na połączenie z protokołem NFS. Następnie musimy przygotować klienta. Aby uzyskać dostęp do zdalnego woluminu, musi on zostać zamontowany lokalnie na kliencie. Jeśli chodzi o punkt montowania, zaleca się użycie dedykowanego pustego katalogu.
Dla dwóch zdalnych woluminów utwórz dwa oddzielne punkty montowania:
|
1 |
client$ sudo mkdir -pv /nfs/general |

|
1 |
client$ sudo mkdir -pv /nfs/home |

Teraz, gdy punkty montowania są gotowe, musisz zamontować zdalne woluminy:
|
1 |
client$ sudo mount 31.171.240.236:/var/nfs/general /nfs/general |
![]()
|
1 |
client$ sudo mount 31.171.240.236:/home /nfs/home |
![]()
Możemy zweryfikować, czy montowanie zakończyło się sukcesem. Sprawdź listę wszystkich zamontowanych woluminów:
|
1 |
client$ df -h |

Voila! Zdalne woluminy zostały pomyślnie zamontowane. Możemy również sprawdzić zużycie miejsca za pomocą następującego polecenia:
|
1 |
client$ du -sh /nfs/home |

Testowanie dostępu do NFS
Do tej pory zdalne woluminy zostały zamontowane prawidłowo. Jednak nie zda się to na nic, jeśli klient nie będzie mógł czytać/zapisywać danych na zdalnym woluminie. Aby to zweryfikować, utwórz próbny plik w punkcie (punktach) montowania NFS. Tutaj plik zostanie utworzony z uprawnieniami root aby przetestować, czy konfiguracje specyficzne dla użytkownika root działają poprawnie:
|
1 |
client$ sudo touch /nfs/general/write_test.txt |
![]()
Następnie sprawdź własność pliku:
|
1 |
client$ ls -l /nfs/general/write_test.txt |

Jak widać, NFS tłumaczy właściciela pliku na nobody:nogroup. Katalog /var/nfs/ general ma przypisanego właściciela nobody:nogroup, więc NFS tłumaczy własność pliku. Czas przetestować drugi punkt montowania NFS:
|
1 |
client$ sudo touch /nfs/home/test_home.txt |
![]()
Sprawdź istnienie i własność pliku:
|
1 |
Client $ ls -l /nfs/home/test_home.txt |

W tym przypadku NFS nie przetłumaczył własności pliku. Ten klient został skonfigurowany tak, aby móc wykonywać działania administracyjne. Co więcej, oryginalny katalog hosta directory /home nie ma przypisanego właściciela nobody:nogroup.
Dodatkowe wskazówki
-
Montowanie przy rozruchu
Do tej pory musieliśmy ręcznie montować wolumin NFS w lokalnym katalogu. Jeśli nie zostaną odmontowane, punkty montowania NFS przetrwają do ponownego uruchomienia systemu. Jeśli wolumin NFS jest używany regularnie, ręczne montowanie staje się niezwykle uciążliwe. W przypadku wielu punktów montowania NFS, ręczne montowanie ich jeden po drugim jest niepraktyczne.
Używając pliku /etc/fstab możemy zautomatyzować ten proces. Podczas rozruchu ten skrypt automatycznie zamontuje woluminy NFS w docelowych punktach montowania. Otwórz plik w edytorze tekstu:
|
1 |
client$ sudo nano /etc/fstab |

Dodaj następujące linie, aby zamontować zdalne woluminy systemu hosta:
|
1 2 3 |
client$ 31.171.240.236:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 client$31.171.240.236:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 |

Zapisz skrypt i zamknij edytor tekstu. Przy następnym uruchomieniu system Linux automatycznie zamontuje zdalne woluminy. Pamiętaj, że uruchomienie systemu może zająć trochę czasu, ponieważ łączy się on i montuje woluminy.
-
Odmontowywanie woluminu NFS
Jeśli zdalny wolumin nie jest już potrzebny, odmontowanie woluminów usunie je z systemu klienta. Przed odmontowaniem upewnij się jednak, że żadna aplikacja ani skrypt nie korzysta ze zdalnego woluminu. Odmontowywanie punktów montowania NFS jest podobne do odmontowywania innych punktów montowania. W tym przypadku odmontuj /nfs/home oraz /nfs/general:
|
1 2 3 |
client$ sudo umount /nfs/home client$ sudo umount /nfs/ogólne |

Następnie zweryfikuj operację:
|
1 |
klient$ df -h |

Podsumowanie
W tym poradniku utworzyliśmy serwer NFS i zademonstrowaliśmy podstawy zdalnego udostępniania NFS. Jeśli planujesz wdrożenie NFS w środowisku produkcyjnym, pamiętaj, że protokół NFS nie jest szyfrowany. Może to stwarzać pewne zagrożenia dla bezpieczeństwa, na przykład ataki typu man-in-the-middle.
Miłego korzystania!
Komentarze
Brak komentarzy. Bądź pierwszy.