第1章 文件同步与共享
1.1 NFS服务
1.1.1什么是 NFS
- NFS 是 Network File System 的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由 Sun 公司开发,于 1984 年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类 Unix 系统间实现磁盘文件共享的一种方法。
- 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。NFS 服务器可以允许 NFS 客户端将远端 NFS 服务器端的共享目录挂载到本地的 NFS 客户端中。在本地的 NFS 客户端的机器看来,NFS 服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。
1.1.2NFS挂载原理图
- 当我们在NFS服务器设置好一个共享目录/home/public后,其他的有权访问NFS服务器的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/home/public的所有数据。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。挂载后,NFS客户端查看磁盘信息命令:#df –h。
- 既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有想对应的网络端口,NFS服务器到底使用哪个端口来进行数据传输呢?基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现。
1.1.3RPC与NFS通讯原理
-
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。 -
那么RPC又是如何知道每个NFS功能的端口呢? -
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
- 首先服务器端启动RPC服务,并开启111端口
- 服务器端启动NFS服务,并向RPC注册端口信息
- 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
- 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
- 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
1.1.4NFS安装
1.linux系统检查
yum install -y net-tools
netstat -antp
2.windows系统检查
打开运行窗口
win+r
输入命令
services.msc
检查RPC服务状态
yum install -y nfs-utils rpcbind
- 安装NFS服务,需要安装两个软件,分别是:
- RPC主程序:rpcbind
- NFS 其实可以被视为一个 RPC 服务,因为启动任何一个 RPC 服务之前,我们都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实就是『 rpcbind 』这个服务所负责的!也就是说, 在启动任何一个 RPC 服务之前,我们都需要启动 rpcbind 才行! (在 CentOS 以前这个软件称为portmap,在 CentOS 7.x 之后才称为 rpcbind 的!)。
- NFS主程序:nfs-utils
- 就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其
1.1.5创建共享目录
-
NFS的相关文件:
- 主要配置文件:/etc/exports
- 这是 NFS 的主要配置文件了。该文件是空白的,有的系统可能不存在这个文件,主要手动建立。
- NFS的配置一般只在这个文件中配置即可。
- NFS 文件系统维护指令:/usr/sbin/exportfs
- 这个是维护 NFS 分享资源的指令,可以利用这个指令重新分享 /etc/exports 变更的目录资源、将NFS Server 分享的目录卸除或重新分享。
- 分享资源的登录档:/var/lib/nfs/*tab
- 在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。
- 客户端查询服务器分享资源的指令:/usr/sbin/showmount
- 这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client端。showmount 可以用来察看 NFS 分享出来的目录资源。
-
/etc/exports 文件内容格式: 共享目录 客户端 1(访问权限,用户映射,其他) 客户端 2(访问权限,用户映射,其他) -
共享目录:共享目录是指 NFS 服务器共享给客户机使用的目录 -
客户端:客户端是指网络中可以访问这个 NFS 共享目录的计算机 。客户端常用的指定方式:
- 指定 ip 地址的主机:192.168.0.200
- 指定子网中的所有主机:192.168.88.0
- 指定域名的主机:www.lagou.com
- 指定域中的所有主机:*.lagou.com
- 所有主机:*
-
访问权限选项
-
用户映射选项:
- root_squash:将 root 用户的访问映射为匿名(nfsnobody)用户 uid 和 gid;(默认生效)
- no_root_squash:保留管理员权限,以服务器管理员的权限管理
- all_squash:将远程访问的用户及所属组都映射为指定 uid、gid 的匿名用户
-
其它选项
- sync: 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性(同步)
- async:将数据先保存在内存缓冲区中,必要时才写入磁盘(异步)
1.参数说明
参数 | 说明 |
---|
ro | 只读访问 | rw | 读写访问 | sync | 所有数据在请求时写入共享 | async | nfs 在写入数据前可以响应请求 | secure | nfs 通过 1024 以下的安全 TCP/IP 端口发送 | insecure | nfs 通过 1024 以上的端口发送 | wdelay | 如果多个用户要写入 nfs 目录,则归组写入(默认) | no_wdelay | 如果多个用户要写入 nfs 目录,则立即写入,当使用 async 时,无需此设置 | hide | 在 nfs 共享目录中不共享其子目录 | no_hide | 共享 nfs 目录的子目录 | subtree_check | 如果共享 /usr/bin 之类的子目录时,强制 nfs 检查父目录的权限(默认) | no_subtree_check | 不检查父目录权限 | all_squash | 共享文件的 UID 和 GID 映射匿名用户 anonymous,适合公用目录 | no_all_squash | 保留共享文件的 UID 和 GID(默认) | root_squash | root 用户的所有请求映射成如 anonymous 用户一样的权限(默认) | no_root_squash | root 用户具有根目录的完全管理访问权限 | anonuid=xxx | 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 UID | anongid=xxx | 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 GID |
1.1.6安装NFS
1.安装环境配置
1.1克隆虚拟机
linux-90:192.168.198.90
linux-91:192.168.198.91
1.2修改IP地址
vi /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl restart network
ip addr
ping www.baidu.com
1.3修改hostname
hostnamectl set-hostname linux-91
1.4设置VM快照
2.安装NFS服务
yum install -y nfs-utils rpcbind
3.启动NFS服务
systemctl start rpcbind
systemctl start nfs
设置开启启动
systemctl enable rpcbind
systemctl enable nfs
4.测试NFS服务
第一步:
在linux-90创建挂载目录
mkdir -p /lagouedu
chmod 777 /lagouedu
更改归属组与用户
chown -R nfsnobody:nfsnobody /lagouedu
a.客户端root用户:使用客户端的root身份在nfs服务器上创建文件,文件的所有者和所属组是
nfsnobody。
b.客户端普通用户:使用客户端的普通用户身份在nfs服务器上创建文件,所有者和所属组是nobody或普通用
户。如果明确设定了普通用户的映射用户身份,那么此时客户端用户的身份转换为指定映射用户;如果NFS
server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户
第二步:
将linux-90的NFS服务器端/lagouedu目录共享给192.168.198.0网段,rw权限
vi /etc/exports
/lagouedu 192.168.198.0 (rw,no_root_squash)
no_root_squash:root 用户具有根目录的完全管理访问权限
第三步:
重启将linux-90服务器端的rpcbind和nfs 服务
systemctl restart rpcbind
systemctl restart nfs
第四步:
使用NFS服务器端命令查看共享目录
exportfs
第五步:
在linux-91上测试一下,是否能够正确挂载:
showmount -e 192.168.198.90
第六步:
linux-91上挂载远端目录到本地 /laosiji 目录
mkdir -p /laosiji
mount –o vers=3 共享 本地
mount -o vers=3 192.168.198.90:/lagouedu /laosiji
第七步:
在linux-90的NFS服务端写入
cd /lagouedu/
echo "This is NFS server." >> /lagouedu/nfs.txt
cat nfs.txt
第八步:
在linux-91客户端读取。
cd /laosiji
cat /laosiji/nfs.txt
第九步:
在linux-91客户端写入
echo "This is NFS client." >> nfs.txt
在linux-90服务端读取
cat /lagouedu/nfs.txt
5.客户端卸载 NFS 挂载目录
umount /laosiji
强制卸载
umount -l /laosiji
1.2 rsync
1.2.1rsync概述
- rsync 是类 unix 系统下的数据镜像备份工具。一款支持快速完全备份和增量备份的工具,支持本地复制,远程同步等,类似于 scp 命令;rsync 命令在同步文件之前要先登录目标主机进行用户身份认证,认证过后才能进行数据同步,身份认证方式取决于所使用的协议类型,rsync 一般使用两种协议进行数据同步:ssh 协议和 rsync 协议。
1.2.2rsync特性
- 能更新整个目录树和文件系统。有选择性的保留符号链接、硬链接、文件属性、权限、设备以及时间等对于安装来说,无任何特殊权限要求。对于多个文件来说,文件传输效率高。能用 ssh 或自定义端口作为传输入口端口。
1.2.3rsync工作原理
-
既然涉及到数据同步,必要的两个概念是:源地址(文件),目标地址(文件),以及以哪一方为基准,例如,想让目标主机上的文件和本地文件保持同步,则是以本地文件为同步基准,将本地文件作为源文件推送到目标主机上。 -
rsync的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步(scp可以实现)。 -
不考虑rsync的实现细节,就文件同步而言,涉及了源文件和目标文件的概念,还涉及了以哪边文件为同步基准。例如,想让目标主机上的文件和本地文件保持同步,则是以本地文件为同步基准,将本地文件作为源文件推送到目标主机上。反之,如果想让本地主机上的文件和目标主机上的文件保持同步,则目标主机上的文件为同步基准,实现方式是将目标主机上的文件作为源文件拉取到本地。当然,要保持本地的两个文件相互同步,rsync也一样能实现,这就像Linux中cp命令一样,以本地某文件作为源,另一文件作为目标文件,但请注意,虽然rsync和cp能达到相同的目的,但它们的实现方式是不一样的。 -
既然是文件同步,在同步过程中必然会涉及到源和目标两文件之间版本控制的问题,例如是否要删除源主机上没有但目标上多出来的文件,目标文件比源文件更新(newer than source)时是否仍要保持同步,遇到软链接时是拷贝软链接本身还是拷贝软链接所指向的文件,目标文件已存在时是否要先对其做个备份等等。
1.2.4rsync实战演练
1.rsync语法
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
- 由此语法可知,rsync有三种工作方式:
(1).本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。 (2).本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。 (3).本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access viarsync daemon"段的格式。
2.常用参数
- -v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
- -a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
- -z:传输时进行压缩提高效率。
- –delete:以SRC为主,对DEST进行同步。多则删之,少则补之。注意"–delete"是在接收端执行的。
- -P:显示文件传输的进度信息。(实际上"-P"="–partial --progress",其中的"–progress"才是显示进度信息的)。
- -n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
- -r --recursive:递归到目录中去。
- -t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新检查出mtime不同从而导致增量传输无效。
- -o --owner:保持owner属性(属主)。
- -g --group:保持group属性(属组)。
- -p --perms:保持perms属性(权限,不包括特殊权限)。
- -D :是"–device --specials"选项的组合,即也拷贝设备文件和特殊文件。
- -l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
- -R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。
- –size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
- -u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
- -d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
- –max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"–max-size=1.5m")
- –min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
- –exclude :指定排除规则来排除不需要传输的文件。
- -b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
- –backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
- -e :指定所要使用的远程shell程序,默认为ssh。
- –port :连接daemon时使用的端口号,默认为873端口。
- –password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
- -W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
- –existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
- –ignore-existing:要求只更新目标端不存在的文件。和"–existing"结合使用有特殊功能。
- –remove-source-files:要求删除源端已经成功传输的文件。
3.安装rsync
yum install -y rsync
4.实战演练
案例一
在linux-90创建挂载目录
mkdir -p /lagouedu
cd /lagouedu/
在linux-91创建挂载目录
mkdir -p /laosiji
cd /laosiji/
在linux-90创建挂载文件
touch {1..5}.txt
ls
在linux-91本地目录中下载远程服务器内容
rsync -avz root@192.168.198.90:/lagouedu/* /laosiji
案例二
在linux-90创建挂载目录
mkdir -p /lagouedu
cd /lagouedu/
rm -rf *
在linux-91创建挂载目录
mkdir -p /laosiji
cd /laosiji/
在linux-91创建挂载文件
touch {1..5}.txt
ls
在linux-91将本地目录内容上传到远程服务器
rsync -avz /laosiji/* root@192.168.198.90:/lagouedu
|