Проблемы Robocopy с облачными файлами

Вопрос или проблема

Я хотел бы, чтобы Robocopy скопировал все полезные данные с системного диска Windows, но по какой-то причине robocopy не может отличить некоторые файлы OneDrive (думаю, с Google Drive и iCloud может быть такая же проблема); даже при добавлении /XA:O robocopy все равно пытается скопировать их, что приводит к сбоям (то же самое происходит, если используется /XJ для исключения символических ссылок).

Что не так с этими файлами и есть ли способ заставить Robocopy игнорировать эти файлы?

  • Свойства этих файлов показывают фактический размер в Проводнике, но с Размер на диске: 0 байт
  • Я думаю, что единственный (неэффективный) способ исключить эти файлы — исключить целые папки [/XD:%UserProfile%\OneDrive], что немного неудобно, потому что системный диск может содержать разнообразные офлайн приложения и данные (такие как папки iCloud, OneDrive и Google Drive в каждом профиле пользователя):
    onedrive file

Нет, нет способов. Эти файлы используют функцию “Файлы по запросу” OneDrive. Файлы, которые вы видите, являются “заглушками”, ссылающимися на файл в облаке, поэтому у них есть правильный размер файла, показанный в свойствах, но они не занимают никакого места на диске. Если вы выполните команду Windows ATTRIB /?, вы увидите некоторые новые атрибуты. Ссылка: https://docs.microsoft.com/en-us/onedrive/files-on-demand-windows. Robocopy не был обновлен, чтобы учитывать эти атрибуты, поэтому вы не можете исключить их.

“Всегда доступно” – Закреплено – attrib +p
“Доступно локально” – Снять закрепление – attrib -p
“Только онлайн” – Не закреплено – attrib +u

Если вы часто выполняете эту задачу, запуская скрипт, вы могли бы добавить тихую деинсталляцию любых приложений синхронизации файлов в начало скрипта, поскольку они так или иначе резервируются в облаке.

RoboCopy крайне неэффективен для резервного копирования файлов/разделов и не рекомендуется для использования, так как у него нет сжатия и нет паритета, чтобы обеспечить корректность файлов в резервной копии; вместо этого рекомендуется создать WIM с помощью Dism:

  • WIM/ESD являются форматами интеллектуального сжатия изображений и, следовательно, эффективны по месту хранения:
    • Только измененные файлы добавляются к .esd/.wim, когда к ним дополняется новое изображение [индекс]; новые добавленные изображения используют одну и ту же копию неизмененных файлов, уже содержащихся в изображении (проверено по хешу), что позволяет изображению оставаться маленьким по сравнению с содержащимися данными
    • Данные в ESD/WIM невозможно испортить, если команды имиджирования всегда выполняются с /Verify и /CheckIntegrity (Windows ≤7: /Check)
  • Windows XP ≥ 10 всегда нативно поддерживал имиджирование разделов/файловых систем:
    • Системный [ОС] раздел может быть проимайтирован только из WinPE/WinRE
      • WIM [Windows IMage] может захватить весь раздел или отдельные папки/файлы
      • ESD [Electronic Software Distribution] может захватить только системный раздел и должен использовать /Compress:Recovery (алгоритм примерно на 33% эффективнее, чем /Compress:Max)
        • Windows ≥10: Может использоваться только для экспортированных PBR [Push-Button Reset] изображений
          Windows ≤8.1: Только загрузочная установка Windows может быть захвачена как ESD
    • Dism всегда включен в WinPE/WinRE (Win XP ≤ 7: ImageX):
      • WinPE: Windows Preinstallation Environment
        (Установочный носитель Windows: SHIFT+F10 для доступа к терминалу)
      • WinRE: Windows Recovery Environment
        (WinRE – это образ WinPE, содержащий дополнительные Дополнительные компоненты WinPE, важные для восстановления)

Создание образа

(соответствие cmdlet)
Укажите исключения или исключения, создав WimScript.ini файл конфигурации, при этом /ScratchDir требуется в WinPE, так как по умолчанию у него всего 32 МБ временного пространства:

  1. Либо Создать, либо Дополнить изображение:
    • Создать изображение:
      # Windows ≥8: DISM
        Dism /Capture-Image /ImageFile:"Z:\Base.wim" /CaptureDir:"C:" /Name:"Резервное копирование Windows" /Description:"Базовый образ 2022.01.30 @ 09:00" /Compress:Max /CheckIntegrity /Verify /ScratchDir:"Z:"
      
      # Windows XP ≤ 7: ImageX
        ImageX /Capture "C:" "Z:\Base.esd" "Резервное копирование Windows" "Базовый образ 2022.01.30 @ 09:00" /Compress:Recovery /Check /Verify /ScratchDir:"Z:\"
      
      • Измените /Compress:Max на /Compress:Fast, если не сохраняете захваченное изображение на SSD
      • Для ограничения по размеру /Split-Image разбивает изображения на несколько файлов только для чтения .swm
    • Дополнить изображение:
      # Windows ≥8: DISM
        Dism /Append-Image /ImageFile:"Z:\Base.wim" /CaptureDir:"C:" /Name:"Резервное копирование Windows" /Description:"Базовый образ 2022.01.30 @ 09:00" /CheckIntegrity /Verify /ScratchDir:"Z:"
      
      # Windows XP ≤ 7: ImageX
        ImageX /Append "C:" "Z:\Base.esd" "Резервное копирование Windows" "Базовый образ 2022.01.30 @ 09:00" /Compress:Recovery /Check /Verify /ScratchDir:"Z:\"
      
      • Сжатие заблокировано на значении, установленном при захвате базового изображения
      • Индексы могут быть удалены [/Delete-Image] или экспортированы [/Export-Image] в собственное изображение
  2. Применить изображение:
    # Windows ≥8: DISM
      Dism /Apply-Image /ImageFile:"Z:\Base.wim" /Index:1 /ApplyDir:"C:" /CheckIntegrity /Verify /ScratchDir:"Z:"
    
    # Windows XP ≤ 7: ImageX
      ImageX /Apply "Z:\Base.wim" 1 "C:" /Check /Verify /ScratchDir:"Z:\"
    
    • Перед применением /Get-ImageInfo для проверки, что применяется правильный индекс [образ]:
      Dism /Get-ImageInfo /ImageFile:"Z:\Base.wim"
      
    • Если применяется образ ОС, следующее должно быть выполнено перед выходом из WinPE/WinRE:
      • BIOS:
        BootRec /FixMBR && BootRec /FixBoot && BootRec /RebuildBCD
        
      • UEFI:
        ::# С существующим загрузочным EFI-разделом:
            BootRec /FixMBR && BootRec /RebuildBCD
        
        
        ::# Без существующего загрузочного EFI-раздела:
            ::# Смонтировать EFI-раздел на Y:
                DiskPart → lis vol → sel vol # → assign letter=Y → exit
        
            ::# Создать EFI-структуры и войти:
                MkDir "Y:\EFI\Microsoft\Boot"
                Cd /d "Y:\EFI\Microsoft\Boot"
        
            ::# Создать структуру загрузки EFI:
                BootRec /Fixboot
        
                ::# Если возникает ошибка "Доступ запрещен" (C: - применяется изображение):
                    BcdBoot C:\Windows /s C: /f UEFI
        
            ::# Устранение любых других проблем с загрузкой:
                BootRec /FixMBR && BootRec /RebuildBCD
        
            ::# Отмонтировать EFI-раздел:
                DiskPart → sel vol Y → remove → exit
        


