网络文件共享服务(四)——SAMBA

网络文件共享服务(三)

SAMBA服务

SAMBA服务简介

SMB:Server Message Block服务器消息块,IBM发布,最早是DOS网络文件共享协议
CIFS:common internet file system,微软基于SMB发布
SAMBA:1991年Andrew Tridgell,实现windows和UNIX相通

SAMBA的功能:
共享文件和打印,实现在线编辑
实现登录SAMBA用户的身份认证
可以进行NetBIOS名称解析
外围设备共享

Windows计算机网络管理模式:
工作组WORKGROUP:计算机对等关系,帐号信息各自管理
域DOMAIN:C/S结构,帐号信息集中管理,DC,AD

SAMBA软件介绍

相关包:
samba 提供smb服务
samba-client 客户端软件
samba-common 通用软件
cifs-utils smb客户端工具
samba-winbind 和AD相关

相关服务进程:
smbd 提供smb(cifs)服务 TCP:139,445
nmbd NetBIOS名称解析 UDP:137,138

主配置文件:/etc/samba/smb.conf 帮助参看:man smb.conf
语法检查: testparm [-v] [/etc/samba/smb.conf]
客户端工具:smbclient,mount.cifs

dnf install samba
systemctl start smb
systemctl start nmb

SAMBA客户端工具

UNC路径: Universal Naming Convention,通用命名规范,格式如下

\\sambaserver\sharename     #中间为samba服务器名或者ip地址

使用smbclient 访问SAMBA服务器

smbclient -L instructor.example.com
smbclient -L instructor.example.com -U smb用户
#可以使用-U选项来指定用户%密码,或通过设置和导出USER和PASSWD环境变量来指定
smbclient //instructor.example.com/shared -U wang
>cd directory
>get file1
>put file2

挂载CIFS文件系统
范例:手动挂载

mount -o user=wang,password=magedu //server/shared /mnt/smb

范例:开机自动挂载

cat /etc/fstab
#可以用文件代替用户名和密码的输入
//server/homes /mnt cifs credentials或cred=/etc/smb.txt 0 0

cat /etc/smb.txt
username=wang     #或 user=wang
password=password #或 pass=password
chmod 600 /etc/smb.txt       #这一步加密很重要

管理SAMBA用户

实现samba用户说明

包:samba-common-tools

工具:smbpasswd pdbedit

用户数据库:/var/lib/samba/private/passdb.tdb sam账号必须先是系统账号

说明:samba用户须是Linux用户,建议使用/sbin/nologin

[root@centos8 ~]#useradd -s /sbin/nologin -r  smb1    
[root@centos8 ~]#useradd -s /sbin/nologin  smb2        #这里没有加-r 选项 会自动生成家目录
[root@centos8 ~]#useradd -s /sbin/nologin  smb3
[root@centos8 ~]#ls /home/
kaivi  smb2  smb3

