本地与远程服务器同步文件(scp、rsync、samba,and ...)

最近在进行深度学习训练的时候,遇到一个问题:服务器端的系统一般是没有GUI界面的,这导致在深度学习训练中,要查看网络的训练效果,不得不将图片从服务器端传输到本地进行查看。(网络的好坏也可以通过mIOU、AP等指标来评判,不过可视化能看到更多细节方面的问题)。

下文总结了本地与远程服务器同步文件的几个解决方案。

方案1: scp命令

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。[链接]

  1. 命令格式:

    scp [参数][原路径][目标路径]

  2. 命令参数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    -1  强制scp命令使用协议ssh1
    -2 强制scp命令使用协议ssh2
    -4 强制scp命令只使用IPv4寻址
    -6 强制scp命令只使用IPv6寻址
    -B 使用批处理模式(传输过程中不询问传输口令或短语)
    -C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
    -p 保留原文件的修改时间,访问时间和访问权限。
    -q 不显示传输进度条。
    -r 递归复制整个目录。
    -v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
    -c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
    -F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。
    -i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
    -l limit 限定用户所能使用的带宽,以Kbit/s为单位。
    -o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,
    -P port 注意是大写的P, port是指定数据传输用到的端口号
    -S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
  3. 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 从本地复制到服务器
    sudo scp -P port local_file remote_username@remote_ip:remote_folder #复制文件
    sudo scp -P port -r local_folder remote_username@remote_ip:remote_folder #复制文件夹

    # 从服务器复制到本地
    sudo scp -P port remote_username@remote_ip:remote_file local_folder #复制文件a.out
    sudo scp -P port -r remote_username@remote_ip:remote_folder local_folder #复制文件夹

    #Windows系统推荐使用Wincp软件进行文件传输
  4. 缺点

​ 采用scp命令自动化程度不高,用起来麻烦,传送速度也比较慢。

方案2: rsync命令

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync”算法来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。rsync是一个功能非常强大的工具,其命令也有很多功能特色选项。链接

  1. 命令格式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SYNOPSIS
    Local: rsync [OPTION...] SRC... [DEST]

    Access via remote shell:
    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]
    rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
    Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
    rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
  2. 命令参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    -v, --verbose 详细模式输出。
    -q, --quiet 精简输出模式。
    -c, --checksum 打开校验开关,强制对文件传输进行校验。
    -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
    -r, --recursive 对子目录以递归模式处理。
    -R, --relative 使用相对路径信息。
    -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
    --backup-dir 将备份文件(如~filename)存放在在目录下。
    -suffix=SUFFIX 定义备份文件前缀。
    -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
    -l, --links 保留软链结。
    -L, --copy-links 想对待常规文件一样处理软链结。
    --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
    --safe-links 忽略指向SRC路径目录树以外的链结。
    -H, --hard-links 保留硬链结。
    -p, --perms 保持文件权限。
    -o, --owner 保持文件属主信息。
    -g, --group 保持文件属组信息。
    -D, --devices 保持设备文件信息。
    -t, --times 保持文件时间信息。
    -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
    -n, --dry-run现实哪些文件将被传输。
    -w, --whole-file 拷贝文件,不进行增量检测。
    -x, --one-file-system 不要跨越文件系统边界。
    -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
    -e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
    --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
    -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
    --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
    --delete 删除那些DST中SRC没有的文件。
    --delete-excluded 同样删除接收端那些被该选项指定排除的文件。
    --delete-after 传输结束以后再删除。
    --ignore-errors 及时出现IO错误也进行删除。
    --max-delete=NUM 最多删除NUM个文件。
    --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
    --force 强制删除目录,即使不为空。
    --numeric-ids 不将数字的用户和组id匹配为用户名和组名。
    --timeout=time ip超时时间,单位为秒。
    -I, --ignore-times 不跳过那些有同样的时间和长度的文件。
    --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
    --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
    -T --temp-dir=DIR 在DIR中创建临时文件。
    --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
    -P 等同于 --partial。
    --progress 显示备份过程。
    -z, --compress 对备份的文件在传输时进行压缩处理。
    --exclude=PATTERN 指定排除不需要传输的文件模式。
    --include=PATTERN 指定不排除而需要传输的文件模式。
    --exclude-from=FILE 排除FILE中指定模式的文件。
    --include-from=FILE 不排除FILE指定模式匹配的文件。
    --version 打印版本信息。
    --address 绑定到特定的地址。
    --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
    --port=PORT 指定其他的rsync服务端口。
    --blocking-io 对远程shell使用阻塞IO。
    -stats 给出某些文件的传输状态。
    --progress 在传输时现实传输过程。
    --log-format=formAT 指定日志文件格式。
    --password-file=FILE 从FILE中得到密码。
    --bwlimit=KBPS 限制I/O带宽,KBytes per second。
    -h, --help 显示帮助信息。
  3. 示例

    1
    2
    3
    4
    5
    # Update host files to local"
    rsync -azh --update --progress -e 'ssh -p port' ${SSH_USER}@${SSH_HOST_outside}:${HOST_PATH} ${LOCAL_PATH}

    # Update local files to host"
    rsync -azh --update --progress ${LOCAL_PATH} -e 'ssh -p 8221' ${SSH_USER}@${SSH_HOST_outside}:${HOST_PATH}
  4. rsync可以说是相当不错了,可以用于自动备份以及文件自动同步,这点比ssh好很多。有一个问题:rsync命令中单冒号和双冒号作用不同。单冒号启用ssh或rsh服务,双冒号启用rsync服务,不过改成双冒号会出差。看了一些例子,用法如rsync243 -avz joe@linux.acme.com::confidential ./confidential以域名做HOST。

方案3. samba

听老大说,samba用来做共享文件夹相当好用,网上找了一圈教程,都是Linux与windows之间的共享,并没有Linux系统之间的共享。按道理来说,应该也能配置成Linux之间的,以后有时间再折腾。

方案4. 思考

想想自己写一个共享文件的脚本,也不是很难的。在本地与服务器端各设立一个文件夹用来做共享文件夹,其实本质上是同步两个文件夹间的文件。如何做到同步呢?需要考虑到文件的几个常用的操作——复制、删除、修改、移动。为这两个文件夹各自建立一个文件索引(子目录不需要建立),将每个文件的的操作都记录在这个文件中,根据这两个文件进行文件同步。