Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8041
  • 博文数量: 3
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-10 17:44
个人简介

Welcom to My Blog

文章分类

全部博文(3)

文章存档

2016年(2)

2015年(1)

我的朋友
最近访客

分类: LINUX

2015-07-25 09:18:37

CentOS最小化安装后,直接在客户端主机172.16.100.15上安装rsync程序,而服务端172.16.100.16/17未安装任何东西
  1. # yum install rsync 
  2. # rsync /tmp/test.txt 172.16.100.16:/tmp
  3. 错误信息:
  4. rsync: Failed to exec ssh: No such file or directory (2)
  5. rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.6]
  6. rsync: connection unexpectedly closed (0 bytes received so far) [sender]
  7. rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]
  8. 原因:
  9. 客户端172.16.100.15未安装openssh-clients程序
  10. # yum install openssh-clients -y
  11. # rsync /tmp/test.txt 172.16.100.16:/tmp
  12. 错误信息:
  13. bash: rsync: command not found
  14. rsync: connection unexpectedly closed (0 bytes received so far) [sender]
  15. rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]
  16. 原因:
  17. 服务器端172.16.100.16未安装rsync程序
  18. # yum install rsync -y

rsync /tmp/test.txt 172.16.100.16:/tmp 输入密码后正常!


语法:
    rsync    [options]    [[user@]from-host:]source-file   [[user@]:to-host:]destination-file

参数
    rsync可以在本地系统的目录之间复制文件,也可以是本地系统和远程系统之间复制文件。当不指定用户名时,默认是当前登录账号。
    注意:rsync只是在本地和远程之间复制文件,并不是让你在2个远程系统之间复制文件。这点是不同于scp命令的。
    比如在172.16.100.15上面登录,然后可以使用下面的命令:
    # scp  root@172.16.100.16:/tmp/test1.txt root@172.16.100.17:/tmp  
            在输入2个主机的密码后,就可以将文件复制过去了
    # rsync  root@172.16.100.16:/tmp/test1.txt root@172.16.100.17:/tmp  

            "The source and destination cannot both be remote"
   这是rsync与scp命令不同的地方。

    source-file 是要复制的普通文件或目录。destination-file 是得到的副本。这里可以使用相对或绝对路径指定文件名称。
    在本地系统上面,如果使用相对路径,那么它是相对于当前的所在工作目录的。
    在远程系统上面,使用相对路径时,那么它是相对于被 指定用户的或隐式用户的主目录的。 
    # rsync /tmp/test2.txt root@172.16.100.17:  
            这时,就会将test2.txt复制到172.16.100.17:/root/test2.txt
    注意:如果source-file 是一个目录,那么source-file默认的斜杠"/" 使rsync 复制该目录中的内容,该斜杠作用等价于"source-file/* ",它告诉rsync忽略目录本身,而复制目录中的内容。
            当默认没有斜杠时,那么rsync 就只复制目录
# mkdir /test3 && rsync -a -v --delete /test3 root@172.16.100.17:/
        这样不会干掉172.16.100.17:/ 根目录下面的文件和目录,只会将test3目录复制过去,而且替换掉17原来上面有的test3目录。
# mkdir /test3 && rsync -a -v --delete /test3/ root@172.16.100.17:/
        这里加上 ”/“ 就会干掉172.16.100.17:/ 根目录下面的所有内容


选项[options]:

--acls            -A        保存被复制文件ACL,包括setfacl 设定的权限
--compress    -z         复制文件的同时压缩传送。
--delete                    在destination-file中删除source-file中没有的文件,小心使用。
--dry-run       -n        运行rsync,但不实际写入磁盘,一般与--verbose、--delete、--archive一起使用,它会报告rsync将会删除的文件,
                               或者报告源与目标不同的地方,对于十分混乱的生产环境,十分有用。
--archive        -a        递归复制文件,包括 ”取消引用的符号链接“、设备文件和特殊文件,保留与文件相关的所有权关系、组、权限(即使用chown 、chmod设定的)和修改次数。
                               使用这个选项与指定--devices、--special、--group、--links、--owner、--perms、--recursive和--times 选项相同。
                               但是它不包括 --acls、--hard-links或--xattrs选项。
--backup        -b        重名文件,否则该文件就会被删除或覆盖。在重命名文件的时候,默认会在destination-file后面加上一个"~"波浪线。
                               如果希望rsync 把这些文件放在特定的目录下,而不是重名,则可以使用--backup-dir,或者--link-dest=dir
--backup-dir=DIR        与 --backup 一起使用时,就会把文件移动到dir 目录下面,否则该文件就会被删除或被覆盖。
                               DIR目录位于destination系统上面 ,在目标主机的用户有写入权限的情况下,会在DIR目录下面新建一个与source-file目录一样的目录结构。
--link-dest=DIR           用于增量备份,详见下面例子。
 
--copy--unsafe-links   对于source-file分层目录中包含有指向外部的软连接文件时,可以使用这个选项将软连接指向的源文件或源目录一并复制到目标主机上。
                               但是目标主机上面的那个软连接文件会成为真实的文件或目录,所以相对于源主机的源文件或源目录,名字会被更名。
