robocopy: повний посібник для сисадміна — міграція файл-серверів, бекапи, типові помилки
Перед стартом
- Усі приклади запускаються у cmd або PowerShell від імені адміністратора. Без прав адміна robocopy не скопіює ACL і не побачить системні атрибути.
- Тестуйте
/MIR на тестовому наборі даних перед першим запуском на проді. Помилка з напрямом (source/dest поміняли місцями) знищує дані за секунди.
- Перед міграцією файл-сервера зніміть snapshot VM обох сторін або хоча б інкрементальний бекап. Це не параноя — це здоровий страх.
Що таке robocopy і коли я її викликаю
Robocopy (Robust File Copy) — консольна утиліта Microsoft для копіювання й синхронізації файлів. Три речі роблять її безальтернативною на серверах:
- Рестартабельність — при розриві мережі продовжує з місця, де впало (
/Z, /ZB).
- Багатопоточність — до 128 потоків (
/MT), реально прискорює в 3-6 разів на мережевих share.
- Повне копіювання метаданих — NTFS ACL, власники, атрибути, часові мітки, junction points (
/COPYALL, /SEC).
Типові мої сценарії, у яких robocopy не має альтернатив:
- Міграція файл-сервера на нове залізо або VM.
- Щоденна інкрементальна синхронізація на резервний сервер.
- Копіювання великого архіву через нестабільний WAN.
- Ремонт пермішенів на вже існуючій копії (
/SECFIX).
- Перенесення профілів користувачів перед реінсталом Windows.
Базовий синтаксис
robocopy <source> <destination> [<files>] [<options>]
Мінімальний робочий приклад — копія з однієї папки в іншу з логом і 2 повторами при помилках:
robocopy D:\Src E:\Dst /E /R:2 /W:5 /LOG:copy.log /TEE
Без /E скопіюються лише файли з кореня, без вкладених папок. Без /R:2 /W:5 robocopy при першій помилці спробує 1 000 000 разів з паузою 30 секунд (так, це дефолт) — процес застрягне назавжди на одному недоступному файлі.
Таблиця найважливіших ключів
Це не повний список (повний — у robocopy /?, їх 80+). Це ті 15, якими користуєшся 95% часу:
| Ключ | Що робить | Коли треба |
/E | Рекурсивно, включно з порожніми папками | Майже завжди. Без нього копіюється тільки корінь. |
/S | Рекурсивно, без порожніх папок | Коли порожні теки не потрібні (зменшити сміття). |
/MIR | Дзеркало: /E + видалити у dst те, чого нема в src | Повторна синхронізація. Небезпечно (див. нижче). |
/COPYALL | Копіювати D,A,T,S,O,U (дані+атрибути+ACL+власник+аудит) | Міграція файл-сервера. Потребує SeBackupPrivilege. |
/SEC | Копіювати тільки NTFS ACL | Коротший варіант /COPYALL без аудиту. |
/SECFIX | Оновити ACL у dst, не копіюючи дані | Коли пермішени розсинхронізувались після ручних правок. |
/R:N | N повторів при помилці (дефолт 1 000 000) | Завжди. Рекомендую /R:2. |
/W:N | Пауза N секунд між повторами (дефолт 30) | Завжди. Рекомендую /W:5. |
/MT:N | N паралельних потоків (1-128, дефолт 8) | Мережеві share, багато дрібних файлів. /MT:16 — добра база. |
/Z | Рестартабельний режим | Нестабільна мережа, дуже великі файли. |
/ZB | Рестартабельно, fallback у backup-режим | Коли не вистачає прав на деякі файли. Повільно. |
/XO | Пропустити файли, старші у src, ніж у dst | Інкрементальна синхронізація «тільки нове». |
/XA:H | Виключити файли з атрибутом Hidden | Виключити desktop.ini, Thumbs.db і т.д. |
/LOG:file | Запис у лог-файл | Продакшн-запуски — завжди. |
/TEE | Показувати прогрес і в консолі, і в лог | Коли хочеш бачити наживо + потім ревюнути. |
/NP | Без progress bar у логах | Обов'язково з /LOG — без /NP лог роздувається у сотні МБ. |
Сценарій 1. Міграція файл-сервера з ACL — нічна вікна
Задача: переїхати з \\FS01\Data (1.5 ТБ, 850 тисяч файлів, NTFS-ACL від складних Security-груп) на \\FS02\Data. Вікно — з суботи 22:00 до неділі 06:00.
Підхід у дві фази: заздалегідь (за день-два до міграції) робимо перший прогін, який копіює 99% даних. У саму вікну робимо другий прогін — він довезе лише те, що змінилось.
Попередня копія (за день до вікна):
robocopy \\FS01\Data \\FS02\Data /E /COPYALL /R:2 /W:5 /MT:16 /NP /LOG:D:\migration\pre.log /TEE
Фінальний прогін у вікну:
robocopy \\FS01\Data \\FS02\Data /MIR /COPYALL /R:2 /W:5 /MT:32 /NP /LOG:D:\migration\final.log /TEE
Різниця — /MIR у другому прогоні: він не тільки донесе зміни, але й видалить у dst те, що користувачі видалили у src між двома прогонами. /MT:32 більше (ніч — є ресурс). /NP обов'язково, інакше лог-файл виросте у гігабайти.
Обережно
/COPYALL потребує привілеїв SeBackupPrivilege і SeRestorePrivilege. Звичайний адмін домену їх має, але сервісна обліковка — не завжди. Якщо частина ACL не скопіювалась, лог покаже «ERROR 5 (0x00000005) Accessing Source Directory» — додавайте /B (backup mode) і запускайте від адміна.
Сценарій 2. Щоденна інкрементальна копія на резервний сервер
Задача: кожну ніч о 2:00 копіювати нові/змінені файли зі \\FS01\Users на \\BACKUP\Users-daily. Видалені — не видаляти (бекап повинен зберігати історію).
robocopy \\FS01\Users \\BACKUP\Users-daily /E /COPY:DAT /XO /R:2 /W:5 /MT:16 /NP /LOG+:D:\backups\daily.log
Ключові рішення:
/COPY:DAT замість /COPYALL — тут не потрібна реплікація пермішенів (на бекап-сервері своя структура прав).
/XO (eXclude Older) — копіювати тільки те, що в src новіше за dst. Тобто інкремент.
/LOG+: (з плюсом) — дописує в існуючий лог замість перезапису. Так за тиждень маєш архів усіх запусків.
- Ніякого
/MIR! Інакше якщо користувач видалить важливий файл, бекап його теж видалить тієї ж ночі — і ти більше його не повернеш.
Сценарій 3. Нестабільна мережа — через WAN або VPN
Задача: перенести 200 ГБ архіву з філіалу через IPsec-тунель, який розривається раз на 20-40 хвилин.
robocopy \\FILIAL-FS\Archive D:\Archive /E /Z /R:30 /W:60 /MT:4 /NP /LOG:D:\wan-copy.log /TEE
Ключові рішення:
/Z — рестартабельний режим. Якщо розрив посеред файла, продовжить з місця, не спочатку.
/R:30 /W:60 — 30 повторів з паузою хвилину. Дає тунелю шанс піднятися.
/MT:4, а не 16 — багато потоків по ненадійній мережі тільки погіршує (кожне розривання множиться).
Примітка про /Z vs /ZB
/Z — рестартабельний. /ZB — рестартабельний + fallback у backup-режим, коли прав не вистачає. /ZB зручний, але у 3-5 разів повільніший навіть на швидкій мережі. Не вмикайте «про всяк випадок» — тільки коли реально ловите «Access denied».
Сценарій 4. Шляхи довші 260 символів
Задача: скопіювати користувацьку домашню теку, де лежить структура \\FS\Home\ivanov\Projects\2024\Q4\Clients\...\file.xlsx — загальна довжина 290 символів.
robocopy "\\FS\Home\ivanov" "\\FS2\Home\ivanov" /E /COPYALL /R:2 /W:5 /MT:8 /256 /NP /LOG:long.log
Ключове: /256 — дозвіл працювати зі шляхами до 32 767 символів (з префіксом \\?\). Без нього robocopy впаде на перших же глибоких ієрархіях з помилкою «The filename or extension is too long».
Сценарій 5. Копіювати тільки права, без даних
Задача: після ручного rsync-а / міграції фізичного диска NTFS-пермішени злетіли. Дані на місці, але \\FS\Data\HR тепер доступна всьому «Everyone». Треба відновити права з «еталонного» сервера.
robocopy \\FS-ETALON\Data \\FS\Data /E /SECFIX /COPY:S /R:0 /NP /LOG:secfix.log /TEE
/SECFIX — магічний ключ: не копіює дані, оновлює тільки ACL у dst, щоб вони збігалися з src. /R:0 — без повторів, бо це одноразова операція, якщо впало — буде видно одразу.
Порада
Інші /*FIX ключі: /TIMFIX — оновити лише timestamps у dst, /ATFIX — оновити атрибути. Корисно після міграцій, коли дані вже на місці, але метадані злетіли.
Сценарій 6. Виключити певні файли / папки
Задача: скопіювати користувацький профіль, але без AppData, без .ost-файлів Outlook і без Thumbs.db.
robocopy C:\Users\ivanov D:\Profiles\ivanov /E /COPYALL /R:2 /W:5 /MT:8 /XD AppData /XF *.ost Thumbs.db desktop.ini /NP /LOG:profile.log
Де:
/XD AppData — виключити теку AppData (рекурсивно).
/XF *.ost Thumbs.db desktop.ini — виключити конкретні файли за маскою.
Коди завершення (exit codes)
У скриптах важливо правильно інтерпретувати %ERRORLEVEL%. Robocopy використовує бітову маску, а не традиційні «0 = OK, не-0 = помилка»:
| Код | Значення |
| 0 | Нічого не копіювалось. Папки ідентичні. OK. |
| 1 | Файли скопійовано успішно. OK. |
| 2 | У dst є зайве (не у src). OK, якщо це очікувано. |
| 3 | (1+2) Скопійовано + є зайве. OK. |
| 4 | Розбіжності (mismatched). Потребує уваги. |
| 8 | Були помилки копіювання. Частина файлів не дойшла. |
| 16 | Фатальна помилка. Не стартувало взагалі. |
Перевірка в batch-файлі:
robocopy %SRC% %DST% /MIR /COPYALL /NP /LOG:out.log
if %ERRORLEVEL% GEQ 8 (
echo ERROR: robocopy exit code %ERRORLEVEL%
exit /b %ERRORLEVEL%
)
echo Sync OK
exit /b 0
Тобто будь-який код < 8 — це успіх, ≥ 8 — помилка. Типова пастка: перевіряти if %ERRORLEVEL% NEQ 0 — тоді навіть успішна копія з пермішен-різницею буде вважатися провалом.
Типові помилки й як їх уникнути
Небезпека №1: /MIR не в той бік
Змінили source і destination місцями при правці скрипта — і через хвилину D:\Data (еталон) порожня, бо синхронізувалась зі щойно створеною порожньою E:\Backup. Відновити — тільки з бекапу.
Захист: перед продакшн-запуском /MIR завжди робіть /L (list only, не копіювати) на тих самих аргументах і візуально перевірте, що намальовано видаляти саме в dst.
robocopy %SRC% %DST% /MIR /L /NP /LOG:dryrun.log
Якщо у dryrun.log список «EXTRA Dir/File» виглядає дивно — ви щось поміняли місцями.
Пастка №2: дефолтні повтори
Якщо не вказати /R і /W, robocopy при помилці спробує 1 мільйон разів з паузою 30 секунд (приблизно 347 днів очікування на один файл). Процес буде «висіти» і здаватись зависшим. Завжди ставте /R:2 /W:5 або подібне.
Пастка №3: /MT і ACL
При /MT:N де N > 8 на складних ACL (NTFS-inheritance з великою глибиною) robocopy іноді «перемішує» послідовність виставлення прав. Результат — у dst пермішени дивно відрізняються від src, хоча лог OK. Для міграцій з /COPYALL тримайте /MT не більше 16, після завершення прогоніть /SECFIX /COPY:S /L і перевіряйте розбіжності.
Пастка №4: /LOG без /NP
Без /NP (No Progress) robocopy у лог пише кожен прогрес-апдейт ідентичним рядком з оновленням відсотків через \r. Для консолі виглядає нормально, а у файл лог-файл роздувається на гігабайти за великих міграцій. У /LOG завжди комбінуйте з /NP.
Чеклист перед першим /MIR на прод
Перевірити перед запуском
- Знято snapshot VM або інкрементальний бекап обох сторін.
- Source і destination у команді візуально перевірено — ліва сторона завжди джерело.
- Спершу прогнано
/L (list only) з тими самими ключами, лог переглянуто.
- Вказані
/R:2 /W:5 (або подібні) — не default 1 000 000.
- У команді є
/NP, якщо є /LOG.
- Disk space у dst перевірений — вистачить на прийом усіх даних + 10% запасу.
- Обліковий запис, з-під якого запуск, має потрібні привілеї (SeBackupPrivilege для
/COPYALL).
- Є час на аналіз логу після: exit code ≥ 8 — не йдемо спати, розбираємось зараз.
Пов'язане
Робочий цикл з robocopy: перевірити → /L → запустити → проаналізувати лог → повторний прогін з /MIR якщо треба. Не пропускайте жоден крок, навіть якщо здається «ну я це вже сто разів робив». Саме у сотий раз і можна переплутати source і destination, коли рука звикла.