-- sync 同步 async 异步 rsync 远程同步 rsync remote sync 远程同步 拷贝和同步的区别? rsync - faster, flexible replacement for rcp rsync — a fast, versatile, remote (and local) file-copying tool Wget - The non-interactive network down-loader. wget http://10.1.1.10/linux_basic01.txt --直接接url uniform resource locate(统一资源定位) wget http://10.1.1.10/linux_basic01.txt -O /test/123 wget -m -k -np http://10.1.1.10/png/ wget -m http://www.xxx.com --下载整个网站 题目:如何下载一个epel的扩展yum源* 做法: 1,先在本地yum配置里写上你要下载的yum源的路径,如 # vim /etc/yum.repos.d/rhel-source.repo [epel] server=epel baseurl=http://xxx.xxx.xxx/ gpgcheck=0 enabled=1 3 # yum repolist --列出你现在所有配置的repo的名字 2,# reposync --repoid=epel --把epel路径的所有软件包下载到本地当前目录 rsync 特点: 1,可以镜像保存整个目录树和文件系统 2,容易做到保存原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件attributes等 3,传输效率高,使用同步算法,只比较变化的 4,支持匿名传输,方便网站镜像 rsync 参数介绍 -v verbo -a 归档模式,递归的方式传输文件,并保持文件的属性 -l 保留软链接 -R 保留相对路径 -H 保留硬链接 -p ,-o,-g,-A 分别保留权限,属主,属组,acl等,但如果加了-a,这些就都包括了 -D 等于--devices --specials 表示支持b,c,s,p类型的文件 普通应用: rsync -av /home/ /backup/ --本机上的同步,把/home目录下的内容同步到/backup目录下(包括隐藏文件) rsync -av /home/ 10.1.1.218:/backup/ --把本地的/home目录内容,同步到远端218的/backup目录下,需要远程的10.1.1.218的密码 rsync -av 10.1.1.218:/backup/ /backup/ --把远端218的/backup目录下的内容同步到本地的/backup目录,需要远程的10.1.1.218的密码 # rsync -a /test/ '-e ssh -p 2222' 10.1.1.218:/test1/ --如果远程机10.1.1.218的ssh端口不为默认的22,比如改成了2222,那么需要这样写 注意的问题: 1。 同步时保留原路径,也就是把/home同步到/backup会变成/backup/home/*再内容 --原目录后面加不加/也影响你的同步 下面这三个有区别: rsync -av /home/ /backup/ --/home下的内容直接同步到/backup下 rsync -av /home /backup/ rsync -aRv /home/ /backup/ --这两上是/home被同步成/backup/home/* # rsync -av /share/120214 /backup/ --被同步成/backup/120214/* # rsync -aRv /share/120214/ /backup/ --被同步成/backup/share/120214/* 2。如果源目录有文件被删除了,那同步的目录是删除还是不删除,是否可以用参数来控制* --delete # rsync -aHAX --delete /test/ /test1/ --比较完整的一个写法 思考:能否把上面的rsync做成服务(daemon)的形式,并加上一些控制功能或日志记录功能呢? 主要两个知识点: 1,xinetd 2,man rsyncd.conf --这两个一起共存,共同控制rsync xinetd介绍 # yum install xinetd rsync xinetd 就类似于一个拖管服务,可以拖管一些其它的小服务。拖管后的好处就是可以使用xinetd强大的参数来控制这些服务。(比如一个小服务没有一些控制功能,但支持xinetd拖管,你就可以拖管并使用xinetd的参数来控制它) /etc/xinetd.conf --主配置文件,一般不用配置,主要配置子配置文件 /etc/xinetd.d --子配置文件目录 xinetd服务相当于是所有被拖管服务的总开关 # vim /etc/xinetd.d/rsync --(man xinetd.conf参考帮助) service rsync { disable = yes --yes表示关闭,no表示开启(也就是说要启动rsync服务,两个条件:1,disable = no 2,xinetd服务要启动) flags = IPv6 socket_type = stream wait = no --并发连接 user = root --跑守护进程的用户 server = /usr/bin/rsync --启动程序路径 server_args = --daemon --启动参数(这三个参数合起来就是表示用root身份执行/usr/bin/rsync --daemon来启动rsync服务) log_on_failure += USERID --控制日志格式,表示登陆此服务失败时,在日志里原来的格式基础上再加上记录USERID } 例一: 服务器端的配置: 1,第一步: vim /etc/rsyncd.conf --此文件不存在,需要手动建立(man rsyncd.conf参考帮助) motd file=/etc/rsyncd.welcome [weekendnotes] --共享给客户端看到的名字 path=/share/weekend2 --实际共享的服务器路径 vim /etc/rsyncd.welcome --手动建立自己定义的motd文件,并写上自定义的欢迎信息 2,第二步: # vim /etc/xinetd.d/rsync service rsync { disable = no --yes改为no 打开rsync服务功能 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID } 第三步: /etc/init.d/xinetd restart --重启服务 netstat -ntlup |grep 873 --服务端就会有873的端口在监听了 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4080/xinetd 客户端的操作: # rsync -v 10.1.1.10:: --直接这样可以查看10这个服务器共享了哪些 "hello today! @_@" --这就是你rsyncd.welcome里写的欢迎内容 weekendnotes # rsync -a 10.1.1.10::weekendnotes /notes/ --这样同步,是不需要密码的;注意weekendnotes为共享名,前面有两个:: 后面/notes为本地目录 --没有密码有好处也有坏处,好处是不需要密码方便写脚本做远程同步。如果要密码写脚本就要用到expect自动应答。坏处就是不安全,但你可以使用iptables等来加强安全。 --如果你希望有密码,也不用传密码的话,可以用rsyncd本身自带的secrets file来做验证的用户 同步可能出现的问题: 1,如果同步报permission denied这种,可能是服务端selinux没有关闭 关闭selinux的方法: # setenforce 0 --这是马上把selinux由强制模式改成警告模式 # vim /etc/selinux/config SELINUX=disabled --把这个改成disabled,然后需要重启电脑才能生效 2,同步时间慢 解决方法:绑定对方主机名 例二:在上面的基础上加上一些功能 要求: 1。把日志记录到/var/log/rsyncd.log 2。共享模块要求隐藏(也就是说客户端查看不到这个模块名) 3。并且同时只能1个客户端连接进行同步这个module 4。只能允许10.1.1.x(ip你自定义)同步这个module 5。只能早上9点到下午6点同步 第一个要求实现的方法很多: 方法1:在/etc/xinetd.d/rsync 加上参数log_type file /var/log/rsyncd.log; 方法2:在/etc/xinetd.d/rsync 加上参数log_type syslog local5; 方法3:在/etc/rsyncd.conf加上参数 log file=/var/log/rsyncd.log; 方法4:在/etc/rsyncd.conf加上参数syslog facility=local5 --方法2和4还需要在/etc/rsyslog.conf里加上local5.* /var/log/rsyncd.log # vim /etc/rsyncd.conf motd file=/etc/rsyncd.welcome [weekendnotes] path=/share/weekend2 list=false max connections=1 log file=/var/log/rsyncd.log hosts allow=10.1.1.x # vim /etc/xinetd.d/rsync access_times = 9:00-18:00 # /etc/init.d/xinetd restart rsyncd能不能不拖管到xinetd下实现呢* 可以实现 使用下面的命令来启动,而不用xinetd来做(这样做rsyncd.conf里的参数还是生效,但/etc/xinetd.d/rsync里的参数不生效了) /usr/bin/rsync --daemon ============================================================================================ rsync的补充: 实现实时同步(也就是源一变化,它就会触发同步) inotify+rsync inotify-tools-3.13.tar.gz # tar xf inotify-tools-3.13.tar.gz -C /usr/src/ # cd /usr/src/inotify-tools-3.13/ # ./configure # make # make install --安装完后,就会产生下面两个命令 /usr/local/bin/inotifywait /usr/local/bin/inotifywatch # /usr/local/bin/inotifywait --help /usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory 如果报错,找不到那个库,这个库实际上是在/usr/local/lib下的 解决方法 # echo /usr/local/lib/ > /etc/ld.so.conf.d/abc.conf # ldconfig 1,实现单向本地目录实时同步 测试本机/test目录里一有(增,删,改,属性改变),就会同步到/test1目录 --使用下面的脚本来做 #vim /tmp/1.sh #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read files do rsync -a --delete /test/ /test1/ echo "`date +'%F %T'`出现事件$files" >> /var/log/rsync.log 2>&1 done # nohup sh /tmp/1.sh & --使用nohup挂起到后台执行,终端关闭,这个进程也不会被关闭 --如果你希望实现开机自动启动,可以把此命令加到/etc/rc.local里,或者写成shell服务脚本,让其支持chkconfig开机自动启动 再然后对/test进行各种操作,验证可以实时同步到/test1 2,实现双向本地目录的实时同步 也有相关的软件(比如unison)可以专门来做双向的实时同步 但我们就可以用inotify反向再做一次再写一个脚本也一样可以简单去实现 3,远程实时同步 web1 web2 共享存储iscsi FC (分布式存储) 方法一,inotify+rsync+nfs 把远程目录用nfs挂载过来,当本地目录来监控,然后直接用上面的本地实时同步脚本就可以了 --注意:经测试后,此种方法不可取。(应该是inotify只能支持本地目录的监控,远程目就算是挂载过来也不能监控) 监控远程挂载过来的目录不可以,那么我们可以考虑监控本地的目录,当本地目录内容有变化时,同步到远程挂载过来的NFS目录(但要有写权限) 实现把35上的/test目录实时同步到37上的/test1目录 10.1.1.10 /test目录 10.1.1.34 /test1目录 步骤一: 在37上 # vim /etc/exports /test1 *(rw,no_root_squash) # /etc/init.d/rpcbind restart # /etc/init.d/nfs restart 步骤二: 在35上 # mkdir /test1/ # mount -t nfs -o vers=3 10.1.1.34:/test1 /test1 --用nfs3版本挂载过来,那么/test1目录就是37上的远程/test1目录了 步骤三: 执行上面讲的两个本地目录同步一样的脚本,测试就可以了 #vim /tmp/1.sh #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read files do rsync -a --delete /test/ /test1/ echo "$files在`date +'%F %T'`被同步" >> /var/log/rsync.log 2>&1 done #nohup sh /tmp/1.sh & 方法二,使用ssh等效性(ssh密钥登录)让远程机器连接不需要密码,就很容易使用远程监控或同步了 对称加密 非对称加密 ssh等效性用的是非对称加密原理 原理:产生一对密钥,自己持有一个私钥,公钥给对方,需要一对才能解密 # ssh-keygen --输入这个命令后,三次回车产生空密码key对 # scp /root/.ssh/id_rsa.pub 10.1.1.104:/root/.ssh/authorized_keys--把公钥传给104的机器后,重命令名为authorized_keys # ssh-add /root/.ssh/id_rsa --在rhel6如果不能成功,需要在本地把自己的私钥加一下 Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) # ssh 10.1.1.104 --直接ssh不需要密码了 思考:三台机的user1用户之间全部ssh不需要密码,并且ssh自己也不需要密码 A B C 1,A,B,C三台都su - user1,然后使用ssh-keygen产生各自的私钥对 2,在A机器上用user1继续操作, scp Bserver:~/.ssh/id_rsa.pub ~/Bserver_pubkey scp Cserver:~/.ssh/id_rsa.pub ~/Cserver_pubkey 3,cat id_rsa.pub Bserver_pubkey Cserver_pubkey >> authorized_keys 4,scp authorized_keys Bserver:~/.ssh/ scp authorized_keys Cserver:~/.ssh/ 思考: 试想一下,如果你管理1000台服务器,你希望就在一台服务器上能轻松远程管理所有服务器,或者在一台上写脚本可以管理所有服务器,你会怎么做? 答案: 1,如果你都做ssh等效性,工作量太大;当然也可以先在1000台上分别产生一对密钥,然后把公钥都传给其中一个人,全部追加到一个authorized_keys文件。然后使用expect脚本或者puppet这种工具推送到其它999台上面. 2,就算是都做好了,也不安全,如果一台被攻破,那么另外999台也没有安全保障了 3,但并不是说这个没有实际应用,在少量的几台之间做一些特殊应用还是可以用的; 如:在oracle的RAC集群里,各个节点之间必须要配置这个(只不过是oracle用户,不是root用户); 如:hadoop的管理用户也需要互相配置ssh等效性 4,或者使用用户集中化管理,所有的用户都在一个服务器上 然后实现远程实时同步,只需要在原来的脚本基础上把远程目录前加上远程IP就可以了(因为做了ssh等效性,不需要密码) #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test |while read files do rsync -a --delete /test/ 10.1.1.104:/test1/ echo "`date +'%F %T'`出现事件$files" >> /var/log/rsync.log 2>&1 done 方法三,用脚本的expect自动应答来处理远程连接时要传的密码问题 shell脚本再讨论 方法四,使用rsync的secrets file的方法然后写脚本 例: 远程被同步端 本地同步端 10.1.1.34 10.1.1.10 我要实现把本地同步端10.1.1.10上的/localtest/目录里的内容实时同步到远程被同步端10.1.1.34的/remotetest/目录 准备: 关闭iptables和selinux 实现过程 第一大步:在远程被同步端10.1.1.34上操作 # mkdir /remotetest/ --创建测试的被同步目录 # vim /etc/rsyncd.conf uid=root gid=root --这里指定使用root身份同步到10,否则默认使用nobody用户(这样你需要把/remotetest/目录改成757的权限,才有权限写) [testsource] path=/remotetest/ ignore errors read only=no --服务级别给写权限 auth users=test --验证的用户取名为test secrets file=/etc/rsyncd.secrets --验证用户test的用户名和密码的存放文件,此文件需要同步端和被同步端都要有(这样我们就可以用这种方式来进行验证,而不需要远程的ssh密码验证了) hosts allow=10.1.1.10 --进一步加强安全,只允许10.1.1.10同步 # vim /etc/rsyncd.secrets --创建这个密码文件,用户名要与上面的auth users指定的一致,密码随意(我这里以321来测试) test:321 # chmod 600 /etc/rsyncd.secrets --为了安全性,把权限改成600,只让root读写(很多其它软件的密码文件也会要求你改成600权限) # yum install xinetd -y # vim /etc/xinetd.d/rsync disable = no -- disable 后面值由yes改为no # /etc/init.d/xinetd restart --重启服务 # chkconfig xinetd on --设置开机自动启动 第二大步:在本地同步端10.1.1.10上操作 先安装inotify软件,步骤参照上面过程,这里省略 # mkdir /localtest/ --创建测试的同步目录 # vim /etc/rsyncd.secrets --也要创建这个密码文件,里面只写密码就可以了。用户我们在后面的脚本里的命令里指定 321 # chmod 600 /etc/rsyncd.secrets --也改成600的权限 # vim /bin/rsync.sh --脚本及其内容 #!/bin/bash /usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /localtest |while read files do rsync -a --delete --password-file=/etc/rsyncd.secrets /localtest/ test@10.1.1.34::testsource done # chmod 755 /bin/rsync.sh --给执行权限,方便执行 # nohup sh /bin/rsync.sh & --后面挂起执行 # vim /etc/rc.local --加到rc.local里让其开头自动启动 nohup sh /bin/rsync.sh & 第三大步: 测试过程省略