Я наблюдаю случайное поведение при копировании с одного сервера на другой с помощью 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"