NFS

NFS概念

NFS:Network File System 网络文件系统,基于内核的文件系统。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure Call Protocol远程过程调用)实现。RPC采用C/S模式。客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进,一般应用于企业内网而不是互联网。
另外,NFS的安全性基于IP认证,很容易伪装可性的IP来访问NFS,所以总体的安全性不高。

NFS拓扑图

NFS特点

rpm -q nfs-utils
/usr/lib/systemd/scripts/nfs-utils_env.sh
/usr/lib/systemd/system-generators/nfs-server-generator
/usr/lib/systemd/system-generators/rpc-pipefs-generator
/usr/lib/systemd/system/auth-rpcgss-module.service
/usr/lib/systemd/system/nfs-blkmap.service
/usr/lib/systemd/system/nfs-client.target
/usr/lib/systemd/system/nfs-config.service
/usr/lib/systemd/system/nfs-idmap.service
/usr/lib/systemd/system/nfs-idmapd.service
/usr/lib/systemd/system/nfs-lock.service
/usr/lib/systemd/system/nfs-mountd.service
/usr/lib/systemd/system/nfs-secure.service
/usr/lib/systemd/system/nfs-server.service
/usr/lib/systemd/system/nfs-utils.service
/usr/lib/systemd/system/nfs.service
/usr/lib/systemd/system/nfslock.service
/usr/lib/systemd/system/proc-fs-nfsd.mount
/usr/lib/systemd/system/rpc-gssd.service
/usr/lib/systemd/system/rpc-statd-notify.service
/usr/lib/systemd/system/rpc-statd.service
/usr/lib/systemd/system/rpc_pipefs.target
/usr/lib/systemd/system/rpcgssd.service
/usr/lib/systemd/system/rpcidmapd.service
/usr/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount

locate nfs.ko
1. 相对复杂的服务,如上述的列表,依赖众多的服务
2. 对外提供的端口不固定,用rpcinfo -p查看
3. 通过rpcbind来管理NFS的临时端口,rpcbind使用固定的端口111
4. Centos7启动systemctl start nfs-server      CentOS6:service nfs start,另外,在CentOS6,启动nfs之前,必须确保rpcbind启动。

NFS配置

/etc/exports主配置文件
    rpm -qf /etc/exports
    setup-2.8.71-9.el7.noarch(exports并不来自nfs-utils安装包,而是来自更基础的setup安装包)
