scp
scp节约资源,系统负荷小,但断点续传是个问题
scp
scp [OPTION] SRC DEST
常用参数:
-r:递归拷贝目录
-q:不显示进度
-l:限制传输带宽,单位是kbits/s
示例
scp -r -l 200 path/to/dir user@192.168.1.1:/home/user/
rsync
scp 是通过ssh协议传输数据,如果是想传输一个很大的数据,有可能遇到服务器断电什么的悲剧问题,类似scp拷贝的另一个命令 rsync就可以实现意外中断后,下次继续传
rsync速度更快,断点续传方便,但系统负荷大,尤其是传输很多文件的时候,硬盘I/O非常高。
注意,传输的双方都必须安装 rsync 安装
# Debian
$ sudo apt-get install rsync
# Red Hat
$ sudo yum install rsync
# Arch Linux
$ sudo pacman -S rsync
参数说明
rsync
rsync [OPTION] SRC DEST
常用参数:
-b、--backup:参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix参数指定的文件后缀名,默认是~
--progress: 显示拷贝进度
--partial:保留不完整文件,实现断点续传
--partial-dir=DIR:指定不完整文件的存储目录,而不是默认存储到目的地目录,比如--partial-dir=.rsync-partial。一般需要与--append或--append-verify配合使用。
-P:包含--progress和--partial
--rsh=ssh:使用ssh方式传输文件,注意:如果之前设置过ssh免密码登录,那么此时也就不需要密码了,非常方便
-v:-v参数表示输出细节。-vv表示输出更详细的信息,-vvv表示输出最详细的信息。
-a:归档模式。也就是以递归方式传输文件,并保持所有文件属性。
--append:参数指定文件接着上次中断的地方,继续传输。
--append-verify:参数跟--append参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。
-z :传输时进行压缩提高效率。
--bwlimit参数指定带宽限制,默认单位是 KB/s,比如--bwlimit=100
-c、--checksum参数改变rsync的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。
-i参数表示输出源目录与目标目录之间文件差异的详细情况。
--existing、--ignore-non-existing参数表示不同步目标目录中不存在的文件和目录。
--ignore-existing参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。
-u、--update参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。
-r:递归方式传输文件
--remove-source-files:参数表示传输成功后,删除发送方的文件。
-n:-n或--dry-run参数模拟执行的结果,不真的执行
--delete:默认只保证复制到,不保证相同所以不删除,添加此参数会删除不存在于源的内容,进而保证一致
--link-dest:参数用来指定同步时的基准目录
--size-only:参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file :daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
示例
rsync -P --rsh=ssh home.tar user@192.168.1.2:/home/
rsync -P --rsh=ssh user@192.168.1.2:/home/test.tar.gz /root
# -P: 是包含了 “–partial –progress”, 部分传送和显示进度
# 省略参数的写法 alias scpr="rsync -P --rsh=ssh"
# scpr home.tar 192.168.205.34:/home/home.tar
rsync -a source destination # 复制目录
rsync -a source/ destination # 复制目录的内容
rsync -anv source/ destination # 模拟执行
rsync -av --delete source/ destination # 保证完全一致,删除多余文件
# 早期 rsync 不使用 SSH 协议,需要用-e参数指定协议
# 现在 下面的 -e ssh可以省略
rsync -av -e ssh source/ user@remote_host:/destination
# 操作当前目录并排除部分目录
rsync -ave ssh \
--exclude .git \
--exclude dist \
. \
user@192.168.1.1:~/person/dev/
rsync -av --include="*.txt" --exclude='*' source/ destination # 排除所有文件,只同步 txt 文件
rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination # -e 参数指定使用 2234 端口
JumpHost
# Upload
scp -oProxyCommand="ssh -W %h:%p JUMP_HOST" FILE_TO_SEND DEST_HOST:/home/gareth/
# Download
scp -oProxyCommand="ssh -W %h:%p JUMP_HOST" DEST_HOST:FILE_TO_DOWNLOAD ~/Downloads/
# Upload
rsync -av -e "ssh -A JUMP_HOST ssh" FILE_TO_SEND DEST_HOST:/home/gareth/
# Download
rsync -av -e "ssh -A JUMP_HOST ssh" DEST_HOST:~/FILE_TO_DOWNLOAD ~/Downloads/
# file copy line: serverC(file) -> serverB -> serverA
rsync -avzhP -e "ssh -p portB -A user1@serverB ssh" user2@serverC:somedir/ localdir/
rsync 协议
除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用rsync://协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔::。
rsync -av source/ 192.168.122.32::module/destination
# 地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配。
rsync rsync://192.168.122.32
# 列出rsync 守护程序分配的所有 module 列表
rsync -av source/ rsync://192.168.122.32/module/destination
# rsync 协议除了使用双冒号,也可以直接用rsync://协议指定地址
增量备份
rsync -a --delete --link-dest /compare/path /source/path /target/path
增量备份脚本
每一次同步都会生成一个新目录${BACKUP_DIR}/${DATETIME},并将软链接${BACKUP_DIR}/latest指向这个目录。下一次备份时,就将${BACKUP_DIR}/latest作为基准目录,生成新的备份目录。最后,再将软链接${BACKUP_DIR}/latest指向新的备份目录。
#!/bin/bash
# A script to perform incremental backups using rsync
set -o errexit
set -o nounset
set -o pipefail
readonly SOURCE_DIR="${HOME}"
readonly BACKUP_DIR="/mnt/data/backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly LATEST_LINK="${BACKUP_DIR}/latest"
mkdir -p "${BACKUP_DIR}"
rsync -av --delete \
"${SOURCE_DIR}/" \
--link-dest "${LATEST_LINK}" \
--exclude=".cache" \
"${BACKUP_PATH}"
rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"