はじめに
前回テスト用のデータを作成したので、今回はWindows環境同士のサーバ間でのデータコピーを行います。なお、本記事はAD環境下でのファイルサーバの移行検証です。
※本記事は下記のファイルサーバ移行検証の一部です。
構成
既存ファイルサーバ(データのコピー元)
ホスト名:filesv-win-01
IPアドレス:172.16.1.137
OS:WindowsServer 2022
新規ファイルサーバ(データのコピー先)
ホスト名:filesv-win-02
IPアドレス:172.16.1.138
OS:WindowsServer 2022
ADサーバ
ホスト名:adsv01
IPアドレス:172.16.1.67
OS:WindowsServer 2022
切り替えの流れ
本記事で紹介する手順は個人的な経験となりますが、流れは以下のような流れを想定しています。
既存サーバと新規サーバを接続
テスト用スクリプトの実行
データコピーの定期実行(切り替えまで随時実行)
私が経験したシステム更改作業はオンプレサーバの更改が多く、エンドユーザーの職場環境のすぐ側に設置されているサーバーが多かったです。そのため、数TBあるデータをすぐにコピーできるはずもなく、データコピーを数日かけて実施きていました。データコピーで使用するネットワークが業務で使うネットワークと同じ場合、データコピーを実施する時間を夜間に限定したり、使用できる帯域を制限したりすることもありました。実施環境によって要件は異なりますので、実施の際は事前に確認しておきましょう。
既存サーバと新規サーバの接続
データコピー用に接続します。システム更改を想定して書きますが、データコピーのために既存と新規が一時的に並行稼働することになります。IPアドレスは一時的に使用する仮のアドレスを割り当てる必要があるでしょう。
また、ドメイン環境にいるファイルサーバであれば、アクセス権も一緒にコピーできますが、コピーする際は新規サーバもドメインに参加する必要があります。更改時にホスト名の変更しない場合は、ホスト名も仮の名前をつける必要がありますので、移行計画時には考慮事項整理しておきましょう。
テスト用スクリプトの実行
既存サーバと新規サーバがネットワーク的に接続できている想定で進めます。
以下のスクリプトは、データコピーコマンドである「robocopy」コマンドをテストモードで実行するスクリプトです。
スクリプトについて説明します。
・ユーザー名とパスワード情報:ドメインユーザーでファイルサーバにアクセスできるユーザーを指定しています。
・コピー元のデータ:「$source = “\\172.16.1.137\share”」で指定しています。
・コピー先:「$destination = “E:\share”」で指定しています。
※今回は「\\172.16.1.137\share」のデータを実行端末のローカルである「E:\share」にコピーします。
・コマンド実行結果:「C:\work\log\」に保管されます。
また、先に書いている通り、あくまでもテストモードなので、実際にコピーされません。
robocopyのオプションについては適宜要件に応じて編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# 認証情報の設定 $User = "jasm.ricecake24book.com\fileuser01" $PWord = ConvertTo-SecureString -String "Share_test01!" -AsPlainText -Force $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord # ネットワーク共有のパス $source = "\\172.16.1.137\share" # ローカルのコピー先ディレクトリ $destination = "E:\share" # 実行日時を含むログファイル名の生成 $timestamp = Get-Date -Format "yyyyMMdd_HHmmss" $logFile = "C:\work\log\test_log_$timestamp.txt" # ログディレクトリが存在しない場合は作成 $logDir = Split-Path $logFile if (!(Test-Path -Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force } # ログ記録関数 function Write-Log { param ( [string]$message ) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $logMessage = "$timestamp - $message" $logMessage | Out-File -FilePath $logFile -Encoding UTF8 -Append } # ログにテスト開始メッセージを書き込む Write-Log -message "Start copy." # コピー操作のシミュレーション Write-Log -message "コピー元: $source" Write-Log -message "コピー先: $destination" Write-Log -message "認証ユーザー: $User" # Robocopyのテストモードでの実行 $robocopyArgs = "$source $destination /MIR /COPY:DATSOU /R:3 /W:10 /IPG:10 /L" Write-Log -message "実行するRobocopyコマンド: robocopy $robocopyArgs" # Robocopyの実行と出力キャプチャ $robocopyCommand = "robocopy $robocopyArgs > `"$logFile`" 2>&1" cmd.exe /c $robocopyCommand |
実行後の結果を確認してみましょう。
末尾に結果が集約されています。不一致や失敗がないことを確認します。
本番用のデータコピースクリプト
テストモードで問題なく実行できたら、本番用のスクリプトを実行します。以下がそのスクリプトになります。
テスト用スクリプトとほとんど同じで、違いは「/L」オプションの有無とログの名前のみです。当たり前ですが、テストで実行したスクリプトに対し、違う構文のスクリプトを本番実行しないよう注意しましょう。※テストの意味がなくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# 認証情報の設定 $User = "jasm.ricecake24book.com\fileuser01" $PWord = ConvertTo-SecureString -String "Share_test01!" -AsPlainText -Force $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord # ネットワーク共有のパス $source = "\\172.16.1.137\share" # ローカルのコピー先ディレクトリ $destination = "E:\share" # 実行日時を含むログファイル名の生成 $timestamp = Get-Date -Format "yyyyMMdd_HHmmss" $logFile = "C:\work\log\copy_log_$timestamp.txt" # ログディレクトリが存在しない場合は作成 $logDir = Split-Path $logFile if (!(Test-Path -Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force } # ログ記録関数 function Write-Log { param ( [string]$message ) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $logMessage = "$timestamp - $message" $logMessage | Out-File -FilePath $logFile -Encoding UTF8 -Append } # ログにテスト開始メッセージを書き込む Write-Log -message "Start copy." # コピー操作のシミュレーション Write-Log -message "コピー元: $source" Write-Log -message "コピー先: $destination" Write-Log -message "認証ユーザー: $User" # Robocopyのテストモードでの実行 $robocopyArgs = "$source $destination /MIR /COPY:DATSOU /R:3 /W:10 /IPG:10" Write-Log -message "実行するRobocopyコマンド: robocopy $robocopyArgs" # Robocopyの実行と出力キャプチャ $robocopyCommand = "robocopy $robocopyArgs > `"$logFile`" 2>&1" cmd.exe /c $robocopyCommand |
データコピーの定期実行(切り替えまで随時実行)
スケジュール実行する前の確認について
テストモードで実行できたので、コピー自体は成功しますが、実際の作業時には以下の2点は確認しておきましょう。
コピー実行時に帯域や負荷が上がっていないか
スケジューラからの実行で成功するか
帯域制御をかける場合は、想定通りの範囲内に収まっているかを確認します。タスクマネージャーで確認できるので、コピー実行と同時に確認しましょう。また、スケジュール実行する場合は手動実行して成功するかどうか見ておくと安心です。
スケジュール実行について
タスクスケジューラでPowerShellを実行する手順は、以下を参照してください。
以上でコピー実施までの流れを確認できました。次回はデータコピーができているかの確認を行います。