网络文件系统(NFS)
类似于Windows中的网络共享功能,Linux系统也提供了多种网络文件共享方法,常见的有NFS、Samba和FTP。
本章首先介绍网络文件系统NFS的安装与配置,然后介绍文件服务器Samba的安装与设置,最后介绍常用的FTP软件的安装与配置。通过本章,用户可以了解Linux系统中常见的几种网络文件共享方式。
本章主要涉及的知识点有:
- NFS的安装与使用
- Samba的安装与使用
- FTP软件的安装与使用
网络文件系统(NFS)
NFS(Network File System的简称,即网络文件系统)是一种分布式文件系统,允许网络中不同操作系统的计算机间共享文件,其通信协议定基于TCP/IP协议层,可以将远程的计算机磁盘挂载到本地,读写文件像本地磁盘一样操作。
NFS简介
NFS在文件传送或信息传送过程中依赖于RPC(Remote Procedure Call,远程过程调用协议)。RPC协议可以在不同的系统间使用,此通信协议设计与主机及操作系统无关。使用NFS时用户端只需使用mount
命令就可以把远程文件系统挂接到自己的文件系统之下,操作远程文件如使用本地计算机上的文件一样。NFS本身可以认为是RPC的一个程序。只要用到NFS的地方都要启动RPC服务,不论是服务端还是客户端,NFS是一个文件系统,而RPC负责信息的传输。
例如在服务器上,要把远程服务器**192.168.3.101**
上的/nfsshare
挂载到本地目录可以执行如下命令:
mount 192.168.3.101:/nfsshare /nfsshare
当挂载成功后,本地上**/nfsshare**
目录下如果有数据,则原有的数据都不可见,用户看到的是远程主机**192.168.3.101**
上面的**/nfsshare**
目录文件列表。
配置NFS服务器
NFS的安装需要两个软件包,通常情况下是作为系统的默认包安装的,版本因为系统的不同而不同。
nfs-utils-1.3.0-0.65.el7.x86_64.rpm
包含一些基本的NFS命令与控制脚本。**rpcbind-0.2.0-48.el7.x86_64.rpm**
是一个管理RPC连接的程序,类似的管理工具为portmap
。
安装方法如【示例1-1】所示。
【示例1-1】
#首先确认系统中是否安装了对应的软件
[root@node1 ~]# rpm -qa | grep -i nfs
#在有网络的情况下使用yum工具安装nfs、rpcbind软件包
[root@node1 ~]# yum install -y nfs-utils rpcbind
......
#安装的主要文件列表
[root@node1 ~]# rpm -qpl nfs-utils-1.3.0-0.65.el7.x86_64.rpm #这一行有问题,输入后显示error
/etc/exports.d
/etc/nfsmount.conf
/etc/request-key.d/id_resolver.conf
/etc/sysconfig/nfs
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/osd_login
/sbin/rpc.statd
/sbin/umount.nfs
......
在安装好软件之后,接下来就可以配置NFS服务器了,配置之前先了解下NFS主要的文件和进程。
(1)**nfs**
有的发行版名字叫做nfsserver
,主要用来控制NFS服务的启动和停止,安装完毕后位于/etc/init.d
目录下。
(2)**rpc.nfsd**
是基本的NFS守护进程,主要功能是控制客户端是否可以登录服务器,另外可以结合**/etc/hosts.allow**
和**/etc/hosts.key**
做更精细的权限控制。
(3)**rpc.mountd**
是RPC安装守护进程,主要功能是管理NFS的文件系统。通过配置文件共享指定的目录,同时根据配置文件做一些权限验证。
(4)**rpcbind**
是一个管理RPC连接的程序,**rpcbind**
服务对NFS是必需的,因为是NFS的动态端口分配守护进程,如果**rpcbind**
不启动,NFS服务则无法启动。类似的管理工具为**portmap**
。
(5)**exports**
如果修改了**/etc/exports**
文件后不需要重新激活NFS,只要重新扫描一次**/etc/exports**
文件,并且重新将设定加载即可。**exports**
参数说明如表5.1所示。
表1.1 exports命令常用参数说明
参数 | 说明 |
---|---|
-a | 全部挂载/etc/exports文件内的设置 |
-r | 重新挂载/etc/exports种的设置 |
-u | 卸载某一目录 |
-v | 在exports时将共享的目录显示在屏幕上 |
(6)showmount显示指定NFS服务器连接NFS客户端的信息,常用参数如表5.2所示。
表1.2 showmount命令常用参数说明
参数 | 说明 |
---|---|
-a | 列出NFS服务共享的完整目录信息 |
-d | 仅列出客户机远程安装的目录 |
-e | 显示导出目录的列表 |
配置NFS服务器首先需要确认共享的文件目录和权限及访问的主机列表,这些可以通过**/etc/exports**
文件配置。一般系统都有一个默认的exports
文件,可以直接修改如果没有,可以创建一个,然后通过启动命令启动守护进程。
1.配置文件/etc/exports
要配置NFS服务器,首先就是编辑**/etc/exports**
文件。在该文件中,每一行代表一个共享目录,并且描述了该目录如何被共享。**exports**
文件的格式和使用如【示例3-2】所示。
#<共享目录> [客户端1 选项] [客户端2 选项]
/nfsshare *(rw,all_squash,sync,anonuid=1001,anongid=1000)
每一条配置,可指定共享的目录,允许访问的主机及其他选项设置。上面的配置说明在这台服务器上共享了一个目录**/nfsshare**
,参数说明如下:
- 共享目录:是指NFS系统中需要共享给客户端使用的目录。
- 客户端:是指网络中可以访问这个NFS共享目录的计算机。
客户端常用的指定方式:
- 指定ip地址的主机:192.168.1.128
- 指定子网中的所有主机:192.168.1.0/24 192.168.0.0/255.255.255.0
- 指定域名的主机:www.domain.com
- 指定域中的所有主机:*.domain.com
- 所有主机:*
语法中的选项用来设置输出目录的访问权限、用户映射等。NFS常见的选项如表3.3所示。
表1.3 NFS常用选项说明
参数 | 说明 |
---|---|
ro | 该主机有只读的权限 |
rw | 该主机对该共享目录有可读可写的权限 |
all_squash | 将远程访问的所有普通用户及所属组都映射为弥明用户或用户组,相当于使用nobody用户访问该共享目录。注意此参数为默认设置 |
no_all_squash | 与all_squash取反,该选项默认设置 |
root_squash | 将root用户及所属组都映射为匿名用户或用户组,为默认设置 |
no_root_squash | 与root_squash取反 |
anonuid | 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户 |
anongid | 将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户 |
sync | 将数据同步写入内存缓冲区与磁盘种,效率低,但可以保证数据的一致性 |
async | 将数据先保存在内存缓冲区种,必要时才写入磁盘 |
**exports**
文件的使用方法如【示例3-3】所示。
【示例1-3】
/nfsshare *.*(rw)
该行设置表示**/nfsshare**
目录,所有主机都可以访问该目录,并且都有读写的权限,客户端上的任何用户在访问时都映射成nobody用户。如果客户端要在该共享目录上保存文件,则服务器上的nobody用户对/nfsshare
目录必须要有写的权限。
【示例1-4】
/nfsshare2 192.168.19.0/255.255.255.0
(rw,all_squash,anonuid=1001,anongid=100) 192.168.32.0/255.255.255.0(ro)
改行设置表示共享**/nfsshare2**
目录,192.168.19.0/24
网段的所有主机都可以访问该目录,对该目录有读写的权限,并且所有的用户在访问时都映射成服务器上的**uid**
为**1001**
、**gid**
为**100**
的用户;**192.168.32.0/24**
网段的所有主机对该目录有只读访问权限,并且在访问时所有的用户都映射成nobody用户。
2.启动服务
配置好服务器之后,要使用客户端能够使用NFS,必须要先启动服务。启动过程如【示例3-5】所示。
【示例1-5】
[root@node1 ~]# cat /etc/exports
/nfsshare *(rw)
#必须要先创建此目录才能启动nfs
[root@node1 ~]# mkdir /nfsshare
#rpcbind服务可能正在运行因此此处选择重启
[root@node1 ~]# systemctl restart rpcbind
#启动nfs服务
[root@node1 ~]# systemctl start nfs-server
NFS服务由5个后台进程组成,分别是**rpc.nfsd**
、**rpc.lockd**
、**rpc.statd**
、**rpc.mountd**
、**rpc.rquotad**
。**rpc.nfsd**
负责主要的工作;**rpc.lockd**
、**rpc.statd**
负责抓取文件锁;**rpc.mountd**
负责初始化客户端的mount
请求;**rpc.rquotad**
负责对客户文件的磁盘配额限制。这些后台程序是**nfs-utils**
的一部分,如果是使用的RPM包,它们存放则**/usr/sbin**
目录下。
大多数的发行版本都会带有NFS服务的启动脚本,在CentOS 7之前的版本中,要启动NFS服务,执行**/etc/init.d/nfs start**
即可。而在CentOS 7中由于系统框架的改变,我们可以使用**systemctl**
启动,也可以使用**service nfs-server start**
启动。
3.确认NFS是否已经启动
可以使用**rpcinfo**
命令来确认,如果NFS服务正常运行,应该有下面的输出,如【示例3-6】所示。
【示例1-6】
[root@node1 ~]# rpcinfo -p
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
......
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 48238 nlockmgr
......
从上述结果可以看出NFS服务已经启动。也可以使用**showmount**
来查看服务器的输出清单:
[root@node1 ~]# showmount -e 127.0.0.1
Export list for 127.0.0.1:
/nfsshare *
为服务端配置防火墙规则。
[root@node1 ~]# firewall-cmd --permanent --add-service=nfs
success
[root@node1 ~]# firewall-cmd --permanent --add-service=rpc-bind
success
[root@node1 ~]# firewall-cmd --permanent --add-service=mountd
success
[root@node1 ~]# firewall-cmd --reload
success
[root@node1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client mountd nfs rpc-bind ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
经过以上的步骤NFS服务器端已经配置完成,接下来进行客户端的配置。
配置客户端
要在客户端使用NFS,首先需要确定要挂载的文件路径,并确认该路径中没有已经存在的数据文件,然后确定要挂载的服务端的路径,然后使用**mount**
挂载到本地磁盘,如【示例3-7】所示,**mount**
命令的详细用法可参考前面章节。(呸,这本书前面完全没他妈提到mount
,不知道这个实验是编辑从哪里Down来的,f**k!)
【示例1-7】
[root@node2 test]# mount -t nfs -o rw 192.168.1.128:/nfsshare /test
mount: wrong fs type, bad option, bad superblock on 192.168.1.128:/nfsshare,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)
In some cases useful info is found in syslog - try
dmesg | tail or so.
#输入挂载发现没有/sbin/mount.nfs目录,安装nfs-utils就好了
[root@node2 test]# yum install -y nfs-utils
......
[root@node2 test]# ll /sbin/mount.nfs
-rwxr-xr-x. 1 root root 11368 Oct 31 2018 /sbin/mount.fuse
-rwsr-xr-x. 1 root root 117432 Aug 9 2019 /sbin/mount.nfs
lrwxrwxrwx. 1 root root 9 Apr 20 00:40 /sbin/mount.nfs4 -> mount.nfs
-rwxr-xr-x. 1 root root 41563 Aug 9 2019 /sbin/mountstats
#安装nfs-utils后,重新挂载
[root@node2 test]# mount -t nfs -o rw 192.168.1.128:/nfsshare /test
测试
#在服务端新建文件
[root@node1 nfsshare]# ls
[root@node1 nfsshare]# touch a
[root@node1 nfsshare]# ls
a
#在客户端查看
[root@node2 test]# ls
a
#在客户端新建文件失败
[root@node2 test]# touch b
touch: cannot touch ‘b’: Permission denied
以读写模式挂在了共享目录,但root用户并不可写,其原因在于**/etc/exports**
中的文件设置。由于**all_squash**
和**root_squash**
为NFS的默认设置,会讲远程访问的用户映射为nobody用户,而**/test**
目录nobody用户是不可写的,通过修改共享设置可以解决这个问题。
/nfsshare *(rw,all_squash,sync,anonuid=1001,anongid=1000)
通过以上设置然后重启NFS服务,这时目录挂载后可以正常读写了。
#设置完服务端之后,发现客户端依然没有写权限
[root@node2 test]# touch b
touch: cannot touch ‘b’: Permission denied
#好像:NFS服务器端,
#没有给文件夹:/nfsshare
[root@node1 /]# ll nfsshare/
total 0
-rw-r--r--. 1 root root 0 Apr 20 00:59 a
#开通,g=group,o=other的写的权限。
所以去开通试试:
[root@node1 /]# chmod go+w -R /nfsshare/
[root@node1 /]# ll /nfsshare/
total 0
-rw-rw-rw-. 1 root root 0 Apr 20 00:59 a
#客户端可以正常读写了
[root@node2 test]# touch b
[root@node2 test]# ls
a b