为什么不用scp cp rsync区别 替换cp/mv

rsync和cp之间的区别_百度知道linux(39)
I tend to use rsync when others would typically use a simple cp for copying files. A few reasons:
It can be canceled in the middle, and resumed later.
It can show a progress bar that (while not perfect) is great for large files or lots of files.
It will only copy the changed files and won’t clobber already existing directories of files at the target.
rsync is available on Linux, Mac, and there’s a binary somewhere on teh intarwebs for Windows.
To use, you almost always want to pass the&-a&flag,
which stands for “archive” – basically a convenience flag for&-r&(recursive),&-p&(permissions),&-t&(timestamps),
and a few others. I can’t think of a time I haven’t used&-a&when
using rsync.
Following that, basic usage looks like this:
rsync -a source destination
The other thing to remember when using rsync is that it’ if you put a trailing lash on a path, then rsync takes that to mean you want to copy the&contents&of
that path. If, on the other hand, you leave off the slash, it will copy the path&and&its
contents. A few examples will help:
# This will copy the stuff directory (and its contents) to the documents directory
rsync -a /home/tim/stuff /home/tim/documents
# This will copy only the contents of stuff to the documents directory
rsync -a /home/tim/stuff/ home/tim/documents
Some other handy arguments:
--progress
So, to put it all together:
rsync -a --stats --progress /home/tim/stuff /home/tim/documents
And, better yet, rsync can work over ssh (if it’s installed on both hosts). Just put an ssh host on the front of either path:
rsync -a --stats --progress /home/tim/stuff tim@:/home/tim/
rsync -a --stats --progress tim@:/home/tim/stuff /home/tim/
So, there you have it. rsync can do tons more stuff, but this is a great start. If this is all you learn of rsync, you will be that much better off.
Morgan&May 9th,
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:514324次
积分:7542
积分:7542
排名:第1966名
原创:232篇
转载:155篇
评论:32条
文章:10篇
阅读:14718
文章:21篇
阅读:24077
文章:11篇
阅读:11279
(1)(3)(1)(1)(4)(9)(18)(9)(4)(12)(2)(4)(11)(9)(17)(16)(16)(23)(7)(7)(7)(17)(41)(20)(15)(23)(25)(22)(25)(6)(1)(6)(4)(1)(1)关于rsync+inotify-tools实时同步模式 | 神一样的少年rsync+inotify实现多台服务器之间数据实时同步 - 服务器技术综合 - 次元立方网 - 电脑知识与技术互动交流平台
rsync+inotify实现多台服务器之间数据实时同步
如果你man一下sync的话,就会发现:sync-flush file system buffers,它是一个把缓冲区中的数据同步到文件系统中的一个命令;而rsync其实就是remote rsync,它是一个远程同步工具,兼具cp和scp的功能,rsync命令的使用几乎和scp是一样一样的。rsync是通过超级守护进程xinetd进行触发同步的。
1)优点:与cp和scp相比来说,rsync更快,更安全,支持增量备份。rsync在数据同步的过程中,不像cp一样全部都拷贝,而是先去比对特征码,只有不一样的才会去拷贝,如果一样了,就不需再做多余操作。通过使用rsync+crontab可以解决对实时性要求不是太高的场景。
2)缺点:在这个大数据年代,如果你的数据量非常大,你每做一次任务计划,rsync都会先去遍历目标目录,把所有数据做一次特征码比对,然后进行差量传输,这个过程会是很漫长的,对于那些要求实时性更新比较高的企业来说,无疑是一场噩梦。但是如果能够出现一个工具能够实时的去监控我们的文件系统,只有在数据改变时才会触发它去同步,那该有多好啊!为了满足广大需求者的心声rsync+inotify组合就出现了
2、inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
3、rsync+inotify 之推荐理由
1)服务器性能:rsync+crontab会定时去检查是否有文件更新,这势必会造成服务器性能下降;而rsync+inotify组合是触发式更新,只有在数据文件有变化时,才会去更新,因此相对前者而言,是提高了服务器性能
2)数据实时性:rsync+crontab是周期性任务计划,不能保证数据的实时性;rsync+inotify组合是触发式更新,只要有数据变化,就立刻同步更新
二、系统平台环境
1、操作系统:CentOS6.4-X86_64
2、rsync客户端(rsync+inotify):172.16.150.150
3、rsync服务端:172.16.251.93,172.16.251.194
三、实验拓扑
四、配置rsync服务端(172.16.251.93、172.16.251.194)
1、配置rsync服务端:172.16.251.93
1)检查系统是否已经安装rsync和xinetd超级守护进程,CentOS6.4默认已经安装rsync,但未安装xinetd
[root@nmshuishui www]# rpm -qa | grep rsync
rsync-3.0.6-9.el6.x86_64
yum -y install xinetd rsync
2)为rsync服务提供配置文件
vim /etc/rsyncd.conf
#Global Settings 全局配置
uid = nobody
#运行rsync的用户
gid = nobody
#运行rsync的用户组
use chroot = no
#是否让进程离开工作目录
max connections = 5
#最大并发连接数,0为不限制
timeout = 600
pid file = /var/run/rsyncd.pid
#指定rsync的pid存放路径
lockfile = /var/run/rsyncd.lock
#指定rsync的锁文件存放路径
log file = /var/log/rsyncd.log
#指定rsync的日志存放路径
path = /var/www
#认证的模块名,在client端需要指定
ignore errors = yes
#忽略一些无关的I/O错误
read only = no
#客户端是否能拉(PULL)
write only = no
#客户端是否能推(PUSH)
hosts allow = 172.16.150.150
#白名单,可以访问此模块的主机
hosts deny = *
#黑名单,*表示任何主机
list = yes
#客户端请求是否可以列出模块列表
uid = root
#以root的身份去获取文件
gid = root
auth users = web
#认证此模块的用户名
secrets file = /etc/web.passwd
#指定存放&用户名:密码&格式的文件
3)创建同步目录
[root@nmshuishui ~]# mkdir /var/www
4)配置rsync认证文件/etc/web.passwd
[root@nmshuishui ~]# echo &web:web& & /etc/web.passwd
[root@nmshuishui ~]# cat /etc/web.passwd
5)修改/etc/web.passwd的权限为600
[root@nmshuishui ~]# chmod 600 /etc/web.passwd
[root@nmshuishui ~]# ll /etc/web.passwd
-rw------- 1 root root 10 Mar 27 22:31 /etc/web.passwd
6)配置服务能够启动
[root@nmshuishui ~]# chkconfig rsync on
[root@nmshuishui ~]# service xinetd start
Starting xinetd:
7)检查873端口是否成功监听
8)检查rsync运行状态
[root@nmshuishui ~]# chkconfig --list
2、配置rsync服务端:172.16.251.194
1)检查系统是否已经安装rsync和xinetd超级守护进程
2)为rsync服务提供配置文件
vim /etc/rsyncd.conf
#Global Settings
uid = nobody
gid = nobody
use chroot = no
max connections = 5
timeout = 600
pid file = /var/run/rsyncd.pid
lockfile = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
path = /var/www
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.150.150
hosts deny = *
list = yes
uid = root
gid = root
auth users = web
secrets file = /etc/web.passwd
3)创建同步目录
[root@shuishui www]# mkdir /var/www
4)配置rsync认证文件/etc/web.passwd
[root@shuishui ~]# echo &web:web& & /etc/web.passwd
[root@shuishui ~]# cat /etc/web.passwd
5)修改/etc/web.passwd的权限为600
[root@shuishui ~]# chmod 600 /etc/web.passwd
[root@shuishui ~]# ll /etc/web.passwd
-rw------- 1 root root 10 Mar 29 15:21 /etc/web.passwd
6)配置服务能够启动
[root@nmshuishui ~]# chkconfig rsync on
[root@nmshuishui ~]# service xinetd start
Starting xinetd:
7)检查873端口是否成功监听
8)检查rsync运行状态
五、配置rsync客户端(172.16.150.150)
1、设置 rsync 客户端的密码文件,客户端只需要设置 rsync 同步的密码即可,不用设置用户名(默认已经安装了rsync)
[root@shuishui ~]# echo web & /etc/web.passwd
[root@shuishui ~]# cat /etc/web.passwd
2、修改/etc/rsyncd.passwd的权限为600
[root@shuishui www]# chmod 600 /etc/web.passwd
[root@shuishui www]# ll /etc/web.passwd
-rw------- 1 root root 10 Mar 26 21:28 /etc/web.passwd
3、安装inotify-tools
# tar xf inotify-tools-3.13.tar.gz
# cd inotify-tools-3.13
# ./configure
# make && make install
4、在172.16.150.150上测试下能否同步文件
[root@shuishui www]# rsync --pass-file=/etc/web.passwd /etc/fstab web@172.16.251.93::web1
[root@shuishui www]# rsync --pass-file=/etc/web.passwd web@172.16.251.93::web1/123 /var/www/
1)第1条是是从rsync客户端(172.16.150.150)上传文件到rsync服务端(172.16.251.93),这里必须要指定密码文件
2)第2条是从rsync服务端(172.16.251.93)下载文件到rsync客户端(172.16.150.150)
3)以上两条说明了,rsync服务端和客户端是可用的;经测试,另一台rsync服务端也可用,不再贴图了。接下来的任务就是编写服务脚本了,能够让rsync客户端自动监测目录的变动情况,并自动同步到rsync服务端,完全实现自动化。
六、编写rsync脚本,实现数据实时同步
1、在rsync客户端(172.16.150.150)编写rsync脚本
vim /var/www/rsync.sh
#!/bin/bash
src=/var/www/
host1=172.16.251.93
host2=172.16.251.194
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e modify,delete,create,attrib $src | while read file DATE TIME DIR;
/usr/bin/rsync -vzrtopg --delete --progress $src $user1@$host1::$des1 --password-file=/etc/web.passwd
/usr/bin/rsync -vzrtopg --delete --progress $src $user2@$host2::$des2 --password-file=/etc/web.passwd
echo &${files} was rsynced& && /var/log/rsync.log 2&&1
2、给rsync.sh执行权限
[root@shuishui www]# chmod +x rsync.sh
[root@shuishui www]# ll rsync.sh
-rwxr-xr-x 1 root root 523 Mar 27 00:46 rsync.sh
3、把脚本加入到开机自动启动文件
[root@shuishui www]# echo &/var/www/rsync.sh && && /etc/rc.local
4、同步测试
在测试之前,为了演示效果的明显,我先把两台rsync服务端的/var/www/下的所有文件都清除掉,让其把持一个空目录,然后重启下rsync客户端,开机后,在rsync客户端的/var/www目录中,新建一个文件,看其是否能够成功监控并自动同步
1)rsync服务端(172.16.251.93,172.16.251.194)/var/www目录下都空;rsync客户端(172.16.150.150)/var/www目录下非空
2)开机在rsync客户端(172.16.150.150)/var/www目录下touch一个6
3)查看rsync服务端(172.16.251.93)是否同步成功
4)查看rsync服务端(172.16.251.194)是否同步成功
到这里,写了一天的rsync+inotify终于完成了,累崩了!
延伸阅读:
目的:通过挂载的方式,可以类似访问本地磁盘的方式一...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......& &本文是引用@五牧同学在阿里ata上发表的文章。感觉分析的比较透彻,分享给大家。& &问题的起因在来源于周会上钟老板提出的一个问题,cp新的so文件替换老的so,会导致程序core掉。这个问题引起了大家的热烈讨论,其中提及了的名词有inode,dentry,buserror等,比较混乱,由于功力浅薄,当时也没有十分清楚引起core掉的原因。于是乎趁着10.1的休息时间,闲里偷忙,理一理当时的问题,有不对之处,还请大家多多指出。& &文章主要分为下面几个部分part1.inode,dentry名词介绍part2.cp,mv操作对inode的影响part3.cp,mv覆盖动态库的区别part4.代码分析验证& &希望通过这几个部分的介绍,最终能说清楚这个问题:cp操作新的so文件替换老的so文件,程序会core掉的根本原因是什么?& &part1:inode,dentry名词介绍& &inode索引节点,dentry目录项。从这两个单词的中文意思也能简单猜测下,dentry就像书的目录一样,指向具体的inode号。事实上是不是这样呢,看下具体的介绍。& &inode和dentry都是linux下虚拟文件系统(vfs,vitual file system,图1)的重要概念。inode储存着文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等,特别注意的是inode中不包括文件名信息,具体包含的内容如下(stat命令可以查看文件的inode信息):*文件的字节数*文件拥有者的User ID*文件的Group ID*文件的读、写、执行权限*文件的时间戳,共有三个:ctime是inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。*链接数,即有多少目录项指向这个inode*文件数据block的位置& &dentry是directory entry的缩写,直接翻译目录入口是不是更容易理解些;)。dentry中则包含具体的文件名和指向inode的指针等信息,也就是说通过dentry可以找到对应的inode,再通过inode找到文件存储的block位置。这里我画了一个简单的示例图(图1),来说明dentry和inode之间的具体关系。& && &每一个进程在pcb中保存着一份文件描述符表,而文件描述符就是这个表的索引,这里进程打开/home/wsl/test文件,文件描述符为3,其中文件描述符表项中又有一个指向已打开文件的指针,已打开的文件在内核中用file结构体表示,包括打开的标志位,读写的位置f_pos,引用计数(f_count)以及指向dentry结构体的指针(f_dentry)等信息。为了减少读盘次数,内核都缓存了目录的树状结构,称为dentry cache,这里面每一个节点都是一个dentry结构体【正如前面介绍的,dentry中保存着文件名信息】。dentry结构体中都有一个指针指向inode结构体,因此只要沿着路径各部分的dentry搜索即可找到进程要访问的文件的inode结构体,从而获取文件的inode信息,进行文件的具体操作。& &简单总结下,*nux系统内部不使用文件名,而是使用inode来识别文件,用户通过文件名打开文件,实际上是首先通过dentry获取文件的inode信息,然后根据读取的inode信息来进行文件的处理。& &part 2:cp,mv,rm操作对inode的影响& &在介绍完inode后,我们来看下cp和mv操作对文件的inode都有什么样的影响。snail@ubuntu:~/test$ touch t1 t2 && ls -i t1 t92798 t2snail@ubuntu:~/test$ cp t1 t2 && ls -i t1 t92798 t2//将t1 cp成t2,但t2的inode号和原始的t2保持一致snail@ubuntu:~/test$ mv t1 t2 && ls -i t //将t1 mv成t2,t2的inode号为原始t1的inode号snail@ubuntu:~/test$ cp t2 t3 && ls -i t2 t92846 t3//cp到一个不存在的文件t3,t3为新的inode号& &下面是一些测试结论直接来自参考文献2& &cp命令& &inode号分配& &如果目标文件不存在,分配一个未使用的inode号,在inode表中添加一个新项目;& &如果目标文件存在,则inode号采用被覆盖之前的目标文件的inode号& &在目录中新建一个dentry,并指向步骤1)中的inode;& &把数据复制到block中。& &我们接着来看下rm命令对inode会有什么样的影响& &mv命令& &a.如果mv命令的目标和源文件所在的文件系统相同:& &1)使用新文件名建立dentry& &2)删除带有原来文件名的dentry; 【该操作对inode表没有影响(除时间戳),对数据的位置也没有影响,不移动任何数据。(即使是mv到一个已经存在的目标文件,新目录项指源文件inode,会先删除目标文件的dentry)】& &b.如果目标和源文件所在文件系统不相同,就是cp和rm;& &然后我们来看下rm对inode的影响& &首先写了一个简单的python脚本,不停的网log文件里面写数据[wsl@inc-search-150-67 tmp]$ cat test.py import timefile = open('log','w')while(1):file.write(&abc&);time.sleep(1)file.flush()file.close()& &然后lsof命令查看log文件& &其中29908为进程号,120那一列为文件大小,35为inode号[wsl@inc-search-150-67 tmp]$ /usr/sbin/lsof |grep /tmp/logpython29908 wsl3wREG8,596 35 /tmp/log& &最后删除此log文件,继续查看此命令[wsl@inc-search-150-67 tmp]$ rm log[wsl@inc-search-150-67 tmp]$ /usr/sbin/lsof |grep /tmp/logpython29908 wsl3wREG8,5 120 35 /tmp/log (deleted)//节点被标记为deleted[wsl@inc-search-150-67 tmp]$ /usr/sbin/lsof |grep /tmp/logpython29908 wsl3wREG8,5 232 35 /tmp/log (deleted)//文件大小仍在增加[wsl@inc-search-150-67 tmp]$ kill -9 29908[wsl@inc-search-150-67 tmp]$ /usr/sbin/lsof |grep /tmp/log[wsl@inc-search-150-67 tmp]$& &我们可以看到log文件被删除后,lsof可以看到此文件被标记为deleted,inode仍然存在,并且在没有kill掉进程的情况下,文件的大小仍在增加,只有进程被kill掉后,才释放掉此inode。先埋下这一观察到的现象,到文章的最后,我们在继续讨论这样的操作会有什么样的影响。& &下面一些是rm命令对文件inode的影响& &rm命令& &1)递减链接计数,从而释放inode号码,这个inode号码可以被重用& &2)把数据块挂到可用空间列表& &3)删除目录映射表中的相关行 但是底层数据实际上没有被删除,只是当数据块被另一个文件使用时,原来的数据才会被覆盖& &简单总结下:& &cp命令到一个已经存在的文件,inode号沿用已经存在文件的inode号;& &mv命令用新的inode号,也就是mv前的文件的inode号;& &rm命令删除的底层数据只有被使用的时候才会被覆盖。& &part3.cp,mv覆盖动态库的区别& &前面两部分是对这一部分的一个简单铺垫。现在我们来看下为什么使用cp对动态库进行覆盖,程序会core掉(或者说可能会core掉?)& &首先我们使用strace命令来跟踪cp命令的执行。【btw:strace命令可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间,调试利器】snail@ubuntu:~/test$ lsnew.soold.sosnail@ubuntu:~/test$ cat new.so //new.so内容this is new.sohaha!snail@ubuntu:~/test$ strace cp new.so old.so//......只列出重要的相关步骤open(&new.so&, O_RDONLY)= 3fstat64(3, {st_mode=S_IFREG|0664, st_size=21, ...}) = 0open(&old.so&, O_WRONLY|O_TRUNC) = 4fstat64(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0read(3, &this is new.sonhaha!n&, 32768) = 21write(4, &this is new.sonhaha!n&, 21) = 21read(3, &&, 32768)= 0close(4)= 0close(3)= 0//......& &可以看到第8行以只读的方式打开了new.so,然后第10行以写加截断(O_WRONLY|O_TRUNC)的方式打开old.so。【O_TRUNC的含义:若文件存在,则长度被截为0,属性不变】,最后将new.so的内容写到old.so中,然后关闭文件。& &这个过程具体的发生的事情如下:& &1.应用程序通过dlopen打开so的时候,kernel通过mmap把so加载到进程地址空间,对应于vma里的几个page.& &2.在这个过程中loader会把so里面引用的外部符号例如malloc printf等解析成真正的虚存地址。& &3.当so被cp覆盖时,确切地说是被trunc时,kernel会把so文件在虚拟内的页清理掉。& &4.当运行到so里面的代码时,因为物理内存中不再有实际的数据(仅存在于虚存空间内),会产生一次缺页中断。& &5.Kernel从so文件中copy一份到内存中去。这时就会发生下面几种情况& &a)如果需要的文件偏移大于新的so的地址范围,就会产生bus error.这个在向宇大神的文章中有详细的介绍(摸我)& &b)如果so里面依赖了外部符号,但是这时的全局符号表并没有经过重新解析,当调用到时就产生segment fault& &c)如果so里面没有依赖外部符号,程序侥幸可以继续运行。& &mv命令新的so到老的so,关键代码就一句,一个重命名的过程,所以旧的so文件的inode号被替换新的so的inode号//......rename(&new.so&, &old.so&)= 0//......& &part4.代码验证分析& &下面就出现的bc两种情况用代码分析验证下。情况a可以参考向宇大神的文章,不在赘述了。//test.c#include&stdio.h& void test1(void){ int j=0; printf(&test1:j=%dn&, j); }void test2(void){ int j=1; }& &执行下面命令生成so文件& &gcc -fPIC -shared -o libtest.so test.c -g//main.c#include &stdio.h&#include &dlfcn.h& int main(){ void *lib_ void (*fn1)(void); void (*fn2)(void); char * //表示要将库装载到内存,准备使用 lib_handle = dlopen(&libtest.so&, RTLD_LAZY); if (!lib_handle) {
fprintf(stderr, &%sn&, dlerror());
return 1; } //获得指定函数(symbol)在内存中的位置(指针) fn1 = dlsym(lib_handle, &test1&); if ((error = dlerror()) != NULL) {
fprintf(stderr, &%sn&, error);
return 1; } printf(&fn1:0x%xn&, fn1); fn1(); fn2 = dlsym(lib_handle, &test2&); if ((error = dlerror()) != NULL) { fprintf(stderr, &%sn&, error); return 1; } printf(&fn2:0x%xn&, fn2); fn2(); dlclose(lib_handle); return 0;}& &执行命令:gcc -o main main.c -ldl -g& &首先进行测试1,断点设置在27行,fn1()执行之前Breakpoint 1, main () at main.c:27//这时我们在另外一个终端执行下面的命令//cp libtest.so libtest2.so //cp libtest2.so libtest.so 27fn1();(gdb) stest1 () at test.c:44 int j=0; //没有报错(gdb) n5 printf(&test1:j=%dn&, j);(gdb) n//出错,因为引用了printf外部函数,而全局符号表并没有经过重新解析,找不到printf函数Program received signal SIGSEGV, Segmentation fault.0x in ?? ()(gdb) bt#00x in ?? ()#10xb7fd84aa in test1 () at test.c:5#20x in main () at main.c:27& &下面进行测试2,断点设置在38行,fn2执行之前。& &然后在另一个终端执行和测试1相同的cp操作Breakpoint 1, main () at main.c:3838fn2();(gdb) stest2 () at test.c:1010int j=1;(gdb) n12}(gdb) nmain () at main.c:4040dlclose(lib_handle);(gdb) n42return 0;(gdb) 43}//程序正常结束& &从这两个测试例子中,我们可以得到这样的结论:& &当用新的so文件去覆盖老的so文件时候:& &A)如果so里面依赖了外部符号,程序会core掉& &B)如果so里面没有依赖外部符号,so部分代码可以正常运行& &总结:& &整理完这四部分,回到最开始的问题“为什么cp新的so文件替换老的so,程序会core掉的根本原因是什么?”,现在串联起来总结如下。& &1. cp new.so old.so,文件的inode号没有改变,dentry找到是新的so,但是cp过程中会把老的so截断为0,这时程序再次进行加载的时候,如果需要的文件偏移大于新的so的地址范围会生成buserror导致程序core掉,或者由于全局符号表没有更新,动态库依赖的外部函数无法解析,会产生sigsegv从而导致程序core掉,当然也有一定的可能性程序继续执行,但是十分危险。& &2. mv new.so old.so,文件的inode号会发生改变,但老的so的inode号依旧存在,这时程序必须停止重启服务才能继续使用新的so,否则程序继续执行,使用的还是老的so,所以程序不会core掉,就像我们在第二部分删除掉log文件,而依然能用lsof命令看到一样。& &ps.阿里的第一篇博客,以后尝试经常写写博客,把自己的思路理的更加清晰和有逻辑,如有不对的地方,还请大家多多指正。觉得文章有用?立即:和朋友一起共学习 共进步!本文作者:而且,对文章有任何想法,可:正在拼命挖掘沟通路线,马上就通了!}

我要回帖

更多关于 rsync cp 速度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信