NFS
是NetworkFileSystem的简写,即网络文件系统,网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS。NFS允许一个系统在网络上与他人共享目录和文件,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
14.1 服务端配置NFS
在CentOS上使用NFS服务需要安装两个包nfs-utils
和rpcbind
,使用yum安装nfs-utils时会一并安装rpcbind。
# yum install -y nfs-utils
CentOS 6之前的版本都是安装portmap包,从CentOS开始,改为安装rpcbind包了。
配置NFS,需要编辑配置文件/etc/exports
。
- 首先修改配置文件(默认该文件为空):
# vim /etc/exports #写入下面内容/home/nfstestdir 192.168.100.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
上面配置文件就一行,分为三部分:
- 本地要共享出去的目录
- 允许访问的主机(可以是一个IP,也可以是IP段)
- 小括号里面是一些权限选项
rw 表示读/写
ro 表示只读
sync 同步模式,表示内存中的数据实时写入磁盘
async 非同步模式,表示内存中的数据定期写入磁盘
no_root_squash 加上该选项后,root用户就会对共享的目录拥有最高权限,像操作本机的目录一样
root_squash 与上面对应,表示root用户对共享目录的权限不高,只有普通用户的权限
all_squash 表示不管使用NFS的用户是谁,其身份都被限定为一个指定的普通用户身份
anonuid/anongid 必须和root_squash以及all_squash选项一同使用,用于指定使用NFS的用户被限定后的uid和gid,前提是本机的/etc/passwd中存在相应的uid和gid
- 创建相关目录并启动NFS服务:
# mkdir /home/nfstestdir# systemctl start rpcbind #启动NFS服务之前,要先启动rpcbind服务# ps aux |grep rpcrpc 2487 0.0 0.0 65000 1416 ? Ss 20:36 0:00 /sbin/rpcbind -w
rpcuser 2506 0.0 0.0 42420 1756 ? Ss 20:36 0:00 /usr/sbin/rpc.statd
root 2507 0.0 0.0 0 0 ? S< 20:36 0:00 [rpciod]root 2513 0.0 0.0 19360 404 ? Ss 20:36 0:00 /usr/sbin/rpc.idmapd
root 2526 0.0 0.0 42608 940 ? Ss 20:36 0:00 /usr/sbin/rpc.mountd
root 2600 0.0 0.0 112720 984 pts/0 S+ 20:45 0:00 grep --color=auto rpc# systemctl start nfs# ps aux |grep nfsroot 2536 0.0 0.0 0 0 ? S< 20:36 0:00 [nfsd4_callbacks]root 2542 0.0 0.0 0 0 ? S 20:36 0:00 [nfsd]root 2543 0.0 0.0 0 0 ? S 20:36 0:00 [nfsd]root 2544 0.0 0.0 0 0 ? S 20:36 0:00 [nfsd]root 2545 0.0 0.0 0 0 ? S 20:36 0:00 [nfsd]root 2546 0.0 0.0 0 0 ? S 20:36 0:00 [nfsd]root 2547 0.0 0.0 0 0 ? S 20:36 0:00 [nfsd]root 2548 0.0 0.0 0 0 ? S 20:36 0:00 [nfsd]root 2549 0.0 0.0 0 0 ? S 20:36 0:00 [nfsd]root 2602 0.0 0.0 112720 984 pts/0 R+ 20:46 0:00 grep --color=auto nfs# systemctl enable rpcbind #使其开机启动# systemctl enable nfsCreated symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
14.2 客户端挂在NFS
本实验需要两台机器,我用的两台机器的IP分别为192.168.100.140 和192.168.100.150,其中提供NFS服务的是192.168.100.140。在客户端挂载NFS之前,给客户端也安装nfs-utils。
- 先在客户端查看服务端共享了哪些目录:
# showmount -e 192.168.100.140 #使用命令 showmount -e IP 就可以查看NFS的共享情况clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host) #这里有报错,113端口不通,防火墙导致# systemctl stop firewalld #这一步在服务端操作,关掉防火墙,最好也关掉SElinux# showmount -e 192.168.100.140 #这一步在客户端操作,再次查看服务端NFS的共享情况Export list for 192.168.100.140:
/home/nfstestdir 192.168.100.0/24 #可以看到之前服务器端共享的目录和IP段
- 然后在客户端上挂在NFS:
# mount -t nfs 192.168.100.140:/home/nfstestdir /mnt/ # -t nfs 指定挂载的类型为nfs# df -h 文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 16G 3.4G 13G 22% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.7M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda1 197M 113M 85M 58% /boot
tmpfs 378M 0 378M 0% /run/user/0
192.168.100.140:/home/nfstestdir 16G 3.4G 13G 22% /mnt #这里可以看到刚挂载的/mnt分区
- 进入/mnt/目录下,创建测试文件:
# cd /mnt/# touch lzx.txttouch: 无法创建"lzx.txt": 权限不够 #这是因为之前服务端创建的/home/nfstestdir目录权限不合适,挂载后等于被限制uid为1000的用户# chmod 777 /home/nfstestdir/ #服务端操作,修改目录权限# touch lzx.txt #客户端操作,就可以创建文件了# ls -l总用量 0
-rw-r--r--. 1 mysql mysql 0 7月 12 21:07 lzx.txt #说明mysql用户的uid和gid都为1000# tail 10 /etc/passwd #服务端查看验证tail: 无法打开"10" 读取数据: 没有那个文件或目录==> /etc/passwd <==systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/sbin/nologin #这里mysql用户的uid和gid为1000rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin# id mysql #客户端查看uid=1000(mysql) gid=1000(mysql) 组=1000(mysql)
可以看到,新创建的文件lzx.txt所有者和所属组都为mysql,其uid和gid都为1000。
14.3 命令exportfs
exportfs
命令常用参数:
-a 表示全部挂载或者卸载
-r 表示重新挂载
-u 表示卸载某一个目录
-v 表示显示共享的目录
当改变/etc/exports
配置文件后,使用exportfs命令挂载不需要重启NFS服务。下面做个测试。
- 首先修改服务端配置文件:
# vim /etc/exports #增加下面一行/tmp/ 192.168.100.0/24(rw,sync,no_root_squash)
- 服务端执行exportfs命令:
# exportfs -arv #服务端直接执行,-arv选项可以直接查看新共享的目录,而不需要重启NFS服务exporting 192.168.100.0/24:/tmp
exporting 192.168.100.0/24:/home/nfstestdir# showmount -e 192.168.100.140 #客户端查看Export list for 192.168.100.140:
/tmp 192.168.100.0/24
/home/nfstestdir 192.168.100.0/24
上面已经用到了mount命令,-t nfs
指定挂载类型为nfs,另外还有-o nolock
(即不加锁)选项。
- 在客户端执行命令:
# mkdir /lzx# mount -t nfs -o nolock 192.168.100.140:/tmp/ /lzx/
- 可以在客户端上把要挂载的目录写到
/etc/fstab
文件中,然后挂载时只需要执行mount -a
命令:
192.168.100.140:/tmp/ /lzx nfs defaults,nolock 0 0 #增加该行
- 之前挂载了NFS,需要先卸载:
# umount /lzx
- 然后重新挂载:
# mount -a
这样操作的好处就是以后开机会自动挂载NFS。
还有,服务端之前设置了no_root_squash参数,表示不限制root用户,它在共享目录下创建文件和在本机创建一样。
# cd /lzx/# lsmysql.sock systemd-private-29c690273acd4d8c9e9a6536e096bfae-chronyd.service-ZSMTXM# ls -l总用量 0
srwxrwxrwx. 1 mysql mysql 0 7月 12 20:27 mysql.sock
drwx------. 3 root root 17 7月 12 17:50 systemd-private-29c690273acd4d8c9e9a6536e096bfae-chronyd.service-ZSMTXM# touch 1.txt# ll总用量 0
-rw-r--r--. 1 root root 0 7月 12 21:43 1.txt #这里的属主和属组都是rootsrwxrwxrwx. 1 mysql mysql 0 7月 12 20:27 mysql.sock
drwx------. 3 root root 17 7月 12 17:50 systemd-private-29c690273acd4d8c9e9a6536e096bfae-chronyd.service-ZSMTXM
14.4 NFS客户端问题
NFS有2、3、4三个大版本,NFS4可能会存在客户端文件属主属组为nobody的问题。
客户端在挂载共享目录后,不管是root用户还是普通用户,在创建文件时属主、属组为nobody。
两种方法解决该问题:
-
客户端挂载时加上
-o nfsvers=3
,指定NFS版本为3; -
客户端和服务端都修改 /etc/idmapd.conf 文件,把
#Domain = local.domain.edu
改为Domain = xxx.com
(这里xxx.com自定义),然后重启rpcidmapd
服务(CentOS 7直接重启rpcbind
服务即可)。
更多资料参考:
详细讲解NFS配置过程
NFS搭建、配置及故障排除详解