Copia de archivos grandes a través de una red poco confiable usando BITS y PowerShell
Por regla general, en las redes locales y globales, los archivos se transfieren entre dispositivos utilizando los protocolos SMB, FTP o HTTP. El problema de todos estos protocolos son algunos problemas para reanudar la descarga de archivos grandes, lo que puede empeorar aún más si la red es lenta o poco confiable. Además, al copiar archivos utilizando estos protocolos, se utiliza todo el ancho de banda disponible entre un servidor y un destinatario, lo que puede afectar negativamente el rendimiento de la red y el funcionamiento de otras aplicaciones de red (no siempre es posible configurar políticas QoS correctas en el equipo de red). En este artículo, consideraremos cómo usar el protocolo BITS y PowerShell para copiar archivos grandes en una red lenta o inestable.
Protocolo BITS
BITS (servicio de transferencia inteligente en segundo plano) es un servicio de Windows que se utiliza para transferir archivos entre los sistemas. Puede descargar y cargar archivos utilizando el protocolo BITS. Las computadoras utilizan este protocolo cuando reciben archivos de servidores cuando realizan actualizaciones automáticas de Windows (incluido el caso cuando descargan actualizaciones de un servidor WSUS), cuando reciben programas de puntos de distribución SCCM, etc.
Ventajas del Protocolo BITS:
BITS es el protocolo inteligente que puede controlar el ancho de banda utilizado del canal de comunicación y no afectar el funcionamiento de otras aplicaciones y servicios de red. BITS puede usar solo el ancho de banda libre (no asignado) y cambiar dinámicamente la tasa de datos durante la transferencia (si otras aplicaciones aumentan el uso de la red, el cliente BITS puede reducir la tasa de transferencia de datos a través de la red);
La descarga de archivos puede continuar en el modo de fondo transparente para el usuario;
-
El trabajo de BITS en el modo de reanudación continuará automáticamente incluso si el canal de comunicación entre la computadora y el cliente está interrumpido o después de reiniciar la computadora;
Puede pausar o reanudar la descarga por BITS sin perder datos;
Nota. La capacidad de reanudar la copia de archivos a través de la red también está disponible en la utilidad robocopy.exe, que le permite reanudar la descarga del archivo si se pierde la conexión.
BITS le permite administrar las prioridades de los trabajos de descarga;
La transferencia de archivos entre computadoras ocurre en los puertos 80 (HTTP) o 443 (HTTPS), por lo que no tendrá que abrir puertos adicionales en los firewalls. Por ejemplo, el puerto 445, que se usa al copiar archivos a través del protocolo SMB (no olvide que existen muchas vulnerabilidades en la versión anterior del protocolo SMB 1.0);
No se requiere necesariamente un servidor IIS implementado en el lado del servidor y del destinatario de BITS.
Por lo tanto, BITS es el protocolo preferible para transferir archivos grandes a través de redes lentas e inestables (canal satelital, conexión GPRS, etc.).
BITS: Requisitos de la versión de SO y PowerShell
El protocolo BITS apareció en Windows XP, en el que la utilidad bitsadmin.exe podía usarse para administrar las tareas de BITS. La utilidad aún se admite, pero está obsoleta. Para administrar trabajos BITS, es preferible usar cmdlets especiales de PowerShell.
Para trabajar en este escenario, necesita un sistema operativo no inferior a Windows Vista o Windows Server 2008 y PowerShell 2.0 o posterior. Las versiones modernas de Windows 10 y Windows Server 2016/2012 R2 son totalmente compatibles con BITS.
Consejo. También es posible utilizar Windows Server 2003. En este caso, deberá instalar la actualización KB 923845 y PowerShell 2.0.
Se requiere compatibilidad con BITS tanto del lado del cliente como del servidor.
¿Cómo descargar un archivo a través del protocolo BITS usando PowerShell?
Suponga que desea descargar un archivo ISO grande almacenado en el servidor HTTP de IIS (http://10.1.1.18/erd65_32.iso). Se supone que se permite el acceso anónimo a esta URL (más adelante consideraremos el acceso a la URL con autenticación).
En primer lugar, importe el módulo BITS en su sesión de PowerShell:
Import-Module BitsTransferDespués de importar el módulo, la lista de todos los comandos disponibles se puede mostrar de la siguiente manera:
get-command *-BITS*Como puede ver, hay 8 cmdlets disponibles:
- Add-BitsFile
- Complete-BitsTransfer
- Get-BitsTransfer
- Remove-BitsTransfer
- Resume-BitsTransfer
- Set-BitsTransfer
- Start-BitsTransfer
- Suspend-BitsTransfer
Transferencia síncrona de archivos entre computadoras usando BITS
El cmdlet Start-BitsTransfer le permite descargar archivos a través de HTTP(s) (como el cmdlet Invoke-WebRequest), así como desde carpetas compartidas en la red (a través de SMB). Para descargar un archivo desde la URL especificada usando el protocolo BITS y guardarlo en el directorio local C:\Temp, use el comando:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\tempEl mensaje "Esta es una transferencia de archivo que usa el servicio de transferencia inteligente en segundo plano (BITS)" significa que el archivo especificado se está descargando usando BITS.
En este caso, el cmdlet ha iniciado la descarga del archivo ISO en modo síncrono. La descarga es similar a un proceso habitual de copia de archivos a través del Explorador de archivos o utilizando el cmdlet Copy-Item. Se muestra una barra de progreso en la pantalla, que muestra el estado de la descarga. Si se reinicia una computadora, la descarga no se reanudará (deberá descargar el archivo completo nuevamente).
Transferencia de archivos grandes a través de la red con BITS en modo asíncrono
La descarga de BITS también se puede iniciar en el modo asíncrono. Para hacerlo, agregue el parámetro -asynchronous al comando que se muestra arriba. En este modo, si sucede algo (reinicio del servidor o del cliente, interrupción del canal de comunicación, etc.), el trabajo de BITS se reanudará automáticamente después de que se restablezca la fuente y la descarga del archivo continuará desde el momento en que se interrumpe la conexión:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronousImportante. De forma predeterminada, Start-BitsTransfer se ejecuta con prioridad de primer plano (la más alta posible). Se supone que la descarga iniciada en este modo competirá con otros procesos por el ancho de banda del canal. Para evitarlo, debe establecer explícitamente cualquier otra prioridad como argumento del comando, p. ej., -Prioridad baja:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous -Priority lowLa tarea BITS asíncrona se ejecuta en segundo plano y el proceso de descarga de archivos no se muestra en la pantalla. El estado del trabajo de BITS se puede obtener desde la consola de PowerShell mediante el comando Get-BitsTransfer:
Get-BitsTransfer | flEl comando devuelve el estado de la transferencia (en este caso, la transferencia ha terminado: Transferido), la información sobre la cantidad de bytes transferidos, el tamaño total del archivo, la hora en que se creó el archivo y la hora en que se completó la tarea.
Puede ver el estado de todas las tareas de BITS que se ejecutan en la computadora en forma de tabla:
Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSizeCuando se utiliza el modo de transferencia asincrónica, se crea un archivo temporal con extensión TMP (por defecto, está oculto en el Explorador de Windows). Para convertirlo en el archivo de origen (que se almacena en el servidor de origen), ejecute el comando Complete-BitsTransfer:
Get-BitsTransfer | Complete-BitsTransferLa tarea de descarga de BITS se considera completada y eliminada de la lista de trabajos.
Puede cargar un archivo local en una carpeta compartida de red en un servidor de archivos de Windows remoto. Para hacer esto, use el siguiente comando (para mayor comodidad, puede especificar el nombre del trabajo de copia):
Start-BitsTransfer -Source C:\iso\w10_1809.iso -Destination \\manch-fs1\iso -Asynchronous -DisplayName CopyISOtoManPara suspender temporalmente una tarea BITS, ejecute:
Get-BitsTransfer -Name CopyISOtoMan | Suspend-BitsTransferPara reanudar el trabajo de BITS, utilice el cmdlet Resume-BitsTransfer:
Get-BitsTransfer -Name CopyISOtoMan | Resume-BitsTransfer -AsynchronousPuede agregar archivos adicionales a la tarea BITS mediante el cmdlet Add-BitsFile:
Get-BitsTransfer -Name CopyISOtoMan | Add-BitsFile -Source C:\iso\w10msu\* -Destination \\manch-fs1\iso -AsynchronousPara eliminar todas las tareas de descarga de BITS en la computadora (incluidas las iniciadas por otros usuarios), ejecute el siguiente comando:
Get-BitsTransfer -Allusers|Remove-BitsTransferNo puede cancelar los trabajos de BITS que se ejecutan en la cuenta del sistema (error 0x80070005 "No se puede cancelar el trabajo"). Para cancelar dicha tarea, debe ejecutar el comando Remove-BitsTransfer en SYSTEM.
Si el servidor, donde se almacena el archivo, requiere la autenticación del usuario, el siguiente comando permitirá mostrar una ventana para especificar las credenciales para acceder al recurso:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous -Priority low -Authentication NTLM -Credential Get-CredentialPara facilitar el seguimiento de los resultados de una tarea BITS, puede usar un script simple, que permite realizar un seguimiento del progreso de la tarea y una vez cada pocos segundos muestra el porcentaje de descarga en la pantalla. Una vez finalizada la descarga, el script convierte automáticamente el archivo TMP al formato de origen:
Import-Module BitsTransfer
$bitsjob = Start-BitsTransfer -Source http://10.1.1.18/erd65_32.iso -Destination c:\temp -Asynchronous
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Write-host $bitsjob.JobState.ToString()
$Proc = ($bitsjob.BytesTransferred / $bitsjob.BytesTotal) * 100
Write-Host $Proc “%”
Sleep 3
}
Complete-BitsTransfer -BitsJob $bitsjob¿Cómo copiar los contenidos del directorio usando BITS?
Como ya mencionamos, BITS no requiere un servidor web, y significa que podemos copiar archivos directamente desde otras computadoras con Windows o carpetas compartidas en red:
Start-BitsTransfer -Source \\lon-rep01\os\RHEL4.8-x86_64-AS-DVD.iso -Destination c:\temp -AsynchronousBitsTransfer no puede copiar recursivamente todos los archivos y carpetas de una carpeta específica o archivos utilizados por otros programas. Para copiar todos los archivos y subdirectorios de la carpeta compartida de red especificada, use este script (primero puede verificar si el directorio de destino existe y crearlo):
Import-Module BitsTransfer
$Source="\\lond-rep01\share\"
$Destination="c:\tmp\"
if ( -Not (Test-Path $Destination))
{
$null = New-Item -Path $Destination -ItemType Directory
}
$folders = Get-ChildItem -Name -Path $source -Directory -Recurse
$bitsjob = Start-BitsTransfer -Source $Source\*.* -Destination $Destination -asynchronous -Priority low
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Sleep 4
}
Complete-BitsTransfer -BitsJob $bitsjob
foreach ($i in $folders)
{
$exists = Test-Path $Destination\$i
if ($exists -eq $false) {New-Item $Destination\$i -ItemType Directory}
$bitsjob = Start-BitsTransfer -Source $Source\$i\*.* -Destination $Destination\$i -asynchronous -Priority low
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Sleep 4
}
Complete-BitsTransfer -BitsJob $bitsjob
}¿Cómo cargar un archivo en el servidor HTTP usando PowerShell y BITS?
Con BITS, no solo puede descargar un archivo de un servidor HTTP, sino también cargarlo en un servidor web remoto. Para hacer esto, el servidor web IIS con el componente Bits Server Extension debe estar instalado en el servidor de destino. En la configuración del directorio virtual de IIS en la sección Cargas de bits, debe habilitar la opción "Permitir que los clientes carguen archivos".
Si utiliza la autenticación anónima, debe permitir que los usuarios anónimos escriban en el directorio en el nivel de permisos NTFS. Si las cargas de archivos se realizan con usuarios autorizados, deben otorgar permisos RW a la carpeta de carga.
Para cargar un archivo a un servidor HTTP utilizando el protocolo BITS, ejecute el siguiente comando:
Start-bits -source c:\iso\winsrv2016.iso -destination http://10.1.1.18/MEDVImages/winsrv2016.iso -Transfertype UploadTenga en cuenta que, de forma predeterminada, IIS le permite cargar archivos de hasta 30 MB. Para permitir la carga de archivos grandes, debe cambiar el valor en el parámetro maxAllowContentLength en el archivo web.config.
Por lo tanto, el uso de las funciones de BITS es una excelente alternativa a la copia de archivos común a través de la red mediante el protocolo SMB. La tarea de transferencia de archivos BITS se realiza a pesar de las interrupciones de la conexión o los reinicios de la computadora, y no ocupa mucho el ancho de banda sin interferir con otras aplicaciones. El protocolo BITS puede ser la solución óptima para transferir imágenes ISO grandes y archivos de máquinas virtuales (vmdk, vhdx) a través de una red WAN.







