Linux学习笔记:NFS

NFS的生产场景

NFS可以让多个客户端挂载,轻松实现文件共享,在集群中经常用到。

NFS与SAMBA比较

同样是文件共享服务软件,NFS能提供的功能,SAMBA都能提供,但SAMBA主要应用于与Windows实现文件共享并带有认证机制,而Linux之间的文件共享应优先考虑NFS,性能更优,也能实现简单的安全措施(指定来访者的IP)。

NFS的优点与缺点


优点


缺点

  1. 部署快速,维护简单;
  2. 并发数不高的情况下,性能高;
  3. 可靠性高,共享的文件都是基于文件系统的,可以直接访问(包括远端和本地);
  1. 单点故障会导致所有客户端不能访问(需考虑inotify和keepalive实现热备);
  2. 高并发(大于2千万PV/日)的性能效率有限(需考虑前端做缓存,如CDN);
  3. 安全性低,只能实现基于ip的认证,而且文件传输是明文。
  4. NFS不会对文件进行完整性校验(NFS使用TCP可以保证传输不出错,但如果使用UDP则无法保证);

NFS客户端的autofs功能

该功能可让客户端在需要用到nfs时才进行自动挂载,空闲时自动卸载,但生产环境中不宜使用,原因是对于突然的高并发会有延迟(挂载需时)

NFS服务器的安装及配置

NFS依赖的组件:

Centos5.x上是portmap

Centos6.x上是rpcbind

必须先安装好依赖组件并运行。RPC(Remote Procedure Call)远程过程调用,它的作用就是别的程序运行时监听一个随机端口并向外界提供服务,可能每次监听的端口都不一样,所以客户端无法得知每次的服务器端口号,这时就要用到RPC,服务器程序打算监听某一个端口时先向RPC进行注册,客户端透过RPC先访问服务器的RPC(TCP/UDP 111)询问指定程序的端口号,并得到RPC的回应后,再去连接那端口。也正因此,服务器RPC必须先启动,然后才可以接受程序注册。而如果服务器RPC重启后,原本已注册的程序必须重新注册。

NFS服务器的配置文件

[[email protected] ~]# rpm -qc nfs-utils    
/etc/nfsmount.conf    #服务器配置文件
/etc/rc.d/init.d/nfs
/etc/rc.d/init.d/nfslock
/etc/rc.d/init.d/rpcgssd
/etc/rc.d/init.d/rpcidmapd
/etc/rc.d/init.d/rpcsvcgssd
/etc/request-key.d/id_resolver.conf
/etc/sysconfig/nfs    
/var/lib/nfs/etab     #服务器共享文件夹的明细配置
/var/lib/nfs/rmtab
/var/lib/nfs/state
/var/lib/nfs/xtab
除了以上文件外,对于nfs服务器来说/etc/exports文件是最重要的共享目录的配置文件,默认是不存在的或者存在但为空。

NFS的组件:nfs-utils (服务器、客户端都需要安装) 