--links           -l         不复制软连接指向的实际文件
--hard-links    -H        保留被复制文件的硬链接。

--device-special    -D  
--device                   复制设备文件
--special                   复制特殊文件
    
--group         -g        保留被复制文件的组权限。
--owner        -o        保留被复制文件的所有权关系(只有root用户才能保留)
--perms        -p         保留被复制文件的权限。
--recursive    -r         递归复制source-file目录
--times         -t         保留复制文件的修改次数,这个选项会加快复制速度,因为它使得rsync不复制 在source-file和destination-file中
                               修改次数相同、大小也相同的文件。
--update      -u          跳过destination-file中比source-file更新的文件,即使加上--delete也不会被删除。
--verbose     -v         显示rsync执行过程的操作的文件
--xattrs       -X          保留被复制文件的扩展属性,这个选项在所有编译版本的rsync中不可用


rsync的运行方式:
openssh:        
    rsync默认使用openssh在远程系统上来回复制文件,这里远程系统后面是一个冒号。所以远程服务器系统必须运行openssh服务,而本地客户端必须安装openssh-clients,是的可以使用ssh命令。这就不难明白开头部分为什么会报错了!
rsyncd守护程序:
    当远程目标主机后面使用2个冒号,即[to-host]::DIR ,那么 "rsync就会连接到远程系统的rsyncd守护程序”,这里就不再使用openssh了。


本地运行方式:

  1. 在/root家目录建立一个需要同步的目录
  2. # mkdir /root/test4
  3. # echo liyapeng > /root/test4/linghuchong
  4. # echo baike > /root/test4/liyuanfang
  5. 在/tmp目录下面建立几个测试文件,测试是否会被覆盖
  6. # touch /tmp/{t1,t2,t3}
  7. 开始测试:
  8. # rsync -av /root/test4/ /tmp/
  9. sending incremental file list
  10. ./
  11. linghuchong #被同步的文件
  12. liyuanfang
  13. # ls /tmp/
  14. linghuchong liyuanfang t1 t2 t3

  1. 在源目录后面带有"/"时,加上--delete参数时,是否会被删除
  2. # rsync -av --delete /root/test4/ /tmp/
  3. sending incremental file list
  4. deleting .ICE-unix/
  5. deleting t3
  6. deleting t2
  7. deleting t1
  8. # ls /tmp
  9. linghuchong liyuanfang
  10. 在SRC目录后面加上"/"时,确实会删除DEST目录中的所有内容。

  1. 在SRC目录后面不加"/"时,加上--delete参数时,是否会删除DEST目录中的文件:
  2. # touch /tmp/{t1,t2,t3}
  3. # rsync -av --delete /root/test4 /tmp/
  4. sending incremental file list
  5. test4/
  6. test4/linghuchong
  7. test4/liyuanfang
  8. 由于DEST目录中没有test4目录,所以只显示send了什么文件
  9. # ls /tmp/
  10. linghuchong liyuanfang t1 t2 t3 test4
  11. 结果显示,SRC目录结尾不带"/",就会将SRC目录整体复制到DEST目录中。

  1. 再测试在/tmp/test4目录中手动增加一些内容,同时也删除一些内容,并且和上个例子一样,也使用--delete参数
  2. # rm -rf /tmp/test4/{linghuchong,liyuanfang}
  3. # touch /tmp/test4/{t4,t5,t6}
  4. # rsync -av --delete /root/test4 /tmp/
  5. sending incremental file list
  6. test4/
  7. deleting test4/t6 #这里显示删除的内容
  8. deleting test4/t5
  9. deleting test4/t4
  10. test4/linghuchong
  11. test4/liyuanfang


  1. 最后再测试当DEST目录不存在时,会发生什么情况
  2. # rm -rf /tmp/*
  3. # rsync -av --delete /root/test4 /tmp/new
  4. sending incremental file list
  5. created directory /tmp/new # 可以看到rsync新建了一个目录
  6. test4/
  7. test4/linghuchong
  8. test4/liyuanfang
  9. 当然,如果DEST目录多级目录未被创建,rsync就会报错了

  1. 上面都是直接删除的例子,但是在实际生产环境会非常混乱,天知道其他人做了什么蠢事情,所以在实际运行前需要测试一下,实际会删除什么文件:
  2. # rsync -av --delete /root/test4 /tmp/
  3. # ls /tmp/test4/
  4. linghuchong liyuanfang
  5. # touch /tmp/test4/t7
  6. # mkdir /tmp/test4/t8
  7. # touch /tmp/test4/t8/{t9}
  8. # tree /tmp/test4/
  9. /tmp/test4/
  10. ├── linghuchong
  11. ├── liyuanfang
  12. ├── t7
  13. └── t8
  14. └── {t9}
  15. # rsync -avn --delete /root/test4 /tmp/
  16. sending incremental file list
  17. test4/
  18. deleting test4/t8/{t9}
  19. deleting test4/t8/
  20. deleting test4/t7
  21. # tree /tmp/test4/
  22. /tmp/test4/
  23. ├── linghuchong
  24. ├── liyuanfang
  25. ├── t7
  26. └── t8
  27. └── {t9}
  28. 结果依然存在,所以--delete常常和--verbose、--dry-run,当然还有-a , 一起用来进行测试

