Копіювання великих файлів по мережі за допомогою BITS і PowerShell

У локальних (та й світових) мережах файли між системами зазвичай передаються за допомогою протоколів SMB, FTP або HTTP. Проблема всіх цих протоколів - складності з докачкой великих файлів, які можуть посилюватися проблемами передачі даних по повільному або нестабільному каналу. При копіюванні файлів за цими протоколами зазвичай задіюється вся доступна пропускна здатність каналу зв'язку між сервером і одержувачем, що може негативно позначитися на продуктивності мережі і роботі інших додатки (не завжди можливо налаштувати коректні політики QoS на рівні мережного обладнання). У цій статті ми розглянемо можливість використання протоколу BITS і командлетів PowerShell для копіювання великих файлів через мережу по нестабільного або повільному каналу.

зміст:

  • протокол BITS
  • BITS: вимоги до ОС і версії PowerShell
  • Як завантажити файл по протоколу BITS за допомогою PowerShell
  • Синхронна передача файлів між комп'ютерами за допомогою BITS
  • Використовуємо BITS для асинхронного копіювання великих файлів по мережі
  • Копіювання всього вмісту загальної мережевої папки через BITS
  • Завантаження файлу на HTTP сервер за допомогою PowerShell і BITS

протокол BITS

BITS або Background Intelligent Transfer service - (Фонового служба передачі) - це служба Windows, яка використовується для передачі файлів між системами. За допомогою протоколу BITS можна передавати як завантажувати, так і закачувати файли. Саме з цього протоколу комп'ютери скачують файли з серверів при виконанні автоматичного оновлення Windows (в т.ч. при скачуванні оновлень зі WSUS сервера), при отриманні програм з SCCM точок розповсюдження і т.д.

Переваги протоколу BITS:

  • BITS - інтелектуальний протокол, який при роботі здатний регулювати використовувану смугу каналу зв'язку, щоб не впливати на інші мережеві додатки і сервіси. BITS може використовувати тільки незайняту смугу пропускання каналу і динамічно змінювати швидкість передачі даних в процесі роботи (якщо інші додатки збільшать навантаження на мережу, BITS може зменшити швидкість передачі даних по мережі);
  • Завантаження файлу може йти в фоновому режимі, непомітно для користувача;
  • Завдання BITS в режимі докачки буде автоматично продовжено навіть у разі втрати канали зв'язку між комп'ютером і клієнтом, або після перезавантаження комп'ютера;
  • У будь-який момент ви можете призупинити або відновити завантаження по BITS без втрати даних;На замітку. Можливість перезапустити процедуру копіювання файлів по мережі є також і в утиліті robocopy.exe, що дозволяє відновити закачку файлу в разі обриву з'єднання.
  • BITS дозволяє управляти пріоритетами завдань завантаження;
  • Передача файлів між комп'ютерами відбувається по портах 80 (HTTP) або 443 (HTTPS), тому вам не доведеться відкривати додаткових портів на міжмережевих екранах. Наприклад, 445 порту, по якому йде копіювання при використанні протоколу SMB (не забудьте, що в старих версіях протоколу SMB 1.0 багато вразливостей);
  • На стороні одержувача і сервера не обов'язково потрібна наявність розгорнутого IIS сервера.