[[email protected] ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd: rpc.mountd:svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not openconnection for tcp6
rpc.mountd: svc_tli_create: could not openconnection for udp6
rpc.mountd: svc_tli_create: could not openconnection for tcp6
rpc.mountd: svc_tli_create: could not openconnection for udp6
rpc.mountd: svc_tli_create: could not openconnection for tcp6
                                                          [ OK  ]
Starting NFS daemon: rpc.nfsd: addressfamily inet6 not supported by protocol TCP
                                                          [  OK  ]
Starting RPC idmapd:                                       [  OK  ]

由于关闭了Ipv6,所以rpc关联不到,可忽略这些错误提示。

NFS服务一般会监听2049端口

而NFS还有其他的功能,每一个功能就是一个daemon进程且监听一个端口,并且向RPC注册。

[[email protected] ~]# rpcinfo -p localhost 
  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 52067  status
   100024    1   tcp 34097  status
   100011    1   udp   875  rquotad
   100011    2   udp   875  rquotad
   100011    1   tcp    875 rquotad
   100011    2   tcp   875  rquotad
   100005    1   udp 39148  mountd
   100005    1   tcp 54013  mountd
   100005    2   udp 57878  mountd
   100005    2   tcp 45483  mountd
   100005    3   udp 34825  mountd
   100005    3   tcp 36880  mountd
   100003    2   tcp  2049  nfs
   100003    3   tcp  2049  nfs
   100003    4   tcp  2049  nfs
   100227    2   tcp  2049  nfs_acl
   100227    3   tcp  2049  nfs_acl
   100003    2   udp  2049  nfs
   100003    3   udp  2049  nfs
   100003    4   udp  2049  nfs
   100227    2   udp  2049  nfs_acl
   100227    3   udp  2049  nfs_acl
   100021    1   udp 45411  nlockmgr
   100021    3   udp 45411  nlockmgr
   100021    4   udp 45411  nlockmgr
   100021    1   tcp 37701  nlockmgr
   100021    3   tcp 37701  nlockmgr
   100021    4   tcp 37701  nlockmgr

服务器上共享目录的实际配置参数可参考,但不要编辑它,它是自动生成的。

[[email protected] ~]# cat /var/lib/nfs/etab
/data/test      192.168.5.0/24(rw,async,wdelay,hide,nocrossmnt,insecure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)

上面etab文件一大堆的参数,是根据NFS服务器端的配置文件/etc/exports 来生成的,这个文件默认是空的,需要我们自己去定义,详细的写法可参考man exports

写法大致上这样

[[email protected] ~]# cat /etc/exports
/data/test     192.168.5.0/24(rw,async)

第一列是服务器上的本地文件夹的绝对路径

第二列是允许访问的主机,括号里是选项。rw是读写、async是异步,选项之间用逗号隔开

主机的写法有4种

single host 单一ip、Ipv6或域名
netgroups
wildcards 通配符,*
IP network 网段,子网掩码可写255.255.255.0,或/24

参数如下

secure    默认参数,要求客户端的端口必须小于1024。关闭该参数可使用insecure。
rw        允许读写
async     默认参数,异步写入,可提高性能,但碰到非法关机的话,有丢失数据的危险
sync      同步写入,与async相反
no_wdelay 该参数与async同用时没有效果。通常NFS服务器会延迟写入到磁盘,因它预计会有关联的写入请求到达。但如果NFS服务器收到许多不关联的写入请求,则应打开no_wdelay禁止延迟写入。
wdelay    与上相反

角色转换

来自客户端的读写权限默认情况下会发生转换,这是因为服务器端默认情况下,是不信任客户端的root,会自动转换成uid=65534,gid=65534(默认);而客户端上的其他用户(非root)的uid、gid得以保留,不会发生转换。

root_squash         仅转换uid、gid为0的请求到65534,可使用anonuid和anongid修改转换后的id。
no_root_squash      保留uid、gid为0
all_squash          转换所有请求的uid、gid
anonuid和anongid     显式指定转换成哪个id
 
服务器端测试
[[email protected]]# ls -ln test/
total 0
-rwxrwxrwx 1     0    0 0 Mar  4 13:04 nfs.test  #该文件是本地生成的
-rw-r--r-- 1   503  801 0 Mar  4 15:48 pannyfile #客户端上用panny用户生成的
-rw-r--r-- 1 65534 65534 0Mar  4 15:48 rootfile  #客户端上用root生成的
-rw-r--r-- 1    27   27 0 Mar  4 15:50 sqlfile   #客户端上用mysql用户生成的

一些例子

# sample /etc/exports file
/               master(rw)trusty(rw,no_root_squash)
把根目录分享给master主机(可读写)和trusty主机(可读写,不转换root)
 
/projects       proj*.local.domain(rw)
/usr            *.local.domain(ro) @trusted(rw)
通配符例子
 
/home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
可读写,转换所有来访者,uid改为150,gid改为100
 
/pub           *(ro,insecure,all_squash)
只读,允许客户端的端口大于等于1024,全部转换角色
 
/srv/www        -sync,rw server @trusted @external(ro)
sync、rw配到后面三个主机,但第三个@external只读覆盖rw
 
/foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
Ipv6于4的写法
 
/build          buildhost[0-9].local.domain(rw)
另一种通配符的写法

NFS客户端

客户端也需要安装nfs-utils

当装好后,就可以查看服务器上的共享目录,如下,在服务器192.168.5.138上有个共享目录/data/test

[[email protected] ~]# showmount -e 192.168.5.138
Export list for 192.168.5.138:
/data/test 192.168.5.0/24

在客户端上进行挂载
[[email protected] ~]# mount -t nfs 192.168.5.138:/data/test /mnt

在客户端上查看挂载状态,有两个方法:
1.直接mount命令;
[[email protected] ~]# mount|grep nfs
192.168.5.138:/data/test on /mnt type nfs (rw,vers=4,addr=192.168.5.138,clientaddr=192.168.5.142)

2.查看/proc/mounts,可以更清晰地看到所有参数;
[[email protected] ~]# cat /proc/mounts | grep mnt
192.168.5.138:/data/test /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.5.142,minorversion=0,local_lock=none,addr=192.168.5.138 0 0

以上是最简单的挂载方法和查看状态的方法

透过方法2,可以看到nfs的挂载参数有很多(具体可参考man 5 nfs),部分如下

rw      读写
vers    版本
rsize   读缓存(非常重要)范围在1024到1048576(即1M),如小于1024,会自动用4096代替,如大于1048576,则自动用1048576代替;生效的数值必须是1024的n倍数。最终数值还需要客户端和服务器端协商。
wsize   写缓存(非常重要)同上;
hard    默认hard,当nfs请求失败会不断重试;可以修改为soft,在超过重传次数后返回错误
proto   使用TCP还是UDP
timeo   超时时间,数值是秒数x10,默认600(即60秒)
retrans 重传次数
intr    允许用户中断尝试中的挂载
nointr  默认值,表示用户不能中断尝试中的挂载

另外还有一些mount命令自身支持的参数,比较重要的如下

noatime      访问文件时不修改相关文件的Access Time   
nodiratime   不修改目录的Access Time 
noexec       不允许直接运行文件,即使该文件有x权限
nodev        屏蔽字符设备或块设备的属性
nosuid       屏蔽suid

如果我们在客户端上,想挂载nfs目录,并且希望得到最佳性能和安全性,则应

[[email protected] ~]# mount -t nfs -o rsize=1048576,wsize=1048576,soft,timeo=30,noatime,nodiratime,noexec,nodev,nosuid 192.168.5.138:/data/test /mnt

在该测试中,尽管rsize和wsize都用了最大值1048576,但查看/proc/mounts的wsize和rsize只有131072,但查看mount命令则是1048576,不知是否bug。

[[email protected] ~]# cat /proc/mounts | grep /mnt
192.168.5.138:/data/test /mnt nfs4 rw,nosuid,nodev,noexec,noatime,nodiratime,vers=4,rsize=131072,wsize=131072,namlen=255,soft,proto=tcp,port=0,timeo=30,retrans=2,sec=sys,clientaddr=192.168.5.142,minorversion=0,local_lock=none,addr=192.168.5.138 0 0

[[email protected] ~]# mount|grep mnt
192.168.5.138:/data/test on /mnt type nfs (rw,noexec,nosuid,nodev,noatime,nodiratime,rsize=1048576,wsize=1048576,soft,timeo=30,vers=4,addr=192.168.5.138,clientaddr=192.168.5.142)
时间: 2024-10-19 02:21:26

Linux学习笔记:NFS的相关文章

linux学习笔记--NFS

NFS分为客户端,服务端.客户端要访问服务端,要写从RPC服务获得端口. 整个流程分为: 1,服务端rpc服务先启动2,nfs服务把端口上报给rpc服务3,rpc客户端通过服务端的rpcbind拿到访问端口4,rpc客户端通过端口访问文件 rpc服务,在centos5.x下叫portmap,在centos6.x下叫rcpbind 客户端也要有rpc才能访问服务端 所以NFS的软件列表: nfs-utilsrpcbind 安装NFSyum install nfs-utils rpcbind最好客户

linux学习笔记(一)-文件目录相关的命令&&文件通配符

一.几个命令概述 1.查看目录以及目录底下的文件:ls(-a显示隐藏文件:-d显示目录本身:-l显示详细内容:-R递归显示,即把子目录的文件也显示出来:-h以更加被人类理解的格式显示,比如显示文件大小的时候用M为单位显示:-i显示文件索引ID) 2.查看文件内容:cat,head,tail,less,more,tac cat:将文件连接起来,输出在屏幕上,可接多个文件(-E:显示隐藏的换行符:-n:显示出行号) head:默认查看文件的前10行(-n#:查看文件的前#行.空白行也是一行) tai

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

Linux学习笔记——例说makefile 增加系统共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

Linux学习笔记——如何使用echo指令向文件写入内容

0.前言 本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符. echo向文件中输出内容的基本方法是使用IO重定向指令--">",默认情况下echo输出到标准输出中,使用>指令可重定向输出到文件中. 1.echo指令基本用法 [1]Linux官方用户手册--echo指令 [2]输入指令获得帮助 sudo echo --help 返回内容如下 用法:echo [短选项]... [字

linux学习笔记--vim程序编辑器

1,在linux系统中使用文本编辑器来编辑自己的linux参数配置文件是一件很重要的事情,因此系统管理员至少应该要熟悉一种文本编辑器. 2,不同的linux distribution各有不同的附加软件,linux命令行界面下的文本编辑器有Emacs,pico,nano,joe与vim 3,学习vim的重要性 (1)所有的UNIX Like系统都内置vi文本编辑器,其他的文本编辑器不一定存在 (2)很多软件的编辑接口都会主动调用vi (3)vim具有程序编辑的能力,可以主动以字体颜色辨别语法的正确

linux学习笔记-type命令

语法: type [-tpa] name 参数: type:    不加任何参数时,type会显示出name是外部命令还是内部bash内置命令 -t:      当加入-t参数时,type会将name以下面这些字眼显示出它的意义 file:表示为外部命令 alias:表示该命令为命令别名所设置的名称 builtin:表示该命令为bash内置的命令功能 -p:     如果后面接的name为外部命令时,才显示完整文件名 -a:     会有path变量定义的路径中,将所有含有name的命令都列出来

Linux学习笔记三:Linux的权限处理命令

1.改变文件或目录权限  chmod 语法:chmod [{ugo} {+-=} {rwx}] [文件或目录] 或 [mode] [文件或目录] 第一种语法中: 这里的u是所有者,g是指所属组,o是指其他人 +是指增加权限,-是指减少权限,=是指赋予权限 r是指读权限,w是指写权限.x只是执行权限 第二种语法中: 在这里,r的值是4,w的值是2,x的值是1. 这里写的mode,是指一组数字.如:421.这里的421,是指所有者所拥有权限的数字总和是4,所属组所拥有权限的总和是2,其他人所拥有权限

Linux学习笔记033_10

网卡命名: eth0,eth1 子接口(一个网卡上多个IP):eth0:1,eth0:2 ifconfig: 查看网卡信息 ifup ethx:开启网卡 ifdown ethx:关闭网卡 配置网卡: 图形 命令: ONBOOT为yes表示启动计算机时通过网卡 全局网络配置: 第一行为开启ipv4,第二行为开启ipv6,第三行为计算机名,注意计算机名在DNS要解析到,如clc.com 可以加一行:GATWAY=192.168.1.254,不过以network-scripts中的网关优先级高 DNS

Linux学习笔记033_11进程

ps:(process information,静态的) 显示进程信息,不加参数显示当前终端的进程 a:包括所有终端的进程 x:不属于任何终端的进程,和任何用户无关系的进程 u:显示出进程的拥有人 f:显示进程的附属关系(依赖关系,父子进程) USER:进程的拥有人 PID:进程ID,默认用进程ID排序 VSZ:程序在运行时调用多少虚拟内存 RSS:真实内存 TTY:?不属于任何终端,进入终端之前就运行 STAT:状态,s为睡眠 TIME:进程持续时间 COMMAND:运行这个进程的指令 ps