Windows ファイルサーバー 移行

Windows

共有フォルダーを新サーバーへ移行するのに robocopy を使うことが多いのだが、あらためてポイントをまとめておく

要件

こんな要件が多い

  • 共有フォルダーのネットワークパスを変更しないこと
  • セキュリティ情報(アクセス権)を保持して移行すること
  • システムの停止時間を数時間以内にすること

パスを変えない

共有フォルダーのネットワークパスが変ると利用者や他のシステムへの影響が大きいので大抵は変更しないことが要件となる。このため次のように設計することになる。
(DFSを利用している場合はこの限りではない)
(この機会にフォルダーを整理し再構成したい、という要件の場合もあるが)

  • 共有名を変えない
  • フォルダーの階層構造を変えない
  • コンピューター名やDNS名、IPアドレスを変えない

アクセス権を保持

これは絶対なので、どのような方法でファイルをコピーするにしてもセキュリティ情報(アクセス権=NTFS ACL)付きでコピーすることを考えなければならない。robocopyを使う場合は次のスイッチを使うことになる。
/copyall または
/copy:sec /copy:dats など

停止時間を短く

許容される停止時間は大抵は休日1日(数時間)、中には1時間だけというケースもある。余程使用量が少ない場合を除き、数時間で全ファイルをコピーして移行を完了するのは難しいため、切替の数日前から差分コピーを行ない切替直前に最終差分コピーを行なうようにすれば1時間の停止でも充分に移行可能だ。
robocopyで差分コピーを行なうには次のスイッチを使う。
/mir

/MIR 使用時は /L も付けてまずテスト!

robocopy /? では次のように表示される。
「/MIR :: ディレクトリ ツリーをミラー化します (/E および /PURGE と同等)。」
「/E :: 空のディレクトリを含むサブディレクトリをコピーします。」
「/PURGE :: 既にコピー元に存在しないコピー先のファイル/ディレクトリを削除します。」
ミラー化(同期)なので、コピー元になく、コピー先にあるファイルは削除される。誤ってコピー元、コピー先を逆に指定したら、原本が全て削除されることになる。なのでまずは1回 /L を付けてテストして、意図した結果になったか確認することを徹底しよう。
「/L :: リストのみ – いずれのファイルにも、コピー、タイムスタンプの追加、または削除を実施しません。」

スクリプトとタスクスケジューラー

テストができたら robocopyコマンドをタスクスケジューラーへ登録して無人実行することになる。実行するコマンドが1行だけならば直接タスクスケジューラーへ登録しても良いが大抵は簡単なスクリプト(バッチファイル)にすることになる。

実行日時と実行範囲

差分コピーなので同じコマンド(スクリプト)を定期的に繰り返して実行するわけだが、初回のコピーはフルとなるので業務影響を避けたい場合は実行日時と実行範囲(コピー対象のフォルダー)を考慮する必要がある。例えば平日の夜間に実行するならば、こんな感じにする。

  • 1日目:フォルダーA
  • 2日目:フォルダーA 、フォルダーB
  • 3日目:フォルダーA 、フォルダーB 、フォルダーC

あまり小分けにするのはちょっと面倒なので、1日目の開始を休日の前日夜間にするとまとめて実行できて楽だ。

実行アカウントと /B

Admin権限を持っているユーザーでも、すべてのファイルをコピーできるとは限らない。 特定のフォルダーやファイルには AdministratorやDomain Adminsにも権限を付けていないケースも少なくない。そこで次のようにすればアクセス権不足でコピーが失敗するのを回避できる。

  • タスクを実行するアカウントを Backup Operators に入れる(新旧サーバーの両方で実施)
  • robocopy に /B スイッチを付ける

「/B :: バックアップ モードでファイルをコピーします。」
バックアップモードでは NTFS ACL を無視して実行する。

良く使う他のスイッチ

  • /DCOPY:T
    フォルダーのタイムスタンプをコピーする(あまり要件になることはないが)
  • /XA:SH
    コピー除外 S=システムファイル、H=隠しファイル(要件次第だがファイルサーバーでは移行不要なファイルかと)
  • /R:0
    何らかの理由でコピーできない場合のリトライ回数(時間が無駄なのでリトライしない)
  • /W:0
    リトライ時のインターバル(そもそもリトライしないが)
  • /NP
    コピーの進行状況を表示しない(表示するとログが膨大になる)
  • /LOG+
    処理状況をファイルに記録する(ログがないと成功したか失敗したか分からない)

まとめ

シンプルなコマンド

robocopy \\SourceFolder D:\FolderPath /B /COPYALL /DCOPY:T /MIR /XA:SH /R:0 /W:0 /NP  /LOG+:D:\LogPath

スクリプトは変数使ったりいくらでも凝ることもできるのでやりたければ。

2020年4月24日Windowsrobocopy

Posted by senchan