"Быстрый
<br />
<strong>Используй Robocopy с флагом /MT — он встроен в Windows, установка не нужна.</strong></p>
<p>Базовая команда для копирования по сети:</p>
<ul>
<li>16 потоков для мелких файлов на NAS: <code>robocopy C:\data \\server\backup /E /MT:16 /Z /R:3 /W:10</code></li>
<li><a class="wpil_keyword_link" title="hdd" href="https://it-apteka.com/tag/hdd/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2494">HDD</a> как источник или приёмник — максимум <code>/MT:2</code>, иначе медленнее</li>
<li>Один большой файл — потоки не помогают, узкое место — канал</li>
<li>FastCopy быстрее на SSD-SSD, TeraCopy удобнее для ручной работы с верификацией</li>
</ul>
<p>
<h1>Многопоточное копирование файлов Windows: Robocopy, FastCopy и TeraCopy с реальными примерами</h1>
<p>Многопоточное копирование файлов <a class="wpil_keyword_link" title="Windows Server" href="https://it-apteka.com/category/windows-server/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2495">Windows</a> — это способ за 15 минут превратить 4-часовой бэкап в 25-минутный. Без покупок, без установки стороннего ПО — всё нужное уже есть в системе. Разберём как работает, когда помогает, а когда делает только хуже.</p>
<p>Что будет в статье: причины торможения стандартного Проводника, три инструмента с готовыми командами, сравнение скорости на реальных сценариях, типичные ошибки и профилактика.</p>
<p>Времени займёт: настройка базового Robocopy — 5 минут. Прочитать всё — 15 минут. Из нужного: Windows 7 и новее, права на запись в папку-приёмник.</p>
<h2>Почему Проводник Windows копирует так медленно</h2>
<p>Открываешь Explorer, перетаскиваешь 300 000 мелких файлов на сетевой диск, идёшь пить кофе. Возвращаешься через час — там 12%. Это не вирус и не глюк. Это архитектурное решение Microsoft, которому уже лет двадцать пять.</p>
<p>Самое обидное — дело не в аппаратуре. У тебя гигабитная сеть, <a class="wpil_keyword_link" title="nvme" href="https://it-apteka.com/tag/nvme/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2492">NVMe</a> SSD и 64 ГБ оперативки. Explorer всё равно копирует 300 000 файлов за 4 часа. Почему? Потому что инструмент не соответствует задаче.</p>
<h3>Один поток — один страдающий процесс</h3>
<p>Стандартный Проводник копирует файлы последовательно, в один поток. Взял файл — положил файл — взял следующий. Для одного большого файла на локальном <a class="wpil_keyword_link" title="ssd" href="https://it-apteka.com/tag/ssd/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2497">SSD</a> это нормально. Но когда у тебя 100 000 файлов по 5 КБ — это катастрофа.</p>
<p>Каждое обращение к файлу — это системный вызов + запрос к файловой системе + запись метаданных. Для мелких файлов время самих операций чтения/записи ничтожно мало по сравнению с этими накладными расходами. Explorer дисциплинированно ждёт завершения каждой операции перед следующей.</p>
<p>Представь курьера, который берёт одну посылку, едет на склад, возвращается, берёт следующую. Каждый рейс занимает одинаковое время независимо от размера посылки. Маленькая коробка или большой паллет — цикл тот же. Многопоточность — это нанять 16 курьеров одновременно.</p>
<h3>Latency сети убивает всё</h3>
<p>При копировании по <a class="wpil_keyword_link" title="Сети" href="https://it-apteka.com/category/networks/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2493">сети</a> к этому добавляется сетевая задержка. Даже в гигабитной локалке пинг до сетевого диска — 0.5-2 мс. Кажется, мелочь. Но на 100 000 файлов это от 50 до 200 секунд только на ожидание ответов, без учёта передачи данных.</p>
<p>SMB-протокол при однопоточном копировании работает как dial-up: отправил запрос — жди ответа — отправил следующий. Пока ждёшь — канал простаивает. На мелких файлах загрузка гигабитного канала может быть 3-7%, всё остальное время — ожидание.</p>
<p>При многопоточном копировании 16 потоков отправляют 16 запросов одновременно. Пока один ждёт ответа — 15 других уже читают или пишут. Latency скрывается за параллельной работой. Загрузка того же гигабитного канала вырастает до 70-90%.</p>
<h3>IOPS: реальное узкое место</h3>
<p>На HDD узкое место — количество операций ввода-вывода в секунду. Обычный механический диск выдаёт 80-150 IOPS. Если каждый файл — это 2-3 операции (открыть, прочитать, закрыть), то с одним потоком физически не обработаешь больше 40-70 файлов в секунду. На 100 000 файлов — минимум 25 минут только на обращения к диску.</p>
<p>На SSD картина другая. NVMe выдаёт 500 000-1 000 000 IOPS. Один поток при копировании мелких файлов загружает SSD примерно на 0.3-1%. Накопитель простаивает в ожидании следующей команды от приложения. Добавляешь 16 потоков — загрузка вырастает до 5-15%, скорость — в 8-12 раз. Диск всё ещё не загружен полностью, но разница уже колоссальная.</p>
<pre><code class="language-bash">
# Смотрим реальную загрузку диска во время копирования
# (запусти в PowerShell пока идёт копирование)
Get-Counter '\PhysicalDisk(_Total)\% Disk Time' -SampleInterval 2 -MaxSamples 10
</code></pre>
"NVMe
<br />
NVMe SSD выдаёт 500 000+ IOPS. Один поток просто не может загрузить накопитель — он постоянно простаивает в ожидании следующей команды от приложения. Вот почему многопоточность на SSD-SSD даёт колоссальный выигрыш, а на HDD часто делает хуже.<br />
<h2>Как работает многопоточное копирование</h2>
<p>Идея простая: вместо одного грузчика нанимаем бригаду. Каждый поток — отдельный рабочий, который независимо копирует свой файл. Пока один ждёт ответа от сетевого диска, второй уже читает следующий файл, третий пишет предыдущий.</p>
<p>Это позволяет скрыть latency за параллельной работой и загрузить канал передачи данных под завязку. При копировании 10 000 мелких файлов по сети разница между 1 потоком и 16 потоками — от 6 до 20 раз по времени.</p>
<h3>Когда многопоточность НЕ помогает — честный разговор</h3>
<p>Прежде чем ставить 128 потоков — стоп. Вот когда это бесполезно или вредно:</p>
<table>
<thead>
<tr>
<th>Ситуация</th>
<th>Почему потоки не помогут</th>
<th>Что делать</th>
</tr>
</thead>
<tbody>
<tr>
<td>Один большой файл</td>
<td>Один файл = один поток записи. 256 потоков будут стоять в очереди</td>
<td>Максимальная скорость канала, параллельность не нужна</td>
</tr>
<tr>
<td>Приёмник — HDD</td>
<td>Головка диска мечется между секторами, скорость падает в 2-3 раза</td>
<td>Максимум /MT:2, обычно /MT:1</td>
</tr>
<tr>
<td>Слабый CPU на NAS</td>
<td>32 потока SMB — это 32 соединения. Celeron J4125 ляжет</td>
<td>Смотри на CPU NAS, начинай с /MT:4</td>
</tr>
<tr>
<td>Канал 100 Мбит</td>
<td>12.5 МБ/с — физический потолок. Хоть 100 потоков</td>
<td>Апгрейд сети или смириться</td>
</tr>
<tr>
<td>Сеть Wi-Fi с потерями</td>
<td>Ретрансмиссии убивают всю выгоду от параллельности</td>
<td>Провод, или /MT:4 максимум</td>
</tr>
</tbody>
</table>
"Золотое
<br />
Сначала найди узкое место — CPU, диск или сеть. Многопоточность лечит latency и недогруженные IOPS. От медленного канала она не лечит ничего.<br />
<h2>Системные требования</h2>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Минимум</th>
<th>Рекомендуется</th>
<th>Примечание</th>
</tr>
</thead>
<tbody>
<tr>
<td>ОС</td>
<td><a title="Автомонтирование сетевых дисков: от костылей Windows 7 до изысков Server 2022" href="https://it-apteka.com/avtomontirovanie-setevyh-diskov-ot-kostylej-windows-7-do-izyskov-server-2022/" target="_blank" rel="noopener" data-wpil-monitor-id="2498">Windows Vista / Server</a> 2008</td>
<td>Windows 10/11, Server 2019+</td>
<td>Robocopy встроен с Vista</td>
</tr>
<tr>
<td>Robocopy</td>
<td>6.1 (встроен в Windows 7)</td>
<td>Любая актуальная</td>
<td>Проверь: robocopy /? в CMD</td>
</tr>
<tr>
<td>FastCopy</td>
<td>Windows 7 x64</td>
<td>FastCopy 5.x</td>
<td>fastcopy.jp, открытый исходник</td>
</tr>
<tr>
<td>TeraCopy</td>
<td>Windows 7</td>
<td>TeraCopy 3.x</td>
<td>codesector.com</td>
</tr>
<tr>
<td>RAM для потоков</td>
<td>4 ГБ</td>
<td>16 ГБ+</td>
<td>Каждый поток держит буфер ~4-16 МБ</td>
</tr>
<tr>
<td>Сеть</td>
<td>100 Мбит (толку мало)</td>
<td>1 Гбит+</td>
<td>10 Гбит раскрывает потенциал полностью</td>
</tr>
</tbody>
</table>
<p>На момент публикации актуальна Robocopy <a title="Windows 12 — дата выхода, версии, 64 bit и что известно в 2026 году" href="https://it-apteka.com/windows-12-data-vyhoda-versii-64-bit-i-chto-izvestno-v-2026-godu/" target="_blank" rel="noopener" data-wpil-monitor-id="2499">версия из Windows</a> 11 24H2 и FastCopy 5.7.7. Перед <a title="Установка Joomla: пошаговый рецепт от нуля до рабочего сайта" href="https://it-apteka.com/ustanovka-joomla-poshagovyj-recept-ot-nulja-do-rabochego-sajta/" target="_blank" rel="noopener" data-wpil-monitor-id="2496">установкой</a> FastCopy и TeraCopy проверь свежие релизы на официальных сайтах.</p>
<h2>Robocopy /MT: многопоточность без установки</h2>
<p>Robocopy — Robust File Copy — живёт в каждой Windows начиная с Vista. Никаких установок, никаких лицензий. Флаг /MT включает многопоточность. По умолчанию /MT:8, диапазон — от 1 до 128.</p>
<h3>Полный справочник полезных флагов Robocopy</h3>
<p>Запомнить все флаги нереально. Вот шпаргалка по самым нужным — те что реально используются в продакшне, а не весь man:</p>
<table>
<thead>
<tr>
<th>Флаг</th>
<th>Что делает</th>
<th>Когда нужен</th>
</tr>
</thead>
<tbody>
<tr>
<td>/E</td>
<td>Копировать все подпапки включая пустые</td>
<td>Всегда для полного бэкапа</td>
</tr>
<tr>
<td>/S</td>
<td>Копировать подпапки, но не пустые</td>
<td>Если пустые папки не нужны</td>
</tr>
<tr>
<td>/MT:N</td>
<td>N параллельных потоков (1-128)</td>
<td>Мелкие файлы по сети, SSD</td>
</tr>
<tr>
<td>/Z</td>
<td>Режим перезапуска — resume при обрыве</td>
<td>WAN, VPN, нестабильная сеть</td>
</tr>
<tr>
<td>/MIR</td>
<td>Зеркало — удаляет лишнее в приёмнике</td>
<td>Синхронизация с очисткой, осторожно</td>
</tr>
<tr>
<td>/XO</td>
<td>Пропускать файлы старше чем в приёмнике</td>
<td>Досинхронизация дельты при миграции</td>
</tr>
<tr>
<td>/L</td>
<td>List Only — симуляция без реального копирования</td>
<td>Тест перед /MIR и другими опасными операциями</td>
</tr>
<tr>
<td>/R:N</td>
<td>Повторить N раз при ошибке (по умолчанию 1000000)</td>
<td>Всегда указывать /R:3</td>
</tr>
<tr>
<td>/W:N</td>
<td>Ждать N секунд между попытками</td>
<td>Всегда указывать /W:10</td>
</tr>
<tr>
<td>/LOG:file</td>
<td>Писать лог в файл</td>
<td>Всегда для автоматических задач</td>
</tr>
<tr>
<td>/NP</td>
<td>Не показывать прогресс в % (меньше вывода)</td>
<td>В скриптах и логах</td>
</tr>
<tr>
<td>/COPYALL</td>
<td>Копировать всё включая ACL, владельца, аудит</td>
<td>Миграция с сохранением прав NTFS</td>
</tr>
<tr>
<td>/B</td>
<td><a class="wpil_keyword_link" title="Резервное копирование" href="https://it-apteka.com/category/rezervnoe-kopirovanie/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2491">Backup</a> mode — обход блокировок файловой системы</td>
<td>Открытые файлы, БД, реестр</td>
</tr>
<tr>
<td>/IPG:N</td>
<td>Пауза N мс между пакетами — снижает нагрузку</td>
<td>Бэкап в рабочее время</td>
</tr>
<tr>
<td>/XD dir</td>
<td>Исключить папки</td>
<td>node_modules, .<a class="wpil_keyword_link" title="Git" href="https://it-apteka.com/tag/git/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2489">git</a>, Temp</td>
</tr>
<tr>
<td>/XF file</td>
<td>Исключить файлы по маске</td>
<td>*.tmp, *.log, Thumbs.db</td>
</tr>
<tr>
<td>/XA:SH</td>
<td>Исключить системные и скрытые файлы</td>
<td>Пользовательские бэкапы</td>
</tr>
</tbody>
</table>
<h3>Базовая команда</h3>
<pre><code class="language-bash">
REM Многопоточное копирование с 16 потоками на сетевой диск
robocopy C:\data \\server\backup /E /MT:16 /Z /R:3 /W:10
REM Расшифровка:
REM /E - все подпапки включая пустые
REM /MT:16 - 16 параллельных потоков
REM /Z - режим перезапуска (resume при обрыве соединения)
REM /R:3 - повторить 3 раза при ошибке (по умолчанию 1 000 000 - не шутка)
REM /W:10 - ждать 10 секунд между попытками
</code></pre>
"Про
<br />
По умолчанию Robocopy при ошибке делает миллион попыток. Встретит один заблокированный файл — будет пытаться скопировать его 8333 часа. Всегда указывай /R:3 /W:10. Всегда. Без исключений.<br />
<h3>Продвинутый бэкап-скрипт для Task Scheduler</h3>
<pre><code class="language-bash">
@echo off
REM backup.bat - запускать через Планировщик задач
REM Автор: твой будущий спокойный сон в 3 ночи
set SRC=D:\Production
set DST=\\nas01\backup\production
set LOG=C:\Logs\backup_%date:~-4,4%%date:~-7,2%%date:~0,2%.log
robocopy %SRC% %DST% /E /MT:16 /Z /R:3 /W:10 /NP /LOG:%LOG% ^
/XD "Temp" "Cache" ".git" "node_modules" "__pycache__" ".venv" "dist" "build" ^
/XF "*.tmp" "*.log" "Thumbs.db" "desktop.ini" "*.pyc"
REM Robocopy коды возврата - это битовая маска, не стандартный 0/1:
REM 0 - нет изменений. 1 - файлы скопированы. 2 - лишние файлы в приёмнике.
REM 4 - несоответствие. 8 - ошибки копирования. 16 - фатальная ошибка.
REM Коды 0-7 - норма. 8+ - проблема. Учти это в мониторинге.
if %ERRORLEVEL% GEQ 8 (
echo ОШИБКА БЭКАПА: код %ERRORLEVEL% >> C:\Logs\backup_errors.log
exit /b 1
)
echo Backup OK, code %ERRORLEVEL%
exit /b 0
</code></pre>
<h3>Миграция сервера: три фазы без потери данных</h3>
<p>Правильная миграция не делается за один запуск. Вот схема для переноса терабайтов без простоя:</p>
<pre class="mermaid">%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Фаза 1: пятница вечер"] --> B["robocopy /E /MT:32 - начальная синхронизация"]
B --> C["Фаза 2: воскресенье ночь"]
C --> D["robocopy /XO - досинхронизация дельты"]
D --> E["Фаза 3: окно обслуживания"]
E --> F["robocopy /MIR /MT:8 - финальное зеркало"]
F --> G["Старый сервер offline - новый в работе"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style C fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style G fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style B fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style D fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style F fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
</pre>
<pre><code class="language-bash">
REM Фаза 1: начальная синхронизация (запускай в пятницу вечером, иди домой)
robocopy \\old-server\data \\new-server\data /E /MT:32 /Z /R:3 /W:5 /LOG:migration_phase1.log
REM Фаза 2: досинхронизация дельты (воскресенье ночью, сервер ещё работает)
REM /XO - пропускать файлы, которые старше чем в приёмнике
robocopy \\old-server\data \\new-server\data /E /MT:16 /Z /R:3 /W:5 /XO /LOG:migration_phase2.log
REM Фаза 3: финальная синхронизация (в окно обслуживания, сервер остановлен)
REM /MIR - зеркало: удалить лишнее в приёмнике, добавить недостающее
REM ВНИМАНИЕ: /MIR удаляет файлы. Сначала запусти с /L (симуляция).
robocopy \\old-server\data \\new-server\data /E /MIR /MT:8 /R:1 /W:1 /LOG:migration_final.log
</code></pre>
"Про
<br />
Флаг /MIR удаляет файлы в приёмнике, которых нет в источнике. Перепутай источник и приёмник местами — за 10 секунд лишишься данных. Всегда делай тестовый запуск с /L (List Only) — показывает что будет сделано, но ничего не делает.<br />
<pre><code class="language-bash">
REM Сначала симуляция - смотрим что будет удалено и скопировано
robocopy \\source\data \\dest\backup /MIR /L /LOG:test_run.log
REM Проверил лог, убедился - запускаем реально
robocopy \\source\data \\dest\backup /MIR /MT:16 /R:3 /W:10
</code></pre>
<h3>Как подобрать оптимальное число потоков</h3>
<p>Нет универсального числа. Вот эмпирическая точка отсчёта:</p>
<table>
<thead>
<tr>
<th>Сценарий</th>
<th>Рекомендуемые потоки</th>
<th>Почему</th>
</tr>
</thead>
<tbody>
<tr>
<td>SSD — SSD (локально)</td>
<td>/MT:8-16</td>
<td>Высокие IOPS, можно параллелить</td>
</tr>
<tr>
<td>SSD — NAS (1 Гбит), мелкие файлы</td>
<td>/MT:16-32</td>
<td>Скрываем latency SMB</td>
</tr>
<tr>
<td>SSD — NAS (10 Гбит), мелкие файлы</td>
<td>/MT:32-64</td>
<td>Канал широкий, latency высокая</td>
</tr>
<tr>
<td>Любой источник — HDD</td>
<td>/MT:1-2</td>
<td>HDD не любит параллельный доступ</td>
</tr>
<tr>
<td>NAS — NAS (Celeron/Atom CPU)</td>
<td>/MT:4-8</td>
<td>Слабый CPU NAS ляжет под нагрузкой</td>
</tr>
<tr>
<td>Один большой файл (10+ ГБ)</td>
<td>/MT:1</td>
<td>Один файл — один поток. Потоки не помогают</td>
</tr>
</tbody>
</table>
<p>Если хочешь найти оптимум точно — вот бенчмарк-<a class="wpil_keyword_link" title="Скрипты" href="https://it-apteka.com/category/scripts/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2490">скрипт</a>:</p>
<pre><code class="language-bash">
# PowerShell - тестируем 4, 8, 16, 32 потока на реальных данных
$testSrc = "C:\test-data"
$testDst = "\\server\test-dst"
foreach ($threads in @(4, 8, 16, 32)) {
# Очищаем приёмник перед каждым тестом
Remove-Item "$testDst\*" -Recurse -Force -ErrorAction SilentlyContinue
$start = Get-Date
robocopy $testSrc $testDst /E /MT:$threads /NP /NFL /NDL /NJH /NJS 2>&1 | Out-Null
$elapsed = (Get-Date) - $start
Write-Host "MT:$threads - $([math]::Round($elapsed.TotalSeconds, 1)) сек"
}
</code></pre>
<h2>FastCopy: когда нужна чистая скорость</h2>
<p>FastCopy — японский инструмент от H.Shirouzu, открытый исходник, бесплатно. Работает иначе: вместо классических потоков использует асинхронный I/O с буферизацией. Пока одна порция данных пишется, следующая уже читается. На NVMe SSD это даёт скорость до 2-3 ГБ/с против 800 МБ/с у Explorer.</p>
<p>Скачать: <a href="https://fastcopy.jp/" target="_blank" rel="noopener">fastcopy.jp</a></p>
<h3>Как работает асинхронный I/O в FastCopy</h3>
<p>Разница между потоковым копированием Robocopy и асинхронным I/O FastCopy принципиальная. Robocopy запускает N потоков, каждый из которых независимо копирует свой файл. Это хорошо для мелких файлов и сетевых задач — много параллельных SMB-соединений скрывают latency.</p>
<p>FastCopy работает иначе: он использует Windows OVERLAPPED I/O API. Один поток читает данные из источника в буфер. Другой параллельно записывает из буфера в приёмник. Операции чтения и записи перекрываются во времени — read и write идут одновременно, а не последовательно. Для одного большого файла это даёт скорость близкую к физическому пределу накопителя или канала.</p>
<p>Результат: на локальных NVMe дисках FastCopy часто обгоняет Robocopy на крупных файлах. На мелких файлах по сети — наоборот, Robocopy с /MT:16 обычно быстрее за счёт большего количества параллельных соединений.</p>
<h3>Когда FastCopy лучше Robocopy</h3>
<ul>
<li>SSD — SSD (локально или по быстрой сети) — FastCopy выигрывает за счёт буферизации</li>
<li>Один большой файл или несколько крупных файлов — асинхронный I/O в полную силу</li>
<li>Разовые задачи — GUI удобнее командной строки</li>
<li>Максимальный throughput без сложной логики синхронизации</li>
<li>Клонирование рабочих станций — быстро и без лишних настроек</li>
</ul>
<h3>Когда Robocopy лучше FastCopy</h3>
<ul>
<li>Автоматизация через скрипты и Task Scheduler</li>
<li>Зеркальная синхронизация с удалением лишнего</li>
<li>Сложные фильтры по атрибутам, датам, расширениям</li>
<li>Подробные логи и коды возврата для мониторинга</li>
<li>Корпоративная среда где нужна аудитоспособность операций</li>
</ul>
<h3>FastCopy в CLI-режиме</h3>
<pre><code class="language-bash">
REM Клонирование папки пользователя SSD -> SSD
FastCopy.exe /cmd=diff /estimate /speed=full /log "C:\Users\worker" /to="D:\Backup\worker\"
REM /cmd=diff - копировать только изменённые файлы
REM /estimate - показывать оценку времени
REM /speed=full - без ограничения скорости
</code></pre>
<pre><code class="language-bash">
REM Синхронизация с удалением лишнего (аналог robocopy /MIR)
FastCopy.exe /cmd=sync /estimate /speed=full /log "C:\Source\" /to="D:\Dest\"
REM /cmd=sync - зеркало: удалить в приёмнике то, чего нет в источнике
</code></pre>
"FastCopy:
<br />
copy — обычное копирование, не трогает существующие файлы. diff — копировать только новые и изменённые. sync — полное зеркало с удалением лишнего. move — переместить (удалить из источника). Для бэкапа — diff. Для миграции с очисткой — sync.<br />
<h2>TeraCopy: надёжность вместо рекордов скорости</h2>
<p>TeraCopy встраивается в правую кнопку мыши и перехватывает стандартное копирование Explorer. Его главная фича — не скорость, а надёжность.</p>
<p>Скачать: <a href="https://www.codesector.com/teracopy" target="_blank" rel="noopener">codesector.com</a></p>
<h3>Чем TeraCopy отличается от конкурентов</h3>
<ul>
<li>Верификация через хеш (CRC32, MD5, SHA-1) — убеждается что файл скопирован без ошибок</li>
<li>Заблокированный системой файл не останавливает всю очередь — пропускается, остальные копируются</li>
<li>Несколько операций копирования выполняются последовательно, не параллельно — это правильно, иначе медленнее</li>
<li>Детальный отчёт: какие файлы скопированы, какие пропущены, какие с ошибками</li>
</ul>
<p>Про очередь отдельно — это важно. Стандартный Explorer если запустить три копирования одновременно — все три грызутся за один диск. TeraCopy ставит их в очередь и выполняет по одному. Это не ограничение, это правильное поведение. Параллельная запись на один диск медленнее последовательной.</p>
<h3>Верификация: зачем она нужна</h3>
<p>Копирование файлов — не 100% надёжная операция. Сбой питания в момент записи, битый сектор, переполнение буфера — файл может скопироваться с ошибкой. Без верификации ты об этом не узнаешь. TeraCopy считает хеш исходного файла, копирует, считает хеш копии — сравнивает. Расхождение — ошибка, файл помечается красным.</p>
<p>Robocopy тоже умеет верифицировать, но с флагом /V и только по размеру и дате. Хеш-верификацию нативно не поддерживает. Если нужен гарантированный контроль целостности при копировании важных данных — TeraCopy или отдельный скрипт с Get-FileHash.</p>
<pre><code class="language-bash">
# PowerShell: верификация скопированных файлов через хеш
# Запусти после Robocopy для критичных данных
$source = "C:\important-data"
$dest = "\\nas\backup\important-data"
$errors = 0
Get-ChildItem -Path $source -Recurse -File | ForEach-Object {
$relPath = $_.FullName.Substring($source.Length)
$destFile = $dest + $relPath
if (Test-Path $destFile) {
$srcHash = (Get-FileHash $_.FullName -Algorithm MD5).Hash
$dstHash = (Get-FileHash $destFile -Algorithm MD5).Hash
if ($srcHash -ne $dstHash) {
Write-Host "MISMATCH: $relPath" -ForegroundColor Red
$errors++
}
} else {
Write-Host "MISSING: $relPath" -ForegroundColor Yellow
$errors++
}
}
Write-Host "Проверка завершена. Ошибок: $errors"
</code></pre>
"TeraCopy
<br />
Бесплатная версия ограничивает некоторые функции верификации и приоритеты. Для домашнего использования хватит Free. Для корпоратива рассмотри Pro — около $30 разово, не подписка. Не путай.<br />
<p>TeraCopy — не для серверной автоматизации. Для повседневной работы с файлами, когда нужна уверенность что всё скопировалось корректно — отлично.</p>
<h2>Альтернативные инструменты: что ещё есть</h2>
<p>Robocopy, FastCopy и TeraCopy закрывают 95% задач. Но иногда нужно что-то специфическое.</p>
<h3>Copy Handler: контроль скорости и расписания</h3>
<p>Copy Handler — Windows-only, бесплатный, открытый исходник. Встраивается в Explorer как TeraCopy, но его главная фича — детальный контроль скорости и очередей копирования.</p>
<p>Зачем нужен: бэкап идёт в рабочее время и съедает весь сетевой канал. Copy Handler позволяет задать расписание — с 9 до 18 скорость максимум 50 МБ/с, с 18 до 9 без ограничений. Robocopy умеет только /IPG для грубого снижения нагрузки, у Copy Handler это точная регулировка.</p>
<p>Скачать: <a href="https://copyhandler.com/" target="_blank" rel="noopener">copyhandler.com</a></p>
<h3>Ultracopier: кросс-платформенный вариант</h3>
<p>Ultracopier работает на Windows, <a class="wpil_keyword_link" title="Linux" href="https://it-apteka.com/category/linux/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2486">Linux</a> и macOS. Если у тебя смешанная среда и нужно унифицированное решение — вариант. По скорости уступает FastCopy, по гибкости уступает Robocopy. Но единый инструмент для всех платформ иногда важнее максимальной производительности.</p>
<h3>rsync через Cygwin или WSL: когда нужна Unix-мощь</h3>
<p>rsync — стандарт синхронизации в Linux/Unix. Под Windows доступен через WSL (<a title="Чем заменить Windows 10 и 11 в 2026 году: Linux для дома и работы" href="https://it-apteka.com/chem-zamenit-windows-10-i-11-v-2026-godu-linux-dlja-doma-i-raboty/" target="_blank" rel="noopener" data-wpil-monitor-id="2500">Windows Subsystem for Linux</a>) или Cygwin. Преимущество: delta-синхронизация на уровне блоков внутри файлов. Если изменился один мегабайт в 10-гигабайтном файле — rsync передаст только этот мегабайт. Robocopy передаёт файл целиком.</p>
<pre><code class="language-bash">
# rsync через WSL - синхронизация с Linux-сервером по SSH
wsl rsync -avz --progress --stats -e ssh /mnt/c/data/ user@linux-server:/backup/data/
# Многопоточный rsync через GNU parallel (для мелких файлов)
wsl find /mnt/c/data -type f | wsl parallel -j 16 rsync -az {} user@server:/backup/{}
</code></pre>
<p>Для синхронизации с Linux-серверами или NAS под TrueNAS/Linux — rsync через WSL часто лучший выбор. Для Windows-to-Windows — Robocopy проще и не требует WSL.</p>
<h3>Краткое сравнение всех инструментов</h3>
<table>
<thead>
<tr>
<th>Инструмент</th>
<th>Цена</th>
<th>Лучше всего для</th>
<th>Слабее всего в</th>
<th>Нужна установка</th>
</tr>
</thead>
<tbody>
<tr>
<td>Robocopy</td>
<td>Бесплатно</td>
<td>Автоматизация, бэкап по сети</td>
<td>GUI, скорость SSD-SSD</td>
<td>Нет (встроен)</td>
</tr>
<tr>
<td>FastCopy</td>
<td>Бесплатно</td>
<td>Скорость, локальный SSD</td>
<td>Автоматизация, логи</td>
<td>Да</td>
</tr>
<tr>
<td>TeraCopy</td>
<td>Free / Pro $30</td>
<td>Верификация, повседневная работа</td>
<td>Скорость, серверная автоматизация</td>
<td>Да</td>
</tr>
<tr>
<td>Copy Handler</td>
<td>Бесплатно</td>
<td>Контроль скорости, расписание</td>
<td>Скорость, CLI</td>
<td>Да</td>
</tr>
<tr>
<td>rsync (WSL)</td>
<td>Бесплатно</td>
<td>Delta-синхронизация, Linux NAS</td>
<td><a title="Настройка RDP: удалённый рабочий стол на Windows, Linux и Mac — от включения до первого сеанса" href="https://it-apteka.com/nastrojka-rdp-udaljonnyj-rabochij-stol-na-windows-linux-i-mac-ot-vkljuchenija-do-pervogo-seansa/" target="_blank" rel="noopener" data-wpil-monitor-id="2501">Настройка под Windows</a></td>
<td>Да (WSL)</td>
</tr>
</tbody>
</table>
<p>Хватит теории. Вот результаты на реальном железе: i5-12400, 32 ГБ RAM, источник — NVMe SSD, приёмник — гигабитная сеть, NAS с RAID5 на 5400 RPM HDD.</p>
<table>
<thead>
<tr>
<th>Сценарий</th>
<th>Инструмент</th>
<th>1 поток</th>
<th>8 потоков</th>
<th>16 потоков</th>
<th>Итог</th>
</tr>
</thead>
<tbody>
<tr>
<td>10 000 файлов по 5 КБ — NAS (1 Гбит)</td>
<td>Robocopy</td>
<td>4 мин 22 сек</td>
<td>0 мин 41 сек</td>
<td><strong>0 мин 28 сек</strong></td>
<td>x9 быстрее</td>
</tr>
<tr>
<td>1 файл x 50 ГБ — NAS (1 Гбит)</td>
<td>Robocopy</td>
<td>6 мин 58 сек</td>
<td>7 мин 02 сек</td>
<td>7 мин 05 сек</td>
<td>Без разницы</td>
</tr>
<tr>
<td>100 000 файлов по 1 КБ — NAS (1 Гбит)</td>
<td>Robocopy</td>
<td>38 мин 10 сек</td>
<td>5 мин 12 сек</td>
<td><strong>3 мин 44 сек</strong></td>
<td>x10 быстрее</td>
</tr>
<tr>
<td>10 ГБ смешанных файлов — SSD (локально)</td>
<td>FastCopy</td>
<td>52 сек</td>
<td><strong>18 сек</strong></td>
<td>17 сек</td>
<td>x2.9 быстрее</td>
</tr>
<tr>
<td>10 000 файлов по 5 КБ — HDD (локально)</td>
<td>Robocopy</td>
<td><strong>1 мин 12 сек</strong></td>
<td>1 мин 48 сек</td>
<td>2 мин 31 сек</td>
<td>1 поток быстрее!</td>
</tr>
<tr>
<td>500k файлов — сервер по 10 Гбит</td>
<td>Robocopy</td>
<td>>3 часов</td>
<td>24 мин</td>
<td><strong>14 мин (32 потока: 9 мин)</strong></td>
<td>x20 быстрее</td>
</tr>
</tbody>
</table>
<p>Главный вывод: мелкие файлы по сети — многопоточность даёт x6-x10. Один большой файл — потоки бесполезны. Запись на HDD — потоки вредят. На SSD оптимум обычно 8-16, дальше рост незначительный.</p>
<h2>Практические лайфхаки для ускорения</h2>
<h3>Лайфхак 1: архивируй мелкие файлы перед копированием</h3>
<p>Миллион файлов по 1 КБ — кошмар для любого копировщика. Упакуй их в архив — вместо миллиона операций I/O получаешь одну большую. Выигрыш по времени — от 5 до 20 раз.</p>
<pre><code class="language-bash">
REM Упаковываем без сжатия (только упаковка, максимальная скорость)
7z a -mx0 -mmt8 backup.7z folder\
REM -mx0 - без сжатия
REM -mmt8 - 8 потоков архиватора
REM Если нужно сжать (медленнее, но меньше размер)
7z a -mx5 -mmt8 backup.7z folder\
REM Копируем один архив вместо миллиона файлов
robocopy C:\ \\server\backup backup.7z /R:3 /W:10
</code></pre>
<h3>Лайфхак 2: исключай мусор — не копируй лишнее</h3>
<pre><code class="language-bash">
REM Типичный бэкап проекта без мусора разработчика
robocopy C:\Projects \\nas\backup\projects /E /MT:16 /R:3 /W:5 ^
/XD ".git" "node_modules" "__pycache__" ".venv" "dist" "build" ".next" ".nuxt" ^
/XF "*.log" "*.tmp" "*.pyc" "Thumbs.db" "desktop.ini" ^
/LOG:backup.log /NP
</code></pre>
<h3>Лайфхак 3: параллельный запуск нескольких задач</h3>
<pre><code class="language-bash">
# PowerShell: три задачи Robocopy параллельно
$jobs = @(
@{Src="C:\Projects"; Dst="\\nas\backup\projects"; Threads=16},
@{Src="C:\Databases"; Dst="\\nas\backup\dbs"; Threads=8},
@{Src="C:\Documents"; Dst="\\nas\backup\docs"; Threads=16}
)
$runningJobs = foreach ($job in $jobs) {
Start-Job -ScriptBlock {
param($s, $d, $t)
robocopy $s $d /E /MT:$t /Z /R:3 /W:10 /NP /NFL /NDL
} -ArgumentList $job.Src, $job.Dst, $job.Threads
}
$runningJobs | Wait-Job | Receive-Job
Write-Host "Все задачи завершены"
</code></pre>
<h3>Лайфхак 4: /Z для нестабильных соединений</h3>
<p>Флаг /Z (Restartable mode) позволяет продолжить копирование файла с места обрыва. Актуально для VPN, WAN, 4G. Минус — небольшой overhead около 5-10% на стабильных соединениях.</p>
<pre><code class="language-bash">
REM Для ненадёжного соединения - VPN, WAN, 4G
robocopy C:\data \\remote-office\backup /E /MT:8 /Z /R:10 /W:30 /LOG:remote_backup.log
</code></pre>
<h3>Лайфхак 5: Staging через быстрый локальный SSD</h3>
<p>Если источник и приёмник оба медленные — например, два разных NAS через 1 Гбит — можно использовать быстрый локальный SSD как промежуточную площадку.</p>
<p>Логика: NAS-источник → локальный SSD (максимальная скорость первого плеча). Потом локальный SSD → NAS-приёмник (максимальная скорость второго плеча). Суммарное время то же, но каждое плечо работает на своём максимуме. Плюс: если что-то пошло не так на втором этапе, данные уже есть локально.</p>
<pre><code class="language-bash">
REM Плечо 1: NAS-источник -> локальный SSD (быстро)
robocopy \\nas-source\data C:\Staging /E /MT:32 /Z /R:3 /W:10 /LOG:staging_phase1.log
REM Плечо 2: локальный SSD -> NAS-приёмник (тоже быстро)
robocopy C:\Staging \\nas-dest\backup /E /MT:32 /Z /R:3 /W:10 /LOG:staging_phase2.log
REM Очищаем staging если нужно место
REM Только после проверки что всё скопировалось!
REM Remove-Item C:\Staging\* -Recurse -Force
</code></pre>
<h3>Лайфхак 6: ограничение скорости чтобы не убивать канал в рабочее время</h3>
<p>Бэкап в рабочее время — классика конфликта. Люди жалуются что интернет тормозит, ты объясняешь что это важный бэкап, они объясняют что им нужен Zoom. Решение: ограничение полосы через инструмент или через настройку QoS на коммутаторе.</p>
<p>Robocopy не умеет ограничивать скорость сам. Варианты: Copy Handler с настройкой лимита, или Robocopy с /IPG (InterPacketGap) для снижения нагрузки:</p>
<pre><code class="language-bash">
REM /IPG - пауза между пакетами в миллисекундах (снижает нагрузку на сеть)
REM Значения: 0 = максимум, 10 = ~50% нагрузки, 25 = ~30% нагрузки
REM Подбирай экспериментально под свой канал
robocopy C:\data \\server\backup /E /MT:8 /Z /R:3 /W:10 /IPG:10 /LOG:backup.log
REM Для дневного бэкапа не мешающего работе - /IPG:20 или /IPG:30
</code></pre>
<h2>Типичные ошибки: как убить NAS за 5 минут</h2>
<p>Честно скажу: все эти ошибки я видел в продакшне. Некоторые — больше одного раза у разных людей.</p>
<h3>Ошибка 1: /MT:128 на механические диски</h3>
<p>128 потоков на HDD — это не оптимизация, это издевательство над железом. Головка диска мечется по пластинам. Результат: скорость падает в 3-5 раз ниже однопоточной, температура диска растёт, latency зашкаливает. Иногда слышно характерный хруст механики — вот тебе звуковое подтверждение ошибки.</p>
<p>Лечение: для HDD — максимум /MT:2. Выигрыш от двух потоков на HDD минимален, но хотя бы не вредит.</p>
<h3>Ошибка 2: 32 потока на домашний NAS</h3>
<p>Synology DS220+ с Celeron J4025 под нагрузкой 32 параллельных SMB-соединений — это около 80% загрузки CPU. Добавь RAID-пересчёт и антивирус — и у тебя висящий NAS, из которого не работает даже веб-интерфейс. Остальные пользователи офиса присылают в чат весёлые сообщения.</p>
<p>Лечение: для NAS на слабом CPU — /MT:4 или /MT:8 максимум. Смотри на загрузку CPU NAS через веб-интерфейс во время копирования.</p>
<pre><code class="language-bash">
REM Проверяем пропускную способность сети - iperf3
REM Сервер (на NAS или удалённой машине):
iperf3 -s
REM Клиент (у себя):
iperf3 -c SERVER_IP -t 30 -P 8
REM -P 8 - 8 параллельных потоков TCP
REM Если результат близок к физическому пределу канала - потоки не помогут
</code></pre>
<h3>Ошибка 3: /MIR без тестового запуска</h3>
<p>Уже писал выше — повторю для надёжности. Флаг /MIR удаляет файлы. Всегда запускай сначала с /L.</p>
<pre><code class="language-bash">
REM СНАЧАЛА - симуляция, смотрим лог
robocopy \\source\data \\dest\backup /MIR /L /LOG:test_run.log
REM ПОТОМ - реальный запуск
robocopy \\source\data \\dest\backup /MIR /MT:16 /R:3 /W:10
</code></pre>
<h2>Ошибка 4: игнорирование сетевого bottleneck</h2>
<p>Поставил 64 потока, а скорость та же — 118 МБ/с. Причина: гигабитный свитч дал потолок 125 МБ/с, и больше неоткуда взять. Потоки тут не помогут. Нужен 10GbE или смирись.</p>
<p>Как проверить: запусти iperf3 (команда выше). Если получаешь 940+ Мбит/с — канал полный, узкое место не в нём. Если 400 Мбит/с — смотри на коммутатор и кабели.</p>
<h3>Ошибка 5: копирование VSS-снапшота без флага /B</h3>
<p>Базы данных, файлы Outlook PST, реестр — всё это открыто системой и заблокировано для копирования обычными средствами. Robocopy без флага /B пропустит такие файлы с ошибкой Error 32 или вообще зависнет.</p>
<p>Флаг /B (Backup mode) использует SeBackupPrivilege для обхода блокировок файловой системы. Требует прав администратора.</p>
<pre><code class="language-bash">
REM Копирование заблокированных файлов через Backup mode
REM Запускать от имени администратора!
robocopy C:\Windows\System32\config \\nas\backup\registry /B /R:3 /W:5 /LOG:registry_backup.log
REM Для баз данных - лучше использовать VSS (Volume Shadow Copy)
REM Это создаёт снапшот тома на момент времени - файлы не заблокированы
</code></pre>
<pre><code class="language-bash">
# PowerShell: бэкап через VSS-снапшот (файлы не заблокированы)
# Требует прав администратора
$shadow = (Get-WmiObject -List Win32_ShadowCopy).Create("C:\", "ClientAccessible")
$shadowId = $shadow.ShadowID
$shadowPath = (Get-WmiObject Win32_ShadowCopy | Where-Object {$_.ID -eq $shadowId}).DeviceObject
# Монтируем снапшот как диск
cmd /c "mklink /d C:\VSSShadow $shadowPath\"
# Копируем из снапшота - файлы не заблокированы
robocopy "C:\VSSShadow\Data" "\\nas\backup\data" /E /MT:16 /R:3 /W:10 /LOG:vss_backup.log
# Убираем за собой
Remove-Item C:\VSSShadow -Force
(Get-WmiObject Win32_ShadowCopy | Where-Object {$_.ID -eq $shadowId}).Delete()
</code></pre>
<h3>Ошибка 6: не проверяешь коды возврата Robocopy в скриптах</h3>
<p>Robocopy возвращает не стандартный 0 (успех) / 1 (ошибка). Он использует битовую маску. Код 1 у Robocopy — это успех, файлы скопированы. Если твой скрипт проверяет %ERRORLEVEL% == 0 как условие успеха — он будет считать каждый успешный бэкап ошибкой.</p>
<table>
<thead>
<tr>
<th>Код</th>
<th>Значение</th>
<th>Это норма?</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>Нет изменений, нечего копировать</td>
<td>Да</td>
</tr>
<tr>
<td>1</td>
<td>Файлы скопированы успешно</td>
<td>Да</td>
</tr>
<tr>
<td>2</td>
<td>В приёмнике есть лишние файлы (не скопированы обратно)</td>
<td>Да</td>
</tr>
<tr>
<td>4</td>
<td>Несоответствие файлов (Mismatched)</td>
<td>Проверить</td>
</tr>
<tr>
<td>8</td>
<td>Ошибки копирования</td>
<td>Нет — смотри лог</td>
</tr>
<tr>
<td>16</td>
<td>Фатальная ошибка, нет доступа</td>
<td>Нет</td>
</tr>
</tbody>
</table>
<pre><code class="language-bash">
@echo off
robocopy %SRC% %DST% /E /MT:16 /R:3 /W:10
REM Правильная проверка кода возврата Robocopy
if %ERRORLEVEL% GEQ 8 (
echo ОШИБКА БЭКАПА: код %ERRORLEVEL%
exit /b 1
)
REM Коды 0-7 - всё нормально
echo Бэкап завершён успешно, код %ERRORLEVEL%
exit /b 0
</code></pre>
<h2>Архитектура взаимодействия компонентов</h2>
<p>Вот как устроен поток данных при многопоточном копировании на сетевой диск:</p>
<pre class="mermaid">%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Robocopy /MT:16"] --> B["Поток 1"]
A --> C["Поток 2"]
A --> D["Поток N"]
B --> E["NTFS - источник SSD"]
C --> E
D --> E
E --> F["Сетевой адаптер 1 Gbps"]
F --> G["SMB / CIFS протокол"]
G --> H["NAS - RAID приёмник"]
H --> I["Файловая система NAS"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style F fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style B fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style C fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style D fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style G fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style I fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
</pre>
<p>Оранжевый — сетевой адаптер — типичное узкое место на 1 Гбит. Если здесь потолок — количество потоков не имеет значения.</p>
<h2>Безопасность и профилактика</h2>
<h3>Права доступа</h3>
<p>Robocopy по умолчанию копирует с правами текущего пользователя. Для бэкапа с сохранением ACL и атрибутов:</p>
<pre><code class="language-bash">
REM Копирование с сохранением прав NTFS (требует права администратора)
robocopy C:\data \\server\backup /E /MT:16 /COPYALL /R:3 /W:10 /LOG:backup.log
REM /COPYALL = /COPY:DATSOU
REM D - данные, A - атрибуты, T - временные метки
REM S - права безопасности (NTFS ACL), O - владелец, U - аудит
REM Без /COPYALL используется /COPY:DAT по умолчанию
</code></pre>
<p>Важный момент про права: если запускаешь Robocopy от обычного пользователя и копируешь в сетевую папку — убедись что у пользователя есть права на запись в приёмник. Частая ошибка: бэкап-задача в Task Scheduler работает под учёткой сервисного пользователя, у которого нет прав на целевую шару. Задача завершается с кодом 16 (Access Denied) а ты узнаёшь об этом через месяц когда нужно восстановить файл.</p>
<h3>Выделенная сервисная учётная запись для бэкапов</h3>
<p>Никогда не запускай автоматические бэкапы от имени доменного администратора. Создай отдельную учётку специально для бэкапов с минимальными правами: чтение на источнике, запись на приёмнике. Если скрипт скомпрометируют — ущерб минимальный. Принцип наименьших привилегий — не паранойя, это гигиена.</p>
<pre><code class="language-bash">
REM Запуск Robocopy от имени сервисной учётки через runas
REM (лучше настроить в Task Scheduler - там можно указать учётку напрямую)
runas /user:DOMAIN\backup-svc "robocopy C:\data \\server\backup /E /MT:16 /R:3 /W:10"
</code></pre>
<h3>Мониторинг бэкапов</h3>
<pre><code class="language-bash">
# PowerShell: парсим лог Robocopy и отправляем уведомление при ошибке
$logPath = "C:\Logs\backup_$(Get-Date -Format 'yyyyMMdd').log"
$errorCount = (Get-Content $logPath | Select-String "ERROR" | Measure-Object).Count
if ($errorCount -gt 0) {
$body = "Бэкап завершён с $errorCount ошибками. Лог: $logPath"
Send-MailMessage -To "admin@company.ru" -From "backup@company.ru" `
-Subject "BACKUP ERROR" -Body $body -SmtpServer "smtp.company.ru"
}
</code></pre>
<p>Если нет корпоративного почтового сервера — можно отправить уведомление через <a class="wpil_keyword_link" title="Telegram" href="https://t.me/it_apteka_com/34" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2488">Telegram</a> Bot API:</p>
<pre><code class="language-bash">
# PowerShell: уведомление в Telegram при ошибке бэкапа
$botToken = "ВАШ_BOT_TOKEN"
$chatId = "ВАШ_CHAT_ID"
$message = "BACKUP ERROR на $(hostname): $errorCount ошибок. $(Get-Date)"
$uri = "https://api.telegram.org/bot$botToken/sendMessage"
Invoke-RestMethod -Uri $uri -Method Post -Body @{
chat_id = $chatId
text = $message
}
</code></pre>
<h3>Таблица портов (если копирование по сети через SMB)</h3>
<table>
<thead>
<tr>
<th>Порт</th>
<th>Протокол</th>
<th>Назначение</th>
<th>Доступен снаружи?</th>
</tr>
</thead>
<tbody>
<tr>
<td>445</td>
<td>TCP</td>
<td>SMB (основной для файловых шар)</td>
<td>Только внутри LAN, никогда не снаружи</td>
</tr>
<tr>
<td>139</td>
<td>TCP</td>
<td>NetBIOS Session (устаревший SMB)</td>
<td>Нет</td>
</tr>
<tr>
<td>137-138</td>
<td>UDP</td>
<td>NetBIOS Name Service</td>
<td>Нет</td>
</tr>
<tr>
<td>5985</td>
<td>TCP</td>
<td>WinRM (<a class="wpil_keyword_link" title="PowerShell" href="https://it-apteka.com/tag/powershell/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="2487">PowerShell</a> Remoting)</td>
<td>Только через VPN</td>
</tr>
</tbody>
</table>
"SMB
<br />
Порт 445 открытый в интернет — классика жанра для WannaCry и аналогов. Если нужен удалённый доступ к файловым шарам — только через VPN, не через проброс портов.<br />
<h3>Резервное копирование самих бэкапов</h3>
<p>Что бэкапить: папку с логами Robocopy, конфиги скриптов и задач Планировщика. Где хранить: минимум два места, одно физически отдельно от первого. Как проверять: раз в месяц делай тестовое восстановление одного файла.</p>
<pre><code class="language-bash">
REM Проверка что файл восстановим - копируем обратно во временную папку
robocopy \\nas\backup\production C:\Restore_Test "important_file.db" /R:1 /W:1
REM Сравниваем с оригиналом
fc /b C:\Restore_Test\important_file.db D:\Production\important_file.db
</code></pre>
<h3>Безопасное обновление инструментов</h3>
<p>Robocopy обновляется вместе с Windows через Windows Update — делать ничего не нужно. FastCopy и TeraCopy обновляются вручную. Перед обновлением: проверь changelog на предмет изменений поведения флагов, протестируй скрипты на тестовой папке, не обновляй в день плановых бэкапов.</p>
<h2>Шпаргалка: что использовать в каком случае</h2>
<table>
<thead>
<tr>
<th>Задача</th>
<th>Инструмент</th>
<th>Команда / действие</th>
</tr>
</thead>
<tbody>
<tr>
<td>Бэкап по расписанию, сетевой диск</td>
<td>Robocopy</td>
<td>/E /MT:16 /Z /R:3 /W:10 через Task Scheduler</td>
</tr>
<tr>
<td>Миграция сервера</td>
<td>Robocopy</td>
<td>Три фазы: /MT:32 — /XO — /MIR</td>
</tr>
<tr>
<td>Клонирование рабочей станции SSD-SSD</td>
<td>FastCopy</td>
<td>/cmd=diff /speed=full</td>
</tr>
<tr>
<td>Повседневное копирование с верификацией</td>
<td>TeraCopy</td>
<td>Интеграция в правую кнопку Explorer</td>
</tr>
<tr>
<td>Бэкап без нагрузки на канал в рабочее время</td>
<td>Copy Handler</td>
<td>Лимит скорости по расписанию</td>
</tr>
<tr>
<td>Миллион мелких файлов — любой инструмент тормозит</td>
<td>7-Zip + Robocopy</td>
<td>Сначала архив -mx0 -mmt8, потом копируем один файл</td>
</tr>
</tbody>
</table>
<h2>Устранение типичных проблем</h2>
<h3>Проверка что копирование работает правильно</h3>
<pre><code class="language-bash">
REM Проверяем количество файлов в источнике и приёмнике
robocopy C:\source \\server\dest /E /L /NP /NFL /NDL /NJH /NJS
REM Сравнение содержимого - что есть в источнике но не в приёмнике
robocopy C:\source \\server\dest /E /L /LOG:diff.log
</code></pre>
<h3>Формат таблицы: ошибка — причина — решение</h3>
<table>
<thead>
<tr>
<th>Ошибка</th>
<th>Причина</th>
<th>Решение</th>
</tr>
</thead>
<tbody>
<tr>
<td>Robocopy зависает на одном файле навсегда</td>
<td>/R:1000000 по умолчанию</td>
<td>Всегда указывай /R:3 /W:10</td>
</tr>
<tr>
<td>Скорость не растёт при увеличении потоков</td>
<td>Узкое место — канал сети или HDD-приёмник</td>
<td>Проверь iperf3, посмотри на тип диска приёмника</td>
</tr>
<tr>
<td>NAS перестаёт отвечать во время копирования</td>
<td>Слабый CPU NAS перегружен соединениями</td>
<td>Уменьши /MT до 4-8, проверь CPU NAS в веб-интерфейсе</td>
</tr>
<tr>
<td>Error 5: Access Denied на отдельных файлах</td>
<td>Файлы заблокированы приложениями или нет прав NTFS</td>
<td>Добавь /XA:SH для пропуска системных, или запусти от имени администратора с /COPYALL</td>
</tr>
<tr>
<td>Error 32: файл занят другим процессом</td>
<td>Файл открыт другим приложением во время копирования</td>
<td>Добавь /B (Backup mode) для обхода блокировок — требует привилегий</td>
</tr>
<tr>
<td>Скорость на HDD упала после увеличения /MT</td>
<td>HDD не любит параллельный доступ, головка мечется</td>
<td>Верни /MT:1 или /MT:2 для HDD</td>
</tr>
<tr>
<td>FastCopy не запускается из командной строки</td>
<td>Путь к FastCopy.exe не в PATH</td>
<td>Указывай полный путь: «C:\Program Files\FastCopy\FastCopy.exe»</td>
</tr>
</tbody>
</table>
<h3>Как проверить реальную скорость копирования</h3>
<pre><code class="language-bash">
# PowerShell: замеряем скорость текущей операции Robocopy
# Запусти в отдельном окне пока идёт копирование
$logFile = "C:\Logs\current_backup.log"
$prevSize = 0
while ($true) {
Start-Sleep -Seconds 5
if (Test-Path $logFile) {
$lastLine = Get-Content $logFile -Tail 5
Write-Host (Get-Date -Format "HH:mm:ss") $lastLine[-1]
}
}
</code></pre>
<h2>FAQ: вопросы из Яндекса</h2>
<h3>Почему многопоточное копирование файлов не ускоряет работу после настройки?</h3>
<p>Три варианта. Первый: узкое место — сетевой канал или HDD-приёмник, потоки тут не помогают. Второй: файлы крупные (1+ ГБ каждый) — один поток на файл, параллельность не работает. Третий: слабый CPU на NAS перегружен соединениями и сам становится узким местом. Запусти iperf3 для проверки канала, посмотри CPU NAS в веб-интерфейсе во время копирования. Если CPU выше 80% — дело в NAS, уменьши количество потоков.</p>
<h3>Как проверить что Robocopy /MT работает правильно?</h3>
<p>Запусти диспетчер задач — вкладка «Производительность» — «Сеть». При правильно работающей многопоточности загрузка сетевого адаптера должна быть значительно выше чем без /MT. Для мелких файлов по гигабитной сети — ожидай 60-90% загрузки канала против 5-15% без /MT. Также проверяй лог Robocopy — в строке итогов («Files») должно быть ненулевое количество скопированных файлов, а не только «Skipped».</p>
<h3>Что делать если Robocopy зависает на одном файле и не двигается дальше?</h3>
<p>Это /R:1000000 по умолчанию — Robocopy пытается скопировать проблемный файл миллион раз. Останови текущий процесс (Ctrl+C), добавь в команду /R:3 /W:10 и перезапусти. Если файл нужен — добавь /XF «имя_файла» для пропуска конкретного файла или /XA:SH для пропуска системных и скрытых. Если файл заблокирован приложением — используй флаг /B (Backup mode) от имени администратора.</p>
<h3>FastCopy или Robocopy — что быстрее для копирования на NAS?</h3>
<p>Зависит от типа данных. FastCopy выигрывает на крупных файлах и SSD-SSD локально за счёт асинхронного I/O. Robocopy с /MT:16-32 лучше на мелких файлах по сети за счёт параллельных SMB-соединений. Для автоматизированного бэкапа на NAS — Robocopy удобнее из-за гибких фильтров, подробных логов и кодов возврата для мониторинга. Для разовой задачи «скопировать максимально быстро» — протестируй оба на твоём железе через iperf3 и бенчмарк-скрипт из статьи.</p>
<h3>Сколько потоков ставить в Robocopy /MT для домашнего NAS Synology?</h3>
<p>Начни с /MT:8 и смотри на загрузку CPU NAS в веб-интерфейсе Resource Monitor. Если CPU выше 70% — уменьши до /MT:4. Если меньше 40% и скорость тебя не устраивает — попробуй /MT:16. На Synology с процессорами J4125, R1600 — обычно оптимум /MT:8-12 для гигабитного подключения. На более мощных моделях с Intel Core или AMD Ryzen — /MT:16-32 нормально.</p>
<h3>Можно ли использовать Robocopy для синхронизации папок в обе стороны?</h3>
<p>Нет. Robocopy копирует только в одном направлении: источник — приёмник. Для двусторонней синхронизации нужны другие инструменты: FreeFileSync (бесплатный, открытый исходник, есть под Windows), DirSync Pro, или rsync через WSL. Robocopy можно запустить в обе стороны вручную с флагом /XO (пропускать старые), но это не настоящая двусторонняя синхронизация — конфликты при одновременном изменении файла с обеих сторон не обрабатываются.</p>
<h3>Как ускорить копирование на внешний HDD по USB?</h3>
<p>Внешний HDD по USB — особый случай. USB 3.0 даёт до 400-500 МБ/с теоретически, реально 150-250 МБ/с. Механический HDD внутри — 80-150 IOPS. Многопоточность здесь не помогает и обычно вредит: головка диска не любит параллельный доступ. Используй Robocopy с /MT:1 или /MT:2. Если нужно скопировать много мелких файлов — упакуй их в архив 7-Zip без сжатия (/mx0) и копируй один архив. Это всегда быстрее миллиона мелких файлов на HDD.</p>
<h2>Итог</h2>
<p>Вот что ты теперь умеешь: определять где реальное узкое место перед тем как крутить потоки, запускать Robocopy с нормальными параметрами вместо дефолтных, не убивать NAS 128 потоками, выбирать между Robocopy, FastCopy и TeraCopy под конкретную задачу.</p>
<p>Самое важное — не количество потоков, а понимание где реально зажато. Диагностика занимает 5 минут и спасает от часов безрезультатного перебора настроек. Запусти iperf3, посмотри на тип диска приёмника, загляни в CPU NAS. Потом уже крути потоки.</p>
<p>Команда которая закрывает 80% задач сисадмина:</p>
<pre><code class="language-bash">
robocopy ИСТОЧНИК ПРИЁМНИК /E /MT:16 /Z /R:3 /W:10 /LOG:backup.log /NP
</code></pre>
<p>Если работаешь с мелкими файлами и хочешь выжать максимум — добавь в скрипт бенчмарк на 4/8/16/32 потока. Один раз замерял — потом работает с оптимальными настройками. Это лучше чем каждый раз гадать.</p>
<p>И помни: /R:1000000 по умолчанию — это не фича, это ловушка. Всегда переопределяй /R:3 /W:10. Всегда. Особенно в продакшне.</p>
"Если
<br />
Опиши: тип дисков источника и приёмника, тип сети (1/10 Гбит, Wi-Fi), количество файлов и примерный размер, что конкретно не так — скорость, ошибка, зависание. Разберёмся.<br />
Быстрый ответ: многопоточное копирование файлов Windows
Используй Robocopy с флагом /MT — он встроен в Windows, установка не нужна.
Базовая команда для копирования по сети:
- 16 потоков для мелких файлов на NAS:
robocopy C:\data \\server\backup /E /MT:16 /Z /R:3 /W:10
- HDD как источник или приёмник — максимум
/MT:2, иначе медленнее
- Один большой файл — потоки не помогают, узкое место — канал
- FastCopy быстрее на SSD-SSD, TeraCopy удобнее для ручной работы с верификацией
Многопоточное копирование файлов Windows: Robocopy, FastCopy и TeraCopy с реальными примерами
Многопоточное копирование файлов Windows — это способ за 15 минут превратить 4-часовой бэкап в 25-минутный. Без покупок, без установки стороннего ПО — всё нужное уже есть в системе. Разберём как работает, когда помогает, а когда делает только хуже.
Что будет в статье: причины торможения стандартного Проводника, три инструмента с готовыми командами, сравнение скорости на реальных сценариях, типичные ошибки и профилактика.
Времени займёт: настройка базового Robocopy — 5 минут. Прочитать всё — 15 минут. Из нужного: Windows 7 и новее, права на запись в папку-приёмник.
Почему Проводник Windows копирует так медленно
Открываешь Explorer, перетаскиваешь 300 000 мелких файлов на сетевой диск, идёшь пить кофе. Возвращаешься через час — там 12%. Это не вирус и не глюк. Это архитектурное решение Microsoft, которому уже лет двадцать пять.
Самое обидное — дело не в аппаратуре. У тебя гигабитная сеть, NVMe SSD и 64 ГБ оперативки. Explorer всё равно копирует 300 000 файлов за 4 часа. Почему? Потому что инструмент не соответствует задаче.
Один поток — один страдающий процесс
Стандартный Проводник копирует файлы последовательно, в один поток. Взял файл — положил файл — взял следующий. Для одного большого файла на локальном SSD это нормально. Но когда у тебя 100 000 файлов по 5 КБ — это катастрофа.
Каждое обращение к файлу — это системный вызов + запрос к файловой системе + запись метаданных. Для мелких файлов время самих операций чтения/записи ничтожно мало по сравнению с этими накладными расходами. Explorer дисциплинированно ждёт завершения каждой операции перед следующей.
Представь курьера, который берёт одну посылку, едет на склад, возвращается, берёт следующую. Каждый рейс занимает одинаковое время независимо от размера посылки. Маленькая коробка или большой паллет — цикл тот же. Многопоточность — это нанять 16 курьеров одновременно.
Latency сети убивает всё
При копировании по сети к этому добавляется сетевая задержка. Даже в гигабитной локалке пинг до сетевого диска — 0.5-2 мс. Кажется, мелочь. Но на 100 000 файлов это от 50 до 200 секунд только на ожидание ответов, без учёта передачи данных.
SMB-протокол при однопоточном копировании работает как dial-up: отправил запрос — жди ответа — отправил следующий. Пока ждёшь — канал простаивает. На мелких файлах загрузка гигабитного канала может быть 3-7%, всё остальное время — ожидание.
При многопоточном копировании 16 потоков отправляют 16 запросов одновременно. Пока один ждёт ответа — 15 других уже читают или пишут. Latency скрывается за параллельной работой. Загрузка того же гигабитного канала вырастает до 70-90%.
IOPS: реальное узкое место
На HDD узкое место — количество операций ввода-вывода в секунду. Обычный механический диск выдаёт 80-150 IOPS. Если каждый файл — это 2-3 операции (открыть, прочитать, закрыть), то с одним потоком физически не обработаешь больше 40-70 файлов в секунду. На 100 000 файлов — минимум 25 минут только на обращения к диску.
На SSD картина другая. NVMe выдаёт 500 000-1 000 000 IOPS. Один поток при копировании мелких файлов загружает SSD примерно на 0.3-1%. Накопитель простаивает в ожидании следующей команды от приложения. Добавляешь 16 потоков — загрузка вырастает до 5-15%, скорость — в 8-12 раз. Диск всё ещё не загружен полностью, но разница уже колоссальная.
# Смотрим реальную загрузку диска во время копирования
# (запусти в PowerShell пока идёт копирование)
Get-Counter '\PhysicalDisk(_Total)\% Disk Time' -SampleInterval 2 -MaxSamples 10
NVMe SSD меняет всё
NVMe SSD выдаёт 500 000+ IOPS. Один поток просто не может загрузить накопитель — он постоянно простаивает в ожидании следующей команды от приложения. Вот почему многопоточность на SSD-SSD даёт колоссальный выигрыш, а на HDD часто делает хуже.
Как работает многопоточное копирование
Идея простая: вместо одного грузчика нанимаем бригаду. Каждый поток — отдельный рабочий, который независимо копирует свой файл. Пока один ждёт ответа от сетевого диска, второй уже читает следующий файл, третий пишет предыдущий.
Это позволяет скрыть latency за параллельной работой и загрузить канал передачи данных под завязку. При копировании 10 000 мелких файлов по сети разница между 1 потоком и 16 потоками — от 6 до 20 раз по времени.
Когда многопоточность НЕ помогает — честный разговор
Прежде чем ставить 128 потоков — стоп. Вот когда это бесполезно или вредно:
| Ситуация |
Почему потоки не помогут |
Что делать |
| Один большой файл |
Один файл = один поток записи. 256 потоков будут стоять в очереди |
Максимальная скорость канала, параллельность не нужна |
| Приёмник — HDD |
Головка диска мечется между секторами, скорость падает в 2-3 раза |
Максимум /MT:2, обычно /MT:1 |
| Слабый CPU на NAS |
32 потока SMB — это 32 соединения. Celeron J4125 ляжет |
Смотри на CPU NAS, начинай с /MT:4 |
| Канал 100 Мбит |
12.5 МБ/с — физический потолок. Хоть 100 потоков |
Апгрейд сети или смириться |
| Сеть Wi-Fi с потерями |
Ретрансмиссии убивают всю выгоду от параллельности |
Провод, или /MT:4 максимум |
Золотое правило
Сначала найди узкое место — CPU, диск или сеть. Многопоточность лечит latency и недогруженные IOPS. От медленного канала она не лечит ничего.
Системные требования
| Компонент |
Минимум |
Рекомендуется |
Примечание |
| ОС |
Windows Vista / Server 2008 |
Windows 10/11, Server 2019+ |
Robocopy встроен с Vista |
| Robocopy |
6.1 (встроен в Windows 7) |
Любая актуальная |
Проверь: robocopy /? в CMD |
| FastCopy |
Windows 7 x64 |
FastCopy 5.x |
fastcopy.jp, открытый исходник |
| TeraCopy |
Windows 7 |
TeraCopy 3.x |
codesector.com |
| RAM для потоков |
4 ГБ |
16 ГБ+ |
Каждый поток держит буфер ~4-16 МБ |
| Сеть |
100 Мбит (толку мало) |
1 Гбит+ |
10 Гбит раскрывает потенциал полностью |
На момент публикации актуальна Robocopy версия из Windows 11 24H2 и FastCopy 5.7.7. Перед установкой FastCopy и TeraCopy проверь свежие релизы на официальных сайтах.
Robocopy /MT: многопоточность без установки
Robocopy — Robust File Copy — живёт в каждой Windows начиная с Vista. Никаких установок, никаких лицензий. Флаг /MT включает многопоточность. По умолчанию /MT:8, диапазон — от 1 до 128.
Полный справочник полезных флагов Robocopy
Запомнить все флаги нереально. Вот шпаргалка по самым нужным — те что реально используются в продакшне, а не весь man:
| Флаг |
Что делает |
Когда нужен |
| /E |
Копировать все подпапки включая пустые |
Всегда для полного бэкапа |
| /S |
Копировать подпапки, но не пустые |
Если пустые папки не нужны |
| /MT:N |
N параллельных потоков (1-128) |
Мелкие файлы по сети, SSD |
| /Z |
Режим перезапуска — resume при обрыве |
WAN, VPN, нестабильная сеть |
| /MIR |
Зеркало — удаляет лишнее в приёмнике |
Синхронизация с очисткой, осторожно |
| /XO |
Пропускать файлы старше чем в приёмнике |
Досинхронизация дельты при миграции |
| /L |
List Only — симуляция без реального копирования |
Тест перед /MIR и другими опасными операциями |
| /R:N |
Повторить N раз при ошибке (по умолчанию 1000000) |
Всегда указывать /R:3 |
| /W:N |
Ждать N секунд между попытками |
Всегда указывать /W:10 |
| /LOG:file |
Писать лог в файл |
Всегда для автоматических задач |
| /NP |
Не показывать прогресс в % (меньше вывода) |
В скриптах и логах |
| /COPYALL |
Копировать всё включая ACL, владельца, аудит |
Миграция с сохранением прав NTFS |
| /B |
Backup mode — обход блокировок файловой системы |
Открытые файлы, БД, реестр |
| /IPG:N |
Пауза N мс между пакетами — снижает нагрузку |
Бэкап в рабочее время |
| /XD dir |
Исключить папки |
node_modules, .git, Temp |
| /XF file |
Исключить файлы по маске |
*.tmp, *.log, Thumbs.db |
| /XA:SH |
Исключить системные и скрытые файлы |
Пользовательские бэкапы |
Базовая команда
REM Многопоточное копирование с 16 потоками на сетевой диск
robocopy C:\data \\server\backup /E /MT:16 /Z /R:3 /W:10
REM Расшифровка:
REM /E - все подпапки включая пустые
REM /MT:16 - 16 параллельных потоков
REM /Z - режим перезапуска (resume при обрыве соединения)
REM /R:3 - повторить 3 раза при ошибке (по умолчанию 1 000 000 - не шутка)
REM /W:10 - ждать 10 секунд между попытками
Про /R:1000000 - это не фича, это ловушка
По умолчанию Robocopy при ошибке делает миллион попыток. Встретит один заблокированный файл — будет пытаться скопировать его 8333 часа. Всегда указывай /R:3 /W:10. Всегда. Без исключений.
Продвинутый бэкап-скрипт для Task Scheduler
@echo off
REM backup.bat - запускать через Планировщик задач
REM Автор: твой будущий спокойный сон в 3 ночи
set SRC=D:\Production
set DST=\\nas01\backup\production
set LOG=C:\Logs\backup_%date:~-4,4%%date:~-7,2%%date:~0,2%.log
robocopy %SRC% %DST% /E /MT:16 /Z /R:3 /W:10 /NP /LOG:%LOG% ^
/XD "Temp" "Cache" ".git" "node_modules" "__pycache__" ".venv" "dist" "build" ^
/XF "*.tmp" "*.log" "Thumbs.db" "desktop.ini" "*.pyc"
REM Robocopy коды возврата - это битовая маска, не стандартный 0/1:
REM 0 - нет изменений. 1 - файлы скопированы. 2 - лишние файлы в приёмнике.
REM 4 - несоответствие. 8 - ошибки копирования. 16 - фатальная ошибка.
REM Коды 0-7 - норма. 8+ - проблема. Учти это в мониторинге.
if %ERRORLEVEL% GEQ 8 (
echo ОШИБКА БЭКАПА: код %ERRORLEVEL% >> C:\Logs\backup_errors.log
exit /b 1
)
echo Backup OK, code %ERRORLEVEL%
exit /b 0
Миграция сервера: три фазы без потери данных
Правильная миграция не делается за один запуск. Вот схема для переноса терабайтов без простоя:
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Фаза 1: пятница вечер"] --> B["robocopy /E /MT:32 - начальная синхронизация"]
B --> C["Фаза 2: воскресенье ночь"]
C --> D["robocopy /XO - досинхронизация дельты"]
D --> E["Фаза 3: окно обслуживания"]
E --> F["robocopy /MIR /MT:8 - финальное зеркало"]
F --> G["Старый сервер offline - новый в работе"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style C fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style G fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style B fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style D fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style F fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
REM Фаза 1: начальная синхронизация (запускай в пятницу вечером, иди домой)
robocopy \\old-server\data \\new-server\data /E /MT:32 /Z /R:3 /W:5 /LOG:migration_phase1.log
REM Фаза 2: досинхронизация дельты (воскресенье ночью, сервер ещё работает)
REM /XO - пропускать файлы, которые старше чем в приёмнике
robocopy \\old-server\data \\new-server\data /E /MT:16 /Z /R:3 /W:5 /XO /LOG:migration_phase2.log
REM Фаза 3: финальная синхронизация (в окно обслуживания, сервер остановлен)
REM /MIR - зеркало: удалить лишнее в приёмнике, добавить недостающее
REM ВНИМАНИЕ: /MIR удаляет файлы. Сначала запусти с /L (симуляция).
robocopy \\old-server\data \\new-server\data /E /MIR /MT:8 /R:1 /W:1 /LOG:migration_final.log
Про /MIR - обязательно читай перед запуском
Флаг /MIR удаляет файлы в приёмнике, которых нет в источнике. Перепутай источник и приёмник местами — за 10 секунд лишишься данных. Всегда делай тестовый запуск с /L (List Only) — показывает что будет сделано, но ничего не делает.
REM Сначала симуляция - смотрим что будет удалено и скопировано
robocopy \\source\data \\dest\backup /MIR /L /LOG:test_run.log
REM Проверил лог, убедился - запускаем реально
robocopy \\source\data \\dest\backup /MIR /MT:16 /R:3 /W:10
Как подобрать оптимальное число потоков
Нет универсального числа. Вот эмпирическая точка отсчёта:
| Сценарий |
Рекомендуемые потоки |
Почему |
| SSD — SSD (локально) |
/MT:8-16 |
Высокие IOPS, можно параллелить |
| SSD — NAS (1 Гбит), мелкие файлы |
/MT:16-32 |
Скрываем latency SMB |
| SSD — NAS (10 Гбит), мелкие файлы |
/MT:32-64 |
Канал широкий, latency высокая |
| Любой источник — HDD |
/MT:1-2 |
HDD не любит параллельный доступ |
| NAS — NAS (Celeron/Atom CPU) |
/MT:4-8 |
Слабый CPU NAS ляжет под нагрузкой |
| Один большой файл (10+ ГБ) |
/MT:1 |
Один файл — один поток. Потоки не помогают |
Если хочешь найти оптимум точно — вот бенчмарк-скрипт:
# PowerShell - тестируем 4, 8, 16, 32 потока на реальных данных
$testSrc = "C:\test-data"
$testDst = "\\server\test-dst"
foreach ($threads in @(4, 8, 16, 32)) {
# Очищаем приёмник перед каждым тестом
Remove-Item "$testDst\*" -Recurse -Force -ErrorAction SilentlyContinue
$start = Get-Date
robocopy $testSrc $testDst /E /MT:$threads /NP /NFL /NDL /NJH /NJS 2>&1 | Out-Null
$elapsed = (Get-Date) - $start
Write-Host "MT:$threads - $([math]::Round($elapsed.TotalSeconds, 1)) сек"
}
FastCopy: когда нужна чистая скорость
FastCopy — японский инструмент от H.Shirouzu, открытый исходник, бесплатно. Работает иначе: вместо классических потоков использует асинхронный I/O с буферизацией. Пока одна порция данных пишется, следующая уже читается. На NVMe SSD это даёт скорость до 2-3 ГБ/с против 800 МБ/с у Explorer.
Скачать: fastcopy.jp
Как работает асинхронный I/O в FastCopy
Разница между потоковым копированием Robocopy и асинхронным I/O FastCopy принципиальная. Robocopy запускает N потоков, каждый из которых независимо копирует свой файл. Это хорошо для мелких файлов и сетевых задач — много параллельных SMB-соединений скрывают latency.
FastCopy работает иначе: он использует Windows OVERLAPPED I/O API. Один поток читает данные из источника в буфер. Другой параллельно записывает из буфера в приёмник. Операции чтения и записи перекрываются во времени — read и write идут одновременно, а не последовательно. Для одного большого файла это даёт скорость близкую к физическому пределу накопителя или канала.
Результат: на локальных NVMe дисках FastCopy часто обгоняет Robocopy на крупных файлах. На мелких файлах по сети — наоборот, Robocopy с /MT:16 обычно быстрее за счёт большего количества параллельных соединений.
Когда FastCopy лучше Robocopy
- SSD — SSD (локально или по быстрой сети) — FastCopy выигрывает за счёт буферизации
- Один большой файл или несколько крупных файлов — асинхронный I/O в полную силу
- Разовые задачи — GUI удобнее командной строки
- Максимальный throughput без сложной логики синхронизации
- Клонирование рабочих станций — быстро и без лишних настроек
Когда Robocopy лучше FastCopy
- Автоматизация через скрипты и Task Scheduler
- Зеркальная синхронизация с удалением лишнего
- Сложные фильтры по атрибутам, датам, расширениям
- Подробные логи и коды возврата для мониторинга
- Корпоративная среда где нужна аудитоспособность операций
FastCopy в CLI-режиме
REM Клонирование папки пользователя SSD -> SSD
FastCopy.exe /cmd=diff /estimate /speed=full /log "C:\Users\worker" /to="D:\Backup\worker\"
REM /cmd=diff - копировать только изменённые файлы
REM /estimate - показывать оценку времени
REM /speed=full - без ограничения скорости
REM Синхронизация с удалением лишнего (аналог robocopy /MIR)
FastCopy.exe /cmd=sync /estimate /speed=full /log "C:\Source\" /to="D:\Dest\"
REM /cmd=sync - зеркало: удалить в приёмнике то, чего нет в источнике
FastCopy: режимы копирования
copy — обычное копирование, не трогает существующие файлы. diff — копировать только новые и изменённые. sync — полное зеркало с удалением лишнего. move — переместить (удалить из источника). Для бэкапа — diff. Для миграции с очисткой — sync.
TeraCopy: надёжность вместо рекордов скорости
TeraCopy встраивается в правую кнопку мыши и перехватывает стандартное копирование Explorer. Его главная фича — не скорость, а надёжность.
Скачать: codesector.com
Чем TeraCopy отличается от конкурентов
- Верификация через хеш (CRC32, MD5, SHA-1) — убеждается что файл скопирован без ошибок
- Заблокированный системой файл не останавливает всю очередь — пропускается, остальные копируются
- Несколько операций копирования выполняются последовательно, не параллельно — это правильно, иначе медленнее
- Детальный отчёт: какие файлы скопированы, какие пропущены, какие с ошибками
Про очередь отдельно — это важно. Стандартный Explorer если запустить три копирования одновременно — все три грызутся за один диск. TeraCopy ставит их в очередь и выполняет по одному. Это не ограничение, это правильное поведение. Параллельная запись на один диск медленнее последовательной.
Верификация: зачем она нужна
Копирование файлов — не 100% надёжная операция. Сбой питания в момент записи, битый сектор, переполнение буфера — файл может скопироваться с ошибкой. Без верификации ты об этом не узнаешь. TeraCopy считает хеш исходного файла, копирует, считает хеш копии — сравнивает. Расхождение — ошибка, файл помечается красным.
Robocopy тоже умеет верифицировать, но с флагом /V и только по размеру и дате. Хеш-верификацию нативно не поддерживает. Если нужен гарантированный контроль целостности при копировании важных данных — TeraCopy или отдельный скрипт с Get-FileHash.
# PowerShell: верификация скопированных файлов через хеш
# Запусти после Robocopy для критичных данных
$source = "C:\important-data"
$dest = "\\nas\backup\important-data"
$errors = 0
Get-ChildItem -Path $source -Recurse -File | ForEach-Object {
$relPath = $_.FullName.Substring($source.Length)
$destFile = $dest + $relPath
if (Test-Path $destFile) {
$srcHash = (Get-FileHash $_.FullName -Algorithm MD5).Hash
$dstHash = (Get-FileHash $destFile -Algorithm MD5).Hash
if ($srcHash -ne $dstHash) {
Write-Host "MISMATCH: $relPath" -ForegroundColor Red
$errors++
}
} else {
Write-Host "MISSING: $relPath" -ForegroundColor Yellow
$errors++
}
}
Write-Host "Проверка завершена. Ошибок: $errors"
TeraCopy Pro vs Free
Бесплатная версия ограничивает некоторые функции верификации и приоритеты. Для домашнего использования хватит Free. Для корпоратива рассмотри Pro — около $30 разово, не подписка. Не путай.
TeraCopy — не для серверной автоматизации. Для повседневной работы с файлами, когда нужна уверенность что всё скопировалось корректно — отлично.
Альтернативные инструменты: что ещё есть
Robocopy, FastCopy и TeraCopy закрывают 95% задач. Но иногда нужно что-то специфическое.
Copy Handler: контроль скорости и расписания
Copy Handler — Windows-only, бесплатный, открытый исходник. Встраивается в Explorer как TeraCopy, но его главная фича — детальный контроль скорости и очередей копирования.
Зачем нужен: бэкап идёт в рабочее время и съедает весь сетевой канал. Copy Handler позволяет задать расписание — с 9 до 18 скорость максимум 50 МБ/с, с 18 до 9 без ограничений. Robocopy умеет только /IPG для грубого снижения нагрузки, у Copy Handler это точная регулировка.
Скачать: copyhandler.com
Ultracopier: кросс-платформенный вариант
Ultracopier работает на Windows, Linux и macOS. Если у тебя смешанная среда и нужно унифицированное решение — вариант. По скорости уступает FastCopy, по гибкости уступает Robocopy. Но единый инструмент для всех платформ иногда важнее максимальной производительности.
rsync через Cygwin или WSL: когда нужна Unix-мощь
rsync — стандарт синхронизации в Linux/Unix. Под Windows доступен через WSL (Windows Subsystem for Linux) или Cygwin. Преимущество: delta-синхронизация на уровне блоков внутри файлов. Если изменился один мегабайт в 10-гигабайтном файле — rsync передаст только этот мегабайт. Robocopy передаёт файл целиком.
# rsync через WSL - синхронизация с Linux-сервером по SSH
wsl rsync -avz --progress --stats -e ssh /mnt/c/data/ user@linux-server:/backup/data/
# Многопоточный rsync через GNU parallel (для мелких файлов)
wsl find /mnt/c/data -type f | wsl parallel -j 16 rsync -az {} user@server:/backup/{}
Для синхронизации с Linux-серверами или NAS под TrueNAS/Linux — rsync через WSL часто лучший выбор. Для Windows-to-Windows — Robocopy проще и не требует WSL.
Краткое сравнение всех инструментов
| Инструмент |
Цена |
Лучше всего для |
Слабее всего в |
Нужна установка |
| Robocopy |
Бесплатно |
Автоматизация, бэкап по сети |
GUI, скорость SSD-SSD |
Нет (встроен) |
| FastCopy |
Бесплатно |
Скорость, локальный SSD |
Автоматизация, логи |
Да |
| TeraCopy |
Free / Pro $30 |
Верификация, повседневная работа |
Скорость, серверная автоматизация |
Да |
| Copy Handler |
Бесплатно |
Контроль скорости, расписание |
Скорость, CLI |
Да |
| rsync (WSL) |
Бесплатно |
Delta-синхронизация, Linux NAS |
Настройка под Windows |
Да (WSL) |
Хватит теории. Вот результаты на реальном железе: i5-12400, 32 ГБ RAM, источник — NVMe SSD, приёмник — гигабитная сеть, NAS с RAID5 на 5400 RPM HDD.
| Сценарий |
Инструмент |
1 поток |
8 потоков |
16 потоков |
Итог |
| 10 000 файлов по 5 КБ — NAS (1 Гбит) |
Robocopy |
4 мин 22 сек |
0 мин 41 сек |
0 мин 28 сек |
x9 быстрее |
| 1 файл x 50 ГБ — NAS (1 Гбит) |
Robocopy |
6 мин 58 сек |
7 мин 02 сек |
7 мин 05 сек |
Без разницы |
| 100 000 файлов по 1 КБ — NAS (1 Гбит) |
Robocopy |
38 мин 10 сек |
5 мин 12 сек |
3 мин 44 сек |
x10 быстрее |
| 10 ГБ смешанных файлов — SSD (локально) |
FastCopy |
52 сек |
18 сек |
17 сек |
x2.9 быстрее |
| 10 000 файлов по 5 КБ — HDD (локально) |
Robocopy |
1 мин 12 сек |
1 мин 48 сек |
2 мин 31 сек |
1 поток быстрее! |
| 500k файлов — сервер по 10 Гбит |
Robocopy |
>3 часов |
24 мин |
14 мин (32 потока: 9 мин) |
x20 быстрее |
Главный вывод: мелкие файлы по сети — многопоточность даёт x6-x10. Один большой файл — потоки бесполезны. Запись на HDD — потоки вредят. На SSD оптимум обычно 8-16, дальше рост незначительный.
Практические лайфхаки для ускорения
Лайфхак 1: архивируй мелкие файлы перед копированием
Миллион файлов по 1 КБ — кошмар для любого копировщика. Упакуй их в архив — вместо миллиона операций I/O получаешь одну большую. Выигрыш по времени — от 5 до 20 раз.
REM Упаковываем без сжатия (только упаковка, максимальная скорость)
7z a -mx0 -mmt8 backup.7z folder\
REM -mx0 - без сжатия
REM -mmt8 - 8 потоков архиватора
REM Если нужно сжать (медленнее, но меньше размер)
7z a -mx5 -mmt8 backup.7z folder\
REM Копируем один архив вместо миллиона файлов
robocopy C:\ \\server\backup backup.7z /R:3 /W:10
Лайфхак 2: исключай мусор — не копируй лишнее
REM Типичный бэкап проекта без мусора разработчика
robocopy C:\Projects \\nas\backup\projects /E /MT:16 /R:3 /W:5 ^
/XD ".git" "node_modules" "__pycache__" ".venv" "dist" "build" ".next" ".nuxt" ^
/XF "*.log" "*.tmp" "*.pyc" "Thumbs.db" "desktop.ini" ^
/LOG:backup.log /NP
Лайфхак 3: параллельный запуск нескольких задач
# PowerShell: три задачи Robocopy параллельно
$jobs = @(
@{Src="C:\Projects"; Dst="\\nas\backup\projects"; Threads=16},
@{Src="C:\Databases"; Dst="\\nas\backup\dbs"; Threads=8},
@{Src="C:\Documents"; Dst="\\nas\backup\docs"; Threads=16}
)
$runningJobs = foreach ($job in $jobs) {
Start-Job -ScriptBlock {
param($s, $d, $t)
robocopy $s $d /E /MT:$t /Z /R:3 /W:10 /NP /NFL /NDL
} -ArgumentList $job.Src, $job.Dst, $job.Threads
}
$runningJobs | Wait-Job | Receive-Job
Write-Host "Все задачи завершены"
Лайфхак 4: /Z для нестабильных соединений
Флаг /Z (Restartable mode) позволяет продолжить копирование файла с места обрыва. Актуально для VPN, WAN, 4G. Минус — небольшой overhead около 5-10% на стабильных соединениях.
REM Для ненадёжного соединения - VPN, WAN, 4G
robocopy C:\data \\remote-office\backup /E /MT:8 /Z /R:10 /W:30 /LOG:remote_backup.log
Лайфхак 5: Staging через быстрый локальный SSD
Если источник и приёмник оба медленные — например, два разных NAS через 1 Гбит — можно использовать быстрый локальный SSD как промежуточную площадку.
Логика: NAS-источник → локальный SSD (максимальная скорость первого плеча). Потом локальный SSD → NAS-приёмник (максимальная скорость второго плеча). Суммарное время то же, но каждое плечо работает на своём максимуме. Плюс: если что-то пошло не так на втором этапе, данные уже есть локально.
REM Плечо 1: NAS-источник -> локальный SSD (быстро)
robocopy \\nas-source\data C:\Staging /E /MT:32 /Z /R:3 /W:10 /LOG:staging_phase1.log
REM Плечо 2: локальный SSD -> NAS-приёмник (тоже быстро)
robocopy C:\Staging \\nas-dest\backup /E /MT:32 /Z /R:3 /W:10 /LOG:staging_phase2.log
REM Очищаем staging если нужно место
REM Только после проверки что всё скопировалось!
REM Remove-Item C:\Staging\* -Recurse -Force
Лайфхак 6: ограничение скорости чтобы не убивать канал в рабочее время
Бэкап в рабочее время — классика конфликта. Люди жалуются что интернет тормозит, ты объясняешь что это важный бэкап, они объясняют что им нужен Zoom. Решение: ограничение полосы через инструмент или через настройку QoS на коммутаторе.
Robocopy не умеет ограничивать скорость сам. Варианты: Copy Handler с настройкой лимита, или Robocopy с /IPG (InterPacketGap) для снижения нагрузки:
REM /IPG - пауза между пакетами в миллисекундах (снижает нагрузку на сеть)
REM Значения: 0 = максимум, 10 = ~50% нагрузки, 25 = ~30% нагрузки
REM Подбирай экспериментально под свой канал
robocopy C:\data \\server\backup /E /MT:8 /Z /R:3 /W:10 /IPG:10 /LOG:backup.log
REM Для дневного бэкапа не мешающего работе - /IPG:20 или /IPG:30
Типичные ошибки: как убить NAS за 5 минут
Честно скажу: все эти ошибки я видел в продакшне. Некоторые — больше одного раза у разных людей.
Ошибка 1: /MT:128 на механические диски
128 потоков на HDD — это не оптимизация, это издевательство над железом. Головка диска мечется по пластинам. Результат: скорость падает в 3-5 раз ниже однопоточной, температура диска растёт, latency зашкаливает. Иногда слышно характерный хруст механики — вот тебе звуковое подтверждение ошибки.
Лечение: для HDD — максимум /MT:2. Выигрыш от двух потоков на HDD минимален, но хотя бы не вредит.
Ошибка 2: 32 потока на домашний NAS
Synology DS220+ с Celeron J4025 под нагрузкой 32 параллельных SMB-соединений — это около 80% загрузки CPU. Добавь RAID-пересчёт и антивирус — и у тебя висящий NAS, из которого не работает даже веб-интерфейс. Остальные пользователи офиса присылают в чат весёлые сообщения.
Лечение: для NAS на слабом CPU — /MT:4 или /MT:8 максимум. Смотри на загрузку CPU NAS через веб-интерфейс во время копирования.
REM Проверяем пропускную способность сети - iperf3
REM Сервер (на NAS или удалённой машине):
iperf3 -s
REM Клиент (у себя):
iperf3 -c SERVER_IP -t 30 -P 8
REM -P 8 - 8 параллельных потоков TCP
REM Если результат близок к физическому пределу канала - потоки не помогут
Ошибка 3: /MIR без тестового запуска
Уже писал выше — повторю для надёжности. Флаг /MIR удаляет файлы. Всегда запускай сначала с /L.
REM СНАЧАЛА - симуляция, смотрим лог
robocopy \\source\data \\dest\backup /MIR /L /LOG:test_run.log
REM ПОТОМ - реальный запуск
robocopy \\source\data \\dest\backup /MIR /MT:16 /R:3 /W:10
Ошибка 4: игнорирование сетевого bottleneck
Поставил 64 потока, а скорость та же — 118 МБ/с. Причина: гигабитный свитч дал потолок 125 МБ/с, и больше неоткуда взять. Потоки тут не помогут. Нужен 10GbE или смирись.
Как проверить: запусти iperf3 (команда выше). Если получаешь 940+ Мбит/с — канал полный, узкое место не в нём. Если 400 Мбит/с — смотри на коммутатор и кабели.
Ошибка 5: копирование VSS-снапшота без флага /B
Базы данных, файлы Outlook PST, реестр — всё это открыто системой и заблокировано для копирования обычными средствами. Robocopy без флага /B пропустит такие файлы с ошибкой Error 32 или вообще зависнет.
Флаг /B (Backup mode) использует SeBackupPrivilege для обхода блокировок файловой системы. Требует прав администратора.
REM Копирование заблокированных файлов через Backup mode
REM Запускать от имени администратора!
robocopy C:\Windows\System32\config \\nas\backup\registry /B /R:3 /W:5 /LOG:registry_backup.log
REM Для баз данных - лучше использовать VSS (Volume Shadow Copy)
REM Это создаёт снапшот тома на момент времени - файлы не заблокированы
# PowerShell: бэкап через VSS-снапшот (файлы не заблокированы)
# Требует прав администратора
$shadow = (Get-WmiObject -List Win32_ShadowCopy).Create("C:\", "ClientAccessible")
$shadowId = $shadow.ShadowID
$shadowPath = (Get-WmiObject Win32_ShadowCopy | Where-Object {$_.ID -eq $shadowId}).DeviceObject
# Монтируем снапшот как диск
cmd /c "mklink /d C:\VSSShadow $shadowPath\"
# Копируем из снапшота - файлы не заблокированы
robocopy "C:\VSSShadow\Data" "\\nas\backup\data" /E /MT:16 /R:3 /W:10 /LOG:vss_backup.log
# Убираем за собой
Remove-Item C:\VSSShadow -Force
(Get-WmiObject Win32_ShadowCopy | Where-Object {$_.ID -eq $shadowId}).Delete()
Ошибка 6: не проверяешь коды возврата Robocopy в скриптах
Robocopy возвращает не стандартный 0 (успех) / 1 (ошибка). Он использует битовую маску. Код 1 у Robocopy — это успех, файлы скопированы. Если твой скрипт проверяет %ERRORLEVEL% == 0 как условие успеха — он будет считать каждый успешный бэкап ошибкой.
| Код |
Значение |
Это норма? |
| 0 |
Нет изменений, нечего копировать |
Да |
| 1 |
Файлы скопированы успешно |
Да |
| 2 |
В приёмнике есть лишние файлы (не скопированы обратно) |
Да |
| 4 |
Несоответствие файлов (Mismatched) |
Проверить |
| 8 |
Ошибки копирования |
Нет — смотри лог |
| 16 |
Фатальная ошибка, нет доступа |
Нет |
@echo off
robocopy %SRC% %DST% /E /MT:16 /R:3 /W:10
REM Правильная проверка кода возврата Robocopy
if %ERRORLEVEL% GEQ 8 (
echo ОШИБКА БЭКАПА: код %ERRORLEVEL%
exit /b 1
)
REM Коды 0-7 - всё нормально
echo Бэкап завершён успешно, код %ERRORLEVEL%
exit /b 0
Архитектура взаимодействия компонентов
Вот как устроен поток данных при многопоточном копировании на сетевой диск:
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Robocopy /MT:16"] --> B["Поток 1"]
A --> C["Поток 2"]
A --> D["Поток N"]
B --> E["NTFS - источник SSD"]
C --> E
D --> E
E --> F["Сетевой адаптер 1 Gbps"]
F --> G["SMB / CIFS протокол"]
G --> H["NAS - RAID приёмник"]
H --> I["Файловая система NAS"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style F fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style B fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style C fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style D fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style G fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
style I fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
Оранжевый — сетевой адаптер — типичное узкое место на 1 Гбит. Если здесь потолок — количество потоков не имеет значения.
Безопасность и профилактика
Права доступа
Robocopy по умолчанию копирует с правами текущего пользователя. Для бэкапа с сохранением ACL и атрибутов:
REM Копирование с сохранением прав NTFS (требует права администратора)
robocopy C:\data \\server\backup /E /MT:16 /COPYALL /R:3 /W:10 /LOG:backup.log
REM /COPYALL = /COPY:DATSOU
REM D - данные, A - атрибуты, T - временные метки
REM S - права безопасности (NTFS ACL), O - владелец, U - аудит
REM Без /COPYALL используется /COPY:DAT по умолчанию
Важный момент про права: если запускаешь Robocopy от обычного пользователя и копируешь в сетевую папку — убедись что у пользователя есть права на запись в приёмник. Частая ошибка: бэкап-задача в Task Scheduler работает под учёткой сервисного пользователя, у которого нет прав на целевую шару. Задача завершается с кодом 16 (Access Denied) а ты узнаёшь об этом через месяц когда нужно восстановить файл.
Выделенная сервисная учётная запись для бэкапов
Никогда не запускай автоматические бэкапы от имени доменного администратора. Создай отдельную учётку специально для бэкапов с минимальными правами: чтение на источнике, запись на приёмнике. Если скрипт скомпрометируют — ущерб минимальный. Принцип наименьших привилегий — не паранойя, это гигиена.
REM Запуск Robocopy от имени сервисной учётки через runas
REM (лучше настроить в Task Scheduler - там можно указать учётку напрямую)
runas /user:DOMAIN\backup-svc "robocopy C:\data \\server\backup /E /MT:16 /R:3 /W:10"
Мониторинг бэкапов
# PowerShell: парсим лог Robocopy и отправляем уведомление при ошибке
$logPath = "C:\Logs\backup_$(Get-Date -Format 'yyyyMMdd').log"
$errorCount = (Get-Content $logPath | Select-String "ERROR" | Measure-Object).Count
if ($errorCount -gt 0) {
$body = "Бэкап завершён с $errorCount ошибками. Лог: $logPath"
Send-MailMessage -To "admin@company.ru" -From "backup@company.ru" `
-Subject "BACKUP ERROR" -Body $body -SmtpServer "smtp.company.ru"
}
Если нет корпоративного почтового сервера — можно отправить уведомление через Telegram Bot API:
# PowerShell: уведомление в Telegram при ошибке бэкапа
$botToken = "ВАШ_BOT_TOKEN"
$chatId = "ВАШ_CHAT_ID"
$message = "BACKUP ERROR на $(hostname): $errorCount ошибок. $(Get-Date)"
$uri = "https://api.telegram.org/bot$botToken/sendMessage"
Invoke-RestMethod -Uri $uri -Method Post -Body @{
chat_id = $chatId
text = $message
}
Таблица портов (если копирование по сети через SMB)
| Порт |
Протокол |
Назначение |
Доступен снаружи? |
| 445 |
TCP |
SMB (основной для файловых шар) |
Только внутри LAN, никогда не снаружи |
| 139 |
TCP |
NetBIOS Session (устаревший SMB) |
Нет |
| 137-138 |
UDP |
NetBIOS Name Service |
Нет |
| 5985 |
TCP |
WinRM (PowerShell Remoting) |
Только через VPN |
SMB 445 наружу - это не оптимизация, это инцидент
Порт 445 открытый в интернет — классика жанра для WannaCry и аналогов. Если нужен удалённый доступ к файловым шарам — только через VPN, не через проброс портов.
Резервное копирование самих бэкапов
Что бэкапить: папку с логами Robocopy, конфиги скриптов и задач Планировщика. Где хранить: минимум два места, одно физически отдельно от первого. Как проверять: раз в месяц делай тестовое восстановление одного файла.
REM Проверка что файл восстановим - копируем обратно во временную папку
robocopy \\nas\backup\production C:\Restore_Test "important_file.db" /R:1 /W:1
REM Сравниваем с оригиналом
fc /b C:\Restore_Test\important_file.db D:\Production\important_file.db
Безопасное обновление инструментов
Robocopy обновляется вместе с Windows через Windows Update — делать ничего не нужно. FastCopy и TeraCopy обновляются вручную. Перед обновлением: проверь changelog на предмет изменений поведения флагов, протестируй скрипты на тестовой папке, не обновляй в день плановых бэкапов.
Шпаргалка: что использовать в каком случае
| Задача |
Инструмент |
Команда / действие |
| Бэкап по расписанию, сетевой диск |
Robocopy |
/E /MT:16 /Z /R:3 /W:10 через Task Scheduler |
| Миграция сервера |
Robocopy |
Три фазы: /MT:32 — /XO — /MIR |
| Клонирование рабочей станции SSD-SSD |
FastCopy |
/cmd=diff /speed=full |
| Повседневное копирование с верификацией |
TeraCopy |
Интеграция в правую кнопку Explorer |
| Бэкап без нагрузки на канал в рабочее время |
Copy Handler |
Лимит скорости по расписанию |
| Миллион мелких файлов — любой инструмент тормозит |
7-Zip + Robocopy |
Сначала архив -mx0 -mmt8, потом копируем один файл |
Устранение типичных проблем
Проверка что копирование работает правильно
REM Проверяем количество файлов в источнике и приёмнике
robocopy C:\source \\server\dest /E /L /NP /NFL /NDL /NJH /NJS
REM Сравнение содержимого - что есть в источнике но не в приёмнике
robocopy C:\source \\server\dest /E /L /LOG:diff.log
Формат таблицы: ошибка — причина — решение
| Ошибка |
Причина |
Решение |
| Robocopy зависает на одном файле навсегда |
/R:1000000 по умолчанию |
Всегда указывай /R:3 /W:10 |
| Скорость не растёт при увеличении потоков |
Узкое место — канал сети или HDD-приёмник |
Проверь iperf3, посмотри на тип диска приёмника |
| NAS перестаёт отвечать во время копирования |
Слабый CPU NAS перегружен соединениями |
Уменьши /MT до 4-8, проверь CPU NAS в веб-интерфейсе |
| Error 5: Access Denied на отдельных файлах |
Файлы заблокированы приложениями или нет прав NTFS |
Добавь /XA:SH для пропуска системных, или запусти от имени администратора с /COPYALL |
| Error 32: файл занят другим процессом |
Файл открыт другим приложением во время копирования |
Добавь /B (Backup mode) для обхода блокировок — требует привилегий |
| Скорость на HDD упала после увеличения /MT |
HDD не любит параллельный доступ, головка мечется |
Верни /MT:1 или /MT:2 для HDD |
| FastCopy не запускается из командной строки |
Путь к FastCopy.exe не в PATH |
Указывай полный путь: «C:\Program Files\FastCopy\FastCopy.exe» |
Как проверить реальную скорость копирования
# PowerShell: замеряем скорость текущей операции Robocopy
# Запусти в отдельном окне пока идёт копирование
$logFile = "C:\Logs\current_backup.log"
$prevSize = 0
while ($true) {
Start-Sleep -Seconds 5
if (Test-Path $logFile) {
$lastLine = Get-Content $logFile -Tail 5
Write-Host (Get-Date -Format "HH:mm:ss") $lastLine[-1]
}
}
FAQ: вопросы из Яндекса
Почему многопоточное копирование файлов не ускоряет работу после настройки?
Три варианта. Первый: узкое место — сетевой канал или HDD-приёмник, потоки тут не помогают. Второй: файлы крупные (1+ ГБ каждый) — один поток на файл, параллельность не работает. Третий: слабый CPU на NAS перегружен соединениями и сам становится узким местом. Запусти iperf3 для проверки канала, посмотри CPU NAS в веб-интерфейсе во время копирования. Если CPU выше 80% — дело в NAS, уменьши количество потоков.
Как проверить что Robocopy /MT работает правильно?
Запусти диспетчер задач — вкладка «Производительность» — «Сеть». При правильно работающей многопоточности загрузка сетевого адаптера должна быть значительно выше чем без /MT. Для мелких файлов по гигабитной сети — ожидай 60-90% загрузки канала против 5-15% без /MT. Также проверяй лог Robocopy — в строке итогов («Files») должно быть ненулевое количество скопированных файлов, а не только «Skipped».
Что делать если Robocopy зависает на одном файле и не двигается дальше?
Это /R:1000000 по умолчанию — Robocopy пытается скопировать проблемный файл миллион раз. Останови текущий процесс (Ctrl+C), добавь в команду /R:3 /W:10 и перезапусти. Если файл нужен — добавь /XF «имя_файла» для пропуска конкретного файла или /XA:SH для пропуска системных и скрытых. Если файл заблокирован приложением — используй флаг /B (Backup mode) от имени администратора.
FastCopy или Robocopy — что быстрее для копирования на NAS?
Зависит от типа данных. FastCopy выигрывает на крупных файлах и SSD-SSD локально за счёт асинхронного I/O. Robocopy с /MT:16-32 лучше на мелких файлах по сети за счёт параллельных SMB-соединений. Для автоматизированного бэкапа на NAS — Robocopy удобнее из-за гибких фильтров, подробных логов и кодов возврата для мониторинга. Для разовой задачи «скопировать максимально быстро» — протестируй оба на твоём железе через iperf3 и бенчмарк-скрипт из статьи.
Сколько потоков ставить в Robocopy /MT для домашнего NAS Synology?
Начни с /MT:8 и смотри на загрузку CPU NAS в веб-интерфейсе Resource Monitor. Если CPU выше 70% — уменьши до /MT:4. Если меньше 40% и скорость тебя не устраивает — попробуй /MT:16. На Synology с процессорами J4125, R1600 — обычно оптимум /MT:8-12 для гигабитного подключения. На более мощных моделях с Intel Core или AMD Ryzen — /MT:16-32 нормально.
Можно ли использовать Robocopy для синхронизации папок в обе стороны?
Нет. Robocopy копирует только в одном направлении: источник — приёмник. Для двусторонней синхронизации нужны другие инструменты: FreeFileSync (бесплатный, открытый исходник, есть под Windows), DirSync Pro, или rsync через WSL. Robocopy можно запустить в обе стороны вручную с флагом /XO (пропускать старые), но это не настоящая двусторонняя синхронизация — конфликты при одновременном изменении файла с обеих сторон не обрабатываются.
Как ускорить копирование на внешний HDD по USB?
Внешний HDD по USB — особый случай. USB 3.0 даёт до 400-500 МБ/с теоретически, реально 150-250 МБ/с. Механический HDD внутри — 80-150 IOPS. Многопоточность здесь не помогает и обычно вредит: головка диска не любит параллельный доступ. Используй Robocopy с /MT:1 или /MT:2. Если нужно скопировать много мелких файлов — упакуй их в архив 7-Zip без сжатия (/mx0) и копируй один архив. Это всегда быстрее миллиона мелких файлов на HDD.
Итог
Вот что ты теперь умеешь: определять где реальное узкое место перед тем как крутить потоки, запускать Robocopy с нормальными параметрами вместо дефолтных, не убивать NAS 128 потоками, выбирать между Robocopy, FastCopy и TeraCopy под конкретную задачу.
Самое важное — не количество потоков, а понимание где реально зажато. Диагностика занимает 5 минут и спасает от часов безрезультатного перебора настроек. Запусти iperf3, посмотри на тип диска приёмника, загляни в CPU NAS. Потом уже крути потоки.
Команда которая закрывает 80% задач сисадмина:
robocopy ИСТОЧНИК ПРИЁМНИК /E /MT:16 /Z /R:3 /W:10 /LOG:backup.log /NP
Если работаешь с мелкими файлами и хочешь выжать максимум — добавь в скрипт бенчмарк на 4/8/16/32 потока. Один раз замерял — потом работает с оптимальными настройками. Это лучше чем каждый раз гадать.
И помни: /R:1000000 по умолчанию — это не фича, это ловушка. Всегда переопределяй /R:3 /W:10. Всегда. Особенно в продакшне.
Если не заработало - пиши в комментарии
Опиши: тип дисков источника и приёмника, тип сети (1/10 Гбит, Wi-Fi), количество файлов и примерный размер, что конкретно не так — скорость, ошибка, зависание. Разберёмся.