Rsync 到 /dev/null 会覆盖它

Rsync 到 /dev/null 会覆盖它

使用 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

我建议使用pvssh来代替。

正如其他人所说,rsync将写入临时文件,然后用临时文件覆盖原始目标文件,这不会给您带来您想要的效果。

如果你想获得有效的网络速度,你可以这样做:

pv -r /dev/zero | ssh user@server "cat > /dev/null"

pv是速率/流量分析的绝佳工具。

-r指示pv显示速率,因此在上面的例子中,pv正在读取/dev/zero并将其传输到,并将显示数据流经ssh的速率。/dev/zerossh

如果您想测试您的网络是否能够维持一定的带宽,而不会使您的网络饱和(上面的例子就是这样),您可以使用-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尽可能避免使用用户。

相关内容