```bash
[root@centos8 ~]#smbpasswd -a smb1        #-a 表示把系统账户变成samba账号 不加-a 表示修改账号密码
New SMB password:
Retype new SMB password:
Added user smb1.
[root@centos8 ~]#pdbedit -L
smb1:995:
[root@centos8 ~]#smbpasswd -a smb2
New SMB password:
Retype new SMB password:
Added user smb2.
[root@centos8 ~]#smbpasswd -a smb3
New SMB password:
Retype new SMB password:
Added user smb3.
[root@centos8 ~]#pdbedit -L   #查看smb账号  加-v看详细信息
smb1:995:
smb3:1002:
smb2:1001:
[root@centos8 ~]#

访问window:
登入对应的smb1 和口令即可登入,默认访问smb1的家目录。会被缓存记住,从而不能访问第二个共享服务。

网络文件共享服务(四)——SAMBA_第1张图片
网络文件共享服务(四)——SAMBA_第2张图片

/usr/lib/systemd/system/nmb.service    #名字解析服务
/usr/lib/systemd/system/smb.service    #主服务程序
[root@centos8 ~]#systemctl start smb        #监听端口139和445
[root@centos8 ~]#ss -nlt
State         Recv-Q         Send-Q                  Local Address:Port                  Peer Address:Port         
LISTEN        0              128                           0.0.0.0:22                         0.0.0.0:*            
LISTEN        0              50                            0.0.0.0:445                        0.0.0.0:*            
LISTEN        0              50                            0.0.0.0:139                        0.0.0.0:*            
LISTEN        0              128                              [::]:22                            [::]:*            
LISTEN        0              50                               [::]:445                           [::]:*            
LISTEN        0              50                               [::]:139                           [::]:*            
[root@centos8 ~]#

管理用户命令
添加samba用户:

smbpasswd -a <user>      #把系统账号加入samba账号        不加a 表示修改已经存在的samba账号的口令
pdbedit -a -u <user>            

修改用户密码:

smbpasswd <user>       #修改口令

删除用户和密码:

smbpasswd –x <user>             #删除用户
pdbedit –x –u <user>            

查看samba用户列表:

pdbedit –L –v      #查看samba账号信息 

查看samba服务器状态:

smbstatus
[root@centos8 ~]#smbstatus 

Samba version 4.9.1
PID     Username     Group        Machine                                   Protocol Version  Encryption           Signing              
----------------------------------------------------------------------------------------------------------------------------------------
6681    smb1         smb1         192.168.32.1 (ipv4:192.168.32.1:60953)    SMB3_11           -                    partial(AES-128-CMAC)

Service      pid     Machine       Connected at                     Encryption   Signing     
---------------------------------------------------------------------------------------------
IPC$         6681    192.168.32.1  Thu Dec 19 08:20:55 PM 2019 CST  -            -           

No locked files

SAMBA服务器配置

samba 配置文件/etc/samba/smb.conf格式 ,使用.ini文件的格式

[root@centos8 ~]#vim /etc/samba/smb.conf
可以参考例子配置文件:
[root@centos18 ~]#vim /etc/samba/smb.conf.example 


[global]        #全局
        workgroup = SAMBA      #工作组名         当然也可以工作在 域 
        security = user           
                           #netbios name:namexxx  可以通过namexxx访问  需要ping通  打开nmb服务(名字解析) 
        passdb backend = tdbsam
                                #interfaces =  端口,监听在哪一个ip接口
                                
        printing = cups                        
        printcap name = cups
        load printers = yes
        cups options = raw

[homes]       #家目录共享
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers]    #打印机共享
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]       #  $符号表示隐藏              
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

\\192.168.32.1\d$         #windows命令
[root@centos18 ~]#smbclient -L 192.168.32.1 -U test%123
#可以查看windons中隐藏目录
[root@centos18 ~]#smbclient  //192.168.32.1/d$ -U test%123  #访问隐藏的D盘

用 [ ] 分分成以下几部分
全局设置:
[global] 服务器通用或全局设置的部分
特定共享设置:
[homes] 用户的家目录共享
[printers] 定义打印机资源和服务
[sharename] 自定义的共享目录配置
其中:#和;开头的语句为注释,大小写不敏感

宏定义:
%m 客户端主机的NetBIOS名
%M 客户端主机的FQDN
%H 当前用户家目录路径
%U 当前用户用户名
%g 当前用户所属组
%h samba服务器的主机名
%L samba服务器的NetBIOS名
%I 客户端主机的IP
%T 当前日期和时间 %S 可登录的用户名

SAMBA服务器全局配置

workgroup 指定工作组名称
server string 主机注释信息
netbios name 指定NetBIOS名
interfaces 指定服务侦听接口和IP
hosts allow 可用逗号,空格,或tab分隔,默认允许所有主机访问,也可在每个共享独立配置,如
在[global]设置,将应用并覆盖所有共享设置,可以是以下格式:
IPv4 network/prefix: 172.16.0.0/24 IPv4前缀: 172.16.0.
IPv4 network/netmask: 172.16.0.0/255.255.255.0
主机名: desktop.example.com
以example.com后缀的主机名: .example.com
范例

hosts allow = 172.16. .example.com

hosts deny 拒绝指定主机访问,格式和hosts allow 相同
config file=/etc/samba/conf.d/%U 用户独立的配置文件
Log file=/var/log/samba/log.%m 不同客户机采用不同日志
log level = 2 日志级别,默认为0,不记录日志 #需要修改配置为2 不然即使打开了日志一般级别也不记录
max log size=50 日志文件达到50K,将轮循rotate,单位KB

Security三种认证方式:

  1. user:samba用户(采有linux用户,samba的独立口令)
  2. share:匿名(CentOS7不再支持),已不建议使用
  3. server:已不建议使用
    passdb backend = tdbsam 密码数据库格式

配置特定目录共享

每个共享目录应该有独立的[ ]部分

[共享名称] 远程网络看到的共享名称 #真正被共享的名称有Path指定
comment 注释信息
path 所共享的目录路径
public 能否被guest访问的共享,默认no,和guest ok 类似 #默认不允许匿名访问
browsable 是否允许所有用户浏览此共享,默认为yes,no为隐藏
writable=yes 可以被所有用户读写,默认为no #打开之后还需要把文件夹的权限开放
对smb虚拟账户授权:setfacl -m u:smbuser:rwx /path/share 这样就可以上传了
当然也可以 chomd 777 /path/share 最大权限 文件系统级别不控制 在smb级别控制即可
read only=no 和writable=yes等价,如与以上设置冲突,放在后面的设置生效,默认只读
write list 用户,@组名,+组名,用,分隔,如writable=no,列表中用户或组可读写,不在列表中用户
只读
valid users 特定用户才能访问该共享,如为空,将允许所有用户,用户名之间用空格分隔

服务器端:

[root@centos8 ~]#vim /etc/samba/smb.conf
[smbshare_kaivi]        # 新增共享文件 名称:smbshare_kaivi
path = /data/share1       #共享文件真实路径

[root@centos8 ~]#mkdir /data/share1
[root@centos8 ~]#touch /data/share1/f1.txt

客户端

[root@centos7 ~]#smbclient -L 192.168.32.8 -U smb1%centos        #访问

网络文件共享服务(四)——SAMBA_第3张图片
在wendos中显示:
网络文件共享服务(四)——SAMBA_第4张图片

[root@centos7 ~]#smbclient //192.168.32.8/smbshare_kaivi -U smb1%centos
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Thu Dec 19 21:19:30 2019
  ..                                  D        0  Thu Dec 19 21:19:21 2019
  f1.txt                              N        0  Thu Dec 19 21:19:30 2019

		52403200 blocks of size 1024. 52004624 blocks available
smb: \> get f1.txt 
getting file \f1.txt of size 0 as f1.txt (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)
smb: \> 
#可以实现登入下载  

范例:基于特定用户和组的共享

vim /etc/samba/smb.conf
[share]
path = /app/dir
valid users=smb1,@admins
writeable = no      #不可写
browseable = no     #不隐藏

实战案例

实战案例1

#在samba服务器上安装samba包
yum -y install samba
#创建samba用户和组
groupadd -r admins
useradd -s /sbin/nologin -G admins kaivi
smbpasswd -a kaivi
useradd -s /sbin/nologin duanxin
smbpasswd -a duanxin
#创建samba共享目录,并设置SElinux
mkdir /testdir/smbshare
chgrp admins /testdir/smbshare
chmod 2775 /testdir/smbshare
#samba服务器配置
vim /etc/samba/smb.conf
...省略...
[share]
path = /testdir/smbshare
write list = @admins
systemctl enable --now smb nmb
#samba客户端访问
yum -y install cifs-utils
#用kaivi用户挂载smb共享并访问
mkdir /mnt/kaivi
mount -o username=kaivi //smbserver/share /mnt/kaivi
echo "Hello world" >/mnt/kaivi/kaivifile.txt
#用duanxin用户挂载smb共享并访问
mkdir /mnt/duanxin
mount -o username=duanxin //smbserver/share /mnt/duanxin
touch /mnt/duanxin/duanxinfile.txt

实战案例2

实现不同的samba账号访问不同的目录。

#创建三个samba用户,并指定密码为centos
useradd -s /sbin/nologin -r smb1   #加选项-r 不创建家目录
useradd -s /sbin/nologin -r smb2
useradd -s /sbin/nologin -r smb3
smbpasswd –a smb1       #创建对应账号的口令  ,不加-a表示修改已经存在的账号的口令
smbpasswd –a smb2
smbpasswd –a smb3
[root@SMB ~]#pdbedit -L    #查看samba账号
smb1:995:
smb3:993:
smb2:994:

#修改samba配置文件
vim /etc/samba/smb.conf
#在workgroup下加一行 
config file= /etc/samba/conf.d/%U 说明:%U表示用户名  #这个步骤为关键步骤

[share]               #共享文件夹在最后添加
Path=/data/dir        #指定分享文件夹的路径
Read only= NO         #不仅仅是只读
Guest ok = yes        
write list=@admin

[root@SMB ~]#mkdir /data/dir
[root@SMB ~]#mkdir /data/dir1
[root@SMB ~]#mkdir /data/dir2
[root@SMB ~]#touch /data/dir/share.txt  #新建共享文件
[root@SMB ~]#touch /data/dir1/smb1.txt  #新建给smb1用户访问特定文件
[root@SMB ~]#touch /data/dir2/smb2.txt  #新建给smb2用户访问特定文件

[root@SMB ~]#tree /data/
/data/
├── dir
│   └── share.txt
├── dir1
│   └── smb1.txt
└── dir2
    └── smb2.txt
    
3 directories, 3 files

#针对smb1和smb2用户创建单独的配置文件
[root@SMB ~]#mkdir /etc/samba/conf/smb1 -pv
vim /etc/samba/conf.d/smb1
[share]
Path=/data/dir1
Read only= NO 等价于writable = yes
Create mask=0644
#说明:默认为744

[root@SMB ~]#mkdir /etc/samba/conf/smb2 -pv
vim /etc/samba/conf.d/smb2
[share]
path=/data/dir2

systemctl restart smb nmb     #重启对应的服务
#用户smb1,smb2,smb3访问share共享目录,看到目录是不同目录,smb3访问的是默认的share目录

在centos7中访问:

[root@client ~]#smbclient //192.168.32.18/share -U smb1%centos
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Dec 20 13:11:40 2019
  ..                                  D        0  Fri Dec 20 13:10:56 2019
  smb1.txt                            N        0  Fri Dec 20 13:11:40 2019

		52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
[root@client ~]#smbclient //192.168.32.18/share -U smb2%centos
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Dec 20 13:12:53 2019
  ..                                  D        0  Fri Dec 20 13:10:56 2019
  smb2.txt                            N        0  Fri Dec 20 13:12:53 2019

		52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
[root@client ~]#smbclient //192.168.32.18/share -U smb3%centos
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Dec 20 13:13:12 2019
  ..                                  D        0  Fri Dec 20 13:10:56 2019
  share.txt                           N        0  Fri Dec 20 13:11:26 2019

		52403200 blocks of size 1024. 52004560 blocks available
smb: \> exit
[root@client ~]#

数据的实时同步

网络文件共享服务(四)——SAMBA_第5张图片
在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动
实时同步到备份的服务器特定目录中。基于2中行为:推和拉的方式。一般为推的行为。

实时同步技术介绍

实现实时同步的方法
inotify + rsync 方式实现数据同步
sersync :金山公司周洋在 inotify 软件基础上进行开发的,功能更加强大

工作原理:
要利用监控服务(inotify),监控同步数据服务器目录中信息的变化,发现目录中数据产生变化,就利用rsync服务推送到备份服务器上,是一个内核级的行为。

inotify:
异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件。

查看内核中的版块

[root@centos8 ~]#grep -i inotify /boot/config-4.18.0-80.el8.x86_64 
CONFIG_INOTIFY_USER=y

实现inotify软件:
inotify-tools
sersync
lrsyncd

[root@centos8 ~]#dnf list inotify-tools -y
Last metadata expiration check: 0:36:44 ago on Fri 20 Dec 2019 01:30:25 PM CST.
Available Packages
inotify-tools.x86_64     
[root@centos8 ~]#dnf install inotify-tools -y  #安装

inotify+rsync使用方式
inotify 对同步数据目录信息的监控
rsync 完成对数据的同步
利用脚本进行结合

实现inotify

内核支持
内核是否支持inotify

Linux支持inotify的内核最小版本为2.6.13,参看man 7 inotify

[root@centos8 ~]#ls -l /proc/sys/fs/inotify    #列出下面的文件,说明服务器内核支持inotify
-rw-r--r-- 1 root root 0 Dec 7 10:10 max_queued_events
-rw-r--r-- 1 root root 0 Dec 7 10:10 max_user_instances
-rw-r--r-- 1 root root 0 Dec 6 05:54 max_user_watches

inotify内核参数说明:
max_queued_events:inotify事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384

max_user_instances:每个用户创建inotify实例最大值,默认值:128

max_user_watches:可以监视的文件数量(单进程),默认值:8192

inotify-tools参考文档:https://github.com/rvoicilas/inotify-tools/wiki

安装inotify-tools:基于epel源

[root@centos8 ~]#ll /proc/sys/fs/inotify/*
-rw-r--r-- 1 root root 0 Dec 20 14:10 /proc/sys/fs/inotify/max_queued_events
-rw-r--r-- 1 root root 0 Dec 20 14:10 /proc/sys/fs/inotify/max_user_instances
-rw-r--r-- 1 root root 0 Dec 20 14:10 /proc/sys/fs/inotify/max_user_watches

[root@centos8 ~]#cat /proc/sys/fs/inotify/*
16384
128
8192

修改对应的参数数值:

[root@centos8 ~]#vim /etc/sysctl.conf  
fs.inotify.max_queued_events=66666

[root@centos8 ~]#sysctl -p      #生效
fs.inotify.max_queued_events = 66666
[root@centos8 ~]#
[root@centos8 ~]#sysctl -a |grep max_queued_events
fs.inotify.max_queued_events = 66666

inotify-tools包主要工具:

inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控

inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

inotifywait 命令常见选项
-m, --monitor 始终保持事件监听
-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive 递归监控目录数据信息变化 #对子目录页监控
-q, --quiet 输出少量事件信息
–exclude 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
–excludei 和exclude相似,不区分大小写
-o, --outfile 打印事件到文件中,相当于标准正确输出
-s, --syslogOutput 发送错误到syslog相当于标准错误输出
–timefmt 指定时间输出格式
–format 指定的输出格式;即实际监控输出内容
-e 指定监听指定的事件,如果省略,表示所有事件都进行监听

[root@centos8 ~]#inotifywait -rm  /data/images/

inotifywait 的–timefmt 时间格式

参考 man 3 strftime

%Y 年份信息,包含世纪信息
%y 年份信息,不包括世纪信息
%m 显示月份,范围 01-12
%d 每月的第几天,范围是 01-31
%H 小时信息,使用 24小时制,范围 00-23
%M 分钟,范围 00-59

范例:

--timefmt "%Y-%m-%d %H:%M"

inotifywait 的 --format 格式定义

%T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
%w 事件出现时,监控文件或目录的名称信息
%f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
%e 显示发生的事件信息,不同的事件默认用逗号分隔
%Xe显示发生的事件信息,不同的事件指定用X进行分隔

范例:

--format "%T %w%f event: %;e"
--format '%T %w %f'

inotifywait -e 选项指定的事件类型

create 文件或目录创建
delete 文件或目录被删除
modify 文件或目录内容被写入
attrib 文件或目录属性改变
close_write 文件或目录关闭,在写入模式打开之后关闭的
close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
close 文件或目录关闭,不管读或是写模式
open 文件或目录被打开
moved_to 文件或目录被移动到监控的目录中
moved_from 文件或目录从监控的目录中被移动
move 文件或目录不管移动到或是移出监控目录都触发事件
access 文件或目录内容被读取
delete_self 文件或目录被删除,目录本身被删除
unmount 取消挂载

范例:

-e create,delete,moved_to,close_write, attrib

范例:使用inotifywait

#监控一次性事件
inotifywait /data
#持续监控
inotifywait -mrq /data
#持续后台监控,并记录日志,格式的前后顺序有要求,--xxxx选项在监控文件的后面,要绝对路径
inotifywait -o /root/inotify.log -drq /data --timefmt "%Y-%m-%d %H:%M" --format
"%T %w%f event: %e"
#持续后台监控特定事件
inotifywait -mrq /data --timefmt "%F %H:%M" --format "%T %w%f event: %;e" -e
create,delete,moved_to,close_write,attrib
[root@centos8 ~]#inotifywait /data/images/     #一次性的监控任务
Setting up watches.
Watches established.
/data/images/ OPEN,ISDIR                #被打开操作
[root@centos8 ~]#inotifywait /data/images/
Setting up watches.
Watches established.
/data/images/ CREATE f1.txt            #被创建文件操纵
#默认只是监控顶级目录

rsync

rsync 常用于做为 linux系统下的数据镜像备份工具,实现实现远程同步,支持本地复制,或者与其他
SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify
或sersync,可以实现触发式的实时数据同步

官方网站: https://www.samba.org/ftp/rsync/rsync.html

软件包:rsync,rsync-daemon(CentOS 8)

[root@centos18 ~]#yum install rsync -y
[root@centos18 ~]#yum install rsync-daemon -y  #独立服务

服务文件:/usr/lib/systemd/system/rsyncd.service

配置文件:/etc/rsyncd.conf

端口:873/tcp

rsync命令

rsync 格式

Local:   #本地
rsync [OPTION...] SRC... [DEST]     

#Access via remote shell:   #基于ssh协议
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]        #区别在于2个冒号::
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

centos8中拆分了服务器端和客户端

[root@centos8mini ~]#yum install rsync -y
[root@centos8mini ~]#yum install rsync-daemon -y

rsync有三种工作方式:

  1. 本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
  2. 本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。
  3. 本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。

常见选项:

-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-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 :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在:exclude/include规则生效之后才执行的。
-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:要求删除源端已经成功传输的文件

以独立服务方式运行rsync

范例:以独立服务方式运行 rsync

#创建rsync服务器的配置文件
vi /etc/rsyncd.conf 
uid = root          
gid = root  
use chroot = no   
max connections = 0
ignore errors
exclude = lost+found/         #排除
log file = /var/log/rsyncd.log   #记录日志
pid file = /var/run/rsyncd.pid   #pid文件
lock file = /var/run/rsyncd.lock
reverse lookup = no           #是否反向解析
hosts allow = 192.168.8.0/24     #允许访问

[backup]           #开起了一个设置,用户同步数据接受文件
path = /backup/
comment = backup
read only = no       #不只读
auth users = rsyncuser      #不用系统账号,用虚拟账号
secrets file = /etc/rsync.pass       #密码文件


#服务器端准备目录
mkdir /backup

#服务器端生成验证文件
echo "rsyncuser:magedu" > /etc/rsync.pass     #name:pass格式 #实现不同账号不同文件夹
chmod 600 /etc/rsync.pass

#服务器端启动rsync服务
rsync --daemon       #可加入/etc/rc.d/rc.local实现开机启动 systemctl restart rsyncd
systemctl restart rsyncd #CentOS 7 以上版本

#客户端配置密码文件
echo "magedu" > /etc/rsync.pass     #代替交互执行
chmod 600 /etc/rsync.pass #此为必要项,安全

#客户端测试同步数据
rsync -avz --delete --password-file=/etc/rsync.pass /data/ rsyncuser@rsync服务器IP::backup
--delete  增减同步    -azv 压缩     文件件后面加/表示只是同步文件夹中的数据,不同步目录  backup是前面配置文件接受的文件名称[backup] 其真实目录在path = /backup/

创建inotify_rsync.sh脚本


#!/bin/bash
SRC='/data/'   #同步的数据   /表示只是同步数据
DEST='rsyncuser@rsync服务器IP::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e 
create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR
FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, 
file $FILEPATH was backuped up via rsync"
>> /var/log/changelist.log
done

rsync实验

实验环境:
最小化安装的centos8最小化系统,关闭防火墙以及selinux。
一台centos8:192.168.32.8做测试端,增删改查文件
一台centos18:192.168.32.18做rsync服务器,测试端修改过的文件同步到本机

centos18:192.168.32.18中操作

[root@centos18 ~]#yum install rsync -y

[root@centos18 ~]#yum install rsync-daemon -y

[root@centos18 ~]#ss -ntl
State         Recv-Q         Send-Q                  Local Address:Port                  Peer Address:Port         
LISTEN        0              128                           0.0.0.0:22                         0.0.0.0:*            
LISTEN        0              128                              [::]:22                            [::]:*            
[root@centos18 ~]#systemctl start rsyncd
[root@centos18 ~]#ss -ntl
State         Recv-Q         Send-Q                  Local Address:Port                  Peer Address:Port         
LISTEN        0              128                           0.0.0.0:22                         0.0.0.0:*            
LISTEN        0              5                             0.0.0.0:873                        0.0.0.0:*            
LISTEN        0              128                              [::]:22                            [::]:*            
LISTEN        0              5                                [::]:873                           [::]:*            
[root@centos18 ~]#
[root@centos18 ~]#ps aux |grep rsync
root       5492  0.0  0.0  11512  1068 ?        Ss   15:25   0:00 /usr/bin/rsync --daemon --no-detach
root       5496  0.0  0.0  12112  1096 pts/0    S+   15:25   0:00 grep --color=auto rsync
[root@centos18 ~]#

rsync单独一个就是客户端,当rsync - -daemon 加了- -daemon就变成了服务器端。

创建rsync服务器的配置文件

[root@centos18 ~]#vim /etc/rsyncd.conf 
uid = root
gid = root
use chroot = no
max connections = 0
ignore errors
exclude = lost+found/       #排除这个没必要的文件夹
log file = /var/log/rsyncd.log  #日志记录
pid file = /var/run/rsyncd.pid   #pid
lock file = /var/run/rsyncd.lock   #锁
reverse lookup = no          #名字解析 
hosts allow = 192.168.32.0/24

[backup]        #数据同步目标,接受远程的数据
path = /data/backup/   #数据同步目标路径 ,真实路径
comment = backup   
read only = no
auth users = rsyncuser      #同步时用的账号
secrets file = /etc/rsyncd.pass      #密码放在这个文件里面

服务器端生成验证文件

[root@centos18 ~]#vim /etc/rsyncd.pass
[root@centos18 ~]#cat /etc/rsyncd.pass
rsyncuser:centos
[root@centos18 ~]#ll /etc/rsyncd.pass
-rw-r--r-- 1 root root 17 Dec 20 15:42 /etc/rsyncd.pass #权限不安全

[root@centos18 ~]#chmod 600 /etc/rsyncd.pass    #修改对应文件权限

[root@centos18 ~]#ll /etc/rsyncd.pass
-rw------- 1 root root 17 Dec 20 15:42 /etc/rsyncd.pass

[root@centos18 ~]#mkdir /data/backup

[root@centos18 ~]#systemctl restart rsyncd

centos8中:192.168.32.8 客户端中的配置:

[root@centos18 ~]#yum install rsync -y

[root@centos8 ~]#vim /etc/rsyncd.pass
[root@centos8 ~]#cat /etc/rsyncd.pass
centos
[root@centos8 ~]#chmod 600 /etc/rsyncd.pass
[root@centos8 ~]#ll /etc/rsyncd.pass
-rw------- 1 root root 7 Dec 20 15:51 /etc/rsyncd.pass
[root@centos8 ~]#

为了测试。这里在rsync客户端centos8中:192.168.32.8 新建一些测试文件

[root@centos8 ~]#mkdir /data/backup
[root@centos8 ~]#touch /data/backup/test.txt
[root@centos8 ~]#ll /data/backup/test.txt
-rw-r--r-- 1 root root 0 Dec 20 16:08 /data/backup/test.txt

在centos客户端192.168.32.8中执行同步rsync指令,看下在192.168.32.18是否同步传输成功。

[root@centos8 ~]#rsync -avz --delete --password-file=/etc/rsyncd.pass /data/backup/ 
\[email protected]::backup
sending incremental file list
./
test.txt

sent 110 bytes  received 38 bytes  296.00 bytes/sec
total size is 0  speedup is 0.00
[root@centos8 ~]#

192.168.32.18中查看

[root@centos18 ~]#tree /data/
/data/
└── backup
    └── test.txt

1 directory, 1 file
[root@centos18 ~]#

同步成功。
但是这里只是一次性同步。所以需要持续监控对应的服务,则需要脚本编辑一个死循环,通过inotidy的触发机制来实时进行数据的不同更新。需要配合inotify_rsync.sh组合脚本。

创建inotify_rsync.sh脚本

[root@centos8 ~]#vim inotify_rsync.sh
#!/bin/bash
#
#********************************************************************
#Author:		KAIVI
#Date:			2019-12-20
#FileName: 		inotify_rsync.sh
#Description:		The test script
#Copyright (C): 	2019 All rights reserved
#********************************************************************
#
SRC='/data/backup/'    #这里注意的是backup后面的/  如果没有则会同步backup文件夹以及文件夹里面内容

DEST='[email protected]::backup'

inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e 
create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
	FILEPATH=${DIR}${FILE}
	rsync -az --delete --password-file=/etc/rsyncd.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file 
$FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done

在192.168.32.8中操作

[root@centos8 ~]#cd /data/
[root@centos8 data]#touch backup/likai.txt
[root@centos8 data]#touch backup/duanxin.txt
[root@centos18 ~]#watch -n1 ls /data/backup/  #每秒监控文件夹中的变化
Every 1.0s: ls /data/backup/                                                     centos18: Fri Dec 20 16:42:23 2019

duanxin.txt
likai.txt

网络文件共享服务(四)——SAMBA_第6张图片
网络文件共享服务(四)——SAMBA_第7张图片

扩展

上述环境中当终端关闭时,rsync - - daemon 服务器端同时也会退出,不再同步数据。因此,如果在生产环境中应该把这个服务跑在后台执行。
或者用tmux 工具或者screen工具

[root@centos8 ~]#yum install tmux -y
[root@centos8 ~]#tmux 
[root@centos8 ~]#bash inotify_rsync.sh 

你可能感兴趣的:(SAMBA同步,Rsync同步,SAMBA实验)