/etc/exportd.d/*.exports 子配置文件
systemctl enable nfs-server
systemctl start nfs-server
format:共享文件夹 who(permission)
exportfs -r (重读配置文件)
exportfs -v (查询已共享的资源)

格式:
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...
主机格式:
1. 单个主机:ipv4,ipv6,FQDN
2. IP networks:两种掩码格式均支持 172.18.0.0/255.255.0.0 or 172.18.0.0/16
3. wildcards:主机名通配,例如*.magedu.com,IP不可以,需要配合DNS解析
4. anonymous:表示使用*通配所有客户端
每个条目指定目录导出到的哪些主机,及相关的权限和选项:
1. 默认选项:(ro,sync,root_squash,no_all_squash)
2. ro,rw 只读和读写
3. async 异步,数据变化后不立即写磁盘,性能高
4. sync(1.0.0后为默认)同步,数据在请求时立即写入共享
5. no_all_squash (默认)保留共享文件的UID和GID
6. all_squash 所有远程用户(包括root)都变成nfsnobody
7. root_squash (默认)远程root映射为nfsnobody,UID为65534,早期版本是4294967294 (nfsnobody)
8. no_root_squash 远程root映射成root用户,如果和all_squash一起配置,all_squash起使用
9. anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非nfsnobody,可配合all_squash使用

NFS客户端

是内核的功能,所有客户端不需要安装第三方的RPM,可以用showmount -e IP(NFS server)
[root@web1 ~]# showmount -e 172.20.42.201
    Export list for 172.20.42.201:
    /data/wordpress 172.20.0.0/16
mkdir /mnt/nfs
mount 172.20.42.201:/data/wordpress /mnt/nfs
mount(检查状态)
172.20.42.201:/data/wordpress on /mnt/nfs type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.20.42.203,local_lock=none,addr=172.20.42.201)
可以指定挂载的版本:
 mount -o vers=3 172.20.42.201:/data/wordpress /mnt/nfs
注意: nfs客户端访问服务器端时: root映射为nfsnobody用户(root_squash),普通用户映射为id相同的用户(no_all_squash)

NFS相关的挂载选项:
    fg(默认)前台挂载,bg后台挂载
    hard(默认)持续请求,soft 非持续请求
    intr 和hard配合,请求可中断
    rsize和wsize 一次读和写数据最大字节数,rsize=32768
    _netdev 无网络不挂载
    例子:mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/
实验:
    服务器端,保持/data/nfs 755,在客户端的/mnt/nfs下root用户无法创建文件;setfacl -m u:nfsnobody:rwx /data/liang/在服务器端,在客户端用root可以在/mnt/nfs下创建文件
    可以配置
    /data/liang     *(rw,no_root_squash),应用于管理员管理多台NFS服务器。

NFS伪根

服务器配置

mkdir -p /app/nfsdir1
mkdir -p /data/nfsdir2
把如上的两个文件夹用伪根共享
mkdir -p /nfsroot/{dir1,dir2}
chown nfsnobody /nfsroot/{dir1,dir2}
vim /etc/fstab
    
    /data/nfsdir2   /nfsroot/dir2   none    bind    0 0
    /app/nfsdir1    /nfsroot/dir1   none    bind    0 0
vim /etc/exports
    /nfsroot *(fsid=0,rw,crossmnt)
    /nfsroot/dir1   *(ro)
    /nfsroot/dir2   *(rw)

客户端

mount 172.20.42.201:/nfsroot /mnt
[root@web1 mnt]# ll /mnt/
    total 0
    drwxr-xr-x 2 root root 21 Jun 26 04:57 dir1
    drwxr-xr-x 2 root root 22 Jun 26 04:57 dir2
cd dir1
echo hello > hello.txt

自动挂载

rpm -ql autofs

挂载规则

相对路径

挂载点分为两部分:/dir/subdir分为/dir和/subdir两部分
auto.master配置文件定义父目录的规则:
    /dir     autofs子配置文件路径
autofs子配置文件:
    /subdir mountdev

绝对路径

auto.master配置文件只定义如下:
    /-    子配置文件
autofs子配置文件
    /dir/subdir mountdev

NFS server

mkdir /data/nfsdir
vim /etc/exports
    /data/nfsdir    *(rw)

NSF client

showmount -e 172.20.42.201
cd /net/
cd 172.20.42.201
    vim /etc/auto.master
    /d1/d2/d3     /etc/test.autofs
vim /etc/test.autofs
    nfs     -fstype=nfs,vers=3,rw   172.20.42.201:/data/nfsdir
systemctl restart autofs
cd /d1/d2/d3/nfs (注意,/d1/d2/d3不需要手动创建,访问即生成)

例子

家目录自动挂载NFS,同一个用户在不同的机器上登录,看到的内容是一致的(相对路径法)

1. 三台server:一台NFS,两台普通服务器,同时两台普通服务器上有相同的用户nfsuser1, nfsuser2
2. NFS服务器
    useradd -d /data/nfs2 -u 2101 nfs2
    useradd -d /data/nfs1 -u 2100 nfs1
    vim /etc/exports
    /data   *(rw)
    exportfs -v
3. 两台普通服务器执行相同的操作
     useradd -u 2100 nfsuser1
    useradd -u 2101 nfsuser2
    mount 172.20.42.201:/data/nfs1 /home/nfsuser1/
    mount 172.20.42.201:/data/nfs2 /home/nfsuser2/
    su - nfsuser1
    touch nfs1 
    在NFS服务器上查看,ll /data/nfs1 nfs1
    自动挂载:
    vim /etc/auto.master
        /home           /etc/test.autofs (/home下的文件夹全部交给autofs来控制)
    vim /etc/test.autofs
        nfsuser1        -fstype=nfs,vers=3,rw   172.20.42.201:/data/nfs1
        nfsuser2        -fstype=nfs,vers=3,rw   172.20.42.201:/data/nfs2
    systemctl restart autofs 
    
    总结:上述方法会导致别的普通用户登录失败,如下:
    ```
    [root@centos7 ~]# su - vmx
    Last login: Tue May 22 16:51:34 CST 2018 from ::ffff:192.168.30.145 on pts/5
    su: warning: cannot change directory to /home/vmx: No such file or directory
    解决的方法用绝对路径法。

家目录自动挂载NFS,同一个用户在不同的机器上登录,看到的内容是一致的(绝对路径)

    1. NFS服务器保持上述的配置        
    2. 普通服务器上
        vim /etc/auto.master
        /-              /etc/test.autofs
        vim /etc/test.autofs
            /home/nfsuser1  -fstype=nfs,vers=3,rw   172.20.42.201:/data/nfs1
            /home/nfsuser2  -fstype=nfs,vers=3,rw   172.20.42.201:/data/nfs2

特殊用法(如果NFS共享的文件夹名字和用户名正好相同,只适用于相对路径的情形)

    1. NFS服务器上
        useradd -d /data/nfsuser3 -u 2102 nfs3
        useradd -d /data/nfsuser4 -u 2103 nfs4
        useradd -d /data/nfs** -u 210* nfs**
    2. 普通服务器上
        useradd -u 2102 nfsuser3
        useradd -u 2103 nfsuser4
        vim /etc/test.autofs
        *       -fstype=nfs,vers=3,rw   172.20.42.201:/data/&

/misc和/net/ip的自动挂载解释

/misc能自动挂载到CDROM

/etc/auto.master: /misc   /etc/auto.misc
/etc/auto.misc: cd              -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom

/net目录能自动访问NFS共享的IP

/etc/auto.master: /net    -hosts

总结:在三种网络共享VSFTP,NFS, SAMBA中,NFS和SAMBA属于文件系统级别, 可以通过挂载的方法实现服务器和客户机之间的网络资源共享,VSFTP是应用层的,需要安装相关的服务器和客户端软件实现。

posted @ 2018-06-26 19:27  Evan_Wolf  阅读(280)  评论(0编辑  收藏  举报