OpenSSH运行方式:

这里需要注意的就是相对目录的问题,如果没有指定绝对目录,那么就会传输到远程用户的家目录下面。

  1. 在172.16.100.16上面生成密钥对,并复制到172.16.100.17上面:
  2. # ssh-keygen -b 4096
  3. # ssh-copy-id -i /root/.ssh/id_rsa root@172.16.100.17
  4. # rsync -av --delete /root/test4 root@172.16.100.17:
  5. sending incremental file list
  6. test4/
  7. test4/linghuchong
  8. test4/liyuanfang
  9. 等到172.16.100.17,在/root目录下面就会又test4目录。可以看到这里只有一个":"。如果后面跟上一个非绝对路径:
  10. # rsync -av --delete /root/test4 root@172.16.100.17:test5
  11. 在172.16.100.17上面看到:
  12. # tree /root/test5
  13. /root/test5
  14. └── test4
  15. ├── linghuchong
  16. └── liyuanfang

  1. 使用绝对路径更是没有问题:
  2. # rsync -av --delete /root/test4 root@172.16.100.17:/tmp
  3. 登录到172.16.100.17:
  4. # ls /tmp
  5. test4 yum.log

还有就是要介绍下--link-dest=DIR用来进行增量备份。但是首先需要明白软连接与硬链接的区别:

  1. # echo 1 > a && ln a b && ln -s a c
  2. # ls -lhi a b c
  3. 653196 -rw-r--r-- 2 root root 2 Jul 26 13:04 a
  4. 653196 -rw-r--r-- 2 root root 2 Jul 26 13:04 b
  5. 653197 lrwxrwxrwx 1 root root 1 Jul 26 13:04 c -> a
  6. 可以看到 a 和 b 使用的相同的 inode ,也就是说它们包含实际内容的文件所在的block是一样的,所以他们完全就是一个文件。而 c 则完全是另外一个文件


  1. 首先还是先将src目录复制过去,当做完全备份:
  2. # rm -rf /tmp/*
  3. # rsync -a --delete /root/test4 /tmp/test4.all (SRC后没有"/")
  4. 接着进行第一次增量备份,这里没有在SRC增加新文件:
  5. # rsync -a --delete --link-dest=/tmp/test4.all /root/test4 /tmp/test4.incremental.first (SRC后没有"/")
  6. # ls -lhi /tmp/test4.all/test4/ /tmp/test4.incremental.first/test4/
  7. /tmp/test4.all/test4/:
  8. total 8.0K
  9. 653192 -rw-r--r-- 2 root root 9 Jul 26 10:35 linghuchong
  10. 653194 -rw-r--r-- 2 root root 6 Jul 26 10:36 liyuanfang
  11. /tmp/test4.incremental.first/test4/:
  12. total 8.0K
  13. 653192 -rw-r--r-- 2 root root 9 Jul 26 10:35 linghuchong
  14. 653194 -rw-r--r-- 2 root root 6 Jul 26 10:36 liyuanfang
  15. 从结果中可以看到他们的inode是一样的,这样就会节省大量的磁盘空间奥!
  16. 如果只是这样你看不特别之处,可以接着看:
  17. 这里没有再使用增量备份的参数,而是像普通一样正常使用rsync:
  18. # rsync -a --delete /root/test4 /tmp/test4.third
  19. # ls -lhi /tmp/test4.all/test4/ /tmp/test4.third/test4/
  20. /tmp/test4.all/test4/:
  21. total 8.0K
  22. 653192 -rw-r--r-- 2 root root 9 Jul 26 10:35 linghuchong
  23. 653194 -rw-r--r-- 2 root root 6 Jul 26 10:36 liyuanfang
  24. /tmp/test4.third/test4/:
  25. total 8.0K
  26. 653199 -rw-r--r-- 1 root root 9 Jul 26 10:35 linghuchong
  27. 653200 -rw-r--r-- 1 root root 6 Jul 26 10:36 liyuanfang
  28. 可以看到,他们的inode是完全不同的,也就是指向的block是完全不同的,所以就会占用额外的空间。
最后说一下--link-dir=DIR是怎么工作的吧:
1、首先进行一次完全备份的rsync.
2、进行第N次增量备份时,rsync会递归的在DEST目录中查找每一个与SRC是否一致的文件。如果在DEST中找到了与SRC中一致的文件,那么他就会处理下一个文件。
3、如果增量备份时,没有在DEST找到与SRC完全一致的精确副本,那么rsync的动作不是直接从SRC中复制,而是先去DIR中递归的搜索一遍:
    a,如果在DIR目录中找到了与SRC中完全一致的文件,那么就会在DEST目录中建立一个硬链接指向DIR目录中的文件。
    b,如果在DIR目录中依然没有找到与SRC中完全一致的文件,那么就会直接从SRC中复制文件到DEST目录中
4、备份完成。














阅读(893) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~