NFS(Network File System)服務配置和使用


 Sun公司開發NFS (Network File System)之初就是為了在不同linux/Unix系統之間共享文件或者文件夾。可以在本地通過網絡掛載遠程主機的共享文件,和遠程主機交互。NFS共享存儲對初學者來說不太好理解,我看到過一個很好的例子,假如有三台機器ABC,它們需要訪問同一個目錄,目錄中都是圖片,傳統的做法是把這些圖片分別放到ABC。但是使用NFS只需要放到A上,然后A共享給BC即可。訪問的時候,BC是通過網絡的方式去訪問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”,並且有readwrite(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
View Code

推薦資源鏈接

https://help.ubuntu.com/community/SettingUpNFSHowTo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM