您的位置:首页 > 其它

Rsync服务器配置,安装、配置、实例以及原理详解(一)

2014-02-24 23:40 711 查看
一、什么是rsync二、rsync的功能特性三、编译安装rsync软件[b]四、rsync的应用模式[/b]五、rsync 借助ssh通道技术案例六、企业案例一:搭建远程容灾备份系统[b]练习一推送文件方式同步并排除指定的目录和文件[/b][b]练习二测试主机之间数据完全同步(无差异同步)[/b]练习三rsync多目录多模块同步配置防火墙允许rsync服务附加一:rsync服务端部署流程回顾附加二:rsync自我模拟排错思路及实战附加三rsync生产排错整理我的FAQinotify介绍企业应用案例:利用rsync+inotify搭建实时同步系统。-------------------------------------Rsync服务器配置,安装、配置、实例以及原理详解。5.3.6 企业应用案例:利用rsync+inotify搭建实时同步系统

===================rsync 简介=======================

一、什么是rsyncrsync简介、传统的数据备份方式有cp命令和wget命令cp命令是源文件和目标文件都在本地。该命令仅实现对文件的一种完整复制,如果要复制的数据量巨大,那么备份的时间就会变得很长,wget命令通过网络进行备份,它不支持增量备份,每次都需要将所有的数据重新在网络上传输一遍,而不考虑哪些文件是更新过来,因此该命令的效率比较点。我们今天就介绍一个款实用的工具rsync,借助于这个工具能轻松实现数据的本地镜像和远程备份。什么是rsyncrsync是linux 系统下的文件同步和数据传输工具,它采用rsync算数。使一个客户机和远程文件服务器之间的文件同步,通过rsync可以将同一个服务器的数据从一个分区备份到另一个分区,也可以将本地系统的数据通知网络传输方式备份到任何一个远程主机上;rsync可以在中断之后恢复传输;rsync只传输源文件和目标文件之间不一致的部分;rsync可以执行完整备份或增量备份。

二、rsync的功能特性rsync即remote sync,从软件名称上就可以看出它所实现的功能,rsync有如下特性:·可以镜像保存整个目录树和文件系统。·可以增量同步数据,文件传输效率高,因而同步时间很短。·可以保持原有文件的权限、时间等属性。·加密传输数据,保证了数据的安全性。·可以使用rcp、ssh等方式来传输文件,当然也可以直接通过socket连接传输文件。支持匿名传输。-v 告诉rsync详细说明正在发生什么-a 告诉rsync从源目录 复制所有文件和目录-z 告诉rsync压缩数据以使网络传输更快(在进入线缆前我们的数据将被加密和压缩)-e ssh 告诉rsync使用我们的SSH shell来执行网络传输,你可以通过设置RSYNC_RSH shell环境变量来避免每次输入rsync命令时都需要加上这个参数,参考rsync的man手册获得详细信息。--delete 告诉rsync删除备用服务器上文件,如果它们在主服务器已经不存在的话(这个选项不会移除任何主或源数据)。/www/ 这是SSH客户端上源目录,它后面带有斜线,如果你想要rsync复制整个目录以及它下面的内容,这个斜线就是必需的10.1.1.2:/www 这是目标ip地址和目标目录

三、编译安装rsync软件[root@director rsync-3.0.4]# tar zxvf rsync-3.0.4.tar.gz[root@director rsync-3.0.4]# cd rsync-3.0.4[root@director rsync-3.0.4]# ./configureconfig.status: creating popt/dummyconfig.status: creating shconfigconfig.status: creating config.hrsync 3.0.4 configuration successful[root@director rsync-3.0.4]#[root@director rsync-3.0.4]# make[root@director rsync-3.0.4]# make install

四、rsync的应用模式rsync有4种应用模式,第一种是shell应用模式,也叫本地模式,第二种是远程shell模式,它是利用ssh执行底层连接和加密传输;第三种是查询模式,与ls命令实现的功能类似。第四种是服务器模式,平时所说的搭建rsync服务器就是指这种模式。1、本地shell模式本地shell主要用于复制制定目录到另一个目录,例如:[root@director src]# rsync -av rsync-3.0.4 /tmp------------省略--------------rsync-3.0.4/zlib/zlib.hrsync-3.0.4/zlib/zutil.crsync-3.0.4/zlib/zutil.hrsync-3.0.4/zlib/zutil.osent 5472930 bytes received 5190 bytes 10956240.00 bytes/sec[root@director src]# rsync -av rsync-3.0.4/ /tmpsent 5472780 bytes received 5189 bytes 10955938.00 bytes/sectotal size is 5454825 speedup is 1.00[root@director src]#rsync -av rsync-3.0.4 /tmp和rsync -av rsync-3.0.4/ /tmp 两个命令是有点差距的。明显差距就是源参数末尾的斜杠,如果源参数的末尾没有斜杠,就将指定的源目录复制到制定的目录;如果源参数末尾有斜杠,就会复制制定源目录中的内容到目录中。命令中:“-a” 即为“--archive”(归档模式),表示以递归方式传输文件,并保持所有文件属性;“-v”即为“--verbose” 表示输出详细模式信息。启动rsync服务以守护进程方式启动rsync服务:rsync --daemon #-----daemon表示以守护进程的方式启动rsync服务拓展:rsync的进程参数选项:--daemon #-----daemon表示以守护进程的方式启动rsync服务--addrss #-----绑定指定ip地址提供服务。--config=FILE #---更改配置文件路径,而不是默认的/etc/rsyncd.conf--prot=PORT #---更改其它端口号提供服务,而不是默认的873端口。提示:以上几个选项为了解内容,生产场景使用的不多。操作过程#rsync --daemonlsof -i tcp:873

===================rsync 借助ssh通道技术案例=======================

#rsync -avzP /etc/hosts -e "ssh -p30000" lianglab@192.168.1.110:/tmp/意思:把本地/etc/hosts文件推送到远端ip为192.168.110tmp目录下,SSH端口号为30000#rsync -avzP -e "ssh -p30000" lianglab@192.168.1.110:/tmp/hosts .意思:从远端的ip把这个文件拉到本地来。我们解释一下拉取案例的语法:rsync -avzP -e "ssh -p 22" lianglab@192.168.1.110:/opt /tmp说明:1、-avz相当于-vzrtopgD1,表示同步时文件和目录属性不变。2、-P显示同步的过程,可以用--progress替换。3、-e "ssh -p 22" 表示通过ssh的通道传输数据,-p 22可省略。4、lianglab@192.168.1.110:/opt 远程的主机系统用户,地址,路径5、/tmp本地的路径。实例:通过root用户从192。168.1.110的opt目录(包含目录本身)把数据拉到本地的/tmp目录。推送案例:raync -vzrtopP -e "ssh -p 22" /etc lianglab@192.168.1.110:/tmp实例:通过root用户把本地的/tmp目录(不包括目录本身)推送到192.168.1.100的/opt目录。#rsync -vzrtopP -e 'ssh -p 22' /tmp root@192.168.1.100:/opt#和拉取的例子几乎一样,只是把源和目的调换一下即可。password:输入连接主机密码即可。特别说明:1上文的数据同步都是通过加密传输,因为通过了ssh通道进行传输,2、在传输前需要进行连接用户(一般为系统用户)密码验证,需要手工输入密码,这里我们借助前面章节的sshkey 密钥免登陆验证的方式来实现,无交互验证数据传输。3、rsync软件必须安装在本地及远程所有机器上。借助ssh key密钥实现数据免登陆验证加密传输 说明,如果事先设置了ssh key密钥免登陆验证,即可以用rsync 通过ssh方式免登陆验证同步传输数据,这是生产场景常用的方法之一。配置ssh key密钥实现数据免登陆验证。使用ssh通道批量传输数据脚本vi lianglab.sh#!/bin/sh./etc/init.d/functionsif [$# -ne 1];then echo "Usage:$0 argv" exitfifor ip in 17 18do #scp -P30000 $1 lianglab@192.168.1.$ip:~ >&/dev/null&&\ #ssh -p30000 -t lianglab@192.168.1.$ip sudo rsync ~/$1 /etc >&/dev/null rsync -avzP $1 -e "ssh -p 30000" lianglab@192.168.1.$ip:~ >&/dev/null ssh -p30000 -t lianglab@192.168.1.$ip sudo rsync ~/$1 /etc >&/dev/null if [ $? -eq 0 ];then action "liang $1 successful." /bin/true else action "liang $1 failure." /bin/false fi done

