NFS为 Network FileSystem 的简称,目的是让不同的机器,不同的操作系统可以彼此分享个别的档案,主要用来做为文件服务器,Linux主机连接到另一部Linux主机来分享
彼此的档案,使用NFS要比SAMBA这个服务器快速且方便的多,在Linux环境下使用的几率很高,他最大的问题在于【权限】方面的概念,因为客户端与服务器端可能必须要
具有相同的账号才能够存取某些档案或目录,另外,NFS的启动需要透过所谓的远程过程调用(RPC),所以我们并不是启动NFS就好了的,还要启动RPC这个服务才行
NFS可以让你的PC来将网络远程的NFS服务器分享的目录,挂载到本地端的机器当中,在本地端的机器看来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样
(partition),挂载点可以自定义,挂载后就可以看到挂载的数据了(当然,权限要足够),之后还可以用cp , cd , mv ,rm 等等磁盘或档案相关的指令
NFS 使用2049这个服务的埠口,由于文件系统非常复杂,因此还有其他的程序去启动额外的端口,但这些额外的端口启动的号码是不固定的,因此预设NFS用来传输的端口
是随机选择小于1024以下的端口来使用的,那此时客户端想要知道使用哪个端口,就要远程调用RPC的协助来辅助啦
因为NFS支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启动一些端口来传输数据,因此NFS的功能所对应的端口没有固定的,而是随机
取用一些未被使用的小于1024的端口来作为传输之用,如此就会照成客户端想要连上服务器时的困扰,因为客户端想要知道服务器端的相关端口才能联机,此时就要远程过程
调用(RPC)的服务了,PRC主要的功能就是指定每个NFS功能所对应的port number ,并汇报给客户端,让客户端能够正确的连上,其实服务器在启动NFS时会随机取用数个
端口,并主动的向RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC是固定使用port 111来监听客户端的需求并回报客户端正确的端口
所以,要启动NFS之前,RPC就要先启动了,否则NFS会无法向RPC注册的,若RPC重新启动时,原本注册的数据会不见,会重新向RPC去注册
客户端有NFS档案存取需求时,如何向服务器端要求数据,操作步骤:
1. 客户端会向服务器端的 RPC (port 111) 发出 NFS 档案存取功能的询问要求;
2. 服务器端找到对应的已注册的 NFS daemon 埠口后,会回报给客户端;
3. 客户端了解正确的埠口后,就可以直接与 NFS daemon 来联机。
RPC了解NFS这个服务的各项功能之port number,PID,NFS在服务器所监听的IP等等,客户端才能够透过RPC的询问找到正确对应的端口,也就是NFS必须要有RPC存在
时才能成功的提供服务,因此我们称NFS为RPC server的一种,事实上有很多的服务器都是想RPC注册的,例如NIS 也是RPC server的一种,不论是客户端还是服务器端
要使用NFS时,两者都需要启动RPC才行
NFS 启动的 RPC daemons
NFS服务器在启动的时候就得要向PRC注册,那么NFS服务器主要是进行文件系统的分享,文件下系统的分享则与权限有关,所以NFS服务器启动时至少需要两个daemons,
一个管理客户端是否能够登入的问题,一个管理客户端能够取得的权限,如果还要管理quota的话,那么NFS还要加载其他的RPC程序了,以较单纯的NFS服务器来说
rpc.nfsd:主要的NFS服务器服务提供商,主要的功能就是在管理客户端是否能够使用服务器文件系统挂载信息,其中包括这个登入者的ID的判别
rpc.mountd:这个daemon主要的功能,则是在管理NFS的文件系统,当顺利通过rpc.nfsd而登入之后,在他可以使用NFS服务器提供的档案之前,还会经过档案权限
(就是那个 -rwxrwxrwx 与 owner, group 那几个权限啦)的认证程序,他会去读 NFS 的配置文件 /etc/exports 来比对客户端的权限,通过之后就可以取用NFS档案的权限了
这个也是我们用来管理 NFS 分享之目录的权限与安全设定的地方
rpc.lockd (非必要):可以用在管理档案的锁定 (lock) 用途,为何需要锁定,因为既然分享的NFS档案可以让客户端使用,那么当多个客户端同时尝试写入某个档案时,
就可能对档案造成问题了,那个rpc.lockd则可以用来克服这个问题,但是rpc.lockd必须要同时在客户端与服务器端都开启才行,此外, rpc.lockd 也常与 rpc.statd 同时启用
rpc.statd (非必要):可以用来检查档案的一致性,与 rpc.lockd 有关,若发生客户端同时使用同一档案而使档案有所损毁时,rpc.statd可以用来检测并尝试回复该档案
与 rpc.lockd 同样的,这个功能必须要在服务器端与客户端都启动才会生效
上述的几个RPC所需要的程序,其实都已经写入到两个基本的服务启动脚本中了,那就是nfs以及nfslook,亦即是在/etc/init.d/nfs, /etc/init.d/nfslock,与服务器较有关的写入
nfs服务中,而与客户端的rpc.lockd之类的,就设定于nfslock服务中。
NFS 的档案访问权限
当使用dmtsai用户去存取/home/data/sharefile/ 这个来自 NFS server 所提供的文件系统时,NFS server 所提供的文件系统会让我也以dmtsai用户去存取,这是因为NFS本
身的服务没有进行身份登入的识别,所以说,你在客户端以dmtsai 的身份想要存取服务器端的文件系统时,服务器端会以客户端的使用者UID 与 GID 等身份来尝试读取服务器
端的文件系统。服务器端文件系统的 inode 所记录的属性为UID, GID 而非账号与群组名,那一般Linux主机会主动的以自己的/etc/passwd, /etc/group 来查询对应使用者,组名
所以当客户端以dmtsai 进入到服务器该目录后,会参照客户机的使用者与组名但是由于该目录的档案主要来自 NFS server ,所以可能就会发现几个情况:
1.NFS server/NFS client 刚好有相同的账号与群组,此时可以直接以dmtsai 的身份进行服务器所提供的文件系统之存取
2.NFS server 的 501 这个 UID 账号对应为 vbird ,若 NFS 服务器上的 /etc/passwd 里面 UID 501 的使用者名称为 vbird 时,而客户端的dmtsai可以存取服务器端的
vbird 这个使用者的档案,只因为两者具有相同的UID而已,这样就会有很大的问题,因为没有人可以保证客户端的UID所对应的账号与服务器端相同,那服务器所提供的数据
不就可能会被错误的使用串改了
3.NFS server 并没有 501 这个 UID,另一个极端的情况是,在服务器端并没有 501 这个 UID 的存在,则此时 dmtsai 的身份在该目录下会被压缩成匿名者,一般 NFS 的匿名
者会以 UID 为 65534 为其使用者,早期的 Linux distributions 这个 65534 的账号名称通常是 nobody,我们的Centos取名为nfsnobody,有时也有特殊的情况
例如:服务器端分享 /tmp 的情况下,dmtsain 的身份还是会保持 501 但建立的各项数据在服务器端来看,就会属于无拥有者的资料
4.如果使用者身份是 root 时,如果以root的身份去存取服务器端的文件系统时,那服务器端的数据就没有任何的保证了,所以预设下root的身份会被主动的压缩为匿名者
总之,客户端使用者能做的事情是与 UID 及其 GID 有关的,那当客户端与服务器端的 UID 及账号的对应不一致时, 可能就会造成文件系统使用上的困扰,这个就是 NFS 文
件系统在使用上面的一个很重要的地方,而在了解使用者账号与UID及文件系统的关系之后,要实际在客户端以 NFS 取用服务器端的文件系统时, 你还得需要具有:
NFS 服务器有开放可写入的权限 (与 /etc/exports 设定有关);
实际的档案权限具有可写入 (w) 的权限。
当满足了使用者账号,亦即UID的相关身份,NFS 服务器允许有写入的权限;文件系统确实具有 w 的权限时,,你才具有该档案的可写入权限,由于有账号的关系,所以
NFS 通常需要与 NIS 这一个可以确认客户端与服务器端身份一致的服务搭配使用,以避免身份的错乱
NFS Server 端的设定
要设定好 NFS 服务器我们必须要有两个软件才行,一个是RPC主程序:rpcbind, 我们的NFS就是【rpcbind】这个服务所负责的,在启动任何一个RPC服务之前,我们都要
启动rpcbind才行,在 CentOS 6.x 之后才称为 rpcbind 的,NFS 主程序:nfs-utils:就是提供rpc.nfsd及rpc。mountd这两个NFS daemons与其他相关的documents与
说明文件,执行文件等的软件!这个就是 NFS 服务所需要的主要软件啦!我们先用RPM看一下有没有rpcbind 与 nfs 相关的软件
简单的使用『 rpm -qa | grep nfs 』与『 rpm -qa | grep rpcbind 』,如果没有安装的话,在 CentOS 内可以使用『 yum install nfs-utils 』来安装!
NFS 的软件结构,提到NFS软件中,配置文件只有一个,执行档也不多,记录文件也三三两两而已,
主要配置文件:/etc/exports ,这个档案就是NFS的主要配置文件了,不过,系统并没有默认值,所以这个档案也许会不存在,此时可以使用vim主动的去建立这个档案
NFS 文件系统维护指令:/usr/sbin/exportfs,这个是维护 NFS 分享资源的指令,我们可以利用这个指令重新分享 /etc/exports 变更的目录资源、将NFS分享的目录卸载或
重新分享等等,这个指令是NFS系统里面相当重要的一个。
分享资源的登录档:/var/lib/nfs/*tab,NFS服务器的登陆文件都放置到/var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档,一个是etab,记录了NFS所分享出来的目录
的完整权限设定值;另一个xtab则是记录曾经链接到此NFS服务器的相关客户端数据
客户端查询服务器分享资源指令:/usr/sbin/showmount ,exportfs 是用在NFS Server 端,showmount 主要用在 Client 端。showmount 可以察看 NFS 分享出来的目录资源
/etc/exports 配置文件的语法与参数,NFS 服务器的架设只要编辑好主要配置文件 /etc/exports 之后,先启动 rpcbind (若已经启动了,就不要重新启动),然后再启动 nfs,
你的 NFS 就成功,不过这样的设定能否对客户端生效?那就得要考虑你权限方面的设定能力了。/etc/exports 档案没有的话需要自行手动的建立他
vim /etc/exports
/tmp 192.168.100.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync)
[分享目录] [第一部主机(权限)] [可用主机名] [可用通配符]
以上的目录可以依照不同的权限分享给不同的主机,上面要将 /tmp 分别分享给三个不同的主机或网域的意思,要在小括号 () 设计权限参数,若权限参数不止一个时,则以逗
号 (,) 分开。且主机名与小括号是连在一起的,在这个档案内也可以利用 # 来批注,至于主机名的设定主要有几个方式:可以使用完整的 IP 或者是网域192.168.100.10 或
192.168.100.0/24或 192.168.100.0/255.255.255.0都可以接受,也可以使用主机名,前提是这个主机名要在/etc/hosts 内,或可使用 DNS 找到该名称才行,反正重点是可
找到 IP 就是了,如果是主机名的话,那么他可以支持通配符,例如 * 或 ? 均可接受
至于权限方面 (就是小括号内的参数) 常见的参数则有:
rw ro 该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关
sync async sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘
no_root_squash root_squash 客户端使用NFS文件系统的账号为root时,系统会根据这个账号判断,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody
如此对服务器的系统会较有保障,但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行
all_squash 不论登入NFS的使用者为何,他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody)
anonuid anongid anon 意指 anonymous (匿名者),前面关于*_squash 提到的匿名用户的 UID 设定值通常是nobody(nfsnobody),你也可以自行设定这个UID的值,当然
这个UID必须要存在与你的/etc/passwd 当中,anonuid 指的是 UID 而 anongid 则是群组的 GID
例题一:让 root 保有 root 的权限 vim /etc/exports 任何人都可以用我的 /tmp ,用通配符来处理主机名,重点在 no_root_squash的设定 /tmp *(rw,no_root_squash)
例题二:同一目录针对不同范围开放不同权限 mkdir /home/public setfacl -m g:vbirdgroup:rwx /home/public设定这个目录给予vbirdgroup群组的特殊权限是rwx
vim /etc/exports /tmp *(rw,no_root_squash) /home/public 192.168.100.0/24(rw) *(ro) 设定只有我的局域网络 192.168.100.0/24 这个网域且加入 vbirdgroup群组的用户
可以能够读写,其他来源则只能读取,IP 或网段就只能用 192.168.100.0/24 的状况,不可以使用 192.168.100.*
例题三:仅给某个单一主机使用的目录设定,我要将一个私人的目录 /home/test 开放给 192.168.100.10 这个 Client 端的机器来使用时,假设使用者身份是dmtsai 才具有完
整权限,mkdir /home/test setfacl -m u:dmtsai:rwx /home/test vim /etc/exports 在实例二之上加上/home/test 192.168.100.10(rw)
例题四:开放匿名登录的情况 我要让 *.centos.vbird 网域的主机,登入我的 NFS 主机时,可以存取 /home/linux ,但是他们存数据的时候,我希望他们的 UID 与 GID 都变
成 45 这个身份的使用者,假设我 NFS 服务器上的 UID 45 与 GID 45 的用户/组名为 nfsanon。groupadd -g 45 nfsanon useradd -u 45 -g nfsanon nfsanon
mkdir /home/linux setfacl -m u:nfsanon:rwx /home/linux vim /etc/exports 在实例三之上加上 /home/linux *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
启动 NFS, NFS 的启动还需要 rpcbind 的协助才行 /etc/init.d/rpcbind start /etc/init.d/nfs start /etc/init.d/nfslock start chkconfig rpcbind on
chkconfig nfs on chkconfig nfslock on 那个 rpcbind 根本就不需要设定!只要直接启动它,会出现一个 port 111 的 sunrpc 的服务,那就是 rpcbind
至于 nfs 则会启动至少两个以上的 daemon 出现,然后就开始在监听 Client 端的需求,如果想要一些NFS服务器的数据一致性功能时,可以用到rpc.lockd 及 rpc.statd 等
RPC 服务,那么或许你可以增加一个服务,那就是 nfslock,启动之后,请赶快到 /var/log/messages 里面看看有没有被正确的启动 tail /var/log/messages
最后去查看一下NFS到底开了哪些端口:netstat -tulnp| grep -E '(rpc|nfs)',从结果中看出主要的埠口是:1.rpcbind 启动的 port 在 111 ,同时启动在 UDP 与 TCP;
2. nfs 本身的服务启动在 port 2049 上头!3. 其他 rpc.* 服务启动的 port 则是随机产生的,因此需向 port 111 注册,可以使用rpcinfo来查看每个RPC服务的注册状况
rpcinfo -p [IP|hostname]
rpcinfo -t|-u IP|hostname 程序名称
选项与参数:
-p :针对某 IP (未写则预设为本机) 显示出所有的 port 与 porgram 的信息;
-t :针对某主机的某支程序检查其 TCP 封包所在的软件版本;
-u :针对某主机的某支程序检查其 UDP 封包所在的软件版本;
rpcinfo -p localhost 程序代号 NFS版本 封包类型 埠口 服务名称
# 2. 针对 nfs 这个程序检查其相关的软件版本信息 (仅察看 TCP 封包)
rpcinfo -t localhost nfs # 可发现提供 nfs 的版本共有三种,分别是 2, 3, 4 版呦,如果执行rpcinfo无法输出,那就表示注册的数据有问题,可能需要重新启动rpcbind nfs
NFS 的联机观察
在你的 NFS 服务器设定妥当之后,我们可以在 server 端先自我测试一下是否可以联机,利用showmount这个指令来查阅
showmount [-ae] [hostname|IP]
选项与参数:
-a :显示目前主机与客户端的 NFS 联机分享的状态;
-e :显示某部主机的 /etc/exports 所分享的目录数据。
1. 请显示出刚刚我们所设定好的相关 exports 分享目录信息 执行 showmount -e localhost (IP (或hostname)) 这样就可以扫描某一部主机提供的NFS分享的目录了,
这也是 NFS client 端最常用的指令,在 /etc/exports 只是比较特别的权限参数而已,还有很多预设参数是在/var/lib/nfs/etab中的, tail /var/lib/nfs/etab 透过这个指令可以分析
anonuid=65534 对比 /etc/passwd 后,会发现 CentOS 出现的是 nfsnobody,这个账号在不同的版本都可能会不一样,另外,如果有其他客户端挂载了你的 NFS 文件系统
时,那么该客户端与文件系统信息就会被记录到 /var/lib/nfs/xtab 里头去的。
如果你想要重新处理 /etc/exports 档案时,不需要重新启动nfs,只要执行exportfs 这个指令来帮忙,exportfs [-aruv] 选项与参数:
-a :全部挂载(或卸除) /etc/exports 档案内的设定
-r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的内容
-u :卸除某一目录
-v :在 export 的时候,将分享的目录显示到屏幕上!
# 1. 重新挂载一次 /etc/exports 的设定 exportfs -arv
# 2. 将已经分享的 NFS 目录资源,通通都卸除 exportfs -auv 这样再使用showmount -e localhost 就会看不到任何资源了
还有需要注意的是如果你仅有处理配置文件,但没有相对应的目录(/home/public 等目录) 可以提供使用时,会出现警告讯息的,所以要记得建立分享的目录才对
NFS 的安全性,防火墙的设定问题与解决方案:
一般来说,NFS的服务仅会对内部网域开放,不会对因特网开放的,不过有特殊情况的时候,那么也可能跨不同网域的,但是此时的NFS的防火墙就特别难搞了
因为除了固定的 port 111, 2049 之外, 还有很多不固定的端口是由rpc.mountd, rpc.rquotad 等服务所开启的,所以你的iptables就很难设定规则了,此时CentOS6有提供
一个固定特定NFS服务的端口配置文件,那就是/etc/sysconfig/nfs ,这个档案里面就能够指定特定的端口,这样每次启动nfs时,相关服务启动的端口会是固定的
如此一来,防火墙就能正确设置了,不过这个配置文件内容很多,绝大部分的数据你都不要去修改,只要改跟PORT这个关键词有关的数据即可,那么需要更改的rpc服务有
哪些?主要有mountd,rquotad,nlockmgr这三个,所以应该这么改:
vim /etc/sysconfig/nfs
RQUOTAD_PORT=1001 <==约在 13 行左右
LOCKD_TCPPORT=30001 <==约在 21 行左右
LOCKD_UDPPORT=30001 <==约在 23 行左右
MOUNTD_PORT=1002 <==约在 41 行左右
# 记得设定值最左边的批注服务要拿掉之外,埠口的值你也可以自行决定。
/etc/init.d/nfs restart 接着再次查看这三个rpc服务所开启的端口是否有变化 rpcinfo -p | grep -E '(rquota|mount|nlock)'
如果想要开放NFS给别的网域的朋友使用,又不想要让对方拥有其他服务的登入功能,那么你的防火墙就要开放上述的十个端口,假设要开放120.114.140.0/24 这个网域的人能
够使用你这部服务器的 NFS 的资源,且假设你已经使用防火墙脚本, 那么你还得要这样做才能够针对该网域放行
vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -p tcp -s 120.114.140.0/24 -m multiport --dport 111,2049,1001,1002,30001 -j ACCEPT
iptables -A INPUT -i $EXTIF -p udp -s 120.114.140.0/24 -m multiport --dport 111,2049,1001,1002,30001 -j ACCEPT
接着查看一下 /usr/local/virus/iptables/iptables.rule 总是要重新执行这样防火墙规则才会顺利的生效
使用 /etc/exports 设定更安全的权限:要在便利与安全之间找到平衡点,善用 root_squash 及 all_squash 等功能,再利用 anonuid等等的设定来规范登入你主机的用户身份
应该还是有办法提供一个较为安全的NFS服务器的,当然你的NFS服务器的文件系统之权限设定也需要留意,不要随便设定成为 -rwxrwxrwx,这样会造成你的系统很大的困扰
更安全的 partition 规划:当在安装Linux的时候,最好规划出一块partition作为预留之用,因为【NFS可以针对目录来分享】因此,你可以将预留的partition挂载在任何一个
挂载点,再将该挂载点(就是目录)由/etc/exports的设定中去分享出去,那么整个工作环境中的其他Linux主机就可以使用该NFS服务器的那块预留的partition了,所以主机规划
上面,主要需要留意的只是partition而已,由于分享的partition 可能较容易被入侵,最好可以针对该 partition 设定比较严格的参数在/etc/fstab 当中,此外,你的磁盘分割不要
使用懒人分割法将系统只分割出boot分区与根分区,这样,万一你分享的是/home目录,而一旦你的home目录被塞爆了,你的系统将会造成无法读写的困扰,因此一个良好
的分割计划,或是利用磁盘配额来限制还是很重要的
NFS 服务器关机前的注意事项,由于NFS使用的这个RPC服务,当客户端连上服务器时,此时你的服务器想要关机,那就是不可能的任务了,如果你的服务器上面还有客户端
的联机,此时要关机估计要等到数个小时才能正常的关机成功,这是因为你的NFS想要关机之前,能先『关掉 rpcbind 与 nfs 』这两个东西,如果无法正确的将这两个daemons
关掉,那就先以netstat -utlp 找出PID ,然后以 kill 将他关掉先,这样才有办法的正常关机,当然啦,你也可以利用 showmount -a localhost 来查出来那个客户端还在联机,
或者查阅/var/lib/nfs/rmtab 或 xtab 等档案来检查亦可,找到这些客户端后,可以直接call他们,事实上,客户端以NFS联机到服务器端时,如果他们可以下达一些比较不那么
【硬】的挂载参数时,就能够减少这方面的问题了
NFS 客户端的设定
服务器端可以架设防火墙来保护自己的文件系统,那么客户端挂载该文件系统后,如何保护自己:
手动挂载 NFS 服务器分享的资源,可以这么做:
1 确认本地端已经启动了rpcbind服务
2 扫描NFS服务器分享的目录有哪些,并了解我们可以使用的(showmount);
3 在本地端建立预计要挂载的挂载点目录(mkdir)
4. 利用mount将远程主机直接挂载到相关目录
现在假设客户端在 192.168.100.10 这部机器上,而服务器是192.168.100.254,操作步骤:
# 1. 启动必备的服务:若没有启动才启动,有启动则保持原样不动。 /etc/init.d/rpcbind start /etc/init.d/nfslock start 一般来说rpcbind预计是启动的,而nfslook服务端有启动才启
# 2. 查询服务器提供哪些资源给我们使用呢? showmount -e 192.168.100.254 接着就将远程主机的 /home/public 挂载到本地端主机的 /home/nfs/public ,
# 3. 建立挂载点,并且实际挂载看看啰! mkdir -p /home/nfs/public mount -t nfs 192.168.100.254:/home/public /home/nfs/public 注意挂载的语法!『 -t nfs 』指定文件系统类型
# 4. 总是得要看看挂载之后的情况如何,可以使用 df 或 mount 啦! 执行df去检查,挂载后,当进入你的目录/home/nfs/public 就等于到了 192.168.100.254那部远程主机的
/home/public 那个目录中,那么如何将挂载的 NFS 目录卸除呢?就使用 umount 啊 umount /home/nfs/public
客户端可处理的挂载参数与开机挂载
挂载之后,有可能伴随着你挂载到本机/home/nfs/public 的文件系统当中,含有一支 script ,且这支 script 的内容为『 rm -rf / 』且该档案权限为 555,如果好奇的去执行一下,那
你的整个系统就会被杀惨了啊,所以,除了NFS服务器需要保护外,我们取用人家的NFS文件系统也需要自我保护才行,那如何自我保护,可以透过mount的指令参数
suid nosuid 如果挂载的partition上面有任何SUID的binary程序时,你只要用nosuid就可以取消SUID的功能了
rw ro 你可以指定该文件系统是只读或可擦写,服务器可以系统给你撰写,但是客户端可以仅允许只读的参数设定值
dev nodev 是否可以保留装置档案的特殊功能,一般来说只有/dev这个目录才会有特殊的装置,因此可以选择nodev
exec noexec 是否具有执行binary file的权限,如果想要挂载的仅是数据区例如/home,那么可以选择noexec
user nouser 是否允许用户进行档案的挂载与卸除功能,如果要保护文件系统,最好不要提供使用者进行挂载与卸除
auto noauto 这个auto指的是【mount -a】时,会不会被挂载的项目,如果你不需要这个partition随时被挂载,可以设定为noauto
一般来说,如果你的NFS服务器所提供的只是类似/home底下的个人资料,应该不需要可执行,SUID与装置档案,因此当你在挂载的时候,可以这样执行
umount /home/nfs/public
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.100.254:/home/public /home/nfs/public
mount | grep addr 这样一来你所挂载的这个文件系统只能作为资料存取之用,相对来说,对于客户端是比较安全一些,所以这个nosuid,noexec,nodev等等的参数可要记得
关于 NFS 特殊的挂载参数
除了上述的mount参数之外,其实针对NFS服务器,linux还提供不少有用的额外参数,例如:你的NFS服务器与客户端之间的联机因为网络问题,或者服务器端先关机了,却
没有通知客户端,那么客户端只要动到文件系统的指令(例如 df, ls, cp 等等) ,整个系统就会慢到爆,因为你必须要等到文件系统搜寻等待逾时后,系统才会饶了你,等待df指令
30分钟也是就可能的,为了避免这些困扰,我们还有一些额外的NFS挂载参数可用
fg bg 当执行挂载时,该挂载的行为会在前景还是背景执行,若在前景执行时, mount会持续尝试挂载,直到成功或time out为止,若为背景执行,则mount会在背景持续多次
进行mount,而不会影响到前景的程序的操作,如果你的网络联机有点不稳定,或是服务器常常需要开关机,那建议使用bg比较妥当
soft hard 如果是hard的情况,则两者之间有任何一部主机脱机,则RPC会持续的呼叫,直到对方恢复联机为止,如果是soft的话,那RPC会在time out 后重复呼叫,而非持续
呼叫,因此系统的延迟会比较不这么明显,同上,如果服务器可能开开关关,建议用soft
intr 当你使用上头提到的hard方式挂载时,若加上intr这个参数,则当RPC持续呼叫中,该次的呼叫是可以被中断的
rsize wsize 读出(rsize)与写入(wsize)的区块大小 (block size),这个设定值可以影响客户端与服务器端传输数据的缓冲记忆容量,一般来说,如果是局域网,并且客户端与服务
器端都具有足够的内存,那这个设定值可以大一点,比如32768 (bytes) 等,提升缓冲记忆区块将可提升 NFS 文件系统的传输能力,但是注意设定的值也不要太大,最好是达到
网络能够传输的最大值为限,更多的参数可以参考 man nfs 的输出数据,一般如果你的NFS是用在高速运作的环境当中的话,可以建议加上这些参数:
umount /home/nfs/public
mount -t nfs -o nosuid,noexec,nodev,rw -o bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/public /home/nfs/public
当你的 192.168.100.254 这部服务器因为某些因素而脱机时,,你的 NFS 可以继续在背景当中重复的呼叫! 直到 NFS 服务器再度上线为止,对于系统的持续操作还是有帮助的
当然啦,那个 rsize 与 wsize 的大小则需要依据你的实际网络环境而定
将 NFS 开机即挂载:开机就挂载的挂载点与相关参数是写入/etc/fstab 中的,那 NFS 能不能写入 /etc/fstab 当中呢?非常可惜的是, 不可以呢!为啥呢?分析下开机的流程
我们发现网络的启动是在本机挂载之后,因此当你利用/etc/fstab 尝试挂载NFS 时,系统由于尚未启动网络,所以肯定是无法挂载成功的啦 那怎办?!就写入 /etc/rc.d/rc.local即可
vim /etc/rc.d/rc.local
mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/public /home/nfs/public
无法挂载的原因分析
客户端的主机名或 IP 网段不被允许使用:
服务器或客户端某些服务未启动: 如果你使用 ping 却发现网络与服务器都是好的,那么这个问题就是rpcbind 没有开啦
要嘛就是 rpcbind 忘记开 (第一个错误),要嘛就是服务器端的 nfs 忘记开,最麻烦的是,重新启动了rpcbind 但是却忘记重新启动其他服务 (上述第二个错误)
解决的方法就是去重新启动 rpcbind 管理的其他所有服务就是
被防火墙档掉了 由于NFS几乎不对外开放,而内部网域又通常是全部的资源都放行, 因此过去玩NFS的朋友,都不会注意NFS防火墙问题,所以,若你一直无法顺利的链接
NFS服务器,请先到服务器端,将客户端的IP完全开放,若确定这样就链得上,那代表就是防火墙有问题了,
自动挂载 autofs 的使用 在一般NFS文件系统的使用情况中,如果客户端要使用服务器端所提供的NFS文件系统时,要么就是在/etc/rc.d/rc.loacl当中设定开机时挂载
要么就是登入背后手动利用mount来挂载,此外,客户端得要预先手动的建立好挂载点目录,然后挂载上来,这样的使用情况恐怕有点小问题
NFS服务器与客户端的联机或许不会永远存在,而RPC这个服务,如果挂载NFS服务器后,任何一方脱机可能会造成另外一方老是在等待,而且,挂载的NFS文件系统可能
又不是常常被使用,若又不挂载,有时候紧急的使用要得要通知系统管理员,很不方便,那可不可让使用的时候进行自动挂载,而当NFS文件系统使用完毕后,可不可以让
NFS自动卸除,以避免可能的PRC错误,此时就可以用autofs这个服务
autofs 的设定概念:
这个服务在客户端计算机上面,会持续的侦测某个指定的目录,并预设当使用到该目录下的某个此目录时,将会取得来自服务器端的NFS文件系统资源,并进行自动挂载的动作
我们的 autofs 主要配置文件为 /etc/auto.master, 我只要定义出最上层目录(/home/nfsfile)即可,这个目录就是autofs会一直持续侦测的目录,至于后续的档案则是该目录底下各
次目录的对应,在 /etc/auto.nfs (这个档案的档名可自定义) 里面则可以定义出每个次目录所欲挂载的远程服务器的 NFS 目录资源
例如:当我们在客户端要使用 /home/nfsfile/public 的数据时,此时autofs 才会去 192.168.100.254 服务器上挂载 /home/public,且『当隔了 5 分钟没有使用该目录下的数据后,则
客户端系统将会主动的卸除/home/nfsfile/public,用到服务器的数据时才自动挂载,没有使用了就会自动卸除! 而不是传统的情况一直是挂载
建立主配置文件 /etc/auto.master ,并指定侦测的特定目录,这个文件主要是持续侦测的目录及【数据对应文件】即可,那个数据对应文件的文件名是可以自行设定的,这里使用
/etc/auto.nfs 来命名 vim /etc/auto.master /home/nfsfile /etc/auto.nfs
上述数据中比较需要注意的是,那个 /home/nfsfile 目录不需要存在,因为 autofs 会主动的建立该目录! 如果你建立了,可能反而会出问题
建立数据对应文件内 (/etc/auto.nfs) 的挂载信息与服务器对应资源,这个档案是要自己创建的,档案的格式如下:
[本地端次目录] [-挂载参数] [服务器所提供的目录]
选项与参数:
[本地端次目录] :指的就是在 /etc/auto.master 内指定的目录之次目录
[-挂载参数]:就是前一小节提到的 rw,bg,soft 等等的参数啦!可有可无;
[服务器所提供的目录] :例如 192.168.100.254:/home/public 等
vim /etc/auto.nfs
public -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/public
testing -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/test
temp -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/tmp
# 参数部分,只要最前面加个 - 符号即可! 这样就可以建立对应了,不过要注意,那些 /home/nfsfile/public 是不需要事先建立的! 咱们的 autofs 会事情况来处理
实际运作与观察 配置文件设定妥当后,当然就是要启动 autofs 啦 /etc/init.d/autofs stop /etc/init.d/autofs start ntOS 6.x 的 autofs 使用 restart 会失效
假设目前没有挂载任何来自 192.168.100.254 这部 NFS 服务器的资源目录,先看看 /home/nfsfile 会不会主动的被建立,然后,如果我要进入 /home/nfsfile/public 时的变化
ll -d /home/nfsfile 你会发现这个目录的容量是0 ,那是正常的!因为是 autofs建立的
cd /home/nfsfile/public进入目录后,查看mount | grep nfsfile 可以看到254的/home/nfsfile/public目录已经被挂载到本机了,df /home/nfsfile/public 也可以看到
案例演练:在练习之前,先将服务器的NFS设定数据都删除,但是保留 rpcbind 不可关闭。至于客户端的环境下, 先关闭 autofs 以及取消之前在
/etc/rc.d/rc.local 里面写入的开机自动挂载项目,同时删除/home/nfs 目录
模拟的环境状态中,服务器端的想法如下
1. 服务器的 IP 为 192.168.100.254 这一部;
2. /tmp分享为可擦写,并且不限制使用者身份的方式,分享给所有192.168.100.0/24 这个网域中的所有计算机
3. /home/nfs 分享的属性为只读,可提供除了网域内的工作站外, Internet向亦提供数据内容;
4. /home/upload 做为 192.168.100.0/24 这个网域的数据上传目录,其中,这个 /home/upload 的使用者及所属群组为 nfs-upload 这个名字,他的 UID与 GID 均为 210;
5. /home/andy 这个目录仅分享给 192.168.100.10 这部主机,以提供该主机上面 andy 这个用户来使用,也就是说, andy 在 192.168.100.10 及
192.168.100.254 均有账号,且账号均为 andy ,所以预计开放 /home/andy 给andy 使用他的家目录
操作开始:
1. 首先,就是要建立 /etc/exports 这个档案的内容啰,你可以这样写吧!
vim /etc/exports
/tmp 192.168.100.0/24(rw,no_root_squash)
/home/nfs 192.168.100.0/24(ro) *(ro,all_squash)
/home/upload 192.168.100.0/24(rw,all_squash,anonuid=210,anongid=210)
/home/andy 192.168.100.10(rw)
2.再来,就是建立每个对应的目录的实际Linux权限,
tmp ll -d /tmp
/home/nfs mkdir -p /home/nfs chmod 755 -R /home/nfs
/home/upload groupadd -g 210 nfs-upload useradd -g 210 -u 210 -M nfs-upload 先建立对应的账号与组名及 UID mkdir -p /home/upload chown -R
nfs-upload:nfs-upload /home/upload 修改拥有者,如此,则用户与目录的权限都设定妥当了
/home/andy useradd andy ll -d /home/andy
这样子一来,权限的问题大概就可以解决 重新启动 nfs 服务: /etc/init.d/nfs restart
在 192.168.100.10 这部机器上面演练一下
# 1. 确认远程服务器的可用目录: showmount -e 192.168.100.254
# 2. 建立挂载点: mkdir -p /mnt/{tmp,nfs,upload,andy}
# 3. 实际挂载: mount -t nfs 192.168.100.254:/tmp /mnt/tmp
mount -t nfs 192.168.100.254:/home/nfs /mnt/nfs
mount -t nfs 192.168.100.254:/home/upload /mnt/upload
mount -t nfs 192.168.100.254:/home/andy /mnt/andy
整个步骤大致上就是这样