Theo quy tắc, trong mạng cục bộ và toàn cầu, tệp được truyền giữa các thiết bị bằng giao thức SMB, FTP hoặc HTTP. Vấn đề của tất cả các giao thức này là một số rắc rối với việc tiếp tục tải xuống các tệp lớn, có thể trở nên tồi tệ hơn nếu mạng chậm hoặc không ổn định. Hơn nữa, khi sao chép tệp bằng các giao thức này, toàn bộ băng thông có sẵn giữa máy chủ và người nhận được sử dụng, điều này có thể ảnh hưởng tiêu cực đến hiệu suất mạng và hoạt động của các ứng dụng mạng khác (không phải lúc nào cũng có thể cấu hình chính sách QoS đúng trên thiết bị mạng). Trong bài viết này, chúng ta sẽ xem xét cách sử dụng giao thức BITS và PowerShell để sao chép tệp lớn qua mạng chậm hoặc không ổn định.
Giao thức BITS
BITS (Background Intelligent Transfer service) là một dịch vụ Windows được sử dụng để truyền tệp giữa các hệ thống. Bạn có thể tải xuống và tải lên tệp bằng giao thức BITS. Giao thức này được máy tính sử dụng khi nhận tệp từ máy chủ khi thực hiện cập nhật Windows tự động (bao gồm trường hợp tải xuống cập nhật từ máy chủ WSUS), khi nhận chương trình từ điểm phân phối SCCM, v.v.
Ưu điểm của giao thức BITS:
- BITS là giao thức thông minh có thể kiểm soát băng thông kênh truyền được sử dụng và không ảnh hưởng đến hoạt động của các ứng dụng và dịch vụ mạng khác. BITS chỉ có thể sử dụng băng thông rảnh (chưa được phân bổ) và thay đổi động tốc độ truyền dữ liệu trong quá trình truyền (nếu các ứng dụng khác tăng sử dụng mạng, client BITS có thể giảm tốc độ truyền dữ liệu qua mạng);
- Tải xuống tệp có thể tiến hành ở chế độ nền minh bạch với người dùng;
- Công việc BITS ở chế độ resume sẽ tự động tiếp tục ngay cả khi kênh truyền giữa máy tính và client bị ngắt, hoặc sau khi máy tính được khởi động lại;
- Bạn có thể tạm dừng hoặc tiếp tục tải xuống bằng BITS mà không mất dữ liệu; Lưu ý. Khả năng tiếp tục sao chép tệp qua mạng cũng có sẵn trong tiện ích robocopy.exe, cho phép bạn tiếp tục tải xuống tệp nếu kết nối bị mất.
- BITS cho phép bạn quản lý ưu tiên của các công việc tải xuống;
- Truyền tệp giữa các máy tính diễn ra trên cổng 80 (HTTP) hoặc 443 (HTTPS), vì vậy bạn sẽ không phải mở cổng bổ sung trên tường lửa. Ví dụ, cổng 445, được sử dụng khi sao chép tệp qua giao thức SMB (đừng quên rằng có nhiều lỗ hổng trong phiên bản cũ của giao thức SMB 1.0);
- Máy chủ IIS đã triển khai không nhất thiết cần thiết ở phía người nhận và máy chủ BITS.
Vì vậy, BITS là giao thức ưu tiên để truyền tệp lớn qua mạng chậm và không ổn định (kênh vệ tinh, kết nối GPRS, v.v.).
BITS: Yêu cầu phiên bản OS và PowerShell
Giao thức BITS xuất hiện trong Windows XP, trong đó tiện ích bitsadmin.exe có thể được sử dụng để quản lý tác vụ BITS. Tiện ích này vẫn được hỗ trợ, nhưng đã lỗi thời. Để quản lý công việc BITS, tốt hơn là sử dụng các cmdlet PowerShell đặc biệt.
Để làm việc theo kịch bản này, bạn cần OS không thấp hơn Windows Vista hoặc Windows Server 2008 và PowerShell 2.0 hoặc mới hơn. Các phiên bản hiện đại của Windows 10 và Windows Server 2016/2012 R2 hỗ trợ đầy đủ BITS.
Mẹo. Có thể sử dụng Windows Server 2003 cũng được. Trong trường hợp này, bạn sẽ phải cài đặt bản cập nhật KB 923845 và PowerShell 2.0.
Hỗ trợ BITS được yêu cầu ở cả phía client và máy chủ.
Cách tải xuống tệp qua giao thức BITS bằng PowerShell?
Giả sử bạn muốn tải xuống file ISO lớn được lưu trữ trên máy chủ HTTP IIS (https://10.1.1.18/erd65_32.iso). Giả định rằng truy cập ẩn danh được phép cho URL này (sau này chúng ta sẽ xem xét truy cập URL với xác thực).
Trước hết, nhập module BITS vào phiên PowerShell của bạn:
Import-Module BitsTransfer
Sau khi module được nhập, danh sách tất cả các lệnh có sẵn có thể được hiển thị như sau:
get-command *-BITS*
Như bạn thấy, có 8 cmdlet có sẵn:
- Add-BitsFile
- Complete-BitsTransfer
- Get-BitsTransfer
- Remove-BitsTransfer
- Resume-BitsTransfer
- Set-BitsTransfer
- Start-BitsTransfer
- Suspend-BitsTransfer
Chuyển tệp đồng bộ giữa máy tính bằng BITS
Cmdlet Start-BitsTransfer cho phép bạn tải xuống tệp qua HTTP(s) (giống như cmdlet Invoke-WebRequest) cũng như từ thư mục chia sẻ mạng (qua SMB). Để tải xuống tệp từ URL được chỉ định bằng giao thức BITS và lưu nó vào thư mục cục bộ C:\Temp, sử dụng lệnh:
Start-BitsTransfer –source https://10.1.1.18/erd65_32.iso -destination c:\temp
Thông báo “This is a file transfer that uses the Background Intelligent Transfer service (BITS)” có nghĩa là tệp được chỉ định đang được tải xuống bằng BITS.
Trong trường hợp này, cmdlet đã bắt đầu tải xuống file ISO ở chế độ đồng bộ. Tải xuống tương tự như quá trình sao chép tệp thông thường qua File Explorer hoặc sử dụng cmdlet Copy-Item. Thanh tiến trình được hiển thị trên màn hình, cho thấy trạng thái tải xuống. Nếu máy tính được khởi động lại, tải xuống sẽ không được tiếp tục (bạn sẽ cần tải xuống toàn bộ tệp lại).
Truyền tệp lớn qua mạng với BITS ở chế độ bất đồng bộ
Tải xuống BITS cũng có thể được bắt đầu ở chế độ bất đồng bộ. Để làm điều đó, thêm tham số –asynchronous vào lệnh hiển thị ở trên. Ở chế độ này, nếu có điều gì xảy ra (khởi động lại máy chủ hoặc client, ngắt kết nối kênh truyền, v.v.), công việc BITS sẽ tự động tiếp tục sau khi nguồn được khôi phục và tải xuống tệp sẽ tiếp tục từ lúc kết nối bị ngắt:
Start-BitsTransfer -source https://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous
Quan trọng. Mặc định, Start-BitsTransfer chạy với ưu tiên Foreground (cao nhất có thể). Giả định rằng tải xuống bắt đầu ở chế độ này sẽ cạnh tranh với các quy trình khác cho băng thông kênh. Để tránh điều đó, bạn phải đặt rõ ràng bất kỳ ưu tiên nào khác làm đối số của lệnh, ví dụ, -Priority low:
Start-BitsTransfer -source https://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous -Priority low
Nhiệm vụ BITS bất đồng bộ chạy trong nền, và quá trình tải xuống tệp không được hiển thị trên màn hình. Trạng thái của công việc BITS có thể được lấy từ console PowerShell bằng lệnh Get-BitsTransfer:
Get-BitsTransfer | fl
Lệnh trả về trạng thái truyền tải (trong trường hợp này truyền tải đã kết thúc: Transferred), thông tin về số byte đã truyền, tổng kích thước tệp, thời gian tạo tệp và thời gian hoàn thành tác vụ.
Bạn có thể xem trạng thái của tất cả các tác vụ BITS đang chạy trên máy tính dưới dạng bảng:
Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize
Khi sử dụng chế độ truyền tải bất đồng bộ, một tệp tạm thời với phần mở rộng TMP được tạo (mặc định, nó bị ẩn trong Windows Explorer). Để chuyển đổi nó thành tệp nguồn (được lưu trữ trên máy chủ nguồn), hãy chạy lệnh Complete-BitsTransfer:
Get-BitsTransfer | Complete-BitsTransfer
Nhiệm vụ tải xuống BITS sau đó được coi là hoàn thành và bị xóa khỏi danh sách công việc.
Bạn có thể tải lên tệp cục bộ vào thư mục chia sẻ mạng trên máy chủ file Windows từ xa. Để làm điều này, sử dụng lệnh sau (để tiện lợi, bạn có thể chỉ định tên công việc sao chép):
Start-BitsTransfer -Source C:\iso\w10_1809.iso -Destination \\manch-fs1\iso -Asynchronous -DisplayName CopyISOtoMan
Để tạm dừng tác vụ BITS, chạy:
Get-BitsTransfer -Name CopyISOtoMan | Suspend-BitsTransfer
Để tiếp tục công việc BITS, sử dụng cmdlet Resume-BitsTransfer:
Get-BitsTransfer -Name CopyISOtoMan | Resume-BitsTransfer -Asynchronous
Bạn có thể thêm tệp bổ sung vào tác vụ BITS bằng cmdlet Add-BitsFile:
Get-BitsTransfer -Name CopyISOtoMan | Add-BitsFile -Source C:\iso\w10msu\* -Destination \\manch-fs1\iso -Asynchronous
Để xóa tất cả tác vụ tải xuống BITS trên máy tính (bao gồm cả những tác vụ được bắt đầu bởi người dùng khác), chạy lệnh sau:
Get-BitsTransfer -Allusers|Remove-BitsTransfer
Bạn không thể hủy tác vụ BITS chạy dưới tài khoản System (lỗi 0x80070005 “Unable to cancel job”). Để hủy tác vụ như vậy, bạn cần thực thi lệnh Remove-BitsTransfer dưới SYSTEM.
Nếu máy chủ, nơi tệp được lưu trữ, yêu cầu xác thực người dùng, lệnh sau sẽ cho phép hiển thị cửa sổ để chỉ định thông tin xác thực để truy cập tài nguyên:
Start-BitsTransfer -source https://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous -Priority low -Authentication NTLM -Credential Get-Credential
Để dễ dàng theo dõi kết quả của tác vụ BITS, bạn có thể sử dụng một script đơn giản, cho phép theo dõi tiến độ tác vụ và mỗi vài giây hiển thị phần trăm tải xuống trên màn hình. Sau khi tải xuống kết thúc, script tự động chuyển đổi file TMP thành định dạng nguồn:
Import-Module BitsTransfer
$bitsjob = Start-BitsTransfer -Source https://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ách sao chép nội dung thư mục bằng BITS?
Như chúng ta đã đề cập, BITS không yêu cầu máy chủ Web, và điều đó có nghĩa là chúng ta có thể sao chép tệp trực tiếp từ các máy tính Windows khác hoặc thư mục chia sẻ mạng:
Start-BitsTransfer -Source \\lon-rep01\os\RHEL4.8-x86_64-AS-DVD.iso -Destination c:\temp -Asynchronous
BitsTransfer không thể sao chép đệ quy tất cả các tệp và thư mục từ một thư mục cụ thể hoặc tệp được sử dụng bởi các chương trình khác. Để sao chép tất cả các tệp và thư mục con từ thư mục chia sẻ mạng được chỉ định, hãy sử dụng script này (bạn có thể trước tiên kiểm tra xem thư mục đích có tồn tại không và tạo nó):
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ách tải tệp lên máy chủ HTTP bằng PowerShell và BITS?
Với BITS, bạn không chỉ có thể tải xuống tệp từ máy chủ HTTP, mà còn tải nó lên máy chủ web từ xa. Để làm điều này, máy chủ web IIS với thành phần Bits Server Extension phải được cài đặt trên máy chủ đích. Trong cài đặt thư mục ảo IIS trong phần Bits Uploads, bạn cần bật tùy chọn “Allow clients to upload files”.
Nếu bạn sử dụng xác thực ẩn danh, bạn phải cho phép người dùng ẩn danh ghi vào thư mục ở cấp độ quyền NTFS. Nếu tải lên tệp được thực hiện dưới người dùng được ủy quyền, họ cần cấp quyền RW cho thư mục tải lên.
Để tải tệp lên máy chủ HTTP bằng giao thức BITS, chạy lệnh sau:
Start-bits –source c:\iso\winsrv2016.iso -destination https://10.1.1.18/MEDVImages/winsrv2016.iso –Transfertype Upload
Lưu ý rằng theo mặc định IIS cho phép tải lên tệp lên đến 30 MB. Để cho phép tải lên tệp lớn, bạn cần thay đổi giá trị trong tham số maxAllowContentLength trong file web.config.
Vì vậy, sử dụng tính năng BITS là một giải pháp thay thế tuyệt vời cho việc sao chép tệp phổ biến qua mạng bằng giao thức SMB. Nhiệm vụ truyền tệp BITS được thực hiện bất chấp việc gián đoạn kết nối hoặc khởi động lại máy tính, và không chiếm dụng nhiều băng thông mà không can thiệp vào các ứng dụng khác. Giao thức BITS có thể là giải pháp tối ưu để truyền hình ảnh ISO lớn và tệp máy ảo (vmdk, vhdx) qua mạng WAN.