Назад | Перейти на главную страницу

Rsync to / dev / null перезаписывает его

Я наблюдаю случайное поведение при копировании с одного сервера на другой с помощью rsync в / dev / null целевого сервера. Это часть моего тестирования производительности сети, и я хочу избежать дискового ввода-вывода в своих тестах. У меня есть один и тот же сценарий на всех моих серверах, но для некоторых из них место назначения / 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

Спасибо, Эйлброн

rsync не просто копирует содержимое файлов, он также синхронизирует атрибуты файлов. Это несколько ограничено параметрами, которые вы передаете (или не передаете) rsync, но лишь в некоторой степени. rsync имеет --devices опция, которая позволяет синхронизировать файлы устройства как файлы устройства, но, очевидно, не передача этой опции не мешает ему синхронизировать простые файлы как простые файлы.

В более общем плане: / dev / null - безопасное место для записи данных в; небезопасно использовать его в качестве цели для вещей, которые нарушают атрибуты или структуру файлов.

По умолчанию rsync будет

  • создать новый файл и перезаписать исходный файл новым
  • не рассматривать какой-либо файл как особый (устройство, ссылка, фифо и т. д.)

Вот как синхронизировать файл с именем 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 может синхронизировать файл с файлом, устройство с устройством, но вы, похоже, синхронизируете файл с устройством. Это, вероятно, не пойдет.

Я рекомендую использовать 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 - показать eta

-t - отображать таймер

-N <name> - показать имя для этого выхода. Это действительно полезно, когда вы трубите несколько pv Команды вместе, они будут «складывать» свой вывод на дисплей, просто назовите каждую по-разному, чтобы указать, какая статистика соответствует шагу в ваших конвейерных процессах.

-s <size> - используйте этот размер при расчете прогресса и еты. Используйте его, когда вы записываете вывод в файл, и вы уже примерно знаете размер полученного файла.

/ dev / null - это специальный символьный файл, и, как вы обнаружили, копирование в него с использованием rsync как root перезапишет его. AFAIK, rsync не будет делать то, что вы хотите. Возможно, можно будет перенаправить через ssh в cat.

time tar cf - file | ssh server "cat > /dev/null"