
NFS o Network File System è un protocollo di file system distribuito che consente di condividere directory su una rete. Con NFS, puoi montare directory remote sul tuo sistema e lavorare con i file sulla macchina remota come se fossero file locali.
Per impostazione predefinita, il protocollo NFS non è crittografato e non fornisce l'autenticazione dell'utente. L'accesso al server è limitato dagli indirizzi IP o dai nomi host del client.
Questo articolo spiega come configurare un server NFSv4 su Ubuntu 20.04. Ti mostreremo anche come montare un file system NFS sul computer client.
Prerequisiti #
Useremo due macchine, una che esegue Ubuntu 20.04, che fungerà da server NFS, e un'altra che esegue qualsiasi altra distribuzione Linux su cui monteremo la condivisione. Il server e i client dovrebbero essere in grado di comunicare tra loro su una rete privata. Puoi utilizzare indirizzi IP pubblici e configurare il firewall del server per consentire il traffico sulla porta 2049
solo da fonti attendibili.
Le macchine in questo esempio hanno i seguenti IP:
NFS Server IP: 192.168.33.10
NFS Clients IPs: From the 192.168.33.0/24 range
Configura il server NFS #
Il primo passo è configurare il server NFS. Installeremo i pacchetti necessari, creeremo ed esporteremo le directory NFS e configureremo il firewall.
Installazione del server NFS #
Il pacchetto del server NFS fornisce il supporto dello spazio utente necessario per eseguire il server del kernel NFS. Per installare il pacchetto, esegui:
sudo apt update
sudo apt install nfs-kernel-server
Una volta completata l'installazione, i servizi NFS verranno avviati automaticamente.
Su Ubuntu 20.04, NFS versione 2 è disabilitata. Le versioni 3 e 4 sono abilitate. Puoi verificarlo eseguendo il seguente cat
comando:
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
NFSv2 è piuttosto vecchio ora e non c'è motivo per abilitarlo.
La configurazione del server NFS è definita in /etc/default/nfs-kernel-server
e /etc/default/nfs-common
File. Le impostazioni predefinite sono sufficienti per la maggior parte delle situazioni.
Creazione dei file system #
Il server NFSv4 utilizza una directory radice globale e le directory esportate sono relative a questa directory. Puoi collegare il punto di montaggio della condivisione alle directory che desideri esportare utilizzando i montaggi di collegamento.
In questo esempio, imposteremo il /srv/nfs4
directory come radice NFS. Per spiegare meglio come configurare i mount NFS, condivideremo due directory (/var/www
e /opt/backups
) con diverse impostazioni di configurazione. Il /var/www/
è di proprietà dell'utente www-data
e /opt/backups
è di proprietà di root
.
Per prima cosa crea la directory principale e i punti di montaggio della condivisione:
sudo mkdir -p /srv/nfs4/backups
sudo mkdir -p /srv/nfs4/www
Associa il montaggio delle directory ai punti di montaggio della condivisione:
sudo mount --bind /opt/backups /srv/nfs4/backups
sudo mount --bind /var/www /srv/nfs4/www
Per rendere permanenti i mount di binding durante i riavvii, apri il /etc/fstab
file:
sudo nano /etc/fstab
e aggiungi le seguenti righe:
/etc/fstab/opt/backups /srv/nfs4/backups none bind 0 0
/var/www /srv/nfs4/www none bind 0 0
Esportazione dei file system #
Il passaggio successivo consiste nell'aggiungere i file system che verranno esportati e i client autorizzati ad accedere a tali condivisioni a /etc/exports
file.
Ciascuna riga di un file system esportato ha la forma seguente:
export host(options)
Dove export
è la directory esportata, host
è un nome host o un indirizzo IP/intervallo che può accedere all'esportazione e alle options
sono le opzioni host.
Apri il /etc/exports
file e aggiungi le seguenti righe:
sudo nano /etc/exports
/etc/exports/srv/nfs4 192.168.33.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)
/srv/nfs4/backups 192.168.33.0/24(ro,sync,no_subtree_check) 192.168.33.3(rw,sync,no_subtree_check)
/srv/nfs4/www 192.168.33.20(rw,sync,no_subtree_check)
La prima riga contiene il fsid=0
opzione, che definisce la directory radice NFS (/srv/nfs4
). L'accesso a questo volume NFS è consentito solo ai client dal 192.168.33.0/24
sottorete. Il crossmnt
l'opzione è richiesta per condividere le directory che sono sottodirectory di una directory esportata.
La seconda riga mostra come specificare più regole di esportazione per un filesystem. L'accesso in lettura è consentito all'intero 192.168.33.0/24
intervallo e accesso in lettura e scrittura solo al 192.168.33.3
Indirizzo IP. La sync
opzione dice a NFS di scrivere le modifiche sul disco prima di rispondere.
L'ultima riga è autoesplicativa. Per maggiori informazioni su tutte le opzioni disponibili digita man exports
nel tuo terminale.
Salva il file ed esporta le condivisioni:
sudo exportfs -ar
Devi eseguire il comando sopra ogni volta che modifichi /etc/exports
file. Eventuali errori o avvisi verranno visualizzati sul terminale.
Per visualizzare le esportazioni attive correnti e il loro stato, utilizzare:
sudo exportfs -v
L'output includerà tutte le condivisioni con le relative opzioni. Come puoi vedere ci sono anche opzioni che non abbiamo definito in /etc/exports
file. Queste sono opzioni predefinite e se vuoi cambiarle dovrai impostare esplicitamente tali opzioni.
/srv/nfs4/backups
192.168.33.3(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/www 192.168.33.20(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4 192.168.33.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/backups
192.168.33.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
Su Ubuntu, root_squash
è abilitato per impostazione predefinita. Questa è una delle opzioni più importanti per quanto riguarda la sicurezza NFS. Impedisce agli utenti root connessi dai client di avere privilegi di root sulle condivisioni montate mappando UID
root e GID
a nobody
/nogroup
UID
/GID
.
Affinché gli utenti sulle macchine client abbiano accesso, NFS prevede che gli ID utente e gruppo del client corrispondano a quelli sul server. Un'altra opzione consiste nell'utilizzare la funzione di mappatura id NFSv4 che traduce gli ID di utenti e gruppi in nomi e viceversa.
Questo è tutto. A questo punto, hai impostato un server NFS sul tuo server Ubuntu. Ora puoi passare al passaggio successivo e configurare i client e connetterti al server NFS.
Configurazione firewall #
Se stai installando Jenkins su un server Ubuntu remoto protetto da un firewall, dovrai abilitare il traffico sulla porta NFS:
sudo ufw allow from 192.168.33.0/24 to any port nfs
Verifica la modifica:
sudo ufw status
L'output dovrebbe mostrare che il traffico sulla porta 2049
è consentito:
To Action From
-- ------ ----
2049 ALLOW 192.168.33.0/24
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
Configura i client NFS #
Ora che il server NFS è configurato e le condivisioni vengono esportate, il passaggio successivo consiste nel configurare i client e montare i file system remoti.
Ci concentreremo sui sistemi Linux, ma puoi anche montare la condivisione NFS su macchine macOS e Windows.
Installazione del client NFS #
Sulle macchine client, dobbiamo installare solo gli strumenti necessari per montare un file system NFS remoto.
-
Installa il client NFS su Debian e Ubuntu
Il nome del pacchetto che include programmi per il montaggio di file system NFS su distribuzioni basate su Debian è
nfs-common
. Per installarlo, esegui:sudo apt update
sudo apt install nfs-common
-
Installa il client NFS su CentOS e Fedora
Su Red Hat e le sue derivate, installa
nfs-utils
pacchetto:sudo yum install nfs-utils
Montaggio dei file system #
Lavoreremo sulla macchina client con IP 192.168.33.20
, che ha accesso in lettura e scrittura a /srv/nfs4/www
file system e accesso in sola lettura a /srv/nfs4/backups
sistema di file.
Crea due nuove directory per i punti di montaggio:
sudo mkdir -p /backups
sudo mkdir -p /srv/www
Puoi creare le directory in qualsiasi posizione desideri.
Monta i file system esportati con mount
comando:
sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backups
sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www
Dove 192.168.33.10
è l'IP del server NFS. Puoi anche utilizzare il nome host invece dell'indirizzo IP, ma deve essere risolvibile dalla macchina client. Questo di solito viene fatto mappando il nome host sull'IP in /etc/hosts
file.
Quando si monta un filesystem NFSv4, omettere la directory radice NFS. Usa /backups
, invece di /srv/nfs4/backups
.
Verificare che i file system remoti siano montati correttamente utilizzando mount o df
comando:
df -h
Il comando stamperà tutti i file system montati. Le ultime due righe sono le condivisioni montate:
Filesystem Size Used Avail Use% Mounted on
udev 951M 0 951M 0% /dev
tmpfs 199M 676K 199M 1% /run
/dev/sda3 124G 2.8G 115G 3% /
tmpfs 994M 0 994M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sda1 456M 197M 226M 47% /boot
tmpfs 199M 0 199M 0% /run/user/1000
192.168.33.10:/backups 124G 2.8G 115G 3% /backups
192.168.33.10:/www 124G 2.8G 115G 3% /srv/www
Per rendere permanenti i mount al riavvio, apri /etc/fstab
file e aggiungi le seguenti righe::
sudo nano /etc/fstab
/etc/fstab192.168.33.10:/backups /backups nfs defaults,timeo=900,retrans=5,_netdev 0 0
192.168.33.10:/www /srv/www nfs defaults,timeo=900,retrans=5,_netdev 0 0
Per informazioni sulle opzioni disponibili durante il montaggio di un file system NFS, digitare man nfs
nel tuo terminale.
Un'altra opzione per montare file system remoti consiste nell'usare autofs
strumento o per creare un'unità systemd.
Test dell'accesso NFS #
Testiamo l'accesso alle condivisioni creando un nuovo file su ciascuna di esse.
Per prima cosa, prova a creare un file di prova in /backups
directory utilizzando il touch
comando:
sudo touch /backups/test.txt
Il /backups
il file system viene esportato in sola lettura e, come previsto, vedrai un Permission denied
messaggio di errore:
touch: cannot touch ‘/backups/test’: Permission denied
Quindi, prova a creare un file di prova in /srv/www
directory come root usando sudo
comando:
sudo touch /srv/www/test.txt
Di nuovo, vedrai Permission denied
messaggio.
touch: cannot touch ‘/srv/www’: Permission denied
Se ricordi, il /var/www
directory è di proprietà di www-data
utente e questa condivisione ha root_squash
set di opzioni che associa l'utente root a nobody
utente e nogroup
gruppo che non dispone delle autorizzazioni di scrittura per la condivisione remota.
Supponendo che tu abbia un www-data
utilizzare sulla macchina client con lo stesso UID
e GID
come sul server remoto (che dovrebbe essere il caso se, ad esempio, hai installato nginxon su entrambe le macchine), puoi provare a creare un file come utente www-data
:
sudo -u www-data touch /srv/www/test.txt
Il comando non mostrerà alcun output, il che significa che il file è stato creato correttamente.
Per verificarlo elenca i file nel /srv/www
directory:
ls -la /srv/www
L'output dovrebbe mostrare il file appena creato:
drwxr-xr-x 3 www-data www-data 4096 Apr 10 22:18 .
drwxr-xr-x 3 root root 4096 Apr 10 22:29 ..
-rw-r--r-- 1 www-data www-data 0 Apr 10 21:58 index.html
-rw-r--r-- 1 www-data www-data 0 Apr 10 22:18 test.txt
Smontaggio del file system NFS #
Se la condivisione NFS remota non è più necessaria, puoi smontarla come qualsiasi altro file system montato usando umount
comando.
Ad esempio, per smontare il /backups
condividi, eseguiresti:
sudo umount /backups
Se il punto di montaggio è definito in /etc/fstab
file, assicurati di rimuovere la riga o di commentarla aggiungendo #
all'inizio della riga.