Копирование файлов по протоколу BITS с помощью Powershell

Как правило, в локальных (да и глобальных) сетях файлы между системами передаются с помощью протоколов SMB, FTP или HTTP. Проблема всех этих протоколов – сложности с докачкой больших файлов, которые могут усугубляться проблемами передачи данных по медленному или нестабильному каналу. Кроме того, при копировании файлов по этим протоколам обычно задействуется вся доступная пропускная способность канала связи между сервером и получателем, что может негативно сказаться на производительности сети и работе других приложения (не всегда возможно настроить корректные политики QoS). В этой статье рассмотрим возможность использования протокола BITS и PowerShell для копирования больших файлов по нестабильному или медленному каналу.

Протокол BITS

BITS или Background Intelligent Transfer service — (Фоновая интеллектуальная служба передачи) – это служба Windows, которая используется для передачи файлов между системами. Система обновлений Windows (в т.ч. WSUS сервера), SCCM точки распространения ПО – передают файлы на целевые компьютеры именно по этому протоколу.

С помощью протокола BITS можно передавать файлы между компьютерами (скачивать и закачивать файлы).

Преимущества использования протокола BITS :

  • BITS — интеллектуальный протокол, который при работе способен регулировать используемую полосу канала связи, чтобы не оказывать влияния на другие сетевые приложений. BITS может использовать только незанятую полосу пропускания канала и динамически изменять скорость передачи данных в процессе работы (если другие приложения увеличат утилизацию сети)
  • Загрузка файла может идти в фоновом режиме, незаметно для пользователя
  • Задание BITS в режиме докачки будет автоматически продолжено даже в случае разрывов связи или перезагрузок компьютера
  • На стороне получателя и сервера не обязательно требуется наличие развернутого IIS сервера

Таким образом, BITS является оптимальным протоколом для передачи больших файлов по медленным сетям.

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

Требования к ОС и версии Powershell

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

Для работы по рассматриваемому сценарию нам потребуется ОС не ниже Windows Vista или Windows Server 2008 и PowerShell не ниже версии 2.0.

Совет. Возможно использовать и Windows Server 2003. В этом случае придется установить специальное обновлений KB 923845 и PowerShell V2.0

Поддержка BITS требуется как на стороне клиента, так и сервера.

Как скачать файл по протоколу BITS при помощи Powershell

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

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

Import-Module BitsTransfer

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

get-command *-BITS*

Модуль Powershell BitsTransfer

Как мы видим, доступно всего 8 командлетов.

Синхронная передача файлов BITS

Чтобы скачать файл по протоколу BITS, воспользуемся командой:

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

Start-BitsTransfer - загрузка файла по протоколу BITS

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

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

Асинхронная передача файлов через BITS

Поток загрузки BITS можно запустить и в асинхронном режиме, для этого к рассмотренной выше команде нужно добавить параметр –asynchronous. В этом режиме, если что то случится (перезагрузка сервера, клиента, обрыв канала связи и пр.), задание автоматически продолжится и загрузка завершиться.

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

Загрузка файла по протоколу BITS в асинхронном режиме с докачкой

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

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

В этом случае на экран не отображается процесс выполнения команды передачи файла. Статус задания можно получить с помощью команды Get-BitsTransfer:

Get-BitsTransfer | fl

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

Просмотреть статус всех заданий BITS в табличной форме:

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

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

Get-BitsTransfer | Complete-BitsTransfer

Complete-BitsTransfer - завершить закачку

Задание закачки BITS после этого считается завершенным и пропадает из списка заданий.

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

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

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

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\"
$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
}

Скрипт копирования содержимого папки по BITS

Таким образом, использование возможностей BITS представляет собой отличную альтернативу традиционному копированию файлов по протоколу SMB. В отличии от последнего, задание BITS на передачу файлов выполняется несмотря на разрывы связи и перезагрузки компьютеров, и не так загружает канал связи, не мешая работе других приложений. BITS будет оптимальным решением при передачи больших файлов с образами систем (iso файлов) и копирования файлов виртуальных машин.


Предыдущая статья Следующая статья


Комментариев: 20 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)