Доступ к данным в ESD/WIM:

  1. Только для чтения:

    1. Смонтировать изображение: (как /ReadOnly)
      # Windows ≥8: DISM
        Dism /Mount-Image /ImageFile:"Z:\Base.wim" /Index:2 /MountDir:"C:\Mount" /Optimize /CheckIntegrity /ReadOnly
      
      # Windows XP ≤ 7: ImageX
        ImageX /Mount "Z:\Base.wim" 2 "C:\Mount" /Check
      
      • Вместо этого я предпочитаю открывать .wim/.esd в графическом интерфейсе 7zip
    2. Отмонтировать изображение: (/discard изменения)
      # Windows ≥8: DISM
        Dism /Unmount-Image /MountDir:"C:\Mount" /CheckIntegrity /Discard
      
      # Windows XP ≤ 7: ImageX
        ImageX /Unmount "C:\Mount"
      

  2. Внести изменения или добавить данные в изображение [индекс]:

    1. Смонтировать изображение:
      # Windows ≥8: DISM
        Dism /Mount-Image /ImageFile:"Z:\Base.wim" /Index:2 /MountDir:"C:\Mount" /Optimize /CheckIntegrity
      
      # Windows XP ≤ 7: ImageX
        ImageX /MountRW "Z:\Base.wim" 2 "C:\Mount" /Check
      
    2. Отмонтировать изображение: (/Commit изменения)
      # Windows ≥8: DISM
        Dism /Unmount-Image /MountDir:"C:\Mount" /CheckIntegrity /Commit
      
      # Windows XP ≤ 7: ImageX
        ImageX /Unmount "C:\Mount" /Commit
      
      • Сохраните изменения как новое добавленное изображение, добавив /Append

Ответ или решение

Использование RoboCopy для копирования данных с диска Windows, особенно когда речь идет о файлах, хранящихся в облачных сервисах, таких как OneDrive, Google Drive или iCloud, может вызвать ряд проблем. Эти проблемы возникают, в частности, из-за функции "Файлы по запросу" (Files On-Demand), реализованной в OneDrive. Давайте рассмотрим проблему и ее возможные решения более подробно.

Проблема с файлами облачного хранилища

При использовании RoboCopy, даже если вы добавляете параметр /XA:O, который предназначен для исключения файлов с атрибутом "Online-only", RoboCopy может по-прежнему пытаться копировать файлы, что приводит к сбоям. Эти файлы фактически представляют собой "заглушки" (stub), которые ссылаются на данные в облаке и в файловом проводнике показывают корректный размер, но не занимают места на диске.

Согласно команде ATTRIB /?, новые атрибуты файлов, используемые OneDrive, включают:

  • +p: Файл доступен локально (Pinned)
  • -p: Файл стал доступен на локальном диске (Locally Available)
  • +u: Файл только в облаке, недоступный локально (Online-only)

К сожалению, RoboCopy не обновлен для распознавания этих атрибутов, поэтому вы не сможете явно исключить файлы с помощью RoboCopy.

Возможные решения

  1. Исключение папок: Наиболее очевидное, но неэффективное решение — исключить целые папки с помощью параметра /XD. Например, вы можете использовать XD:%UserProfile%\OneDrive, чтобы исключить все файлы из OneDrive. Однако, как вы отметили, из-за разнообразия приложений может потребоваться исключить несколько папок, что не всегда удобно.

  2. Удаление клиентских программ перед резервным копированием: Если вам нужно часто выполнять резервное копирование, рассмотрите возможность создания скрипта, который будет автоматизировать процесс. Вы можете временно удалять клиентские приложения синхронизации (OneDrive, Google Drive и iCloud) перед запуском операции копирования. После завершения резервного копирования вы можете установить их снова. Это позволит избежать проблем с "заглушками".

  3. Использование образов WIM или ESD: Вместо использования RoboCopy, рассмотрите возможность использования утилиты DISMдля создания образов файловой системы (например, WIM или ESD). Эти форматы имиджей используют компрессию, что делает их более эффективными для резервного копирования:

    • Команда для создания образа:
      DISM /Capture-Image /ImageFile:"D:\Backup.wim" /CaptureDir:"C:" /Name:"System Backup"
    • Это образ будет содержать только файлы, которые действительно находятся на диске, исключая файлы на запрос, так как они не будут представлены в локальной файловой системе.

Заключение

Работа с облачными файлами и альтернативными устройствами резервного копирования требует осознания особенностей этих файлов. Если вам необходимо регулярно выполнять резервное копирование данных с использованием RoboCopy, подумайте о более надежных и адаптированных методах, таких как использование утилиты DISM для создания образов системы. Это обеспечит более высокую производительность и меньшее количество ошибок в процессе резервного копирования.

Оцените материал
Добавить комментарий

Капча загружается...