NFS是Network File System的縮寫;這個文件系統是基於網路層面,經過網絡層面實現數據同步php
NFS最先由Sun公司開發,分2,3,4三個版本,2和3由Sun起草開發,4.0開始Netapp公司參與並主導開發,目前最新爲4.1版本——>4.1版本是2010年出來還沒更新過python
NFS數據傳輸基於RPC協議,RPC爲Remote Procedure Call的簡寫,意思爲 遠程過程調用mysql
例子:linux
服務端和客戶端通訊,A機器和B機器之間不能直接通訊,須要藉助RPC協議來實現nginx
NFS應用場景是:A,B,C三臺機器上須要保證被訪問到的文件是同樣的,A共享數據出來,B和C分別去掛載A共享的數據目錄,從而B和C訪問到的數據和A上的一致sql
NFS架構vim
/home/nfstestdir 192.168.133.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)centos
1.首先準備兩臺機器,我這裏準備兩臺虛擬機,A機器IP分別爲192.168.5.130,B機器IP爲192.168.5.133緩存
A機器,查看IP:192.168.5.130服務器
[root@xuexi-001 ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.5.130 netmask 255.255.255.0 broadcast 192.168.5.255 inet6 fe80::9625:3e1d:12c7:4fe6 prefixlen 64 scopeid 0x2
B機器,查看IP: 192.168.5.133
[root@localhost ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.5.133 netmask 255.255.255.0 broadcast 192.168.5.255 inet6 fe80::cf14:5db2:1b49:f0c2 prefixlen 64 scopeid 0x2
2.將A機器做爲服務端,並安裝兩個包,分別爲 nfs-utils 和 rpcbind
[root@xuexi-001 ~]# yum install -y nfs-utils rpcbind
3.將B機器做爲客戶端,安裝 nfs-utils 包
[root@localhost ~]# yum install -y nfs-utils
4.在安裝完成後,須要去A機器中 /etc/exports 編輯配置文件
vim /etc/exports //加入以下內容
[root@xuexi-001 ~]# vi /etc/exports /home/nfstestdir 要分享出去的目錄是哪個目錄,這個目錄是不存在的,後期還須要建立的 192.168.5.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) 指定你要給哪一個機器去分享這個目錄,首先定義IP或IP段 保存退出
5.下面就能夠啓動服務了,啓動服務前須要先建立目錄,並設置權限
6.在A機器上建立分享的目錄
[root@xuexi-001 ~]# mkdir /home/nfstestdir
7.並設置成777的權限,這裏設置777權限是爲了方便接下里的實驗
[root@xuexi-001 ~]# chmod 777 /home/nfstestdir
8.啓動 rpcbind ,再啓動前查看A機器上監聽的端口,就會看到啓動了1/systemd,這是centos7系統的一個特性——>111端口是rpcbind服務監聽的
查看A機器:
用ps能夠查看服務已經啓動,由於有這個服務,因此監聽了111端口
[root@xuexi-001 ~]# netstat -lntp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2605/rpcbind tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1038/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 911/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1262/master tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1038/nginx: master tcp6 0 0 :::111 :::* LISTEN 2605/rpcbind tcp6 0 0 :::22 :::* LISTEN 911/sshd tcp6 0 0 ::1:25 :::* LISTEN 1262/master tcp6 0 0 :::3306 :::* LISTEN 1223/mysqld
9.再到B機器上查看下端口,會看到也啓動了rpcbind
[root@localhost ~]# netstat -lntp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2577/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 852/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1029/master tcp6 0 0 :::111 :::* LISTEN 2577/rpcbind tcp6 0 0 :::22 :::* LISTEN 852/sshd tcp6 0 0 ::1:25 :::* LISTEN 1029/master
注:若是rpcbind沒有啓動的話可使用 systemctl start rpcbind啓動服務
10.在A機器啓動了rpcbind,下面就能夠啓動nfs服務,在使用ps查看
[root@xuexi-001 ~]# systemctl start nfs [root@xuexi-001 ~]# ps aux | grep nfs root 2713 0.0 0.0 0 0 ? S< 00:10 0:00 [nfsd4_callbacks] root 2719 0.0 0.0 0 0 ? S 00:10 0:00 [nfsd] root 2720 0.0 0.0 0 0 ? S 00:10 0:00 [nfsd] root 2721 0.0 0.0 0 0 ? S 00:10 0:00 [nfsd] root 2722 0.0 0.0 0 0 ? S 00:10 0:00 [nfsd] root 2723 0.0 0.0 0 0 ? S 00:10 0:00 [nfsd] root 2724 0.0 0.0 0 0 ? S 00:10 0:00 [nfsd] root 2725 0.0 0.0 0 0 ? S 00:10 0:00 [nfsd] root 2726 0.0 0.0 0 0 ? S 00:10 0:00 [nfsd] root 2730 0.0 0.0 112720 968 pts/0 R+ 00:11 0:00 grep --color=auto nfs
11.同時也能夠在A機器上ps aux |grep rpc查詢,在啓動nfs服務的時候,它會自動幫你啓動rpc相關的一些服務
[root@xuexi-001 ~]# ps aux | grep rpc rpc 2605 0.0 0.0 65000 1416 ? Ss 00:01 0:00 /sbin/rpcbind -w rpcuser 2683 0.0 0.0 42420 1756 ? Ss 00:10 0:00 /usr/sbin/rpc.statd root 2685 0.0 0.0 0 0 ? S< 00:10 0:00 [rpciod] root 2695 0.0 0.0 43860 540 ? Ss 00:10 0:00 /usr/sbin/rpc.idmapd root 2703 0.0 0.0 42608 944 ? Ss 00:10 0:00 /usr/sbin/rpc.mountd root 2732 0.0 0.0 112720 968 pts/0 R+ 00:12 0:00 grep --color=auto rpc
12.而在客戶端B機器上是沒有的這些服務的
[root@localhost ~]# ps aux |grep rpc rpc 2577 0.0 0.1 64956 1048 ? Ss 00:01 0:00 /sbin/rpcbind -w root 2585 0.0 0.0 112676 980 pts/0 R+ 00:13 0:00 grep --color=auto
13.若是想讓nfs開機啓動,還須要執行systemctl enable nfs 命令,在服務端A機器上調用
[root@xuexi-001 ~]# systemctl enable nfs Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
1.首先在客戶端B機器上安裝了rpcbind,它是由nfs-utils 這個包自動安裝的
yum install -y nfs-utils
2.在B機器上安裝完成後不須要啓動任何服務
3.在B機器上執行 showmount -e 命令
[root@localhost ~]# showmount -e 192.168.5.130 clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
4.這時候會看到報錯了,RPC: Port mapper failure說明網絡不通,沒法與192.168.5.130 端口通訊
5.由於以前在服務端已經開啓了rpcbind服務,那這時只能說明是防火牆致使的,因此要想讓NFS實現正常的通訊,還須要把防火牆關閉,由於NFS服務比較特殊,雖然rpc能夠通訊,就算iptables把111端口放行但NFS也不必定能正常通訊,由於它們使用了一個不固定的端口
6.這時先把A機器服務端和B機器客戶端,防火牆關閉,命令systemctl stop firewalld
A機器關閉防火牆 [root@xuexi-001 ~]# systemctl stop firewalld [root@xuexi-001 ~]# getenforce Disabled B機器關閉防火牆 [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# getenforce Enforcing [root@localhost ~]# setenforce 0 [root@localhost ~]# getenforce Permissive
7.這時再去B機器客戶端來showmount -e 192.168.5.130 ,這時會看到能夠能show到遠程服務端192.168.5.130 這臺機器,它共享的目錄是/home/nfstestdir
[root@localhost ~]# showmount -e 192.168.5.130 Export list for 192.168.5.130: /home/nfstestdir 192.168.5.0/24
8.這時候在B機器客戶端上來掛載了,而後查看——>掛載的時間可能有點慢
[root@localhost ~]# mount -t nfs 192.168.5.130:/home/nfstestdir /mnt/ [root@localhost ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/sda3 18G 992M 17G 6% / devtmpfs 479M 0 479M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 197M 97M 100M 50% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.5.130:/home/nfstestdir 18G 8.4G 9.5G 47% /mnt
9.這個就是遠程NFS服務端共享的目錄
10.這時到B機器客戶端共享的目錄下建立文件
[root@localhost ~]# cd /mnt/ [root@localhost mnt]# ls [root@localhost mnt]# touch 111.txt [root@localhost mnt]# ls -l 總用量 0 -rw-r--r--. 1 1000 1000 0 8月 4 16:08 111.txt
11.到A機器的服務端查看,能夠看到文件的屬主和屬組都爲1000
[root@xuexi-001 ~]# ls -l /home/nfstestdir/ 總用量 0 -rw-r--r-- 1 user1 user1 0 8月 4 16:08 111.txt [root@xuexi-001 ~]# id user1 uid=1000(user1) gid=1000(user1) 組=1000(user1)
在/etc/exports文件中的/home/nfstestdir
192.168.5.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) ,其中ip與(rw之間不能有空格, 不然客戶端掛載的目錄會變成只讀..
經常使用選項
/tmp/ 192.168.133.0/24(rw,sync,no_root_squash)
1.在B機器客戶端,卸載目錄
[root@localhost ~]# umount /mnt/ [root@localhost ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/sda3 18G 992M 17G 6% / devtmpfs 479M 0 479M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 197M 97M 100M 50% /boot tmpfs 98M 0 98M 0% /run/user/0
2.而後在A機器服務端,使用exportfs -arv命令
exportfs -arv命令,從新使配置文件生效
[root@xuexi-001 ~]# exportfs -arv exporting 192.168.5.0/24:/home/nfstestdir
3.驗證,在A機器上的/etc/exports配置文件中,在增長一行,把 /tmp 目錄單獨共享給192.168.5.133 這個IP
[root@xuexi-001 ~]# vi /etc/exports /home/nfstestdir 192.168.5.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) /tmp 192.168.5.133(rw,sync,no_root_squash) 保存退出
4.而後在A機器服務端執行exportfs -arv命令
[root@xuexi-001 ~]# exportfs -arv exporting 192.168.5.133:/tmp exporting 192.168.5.0/24:/home/nfstestdir
5.在B機器客戶端showmount -e看是否生效——>並無重啓nfs服務,就已經生效
[root@localhost ~]# showmount -e 192.168.5.130 Export list for 192.168.5.130: /home/nfstestdir 192.168.5.0/24 /tmp 192.168.5.133
6.在B機器客戶端掛載,將 tmp目錄 掛載到 mnt 目錄下
[root@localhost ~]# mount -t nfs 192.168.5.130:/tmp/ /mnt/ [root@localhost ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 /dev/sda3 18G 992M 17G 6% / devtmpfs 479M 0 479M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 197M 97M 100M 50% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.5.130:/tmp 18G 8.4G 9.5G 47% /mnt
7.如今在B機器客戶端,查看到的/mnt/目錄就是192.168.5.130IP下的tmp目錄
[root@localhost ~]# ls /mnt/ aming.sock systemd-private-cca061734a284ab68452996f54b9a3e7-chronyd.service-UKFBkE mysql.bak systemd-private-cca061734a284ab68452996f54b9a3e7-vgauthd.service-fXSgVu mysql.sock systemd-private-cca061734a284ab68452996f54b9a3e7-vmtoolsd.service-zsXw2n php-fcgi.sock user.bak
8.再到A機器上查看tmp目錄,會看到兩個目錄下的文件內容會同樣的
[root@xuexi-001 ~]# ls /tmp/ aming.sock systemd-private-cca061734a284ab68452996f54b9a3e7-chronyd.service-UKFBkE mysql.bak systemd-private-cca061734a284ab68452996f54b9a3e7-vgauthd.service-fXSgVu mysql.sock systemd-private-cca061734a284ab68452996f54b9a3e7-vmtoolsd.service-zsXw2n php-fcgi.sock user.bak
9.這時在B機器客戶端的mnt目錄下建立文件,並查看目錄下的文件,能看到新建的1212.txt文件的屬主和屬組都是root
[root@localhost ~]# cd /mnt/ [root@localhost mnt]# touch 1212.txt [root@localhost mnt]# ls -l /mnt/ 總用量 652 -rw-r--r--. 1 root root 0 8月 4 16:38 1212.txt srw-rw-rw-. 1 root root 0 8月 4 15:44 aming.sock -rw-r--r--. 1 root root 657618 7月 25 22:07 mysql.bak srwxrwxrwx. 1 1003 1003 0 8月 4 15:44 mysql.sock srw-rw-rw-. 1 root root 0 8月 4 15:44 php-fcgi.sock drwx------. 3 root root 17 8月 4 15:43 systemd-private-cca061734a284ab68452996f54b9a3e7-chronyd.service-UKFBkE drwx------. 3 root root 17 8月 4 15:43 systemd-private-cca061734a284ab68452996f54b9a3e7-vgauthd.service-fXSgVu drwx------. 3 root root 17 8月 4 15:43 systemd-private-cca061734a284ab68452996f54b9a3e7-vmtoolsd.service-zsXw2n -rw-r--r--. 1 root root 7229 7月 25 22:19 user.bak
10.這時再到A機器服務端查看tmp目錄,會看到1212.txt文件的屬主和屬組也是root
[root@xuexi-001 ~]# ls -l /tmp/ 總用量 652 -rw-r--r-- 1 root root 0 8月 4 16:38 1212.txt srw-rw-rw- 1 root root 0 8月 4 15:44 aming.sock -rw-r--r-- 1 root root 657618 7月 25 22:07 mysql.bak srwxrwxrwx 1 mysql mysql 0 8月 4 15:44 mysql.sock srw-rw-rw- 1 root root 0 8月 4 15:44 php-fcgi.sock drwx------ 3 root root 17 8月 4 15:43 systemd-private-cca061734a284ab68452996f54b9a3e7-chronyd.service-UKFBkE drwx------ 3 root root 17 8月 4 15:43 systemd-private-cca061734a284ab68452996f54b9a3e7-vgauthd.service-fXSgVu drwx------ 3 root root 17 8月 4 15:43 systemd-private-cca061734a284ab68452996f54b9a3e7-vmtoolsd.service-zsXw2n -rw-r--r-- 1 root root 7229 7月 25 22:19 user.bak
11.這就是由於在A機器服務端的配置文件中,使用了no_root_squash ,因此root用戶不受約束,在B機器上到掛載點下,到共享目錄下,就能夠像在本地磁盤使用root用戶同樣,是不受限制的(一般狀況下,不限制root用戶的比較多)