使用 rsync 将目标服务器的 /dev/null 从一台服务器复制到另一台服务器时,我看到了随机行为。这是我的网络性能测试的一部分,我想在测试中避免磁盘 I/O。我在所有服务器中都有相同的脚本,但对于其中一些服务器,目标 /dev/null 会被覆盖并变成常规文件,这会破坏其他东西。
对于同一台服务器,scp 不会覆盖目标 /dev/null。
前:
[root@localhost ~]# ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3 Sep 11 09:24 /dev/null
这是我的 rsync 命令:
rsync -v -e ssh --progress 500MB root@destination-server:/dev/null
后:
[root@localhost ~]# ls -l /dev/null
-rw-r--r--. 1 root root 104857600 Sep 11 10:09 /dev/null
对同一台服务器执行 scp 操作不会破坏 /dev/null
scp 500MB root@destination-server:/dev/null
知道为什么会导致这种随机行为吗?我的服务器是 CentOS6 和 7 的混合版本
谢谢你,艾尔布隆
答案1
rsync
不仅复制文件的内容,还同步文件属性。这在一定程度上受到您传递给(或不传递给)的选项的限制rsync
,但只是在一定程度上。rsync
有一个--devices
选项可以使其将设备文件同步为设备文件,但显然不是传递该选项不会阻止它将纯文本文件同步为纯文本文件。
更一般地说:/dev/null 是写入数据的安全位置进入;将其用作扰乱文件属性或结构的目标是不安全的。
答案2
默认情况下,rsync 将
- 创建一个新文件,并用新文件覆盖原始文件
- 不将任何文件视为特殊文件(设备、链接、fifo 等)。
passwd
以下是从一个目录a
到另一个目录同步文件的方法b
:
读取源文件
a/ OPEN passwd
a/ ACCESS passwd
a/ CLOSE_NOWRITE,CLOSE passwd
创建临时文件并移动数据:
b/ CREATE .passwd.cBzlfu
b/ OPEN .passwd.cBzlfu
b/ ATTRIB .passwd.cBzlfu
b/ MODIFY .passwd.cBzlfu
b/ CLOSE_WRITE,CLOSE .passwd.cBzlfu
b/ ATTRIB .passwd.cBzlfu
确定文件名
b/ MOVED_FROM .passwd.cBzlfu
b/ MOVED_TO passwd
最后一个操作是覆盖 /dev/null,因为它只是覆盖了设备文件。你希望它会写入(附加)到其中,但事实并非如此。
开关--inplace
和--partial
正在影响同步行为。
开关--devices
也有帮助
此选项使 rsync 将字符和块设备文件传输到远程系统以重新创建这些设备。如果接收 rsync 不是以超级用户身份运行,则此选项无效(另请参阅 --super 和 --fake-super 选项)。
也许您还应该考虑不将文件同步到设备上 :) rsync 可以将文件与文件同步,将设备与设备同步,但您似乎将文件同步到设备上。这可能行不通。
答案3
我建议使用pv
和ssh
来代替。
正如其他人所说,rsync
将写入临时文件,然后用临时文件覆盖原始目标文件,这不会给您带来您想要的效果。
如果你想获得有效的网络速度,你可以这样做:
pv -r /dev/zero | ssh user@server "cat > /dev/null"
pv
是速率/流量分析的绝佳工具。
-r
指示pv
显示速率,因此在上面的例子中,pv
正在读取/dev/zero
并将其传输到,并将显示数据流经ssh
的速率。/dev/zero
ssh
如果您想测试您的网络是否能够维持一定的带宽,而不会使您的网络饱和(上面的例子就是这样),您可以使用-L
限制速率,如下所示:
pv -rL 1K /dev/zero | ssh user@server "cat > /dev/null"
pv
我通常使用的其他标志:
-p
- 显示进度表。这在读取文件时非常有用,进度表将显示已读取的文件量
-e
- 显示预计抵达时间
-t
- 显示计时器
-N <name>
- 显示此输出的名称。当您将多个pv
命令通过管道连接在一起时,这个命令非常有用,它们会将其输出“堆叠”在显示屏上,只需为每个命令指定不同的名称,即可分辨哪些统计数据与管道过程中的哪个步骤相关。
-s <size>
- 计算进度和预计完成时间时使用此大小。将输出写入文件时使用此大小,并且您已经大致知道结果文件的大小。
答案4
为了rsync
不覆盖设备,您可以使用以下--write-devices
标志:
--write-devices write to devices as files (implies --inplace)
例子:
rsync -v -e ssh --progress --write-devices 500MB root@destination-server:/dev/null
请注意,通过使用ssh
,您不仅可以测量网络性能,还可以测量加密流量的能力。对于纯网络性能,我建议使用 rsync 自己的协议或其他工具,例如netcat
。
至于随机行为,可能有多种原因,最有可能的是有时您使用用户root
,有时您不使用。我建议root
尽可能避免使用用户。