Назад | Перейти на главную страницу

Какие атрибуты / дескрипторы изменяются при жесткой привязке файла в Windows?

Я работаю над небольшим скриптом резервного копирования, используя robocopy и жесткие ссылки. Моя цель - создать дифференциальные резервные копии, используя ту же концепцию, что и rsync. --link-dest без необходимости прибегать к сторонним инструментам. Для тех, кто не знаком, концепция заключается в том, что первая резервная копия считается полной, а последующие резервные копии ссылка на сайт неизмененные файлы из предыдущей резервной копии с использованием жестких ссылок и копирование только тех файлов, которые были изменены, оставляя вам несколько каталогов для полных резервных копий на определенный момент времени, занимая при этом гораздо меньше дискового пространства (из-за жестких ссылок), чем при полных резервных копиях.

Моя проблема в том, что всякий раз, когда я жестко привязываю файл, robocopy сообщает о жестко привязанном файле как модифицированный, хотя, видимо, я его никак не менял. Сначала я подозревал, что время доступа могло измениться, но это не тот случай, поскольку файл сообщается как измененный только тогда, когда я пытаюсь скопировать ACL или информацию о владельце (/COPY:S или /COPY:O).

Вот как я пытаюсь это сделать:

  1. Имейте исходную структуру каталогов, которую вы хотите скопировать

    mkdir C:\BackupSource
    type nul > C:\BackupSource\myfile.txt
    
  2. Иметь целевой корневой каталог для резервного копирования

    mkdir C:\BackupTarget
    
  3. Запустить первую полную резервную копию
    Я использую в скрипте больше флагов, но их достаточно, чтобы вызвать поведение.

    robocopy C:\BackupSource C:\BackupTarget\1 /MIR /COPY:DATSO
    
  4. Убедитесь, что файлы обновлены
    (не является частью сценария, просто ради вопроса)

    robocopy C:\BackupSource C:\BackupTarget\1 /MIR /COPY:DATSO /L
    

    Это говорит мне, что файл был пропущен, что имеет смысл, потому что на данный момент он не был изменен.

  5. Создайте структуру каталогов для последующего резервного копирования
    Это создаст пустую структуру каталогов, идентичную предыдущей резервной копии. Я просматриваю предыдущую резервную копию и создаю жесткие ссылки на следующем шаге.

    robocopy C:\BackupTarget\1 C:\BackupTarget\2 /MIR /CREATE /DCOPY:DAT /XF *
    
  6. Жестко связать файлы
    Эта часть, очевидно, немного сложнее в сценарии, поскольку она спускается в подкаталоги, но для цели вопроса достаточно одного файла.

    mklink /H C:\BackupTarget\2\myfile.txt C:\BackupTarget\1\myfile.txt
    

Теперь, на данный момент, я думаю, что не внес никаких изменений в файлы ни в одном из каталогов. Документация для CreateHardLinkW функция (который я действительно используя в сценарии) говорит

Дескриптор безопасности принадлежит файлу, на который указывает жесткая ссылка ...
Вы не можете назначить файлу разные дескрипторы безопасности для каждой жесткой ссылки ...
Эта функция не изменяет дескриптор безопасности файла, который нужно связать с ...

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

robocopy C:\BackupSource C:\BackupTarget\1 /MIR /COPY:DATSO /L
robocopy C:\BackupSource C:\BackupTarget\2 /MIR /COPY:DATSO /L

Я проверил стандартные атрибуты, время создания / изменения / доступа, списки управления доступом и владельца, и они совпадают. Если я использую только /COPY:DAT (что по умолчанию), robocopy сообщает мне, что никаких модификаций не было, что наводит меня на мысль, что жесткие ссылки делает измените что-нибудь в дескрипторах безопасности.

Когда я запускаю команду для последующего резервного копирования, как обычно

robocopy C:\BackupSource C:\BackupTarget\2 /MIR /COPY:DATSO

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

fsutil hardlink list C:\BackupTarget\2\myfile.txt

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

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