DFS Replication и «временные» файлы

    Всем привет!
    Это моя первая публикация, надеюсь, что в дальнейшем буду писать часто.
    Если что-то неправильно оформил, поправьте, я исправлю как надо.

    В работе пришлось столкнуться с интересной особенностью работы DFS Replication. И хотя сам рассматриваемый вопрос не нов, набить на нем шишки могут многие.

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

    Для примера я сделал тестовую среду, в которой всего два сервера — LAB-DC1 и LAB-FS1. На каждом из них есть папка C:\DFSR, между которыми и должна проходить репликация.

    Копируем в эту папку на LAB-DC1 два тестовых файла и видим, что на второй сервер отреплицировался только один.

    image

    Почему?


    Потому что механизм DFS Replication устроен так, что by design не копирует файлы, у которых установлен атрибут Temporary. Воспользуемся командой fsutil и посмотрим, какие атрибуты имеют оба наших файла.

    Файл not-a-temporary-file.txt имеет атрибуты 0x20:


    Файл temporary-file.txt имеет атрибуты 0x120:


    Раскодировать эти шестнадцатеричные числа очень просто. Каждый возможный атрибут файла имеет свое шестнадцатеричное значение. Вот все возможные варианты:
    READONLY 0x1
    HIDDEN 0x2
    SYSTEM 0x4
    DIRECTORY 0x10
    ARCHIVE 0x20
    DEVICE 0x40
    NORMAL 0x80
    TEMPORARY 0x100
    SPARSE_FILE 0x200
    REPARSE_POINT 0x400
    COMPRESSED 0x800
    OFFLINE 0x1000
    NOT_CONTENT_INDEXED 0x2000
    ENCRYPTED 0x4000

    Из этого списка видно, что not-a-temporary-file.txt имеет только атрибут «Archive», а temporary-file.txt — атрибуты «Archive» и «Temporary».
    И все файлы, для которых задано «Temporary», не будут реплицироваться с помощью механизма DFS Replication.

    Снять данный атрибут со всех вложенных файлов и папок очень просто с помощью маленького PowerShell-скрипта:
    Get-ChildItem C:\DFSR -recurse | ForEach-Object -process {if (($_.attributes -band 0x100) -eq 0x100) {$_.attributes = ($_.attributes -band 0xFEFF)}}


    Снимаем атрибут и вуаля! Наш «проблемный» файл temporary-file.txt успешно скопировался на удаленный сервер:


    Откуда в сети берутся «временные» файлы — история умалчивает. У меня откуда-то появились. Для того, чтобы поэкспериментировать, можно установить для файла атрибут «Temporary» руками. Для этого тоже можно воспользоваться простым PowerShell-скриптом:
    $file = Get-Item C:\DFSR\temporary-file.txt
    $file.Attributes = 0x120


    На этом все, надеюсь, что данная статья поможет кому-то еще в решении проблем, связанных с работой DFS Replication.

    Напоследок хочется сказать спасибо Крэгу Лэндису, который в далеком 2008-м году опубликовал у себя в блоге исчерпывающую статью на эту тему.
    • +13
    • 18,4k
    • 4
    Поделиться публикацией

    Комментарии 4

      0
      Шаман!
        0
        Возможно этот атрибут у кого-то стоит на папке и портит все файлы внутри?
          0
          Возможно.
          Но в моем случае эти файлы были неравномерно распределены по множеству подпапок.
            0
            Вообще, конечно поражает то, как много бывает вещей, о которых даже не подозреваешь, что не знаешь.
            Вот я знал о 4х атрибутах:
            — скрытый
            — системный
            — архивный
            — рид-онли

            ок, я знал, что в hex-редакторе можно присваивать атрибут «папка», хотя не думал, что это такой же атрибут, как и первые 4.
            А вот что есть ещё какие-то… да ещё такая куча…

            спасибо за информацию *)

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое