BITSとPowerShellを活用して低速・不安定なネットワーク経由で大容量ファイルを確実にコピーする方法
ローカルネットワークやインターネット上でファイルを転送する場合、一般的にはSMB、FTP、HTTPといったプロトコルが使用されます。しかし、これらのプロトコルには大きな課題があります。それは、大容量ファイルのダウンロード再開(レジューム)が苦手という点です。ネットワークが低速だったり不安定だったりすると、この問題はさらに深刻になります。
さらに、これらのプロトコルでファイルをコピーすると、サーバーと受信側の間で利用可能な帯域幅をすべて消費してしまうため、ネットワーク全体のパフォーマンスや他のアプリケーションの動作に悪影響を及ぼすことがあります。ネットワーク機器側で適切なQoSポリシーを設定できる環境ばかりではないのが実情です。
本記事では、BITSプロトコルとPowerShellを活用して、低速または不安定なネットワーク上でも大容量ファイルを効率的かつ確実に転送する方法を詳しく解説します。
BITSプロトコルとは
BITS(Background Intelligent Transfer Service:バックグラウンドインテリジェント転送サービス)は、Windowsに標準搭載されているシステム間ファイル転送用のサービスです。ダウンロードとアップロードの両方に対応しており、Windows Updateによる自動更新(WSUSサーバーからの更新プログラム取得を含む)や、SCCM配布ポイントからのプログラム受信など、さまざまな場面で利用されています。
BITSプロトコルの主なメリット
- 帯域幅のインテリジェントな制御:BITSは通信チャネルの使用帯域を自動的に管理し、他のネットワークアプリケーションやサービスの動作に影響を与えません。未使用(未割り当て)の帯域のみを利用し、転送中も動的にデータ速度を調整します。他のアプリケーションがネットワーク使用量を増やすと、BITSクライアントは転送速度を自動的に下げます。
- バックグラウンド転送:ユーザーに意識させることなく、透過的にバックグラウンドでファイルをダウンロードできます。
- 自動レジューム機能:通信が切断されたり、コンピューターが再起動されたりしても、BITSジョブは自動的に転送を再開します。
- 一時停止・再開が可能:データを失うことなくダウンロードの一時停止と再開ができます。
補足:ネットワーク経由のファイルコピーにおけるレジューム機能は、robocopy.exeユーティリティにも備わっています。 - 優先度の管理:ダウンロードジョブごとに優先度を設定できます。
- ファイアウォールに優しい:コンピューター間の転送にはポート80(HTTP)または443(HTTPS)を使用するため、追加ポートの開放が不要です。SMBプロトコル(ポート445)のように、古いSMB 1.0の脆弱性リスクを避けることもできます。
- IISサーバーは必須ではない:BITSの受信側・送信側ともにIISサーバーの構築は必須ではありません。
以上の特徴から、BITSは衛星回線やGPRS接続など、低速かつ不安定なネットワークでの大容量ファイル転送に最適なプロトコルといえます。
BITS利用に必要なOSとPowerShellのバージョン
BITSプロトコルはWindows XPで初めて登場し、当時はbitsadmin.exeユーティリティでBITSタスクを管理していました。このユーティリティは現在もサポートされていますが、非推奨(deprecated)となっているため、BITSジョブの管理には専用のPowerShellコマンドレットを使うことを推奨します。
本記事のシナリオを実行するには、以下の環境が必要です。
- Windows Vista / Windows Server 2008 以降のOS
- PowerShell 2.0 以降
最新のWindows 10およびWindows Server 2016/2012 R2では、BITSが完全にサポートされています。
ヒント: Windows Server 2003でも、KB923845更新プログラムとPowerShell 2.0をインストールすれば利用可能です。
なお、BITSのサポートはクライアント側とサーバー側の両方で必要となる点に注意してください。
PowerShellでBITSを使ってファイルをダウンロードする手順
ここでは、IIS HTTPサーバー上に保存された大容量ISOファイル(https://10.1.1.18/erd65_32.iso)をダウンロードする例を紹介します。まずは匿名アクセスが許可されているURLを想定し、後ほど認証が必要なケースも説明します。
まず、PowerShellセッションでBITSモジュールをインポートします。
Import-Module 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 https://10.1.1.18/erd65_32.iso -Destination c:\temp
「これはBackground Intelligent Transfer Service(BITS)を使用するファイル転送です」というメッセージが表示されれば、指定したファイルがBITS経由でダウンロードされていることを意味します。
この場合、コマンドレットは同期モードでISOファイルのダウンロードを開始します。エクスプローラーやCopy-Itemコマンドレットで通常のファイルコピーを行うのと似た挙動で、画面には進行状況バーが表示されます。ただし同期モードでは、コンピューターが再起動されるとダウンロードは再開されず、最初からやり直しになる点に注意しましょう。
非同期モードで大容量ファイルをネットワーク転送する
BITSのダウンロードは非同期モードでも開始できます。前述のコマンドに-Asynchronousパラメーターを追加するだけです。このモードでは、サーバーやクライアントの再起動、通信回線の切断など何らかの障害が発生しても、ソースが復旧した時点でBITSジョブが自動的に再開され、接続が切れた箇所からダウンロードが続行されます。
Start-BitsTransfer -Source https://10.1.1.18/erd65_32.iso -Destination c:\temp -Asynchronous
重要: デフォルトでは、Start-BitsTransferは最高位の「Foreground」優先度で実行されます。このモードで開始されたダウンロードは、他のプロセスと帯域幅を奪い合うことになります。これを避けるには、コマンドの引数として明示的に別の優先度を指定します。例えば-Priority lowのように指定します。
Start-BitsTransfer -Source https://10.1.1.18/erd65_32.iso -Destination c:\temp -Asynchronous -Priority low
非同期のBITSタスクはバックグラウンドで実行されるため、画面上にダウンロードの進行状況は表示されません。BITSジョブの状態は、PowerShellコンソールからGet-BitsTransferコマンドで確認できます。
Get-BitsTransfer | fl
このコマンドは、転送状態(この例では「Transferred」=完了)、転送済みバイト数、ファイルの合計サイズ、作成日時、完了日時などの情報を返します。
コンピューター上で実行中のすべてのBITSタスクの状態を表形式で確認することもできます。
Get-BitsTransfer | Select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize
非同期転送モードを使用すると、拡張子が.TMPの一時ファイルが作成されます(デフォルトではエクスプローラー上で非表示)。このTMPファイルを元のファイルに変換するには、Complete-BitsTransferコマンドを実行します。
Get-BitsTransfer | Complete-BitsTransfer
これによりBITSダウンロードタスクは完了とみなされ、ジョブ一覧から削除されます。
ジョブの一時停止・再開・追加・削除
ローカルファイルをリモートのWindowsファイルサーバー上の共有フォルダーへアップロードすることもできます。その際、ジョブ名を指定しておくと管理しやすくなります。
Start-BitsTransfer -Source C:\iso\w10_1809.iso -Destination \\manch-fs1\iso -Asynchronous -DisplayName CopyISOtoMan
BITSタスクを一時停止するには、次のコマンドを実行します。
Get-BitsTransfer -Name CopyISOtoMan | Suspend-BitsTransfer
一時停止したジョブを再開するには、Resume-BitsTransferコマンドレットを使用します。
Get-BitsTransfer -Name CopyISOtoMan | Resume-BitsTransfer -Asynchronous
Add-BitsFileコマンドレットを使えば、既存のBITSタスクにファイルを追加することもできます。
Get-BitsTransfer -Name CopyISOtoMan | Add-BitsFile -Source C:\iso\w10msu\* -Destination \\manch-fs1\iso -Asynchronous
コンピューター上のすべてのBITSダウンロードタスク(他のユーザーが開始したものを含む)を削除するには、次のコマンドを実行します。
Get-BitsTransfer -AllUsers | Remove-BitsTransfer
なお、Systemアカウントで実行中のBITSジョブはキャンセルできません(エラー0x80070005「ジョブを取り消せません」)。このようなタスクをキャンセルするには、SYSTEM権限でRemove-BitsTransferコマンドを実行する必要があります。
認証が必要なサーバーからダウンロードする
ファイルが保存されているサーバーがユーザー認証を要求する場合は、次のコマンドで資格情報を入力するウィンドウを表示させることができます。
Start-BitsTransfer -Source https://10.1.1.18/erd65_32.iso -Destination c:\temp -Asynchronous -Priority low -Authentication NTLM -Credential (Get-Credential)
進捗状況を表示するスクリプト
BITSタスクの結果を追跡しやすくするために、数秒ごとにダウンロードの進捗率(パーセンテージ)を画面に表示するシンプルなスクリプトを活用できます。ダウンロード完了後は、TMPファイルを自動的に元の形式に変換します。
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
BITSを使ってディレクトリの中身をコピーする方法
先に述べたように、BITSはWebサーバーを必須としないため、他のWindowsコンピューターやネットワーク共有フォルダーから直接ファイルをコピーできます。
Start-BitsTransfer -Source \\lon-rep01\os\RHEL4.8-x86_64-AS-DVD.iso -Destination c:\temp -Asynchronous
ただしBitsTransferは、特定フォルダー内の全ファイル・フォルダーを再帰的にコピーすることができません。指定したネットワーク共有フォルダーからすべてのファイルとサブディレクトリをコピーするには、以下のスクリプトを使用します(事前にターゲットディレクトリの存在チェックと作成も行います)。
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
}
PowerShellとBITSでHTTPサーバーへファイルをアップロードする方法
BITSを使えば、HTTPサーバーからファイルをダウンロードするだけでなく、リモートのWebサーバーへアップロードすることも可能です。そのためには、ターゲットサーバーにIIS WebサーバーとBITS Server Extensionコンポーネントがインストールされている必要があります。
IIS仮想ディレクトリの設定で「BITS Uploads」セクションを開き、「クライアントによるファイルのアップロードを許可する(Allow clients to upload files)」オプションを有効にします。
匿名認証を使用する場合は、NTFSアクセス許可レベルで匿名ユーザーに対象ディレクトリへの書き込み権限を付与する必要があります。認証済みユーザーでアップロードを行う場合は、アップロードフォルダーに対してRW(読み書き)権限を付与してください。
BITSプロトコルでHTTPサーバーへファイルをアップロードするには、次のコマンドを実行します。
Start-BitsTransfer -Source c:\iso\winsrv2016.iso -Destination https://10.1.1.18/MEDVImages/winsrv2016.iso -TransferType Upload
注意: デフォルトではIISは最大30MBまでのファイルしかアップロードできません。より大きなファイルをアップロードできるようにするには、web.configファイル内のmaxAllowContentLengthパラメーターの値を変更する必要があります。
まとめ
BITSの機能は、SMBプロトコルを使った一般的なネットワークファイルコピーの有力な代替手段となります。BITSのファイル転送タスクは、回線の切断やコンピューターの再起動が発生しても継続され、帯域幅を大きく占有しないため、他のアプリケーションに干渉しません。
WAN回線越しに大容量のISOイメージや仮想マシンファイル(vmdk、vhdxなど)を転送する場合、BITSプロトコルは最適なソリューションになり得ます。
-
Macで大きなファイルを見つけて削除する方法【Finder・ストレージ管理・ターミナル】
Macのストレージを快適に保つには、定期的に不要なファイルを削除することが大切です。特にサイズの大きいファイルは放置しがちで、気づかないうちにディスクがいっぱいになり、動作が遅くなる原因にもなります。Macの空き容量が不足してきたら、どのファイルが最もスペースを消費しているのかを把握し、効率的に削除することが重要です。この記事では、Macで大きなファイルを見つけるための4つの方法と、隠しファイルの表示方法をご紹介します。これらの方法を活用すれば、Macintosh HDの空き容量を確保し、Macの動作速度を改善できます。この記事でわかることよく使うフォルダから大きなファイルを探す方法Finde
-
PowerShellでファイルとフォルダーを削除する方法【Remove-Itemコマンド徹底解説】
ファイルやフォルダーをひとつずつ手動で削除するのは、意外と手間がかかる作業です。しかし、PowerShellの使い方をマスターしていれば、そんな面倒な作業も一瞬で終わらせられます。この記事では、PowerShellを使ってWindowsのファイルやフォルダーを削除するさまざまな方法を紹介します。 PowerShellとは PowerShellは、Windowsが無料で提供しているコマンドライン自動化ツールです。コマンドプロンプトのウィンドウ上で起動するシェルを通じて、OSをより細かくコントロールできるようになるのが特徴です。 PowerShellでは「コマンドレット(Cmdlet)」と呼ばれ