robocopy: повний посібник для сисадміна — IT-Wiki

[IT-FORMAT]
Новий формат бізнесу

» » » robocopy: повний посібник для сисадміна — міграція файл-серверів, бекапи, типові помилки

robocopy: повний посібник для сисадміна — міграція файл-серверів, бекапи, типові помилки

Цикл: IT-Wiki / Атлас команд Windows Переглядів: 27
Перед стартом
  • Усі приклади запускаються у 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:NN повторів при помилці (дефолт 1 000 000)Завжди. Рекомендую /R:2.
/W:NПауза N секунд між повторами (дефолт 30)Завжди. Рекомендую /W:5.
/MT:NN паралельних потоків (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, коли рука звикла.

Теги:
  • Коментарі


Привіт, незнайомець
Опитування

Якою програмою обліку ви користуєтесь?