Sun公司開發NFS (Network File System)之初就是為了在不同linux/Unix系統之間共享文件或者文件夾。可以在本地通過網絡掛載遠程主機的共享文件,和遠程主機交互。NFS共享存儲對初學者來說不太好理解,我看到過一個很好的例子,假如有三台機器A、B、C,它們需要訪問同一個目錄,目錄中都是圖片,傳統的做法是把這些圖片分別放到A、B、C。但是使用NFS只需要放到A上,然后A共享給B和C即可。訪問的時候,B和C是通過網絡的方式去訪問A上的那個目錄的。
一、NFS的優勢
- 允許本地獲取遠程文件
- NFS使用標准的CS架構在Linux/Unix機器共享文件
- NFS不要求所有機器都是相同的操作系統。
- 用NFS可以配置集中存儲的解決方案。
- 用戶獲取數據是和物理位置無關的。
- 添加新文件不需要手動刷新。
- 新版本的NFS也支持acl,pseudo root掛載。
- 可通過防火牆和認證來加強安全防護。
二、NFS配置相關的文件
- /etc/exports:NFS服務核心配置文件,NFS服務器端所有共享的文件和目錄都在該文件中定義。
- /etc/fstab:要在系統中掛載一個NFS目錄,重啟后生效,就在/etc/fstab中增加相應配置。
- /etc/sysconfig/nfs:NFS配置文件,用來控制rpc或者其他服務正在監聽哪個端口。
三、配置和使用NFS
1、環境
Linux環境配置NFS服務至少需要2台linux機子,並且保證能ping通。
NFS Server IP :10.1.101.188
NFS Client IP : 10.1.101.189
2、安裝NFS Server和NFS Client
在NFS Server和NFS Client兩台機子都需要裝NFS包。(Red Hat Linux 用“yum”)Debian 和Ubuntu環境用"apt-get"。【以server端為例】
# apt-get install nfs-common nfs-kernel-server
NFS Server和NFS Client兩台機子都啟動nfs服務。
要啟動portmap和nfs兩個服務,並且portmap服務一定要先於nfs啟動。【以server端為例】
root@nfsserver:~# /etc/init.d/portmap start Rather than invoking init scripts through /etc/init.d, use the service(8) utility, e.g. service portmap start Since the script you are attempting to invoke has been converted to an Upstart job, you may also use the start(8) utility, e.g. start portmap root@nfsserver:~# /etc/init.d/nfs-kernel-server start * Exporting directories for NFS kernel daemon... [ OK ] * Starting NFS kernel daemon
3、NFS服務器端配置
要共享一個目錄,首先要在/etc/exports中加入。我們在根目錄下新建一個目錄/nfsshare,共享給客戶端。
然后重啟服務使配置生效(或者使用命令#exportfs -rv)。
root@nfsserver:~# mkdir /nfsshare
root@nfsserver:~# cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/nfsshare 10.1.101.189(rw,sync,no_root_squash)
root@nfsserver:~# /etc/init.d/nfs-kernel-server restart
/nfsshare 10.1.101.189(rw,sync,no_root_squash)這句話意思是根分區下的/nfsshare目錄被共享給IP“10.1.101.189”,並且有read和write(rw)權限,這里也可以用主機名(hostname)來代替IP。
exports文件中客戶端主機地址
"客戶端主機地址"字段可以使用多種形式表示主機地址
10.1.101.189:指定IP地址的主機
nfsclient.test.com:指定域名的主機
10.1.101.0/24:指定網段中的所有主機
*.test.com:指定域下的所有主機
*:所有主機
exports文件中配置選項
exports文件中的“配置選項”放在括號中,選項之間逗號分隔。
- ro:該選項表示read only,客戶端只允許讀共享文件。
- rw:該選項表示輸出的共享目錄可讀(read)寫(wirte),客戶端有讀文件的權限也有寫文件的權限。
- sync:將數據同步寫入緩沖區與磁盤中,效率低,但可以保證數據的一致性,推薦所有NFS共享目錄都使用該選項。
- async:將數據先保存在內存緩沖區中,必要時才寫入磁盤。
- wdelay(默認):檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率。
- no_wdelay:若有寫操作則立即執行,應與sync配合使用。
- all_squash:所有訪問用戶都映射為匿名用戶或用戶組。
- no_all_squash(默認):將訪問用戶先與本機用戶匹配,匹配失敗后再映射為匿名用戶或用戶組。
- subtree_check(默認):若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限。
- no_subtree_check:表示禁用子樹檢查。如果禁用子樹檢查會提高效率,但會降低其安全性。
- root_squash(默認):來訪的root用戶映射為匿名用戶或用戶組。
- no_root_squash:來訪的root用戶保持root賬戶權限,就像對本地的目錄操作一樣,不安全,不建議使用。
- anonuid=<UID>:指定匿名訪問用戶的本地用戶UID,默認為nfsnobody(65534)。
- anongid=<GID>:指定匿名訪問用戶的本地用戶組GID,默認為nfsnobody(65534)。
- secure(默認):限制客戶端只能從小於1024的tcp/ip端口連接服務器。
- insecure:允許客戶端大於1024的tcp/ip端口連接服務器。
4、NFS客戶端配置
服務器端配置好后,在客戶端掛載共享目錄或分區。
第一步:查看NFS Server的共享文件
root@nfsclient:~# showmount -e 10.1.101.188 Export list for 10.1.101.188: /nfsshare 10.1.101.189
第二步:新建掛載點
root@nfsclient:~# mkdir -p /mnt/nfsshare
第三步:掛載,注意權限。
root@nfsclient:~# mount -t nfs 10.1.101.188:/nfsshare /mnt/nfsshare mount.nfs: access denied by server while mounting 10.1.101.188:/nfsshare
root@nfsserver:/# chmod 777 -R /nfsshare/
root@nfsserver:/# /etc/init.d/nfs-kernel-server restart * Stopping NFS kernel daemon [ OK ] * Unexporting directories for NFS kernel daemon... [ OK ] * Exporting directories for NFS kernel daemon... exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "10.1.101.189:/nfsshare". Assuming default behaviour ('no_subtree_check'). NOTE: this default has changed since nfs-utils version 1.0.x [ OK ] * Starting NFS kernel daemon
root@nfsclient:~# mount -t nfs 10.1.101.188:/nfsshare /mnt/nfsshare
第四步,檢查掛載是否成功:
root@nfsclient:~# mount |grep nfs 10.1.101.188:/nfsshare on /mnt/nfsshare type nfs (rw,vers=4,addr=10.1.101.188,clientaddr=10.1.101.189)
以上掛載只是暫時的,機子重啟后就沒有了。要永久掛載,可在"/etc/fsab"中配置。
即在/etc/fstab中加入一行:
10.1.101.188:/nfsshare /mnt/nfsshare nfs defaults 0 0
root@nfsclient:~# cat /etc/fstab # /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc nodev,noexec,nosuid 0 0 # / was on /dev/xvda1 during installation UUID=0c681b37-97ed-4d10-bd79-8d5931c443f8 / ext4 errors=remount-ro 0 1 # swap was on /dev/xvda5 during installation UUID=9e2efc1b-ef13-4b7c-b616-34d2a62f04ea none swap sw 0 0 10.1.101.188:/nfsshare /mnt/nfsshare nfs defaults 0 0
然后執行命令:mount -a
root@nfsclient:~# mount -a
root@nfsclient:~# mount |grep nfs
10.1.101.188:/nfsshare on /mnt/nfsshare type nfs (rw,vers=4,addr=10.1.101.188,clientaddr=10.1.101.189)
5、測試NFS配置
在NFS Server端新建一個測試文件,檢查在NFS Client端是否能獲取到,反之亦然。
第一步,在NFS Server的共享目錄中新建文件"nfsTestServer.txt"。
root@nfsserver:/nfsshare# cat nfsTestServer.txt This is a test file to test the working of NFS server setup. This file is created at nfs server end.
第二步,在NFS Client端無需刷新就可以看到“nfsTestServer.txt”文件。
root@nfsclient:/mnt/nfsshare# ls nfstest.txt
root@nfsclient:/mnt/nfsshare# cat nfsTestServer.txt
This is a test file to test the working of NFS server setup.
This file is created at nfs server end.
第三步,在NFS Client端,新建一個測試文件"nfsTestClient.txt"。
root@nfsclient:/mnt/nfsshare# cat nfsTestClient.txt This is a test file to test the working of NFS server setup. This file is created at nfs client end.
第四步,在NFSServer端無需刷新就可以看到“nfsTestClient.txt”文件。
root@nfsserver:/nfsshare# cat nfsTestClient.txt This is a test file to test the working of NFS server setup. This file is created at nfs client end.
6、卸載
文件共享完后執行umount命令卸載。
root@nfsclient:~# df -h -F nfs
Filesystem Size Used Avail Use% Mounted on
10.1.101.188:/nfsshare 19G 1.7G 17G 10% /mnt/nfsshare
root@nfsclient:~# umount /mnt/nfsshare
root@nfsclient:~# df -h -F nfs
df: no file systems processed
7、卸載排錯
root@nfsclient:/mnt/nfsshare# umount /mnt/nfsshare umount.nfs: /mnt/nfsshare: device is busy
首先:注意不要在當前目錄去執行umount,否則會報錯。
root@nfsclient:~# umount /mnt/nfsshare umount.nfs: /mnt/nfsshare: device is busy
如果退出該目錄還是不行,則判斷是有一個進程在用該目錄,找出。
root@nfsclient:~# fuser -m /mnt/nfsshare /mnt/nfsshare: 923c
找到使用該目錄的進程:
root@nfsclient:~# ps aux |grep 923 root 923 0.0 0.3 21452 4036 pts/0 Ss+ 10:12 0:00 -bash root 1323 0.0 0.0 8104 924 pts/1 S+ 11:22 0:00 grep --color=auto 923
殺死進程
root@nfsclient:~# kill -9 923
然后就可以卸載了。
root@nfsclient:~# umount /mnt/nfsshare
四、NFS命令
showmount
- showmount -e <server-ip or hostname>:顯示主機NFS服務器輸出列表。-e或--exports
- showmount -d <server-ip or hostname> :顯示被客戶機掛載的目錄。-d 或--directories
- showmount -a <server-ip or hostname>:列出nfs服務器的所有客戶端主機及所連接的目錄,即掛載點
exportfs管理工具可以對“exports”文件進行管理
- exportfs -v:輸出主機共享的文件和選項到屏幕:
root@nfsserver:~# exportfs -v /nfsshare 10.1.101.188(rw,wdelay,no_root_squash,no_subtree_check)
- exportfs -a:全部掛載或卸載/etc/exports中的內容,輸出/etc/exports文件中設置的所有共享文件
root@nfsserver:~# exportfs -a exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "10.1.101.189:/nfsshare". Assuming default behaviour ('no_subtree_check'). NOTE: this default has changed since nfs-utils version 1.0.x
- exportfs -u:卸載單一目錄(和-a一起使用為卸載所有/etc/exports文件中的目錄)
- exportfs -r:重新讀取/etc/exports文件的設置,並使設置立即生效,而不重啟服務。並同步更新/var/lib/nfs/xtab
- exportfs -rv:重新輸出共享目錄。
設置自動啟動nfs服務
chkconfig --level 35 portmap on
chkconfig --level 35 nfs on
rpcinfo:查看rpc服務注冊情況
-p:顯示所有的端口和程序信息:

root@nfsserver:~# rpcinfo -p 10.1.101.188 program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 44370 status 100024 1 tcp 35677 status 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 2 tcp 2049 100227 3 tcp 2049 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 2 udp 2049 100227 3 udp 2049 100021 1 udp 40301 nlockmgr 100021 3 udp 40301 nlockmgr 100021 4 udp 40301 nlockmgr 100021 1 tcp 39133 nlockmgr 100021 3 tcp 39133 nlockmgr 100021 4 tcp 39133 nlockmgr 100005 1 udp 46249 mountd 100005 1 tcp 40795 mountd 100005 2 udp 42966 mountd 100005 2 tcp 41292 mountd 100005 3 udp 33508 mountd 100005 3 tcp 54892 mountd
推薦資源鏈接
https://help.ubuntu.com/community/SettingUpNFSHowTo