===================rsync 借助ssh通道技术案例=======================

===================企业案例一:搭建远程容灾备份系统 =======================


实战练习:某公司有一台web服务器,里面的数据很重要,但是如果硬盘坏了,数据就会丢失,现在领导要求你把数据在其他机器上做一个周期性定时备份。要求如下:每天晚上00点整在web服务器A上打包备份网站程序目录并通过rsync命令推送到服务器B上备份保留(备份思路可以是先在本地按日期打包,然后在推到备份服务器上)具体操作如下:1、web服务器A和备份服务器B的备份目录必须都为/backup2、web服务器站点目录假定为(/var/www/html) 定时备份脚本cd /var/www &&\tar zcf /backup/192.168.1.110/html_$(date +%F).tar.gz./html &&\cd /backup/ &&\rsync -az . rsync_backup@192.168.1.100::backup --password-file=/etc/rsync.password >&/dev/nullfind /backup --type f -name "*.gz" -mtime +7|xargs rm -f部署前的准备工作,三台机器最佳A>查看一下系统内核版本[root@director src]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 5.4 (Tikanga)[root@director src]# uname -r2.6.18-164.el5[root@director src]# lsb_release -aLSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarchDistributor ID: RedHatEnterpriseServerDescription: Red Hat Enterprise Linux Server release 5.4 (Tikanga)Release: 5.4Codename: Tikanga[root@director src]#B>主机网络参数设置主机名 网卡eth0 默认网关 用途A-server 192.168.1.100 192.168.1.254 rsync服务器B-server 192.168.1.110 192.168.1.254 rsync节点服务器C-server 192.168.1.120 192.168.1.254 rsync节点服务器提示:子网掩码均为255.255.255.0具体需求: 要求在A-server上以rsync守护进程的方式部署rsync服务,使得所有rsync节点客户端主机,可以把本地数据通过rsync的方式备份到rsync服务器A-server上。本例的客户端为B-server、C-server。开始部署rsync------rsync服务器端操作过程:配置rsyncd.conf
1、配置rsyncd.conf首先确认软件是否安装:[root@director src]# rpm -aq rsync 5.5默认版本是2.6rsync-2.6.8-3.1[root@c-server ~]# rpm -aq rsync 5.8版本的centos默认安装是3.0版本rsync-3.0.6-4.el5_7.1
2、rsync的配置文件为/etc/rsyncd.conf 在安装完rsync时,默认没有这个文件,需要手动建立一个即可,rsyncd.conf文件由一个或多个模块结构组成,包括全局参数和模块参数,配置内容如下:vi /etc/rsyncd.conf#rsync_config______start#created by lianglab 21:55 2013-6-13#QQ 865362365#花名:瀚亮#Blog http://hi.baidu.com/zll56281688 http://zll56281688.blog.51cto.com## rsyncd.conf start ##uid = rsyncgid = rsyncuse chroot = nomax connections = 100strict modes = yestimout = 300pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file = /var/log/rsyncd.log[lianglab]path = /lianglabcomment = lianglab fileignore errorsread only = nowrite only = nohost allow = *host deny = 192.168.1.111list = falseauth users =backupsecrets file = /etc/rsync.password上面每个选项解释:1##uid此选项指定当该模块传输文件时守护进程应该具有的用户ID,默认为nobody。2##gid此选项指定当该模块传输文件时守护进程应该具有的用户主ID,默认nobody。3##use chroot如果为true 在给客户端传输文件前 “chroot to the path”这是rsync安全配置,因为我们大多数都是在内网使用,所以不配也可以。4##max connections指定模块的最大并发连接数,超过限制的连接请求将被暂时限制,默认为0,没有限制。5##strict modes指定是否检查口令文件的权限,yes为检查口令文件权限。如果设置为yes,密码文件的权限必须为root用户权限。6##timeout 默认为07##pid file 指定rsync守护进程对应的PID文件路径8##lock file指定支持max connections的锁文件,默认值是/var/run/rsync.lock9##log file 指定了rsync的日志输出文件路径10##[lianglab] 表示定义一个模块的开始,lianglab就是对应的模块名称。11##path此选项用来指定需要备份的文件和目录,是必须设置的项,12##ignore errors 表示可以忽略一些无关的I/O错误13##read only 设置为no表示客户端可以上传文件,设置为yes表示只读14##write only 设置为no表示客户端可下载文件,设置为yes表示不能下载。15##host allow设置可以连接rsync服务器的主机,“*”表示允许任何连接的主机。16##host deny 设置禁止连接rsync服务器的主机地址。17##list,选项用来设定当客户请求可以使用的模块列表时,该模块是否被列出,默认true18##auth users 用来定义可以连接该模块的用户名,19## secrets file 此选项用于指定一个包含“用户名:密码”格式的文件,用户名就是auth users选项定义的用户,密码可以随便指定。
3、 dos2unix /etc/rsyncd.conf[root@rsync ~]# dos2unix /etc/rsyncd.confdos2unix: converting file /etc/rsyncd.conf to UNIX format ...[root@rsync ~]#4、创建一个对外共享的目录,我们要授权lianglab这个目录的rsync权限,但是我们本机没有rsync用户,我们现在就要创建rsync这个用户。useradd rsync -s /sbin/nologin -M ##创建一个rsync用户,拒绝登录并没有在/home下面创建rsync目录。[root@rsync ~]# mkdir -p /lianglab[root@rsync lianglab]# useradd rsync -s /sbin/nologin -M[root@rsync lianglab]# chown -R rsync.rsync /lianglab #授权操作[root@rsync lianglab]#5、配置用于rsync同步的账号和密码以及账号文件权限。注意:其中backup:lianglab中的backup为同步传输用到的虚拟账号,这个账号仅为rsync的账号,不需要是系统账号,后面的lianglab为密码,不超过8位数,账号和密码中间用冒号分割。[root@rsync lianglab]# echo "backup:lianglab" >>/etc/rsync.password[root@rsync lianglab]# cat /etc/rsync.passwordbackup:lianglab[root@rsync lianglab]#[root@rsync lianglab]# chmod 600 /etc/rsync.password[root@rsync lianglab]# ll /etc/rsync.password #操作完检查是一个好习惯-rw------- 1 root root 16 Jan 24 15:49 /etc/rsync.password[root@rsync lianglab]#
6、启动rsync服务以守护进程方式来启动rsync服务rsync --daemon #--daemon 表示以守护进程的方式启动rsync服务rsync的进程参数其它选项解释:--address #----绑定指定IP地址提供服务---config-FILE #---更改配置文件路径,而不是默认的/etc/rsyncd.conf--port=PORT #---更改其它端口提供服务,而不是默认的873端口[root@rsync lianglab]# netstat -ant #没有启动rsync的时候Active Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:659 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN tcp 0 0 192.168.1.100:22 192.168.1.253:49627 ESTABLISHEDtcp 0 1 192.168.1.100:58614 192.168.1.111:21 SYN_SENT tcp 0 0 :::22 :::* LISTEN tcp 0 0 ::1:631 :::* LISTEN [root@rsync lianglab]#[root@rsync lianglab]# lsof -i :873
---------------------------启动rsync后的检查操作--------------------------[root@rsync lianglab]# rsync --daemon[root@rsync lianglab]# lsof -i :873COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMErsync 544 root 3u IPv6 45811 0t0 TCP *:rsync (LISTEN)rsync 544 root 5u IPv4 45812 0t0 TCP *:rsync (LISTEN)[root@rsync lianglab]# netstat -lntup | grep 873tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 544/rsync tcp 0 0 :::873 :::* LISTEN 544/rsync [root@rsync lianglab]# ps -ef | grep rsyncroot 544 1 0 16:05 ? 00:00:00 rsync --daemonroot 551 4404 0 16:06 pts/0 00:00:00 grep rsync[root@rsync lianglab]#
7、设置rsync服务开启自启动操作echo "/usr/bin/rsync --daemon" >>/etc/rc.local注意:当然还可以用chkconfig rsync on 命令,但是要编写适合chkconfig操作的脚本。重启rsync的命令pkill rsync #---关闭rsync服务rsync --daemon #---开启rsync服务[root@rsync lianglab]# pkill rsync #---关闭rsync服务[root@rsync lianglab]# ps -ef | grep rsyncroot 570 4404 0 16:14 pts/0 00:00:00 grep rsync[root@rsync lianglab]# lsof -i :873[root@rsync lianglab]# netstat -lntup | grep 873[root@rsync lianglab]#[root@rsync lianglab]# rsync --daemon #---开启rsync服务[root@rsync lianglab]# netstat -lntup | grep 873tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 575/rsync tcp 0 0 :::873 :::* LISTEN 575/rsync [root@rsync lianglab]# lsof -i :873COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMErsync 575 root 3u IPv6 46196 0t0 TCP *:rsync (LISTEN)rsync 575 root 5u IPv4 46197 0t0 TCP *:rsync (LISTEN)[root@rsync lianglab]# ps -ef | grep rsyncroot 575 1 0 16:15 ? 00:00:00 rsync --daemonroot 580 4404 0 16:15 pts/0 00:00:00 grep rsync[root@rsync lianglab]#[root@rsync lianglab]# killall rsync #同样的作用也是杀rsync进程[root@rsync lianglab]# killall rsyncrsync: no process killed[root@rsync lianglab]# ps -ef | grep rsyncroot 588 4404 0 16:17 pts/0 00:00:00 grep rsync[root@rsync lianglab]# lsof -i :873[root@rsync lianglab]# netstat -lntup | grep 873[root@rsync lianglab]#解释:killall有时候杀进程一下子杀不死,我们要连续杀,直到出现no process killed为止。killall -9 rsync 是强制杀进程。kill -9 PID kill和killall -9 这个两个命令杀进程,如果杀了,有可能这个服务就起不来了。我遇到过MySQL[root@rsync lianglab]# kill -9 rsync[root@rsync lianglab]# rsync --daemonfailed to create pid file /var/run/rsyncd.pid: File exists[root@rsync lianglab]#[root@rsync lianglab]# rm -f /var/run/rsyncd.pid #解决方法[root@rsync lianglab]# rsync --daemon[root@rsync lianglab]#
开始部署rsync------rsync客户端操作过程:1、客户端创建密码文件,并修改权限,另外一台也是同样的操作。[root@b-server ~]# echo "lianglab">/etc/rsync.password[root@b-server ~]# chmod 600 /etc/rsync.password[root@b-server ~]# ll /etc/rsync.password-rw------- 1 root root 9 Jan 3 10:01 /etc/rsync.password[root@b-server ~]# cat /etc/rsync.passwordlianglab[root@b-server ~]#[root@c-server ~]# echo "lianglab">/etc/rsync.password[root@c-server ~]# chmod 600 /etc/rsync.password[root@c-server ~]# ll /etc/rsync.password-rw------- 1 root root 9 Jan 24 16:33 /etc/rsync.password[root@c-server ~]# cat /etc/rsync.passwordlianglab[root@c-server ~]#
2、开始备份数据篇---------------------------------------------------操作场景:备份/var/www/html目录下的文件备份操作一般都是先打包,在备份,到我们要备份目录的上一级目录中去。在使用tar命令打包,我们可以把它打包到指定的目录也可以是当前目录[root@b-server html]# ll /var/www/html/total 4-rw-r--r-- 1 root root 29 Jan 3 10:08 index.html[root@b-server html]#[root@b-server html]# cd /var/www/[root@b-server www]# lscgi-bin error html icons manual usage[root@b-server www]# tar zcvf html_$(date +%F).tar.gz ./html/./html/./html/index.html[root@b-server www]# lscgi-bin error html html_2013-01-03.tar.gz icons manual usage[root@b-server www]#---------------------------------------------------------------------------[root@b-server www]# rsync --avzp html_2013-01-03.tar.gz backup@192.168.1.100::lianglabrsync: --avzp: unknown optionrsync error: syntax or usage error (code 1) at main.c(1449) [client=3.0.6][root@b-server www]#我们使用telnet命令检查一下服务端的端口是否开启[root@b-server www]# telnet 192.168.1.100 873Trying 192.168.1.100...telnet: connect to address 192.168.1.100: Connection refusedtelnet: Unable to connect to remote host: Connection refused[root@b-server www]# telnet 192.168.1.100 873Trying 192.168.1.100...Connected to 192.168.1.100 (192.168.1.100).Escape character is '^]'.@RSYNCD: 30.0^]telnet> qiu^H^H^[[3~^H^H^[[3~?Invalid commandtelnet> quitConnection closed.[root@b-server www]#[root@b-server www]# rsync -avzp html_2013-01-03.tar.gz backup@192.168.1.100::lianglabPassword: #每次都要输入密码比较烦人,我们可以指定一下我们之前设置的密码文件,就不需要输入密码了。sending incremental file listhtml_2013-01-03.tar.gzsent 270 bytes received 27 bytes 66.00 bytes/sectotal size is 183 speedup is 0.62[root@b-server www]#[root@b-server www]# rsync -avzp html_2013-01-03.tar.gz backup@192.168.1.100::lianglab --password-file=/etc/rsync.passwordsending incremental file listsent 43 bytes received 8 bytes 102.00 bytes/sectotal size is 183 speedup is 3.59[root@b-server www]#我们在到rsync服务器上查看一下,文件已经被同步过来了。[root@rsync lianglab]# lltotal 4-rw-r--r-- 1 rsync rsync 183 Jan 3 10:12 html_2013-01-03.tar.gz[root@rsync lianglab]#更换一种方式推送一下文件,首先要到rsync服务端,删除已经推送过来的文件[root@rsync lianglab]# rm html_2013-01-03.tar.gzrm: remove regular file `html_2013-01-03.tar.gz'? y[root@rsync lianglab]#[root@b-server www]# rsync -avzp html_2013-01-03.tar.gz rsync://backup@192.168.1.100/lianglab --password-file=/etc/rsync.passwordsending incremental file listhtml_2013-01-03.tar.gzsent 270 bytes received 27 bytes 594.00 bytes/sectotal size is 183 speedup is 0.62[root@b-server www]#[root@rsync lianglab]# lltotal 4-rw-r--r-- 1 rsync rsync 183 Jan 3 10:12 html_2013-01-03.tar.gz我们在测试一下能不能推送到tmp目录,是不行滴。[root@b-server www]# rsync -avzp html_2013-01-03.tar.gz rsync://backup@192.168.1.100/tmp --password-file=/etc/rsync.password@ERROR: Unknown module 'tmp'rsync error: error starting client-server protocol (code 5) at main.c(1530) [sender=3.0.6][root@b-server www]#我们是可以往服务端lianglab这个目录下子目录推送的,但是一定要给目录授权的。[root@rsync lianglab]# mkdir test[root@rsync lianglab]# chown rsync test[root@b-server www]# rsync -avzp html_2013-01-03.tar.gz rsync://backup@192.168.1.100/lianglab/test --password-file=/etc/rsync.passwordsending incremental file listhtml_2013-01-03.tar.gzsent 270 bytes received 27 bytes 594.00 bytes/sectotal size is 183 speedup is 0.62[root@b-server www]#[root@rsync lianglab]# cd test/[root@rsync test]# lltotal 4-rw-r--r-- 1 rsync rsync 183 Jan 3 10:12 html_2013-01-03.tar.gz[root@rsync test]#查看详细生成时间。[root@rsync test]# ll /back/ --time-style=long-iso[root@rsync test]# ll /back/ --time-style=full-iso==============================================参考文献:老男孩51CTO视频教程http://edu.51cto.com/course/course_id-875.html
南非蚂蚁《高性能Linux服务器构建实战》一书
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息