Таким чином, BITS є оптимальним протоколом для передачі великих файлів по повільним і нестабільним мереж (супутниковий канал, GPRS з'єднання і т.д.).

BITS: вимоги до ОС і версії PowerShell

Протокол BITS вперше був представлений ще в Windows XP, для управління завданнями BITS в якій можна було використовувати утиліту bitsadmin.exe. Утиліта все ще підтримується, проте вважається застарілою. Для управління завданнями BITS переважно використовувати спеціальні командлети PowerShell.

Для роботи з даного сценарієм нам буде потрібно ОС не нижче Windows Vista або Windows Server 2008, і PowerShell не нижче версії 2.0. Сучасні версії Windows 10 і Windows Server 2016/2012 R2 протокол BITS повністю підтримують.

Порада. Можливо використовувати і Windows Server 2003. У цьому випадку доведеться встановити спеціальне оновлень KB 923845 і PowerShell V2.0.

Підтримка BITS потрібно як на стороні клієнта, так і сервера.

Як завантажити файл по протоколу BITS за допомогою PowerShell

Припустимо ви хочете завантажити великий ISO файл, що зберігається на HTTP сервері IIS (_http: //10.2.2.148/erd65_32.iso).

Передбачається, що до даного URL адресою дозволений анонімний доступ (надалі ми розглянемо доступ до URL адресою з аутентифікацією).

В першу чергу завантажте в сесію PowerShell модуль підтримки BITS:

Import-Module BitsTransfer

Після завантаження модуля, ви можете вивести список всіх доступних команд модуля BitsTransfer:

get-command * -BITS *

Як ви бачите, є всього 8 командлетів:

  • Add-BitsFile
  • Complete-BitsTransfer
  • Get-BitsTransfer
  • Remove-BitsTransfer
  • Resume-BitsTransfer
  • Set-BitsTransfer
  • Start-BitsTransfer
  • Suspend-BitsTransfer

Синхронна передача файлів між комп'ютерами за допомогою BITS

Командлет Start-BitsTransfer дозволяє викачувати файли по HTTP (s) (як і комадндет Invoke-WebRequest), так і з загальних мережевих папок (по SMB). Щоб завантажити файл з зазначеного URL адреси за протоколом BITS і зберегти його в локальний каталог C: \ Temp, скористайтеся командою:

Start-BitsTransfer -source _http: //10.2.2.148/erd65_32.iso -destination c: \ temp

Повідомлення This is a file transfer that uses the Background Intelligent Transfer service (BITS) говорить про те, що розпочато скачування зазначеного файлу по протоколу BITS.

В даному прикладі командлет виконує завантаження файлу в синхронному режимі. Закачування файлу нагадує звичайну процедуру копіювання через провідник або за допомогою PoSh командлет Copy-Item. При це на екран виводиться прогрес бар, що відображає статус виконання закачування. При перезавантаженні комп'ютера, закачування відновлені не буде (вам заново завантажувати весь файл).

Використовуємо BITS для асинхронного копіювання великих файлів по мережі

Процес завантаження файлів через BITS можна запустити і в асинхронному режимі, для цього до розглянутої вище команді потрібно додати параметр -asynchronous. У цьому режимі, якщо щось трапиться в процесі завантаження файлу (перезавантаження сервера, клієнта, обрив каналу зв'язку та ін.), Завдання автоматично продовжиться після відновлення доступності джерела і завантаження файлу продовжиться з моменту переривання зв'язку.

Start-BitsTransfer -source _http: //10.2.2.148/erd65_32.iso -destination c: \ temp -asynchronous

важливо. За замовчуванням Start-BitsTransfer працює з пріоритетом Foreground (найвищий з можливих). Передбачається, що завантаження файлу, запущена в цьому режимі буде змагатися з іншими процесами за смугу пропускання каналу. Щоб уникнути цього, потрібно явно вказати в якості аргументу команди будь-який інший пріоритет, наприклад, -Priority low:

Start-BitsTransfer -source _http: //10.2.2.148/erd65_32.iso -destination c: \ temp -asynchronous -Priority low

Асинхронне завдання BITS виконується в фоновому режимі, а на екран не виводиться процес виконання команди завантаження файлу. Статус завдання BITS можна отримати з консолі PowerShell за допомогою команди Get-BitsTransfer:

Get-BitsTransfer | fl

Команда повертає статус передачі (в даному випадку видно, що передача закінчена -Transferred), інформацію про кількість переданих байт, загальний розмір файлу, часу створення і завершення завдання BITS.

Ви можете переглянути статус усіх завдань BITS, запущених на комп'ютері, в табличній формі:

Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize

При використанні асинхронного режиму передачі, в цільовому каталозі створюється тимчасовий файл з розширенням TMP (за замовчуванням прихований в провіднику). Щоб конвертувати його в вихідний тип файлу (який зберігається на сервері-джерелі), потрібно виконати команду Complete-BitsTransfer:

Get-BitsTransfer | Complete-BitsTransfer

Завдання завантаження BITS після цього вважається завершеним і пропадає зі списку завдань.

Ви можете завантажити локальний файл в загальну мережеву папку на віддаленому сервері. Для цього використовується наступна команда (для зручності можна вказати ім'я завдання копіювання):

Start-BitsTransfer -Source C: \ iso \ w101809.iso -Destination \\ ekt-fs1 \ iso -Asynchronous -DisplayName CopyISOtoEKT

Щоб тимчасово призупинити завдання BITS, виконайте:

Get-BitsTransfer -Name CopyISOtoEKT | Suspend-BitsTransfer

Для продовження завдання використовується командлет Resume-BitsTransfer:

Get-BitsTransfer -Name CopyISOtoEKT | Resume-BitsTransfer -Asynchronous

Ви можете додати в завдання BITS додаткові файли за допомогою командлета Add-BitsFile:

Get-BitsTransfer -Name CopyISOtoEKT | Add-BitsFile -Source C: \ iso \ w10msu \ * -Destination \\ ekt-fs1 \ iso -Asynchronous

Щоб видалити всі завдання завантаження BITS на комп'ютері (в тому числі запущені іншими користувачами), виконайте команду:

Get-BitsTransfer -Allusers | Remove-BitsTransfer

Ви не зможете скасувати завдання BITS, запущені з-під System (помилка 0x80070005 Unable to cancel job). Для скасування такого завдання потрібно виконати команду Remove-BitsTransfer з-під SYSTEM.

Якщо сервер, на якому зберігається файл, вимагає аутентифікації користувача, ви можете викликати вікно, в якому потрібно вказані облікові дані для доступу до ресурсу:

Start-BitsTransfer -source _http: //10.2.2.148/erd65_32.iso -destination c: \ temp -asynchronous -Priority low -Authentication NTLM -Credential Get-Credential

Щоб було зручніше відстежувати результати виконання завдання BITS, можна скористатися простим скриптом, який відстежує виконання завдання і раз на кілька секунд виводить відсоток виконання завантаження на екран. Після закінчення завантаження файлу, скрипт автоматично перетворює TMP файл у вихідний формат:

Import-Module BitsTransfer
$ Job = Start-BitsTransfer -Source _http: //10.2.2.148/erd65_32.iso -Destination c: \ temp -Asynchronous
while (($ job.JobState.ToString () -eq 'Transferring') -or ($ job.JobState.ToString () -eq 'Connecting'))

Write-host $ Job.JobState.ToString ()
$ Pro = ($ job.BytesTransferred / $ job.BytesTotal) * 100
Write-Host $ Pro "%"
Sleep 3

Complete-BitsTransfer -BitsJob $ job

Копіювання всього вмісту загальної мережевої папки через BITS

Як ми вже говорили, для роботи BITS не потрібен Web сервер, це означає, що ви можемо скопіювати файли безпосередньо з інших Windows-комп'ютерів або загальних мережевих папок:

Start-BitsTransfer -Source \\ msk-rep01 \ os \ rhel-server-7.0-x86_64-dvd.iso -Destination c: \ temp -Asynchronous

Командлети модуля BitsTransfer не вміють рекурсивно копіювати всі файли і папки з певної директорії, або файли, які використовуються іншими програмами. Щоб з вказаною мережевий папки скопіювати всі файли з підкаталогами, скористаємося такою функцією (можна попередньо перевірити, чи існує цільової каталог і створити його):

Import-Module BitsTransfer
$ Source = "\\ msk-rep01 \ os \"
$ Destination = "c: \ tmp \"
if (-Not (Test-Path $ Destination))

$ Null = New-Item -Path $ Destination -ItemType Directory

$ Folders = Get-ChildItem -Name -Path $ source -Directory -Recurse
$ Job = Start-BitsTransfer -Source $ Source \ *. * -Destination $ Destination -asynchronous -Priority low
while (($ job.JobState.ToString () -eq 'Transferring') -or ($ job.JobState.ToString () -eq 'Connecting'))

Sleep 3

Complete-BitsTransfer -BitsJob $ job
foreach ($ i in $ folders)

$ Exists = Test-Path $ Destination \ $ i
if ($ exists -eq $ false) New-Item $ Destination \ $ i -ItemType Directory
$ Job = Start-BitsTransfer -Source $ Source \ $ i \ *. * -Destination $ Destination \ $ i -asynchronous -Priority low
while (($ job.JobState.ToString () -eq 'Transferring') -or ($ job.JobState.ToString () -eq 'Connecting'))

Sleep 3

Complete-BitsTransfer -BitsJob $ job


Завантаження файлу на HTTP сервер за допомогою PowerShell і BITS

За допомогою BITS ви можете не тільки завантажити файл з HTTP сервера, але і завантажити його на віддалений веб сервер. Для цього на стороні одержувача повинен бути встановлений веб сервер IIS з встановленим компонентом Bits Server Extension. В налаштуваннях віртуального каталогу IIS в секції Bits Uploads потрібно включити опцію "Allow clients to uploads files".

Якщо ви використовуєте анонімну авторизацію, Вам потрібно включити анонімним користувачам запис в каталог на рівні NTFS. Якщо завантаження файлів виконується під авторизованими користувачами, їм необхідно надати RW дозволу на папку завантаження.

Щоб завантажити файл на HTTP сервер за допомогою протоколу BITS, виконайте команду:

Start-bits -source c: \ iso \ win2016.iso -destination http://10.10.1.200/MEDVImages/win2016.iso -Transfertype Upload

Зверніть увагу, що за замовчуванням IIS дозволяє завантажувати файли до 30 Мб. Щоб дозволити завантажувати великі файли, потрібно в файлі web.config змінити значення в параметрі maxAllowContentLength.

Таким чином, використання можливостей BITS є відмінною альтернативу традиційному копіювання файлів по мережі по протоколу SMB. На відміну від останнього, завдання копіювання файлів BITS виконується незважаючи на розриви зв'язку і перезавантаження комп'ютерів, і не так завантажує канал зв'язку, не заважаючи роботі інших мережевих додатків і користувачів. Протокол BITS може бути оптимальним рішенням для передачі по WAN мережі великих файлів ISO образів і файлів віртуальних машин (vmdk, vhdx).