Windowsのバックアップはrobocopyが簡単便利で早い

以前の記事「既定のアプリが変更できないのはKBの不具合だった」でサラっと触れましたが、ぼくは毎日robocopyコマンドでデータのバックアップを取っています。

バックアップをしない人の特徴とか言い訳とか

IT業界に20年以上いる関係で、バックアップについては色々な人と話をしてきました。

だいたいみなさんバックアップの重要性は理解しているのですが、理解しつつも、バックアップを習慣化できない人がいます。

苦い顔をしながら、「しなきゃいけないとは思ってるんだけどねえ…なかなか…」なんて同じIT業界のシステムエンジニアすら言います。

バックアップをなかなかしない人の言い訳としては下記のようなものが多い印象。

  • バックアップ用のソフトを入れるのが面倒
  • バックアップには時間がかかる
  • 復元する頃にはOSのバージョンが違うかも知れない
  • 何をバックアップすれば良いかわからない

システムごとバックアップする必要はあるのか

何か問題があってバックアップから復元するとき、OSのバージョンが違ったり、Windows Updateを再適用するのが大変、なんて話を聞きます。

しかしまず大前提として、個人使用の場合、OSのシステムごとバックアップする必要があるのでしょうか。

業務用の場合、使用時間の関係でPCが壊れる可能性も高く、また一刻も早く復旧する必要があるため、システムをまるごとバックアップすることはあります。ただ、それにしたって、不具合が発生しているシステムをバックアップして、それを元に戻したら不具合まで元に戻っちゃうわけですから、普通はOSをクリーンインストールしたときのイメージと、その後のイメージは別々に保存します。

でも、個人使用でそこまでする必要があるのか、というコトです。ぼくはIT業界が長いというのもあって、OSをクリーンインストールしたときのイメージデータと重要なファイル類のバックアップデータをそれぞれ保存していますけど、普通の人なら後者のデータファイルだけで問題ないのではないでしょうか。

Windowsならセットアップイメージがいつでも入手できる

ご存知の方も多いかと思いますが、Windows 10のセットアップディスク(iso)は下記ページでいつでも入手できます。
https://www.microsoft.com/ja-jp/software-download/windows10

このページにある[ツールを今すぐダウンロード]ボタンをクリックして、MediaCreationToolを起動すれば、お手持ちのUSBメモリやDVDディスクに最新のOSのセットアップイメージを作成することができます。 ※2019年2月現在だとWindows 10のver.1809

それをパソコンに挿した状態で起動するだけでOSのクリーンインストールが可能なのだから良い時代です。

もちろんインストール時にはプロダクトキーが必要なのでそれは用意しておきましょう。パッケージで購入しているなら中にキーが印刷されたカードが入っているでしょうし、OS付きのPCを購入した場合はPC本体のどこかにプロダクトキーシールが貼られているでしょう。

格安の中国製WindowsタブレットPC等ではプロダクトキーシールが貼られていないこともありますが、そういう場合はプロダクトキーを調べるフリーソフトを使うという方法もあります。
http://www.rjlsoftware.com/software/utility/winproductkey/

バックアップに専用ソフトは必要なのか

次にバックアップ用のソフトを入れるのが面倒、という点についてですが、これもそもそも必要なのか、という話。

ぼくも昔はOSが入っているHDDのイメージをまるごと取るためにAcronisやEaseUS、Paragonといった有名どころのバックアップソフトのお世話になっていました。

しかし、Windows 7からはOS自体にイメージバックアップの機能が付きましたし、Windows 8からはOS自体にOS初期化機能が付いたため、ほとんど使わなくなりました。もちろん、PCのキッティング作業では未だにこうしたHDDクローンソフトが使われますけど、今回は個人使用の話なので関係ありません。

こうなってくると個人使用でのバックアップはマイドキュメントやピクチャ等、要するに C:\Users 以下のファイルだけで良いのではないでしょうか。

アプリの設定ファイルなんかも C:\Users\[ユーザー名]\AppData 以下にあることが普通ですし。そうでない特殊なアプリ(例えばインストール不要なPortableAppsとか)は置くディレクトリを決め打ちにすれば良い話です。(C:\PortableApps以下に入れるとか)

じゃあ後は C:\Users と C:\PortableApps だけ外部のHDDなりUSBメモリなりにコピーすれば良いよね、となります。

Windowsにはrobocopyというツールがある

robocopy

ようやく本題ですが、Windowsには昔から、それこそWindows 2000の時代からrobocopyというツールがあります。OSに標準搭載されたのはXPからですが、2000の頃からMS社内では使われていました。

Microsoft社などのグローバル企業はアメリカにある本社と各国の支社との間で毎日最新のデータをミラーリングしなければならないため、堅牢性が高く信頼性のあるコピーコマンドが必要でした。

当時は海外の回線なんてめっちゃ細かったですからね…。ぼくと同年代のおっさんにわかりやすく言うと、モデム…は大袈裟にしてもISDNで通信しているようなレベルですよ。だから、普通のcopyコマンドやxcopyコマンドではタイムアウトされてしまって困るのです。

タイムアウトしても何度も再試行してほしいわけです。そうした社内事情もあって、作られたのがrobocopyなんですね。だからrobocopyはコピーが失敗しても30秒待機した後に再試行を繰り返す設定がデフォルトなのです。

robocopyにはミラーリング機能がある

いくら堅牢性が高いと言われても個人レベルならxcopyで良いじゃん、と言われればそのとおり。

あえて個人使用でもrobocopyの利用を勧めるのはミラーリング機能があるからです。

例えばバックアップ元が C:\Users バックアップ先のHDDが K:\Users だったとします。その場合、下記のようなコマンドでミラーリングが実行出来ます。

C:\>robocopy C:\Users K:\Users /MIR

ミラーリングとは名前のとおり鏡のように同じ状態にすることです。

  • C:\Usersの下にあるファイルが更新された場合、そのファイルをK:\Usersへコピー
  • C:\Usersの下に新しいファイルが追加された場合も、そのファイルをK:\Usersへコピー
  • C:\Usersの下のファイルが消された場合は、同じファイルをK:\Usersからも削除

特に最後の削除が実行されることで、完全に C:\Users と K:\Users が同期されるのがポイントです。xcopyコマンドではこうはなりませんので。

また、初回のコピーは全部のファイルをコピーするためそれなりに時間がかかりますが、二度目以降は更新または追加されたファイルしかコピーされないため、とても少ない時間でバックアップが完了します。それこそ毎日実行しても苦にならないくらい。

「別のプロセスが使用中」と表示されて止まる場合

C:\Usersの下には ntuser.dat 等、システムにロックされているファイルがあります。ロックされているとファイルコピーができず、デフォルトでは「別のプロセスが使用中」と表示されて30秒待機&100万回の再試行に入ってしまうため、いつまで経ってもバックアップが終わりません。

これを回避するために下記のように /XF オプションを使い、除外設定をすることもできます。

robocopy c:\users k:\users /MIR /XF ntuser.dat ntuser.dat.log1 ntuser.dat.log2

ただ、環境によっては ntuser.dat 関係以外のファイルもありますし、基本的にロックされているファイルは無視して良い、ということならば、/R:0 というオプションを付けて再試行回数を0にすることでも解決可能です。

robocopy c:\users k:\users /MIR /R:0

robocopyでよく使うオプション

個人ファイルのバックアップくらいなら基本的に /MIR を付けておけば良いのですが、例えば外付けのHDDがあって、そのルートからバックアップしたい場合、システム用の隠しディレクトリを除外したいケースがあります。

具体的には $RECYCLE.BIN というディレクトリ名ですね。これは名前のとおりゴミ箱用の隠しディレクトリなのですが、こんなものまでバックアップしたくない、というケース。あとシステムの復元で使われる System Volume Information なんかもそうでしょうか。

これら特定のディレクトリを除外してミラーリングしたい場合はこのとおり。

robocopy D:\ K:\ /MIR /XD "System Volume Information" "$RECYCLE.BIN"

(Dドライブのルートから、Kドライブへミラーリングする)

また、ぼくの場合はrobocopy用のバッチファイルを作っているため、毎日手動でそれをクリックするのが習慣になっています。

最初は動作確認のためにも、コピーしているファイルがひとつひとつ見えたほうが気分的にも良いですが、毎日のことになるとコピーしたファイル数とかバイト数のサマリーだけ表示してくれれば良いやってことで、/NFL (ファイルリストを表示しない) や /NDL (ディレクトリリストを表示しない)あたりのオプションも付けるようになりました。

あとは、そうですね。

ファイルサーバーとして使っているWindows PCではrobocopyをタスクスケジューラーに登録しているため、/LOG+ (ログファイルに追記)のオプションや、/R: (試行回数)あたりも付けます。

特に後者の試行回数についてはデフォルトだと1,000,000回も再試行してくれちゃうため、何らかの理由でコピー元のファイルが開かれたままの状態だった場合、そのファイルが開放されるまでバックアップが止まってしまいます。それよりは、そのファイルをスキップして続きをバックアップしてもらったほうが助かるため、/R:3とか3回だけリトライする設定にしていたりしますね。
(0にしないのはHDDがスリープ状態に入っている可能性もあるため)

robocopyのオプション一覧

このようにrobocopyのオプションはとても豊富で全ては解説できませんので、一覧だけ掲載しておきます。

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------

  開始: 2019年2月5日 19:26:44
              使用法:: ROBOCOPY コピー元 コピー先 [ファイル [ファイル]...][オプション]

           コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー\共有\パス)。
           コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー\共有\パス)。
           ファイル :: コピーするファイル (名前/ワイルドカード: 既定値は「*.*」です)

::
:: コピー オプション:
::
                 /S :: サブディレクトリをコピーしますが、空のディレクトリはコピーしません。
                 /E :: 空のディレクトリを含むサブディレクトリをコピーします。
             /LEV:n :: コピー元ディレクトリ ツリーの上位 n レベルのみをコピーします。

                 /Z :: 再起動可能モードでファイルをコピーします。
                 /B :: バックアップ モードでファイルをコピーします。
                /ZB :: 再起動可能モードを使用します。アクセスが拒否された場合、
                       バックアップ モードを使用します。
                 /J :: バッファーなし I/O を使用してコピーします (大きなファイルで推奨)。
            /EFSRAW :: 暗号化されたすべてのファイルを EFS RAW モードでコピーします。

 /COPY:コピーフラグ :: ファイルにコピーする情報 (既定値は /COPY:DAT)。
                       (コピーフラグ: D= データ、A= 属性、T= タイムスタンプ)。
                       (S= セキュリティ =NTFS ACL、O= 所有者情報、U= 監査情報)。

               /SEC :: セキュリティと共にファイルをコピーします (/COPY:DATS と同等)。
           /COPYALL :: ファイル情報をすべてコピーします (/COPY:DATSOU と同等)。
            /NOCOPY :: ファイル情報をコピーしません (/PURGE と共に使用すると便利)。
            /SECFIX :: スキップしたファイルも含むすべてのファイルのファイル セ
                       キュリティを修正します。
            /TIMFIX :: スキップしたファイルも含むすべてのファイルのファイル時刻
                       を修正します。

             /PURGE :: 既にコピー元に存在しないコピー先のファイル/ディレクトリを削除します。
               /MIR :: ディレクトリ ツリーをミラー化します (/E および /PURGE と同等)。

               /MOV :: ファイルを移動します (コピー後にコピー元から削除)。
              /MOVE :: ファイルとディレクトリを移動します (コピー後にコピー元から削除)。

     /A+:[RASHCNET] :: コピーされたファイルに指定の属性を追加します。
     /A-:[RASHCNET] :: コピーされたファイルから指定の属性を削除します。

            /CREATE :: ディレクトリ ツリーと長さ 0 のファイルのみを作成します。
               /FAT :: 8.3 FAT ファイル名のみを使用してコピー先ファイルを作成します。
               /256 :: 256 文字を超える非常に長いパスのサポートをオフにします。

             /MON:n :: コピー元を監視し、n 回を超える変更があった場合に再度実行します。
             /MOT:m :: コピー元を監視し、m 分後に変更があった場合に再度実行します。

      /RH:hhmm-hhmm :: 実行時間 - 新しいコピーを開始できる時刻です。
                /PF :: 実行時間をファイルごと (パスごとではない) に確認します。

             /IPG:n :: 低速回線で帯域幅を解放するためのパケット間ギャップ (ミリ秒)。

                /SL :: 対象ではなくシンボリック リンクをコピーします。

            /MT[:n] :: n 個のスレッドのマルチスレッド コピーを実行します
                       (既定値 8)。
                       n は 1 から 128 までの値である必要があります。
                       このオプションは、/IPG および /EFSRAW オプションと互換性がありません。
                       パフォーマンスの向上のため、/LOG オプションを使用して出力をリダイレクトします。

/DCOPY:コピーフラグ :: ディレクトリにコピーする情報 (既定値は /DCOPY:DA)。
                       (コピーフラグ: D= データ、A= 属性、T= タイムスタンプ)。

           /NODCOPY :: ディレクトリ情報をコピーしません (既定では /DCOPY:DA が実行されます)。

         /NOOFFLOAD :: Windows のオフロードをコピーするメカニズムを使用せずに、
                       ファイルをコピーします。

::
:: ファイル選択オプション:
::
                 /A :: アーカイブ属性が設定されているファイルのみをコピーします。
                 /M :: アーカイブ属性のあるファイルのみをコピーし、リセットします。
    /IA:[RASHCNETO] :: 指定されたいずれかの属性が設定されているファイルのみを含みます。
    /XA:[RASHCNETO] :: 指定されたいずれかの属性が設定されているファイルを除外します。

/XF file [ファイル]... ::
                       指定された名前/パス/ワイルドカードに一致するファイルを除外します。
/XD dir [ディレクトリ]... ::
                       指定された名前/パスに一致するディレクトリを除外します。

                /XC :: 変更されたファイルを除外します。
                /XN :: 新しいファイルを除外します。
                /XO :: 古いファイルを除外します。
                /XX :: コピー先にだけ存在するファイルとディレクトリを除外します。
                /XL :: コピー元にだけ存在するファイルとディレクトリを除外します。
                /IS :: 同一ファイルを含みます。
                /IT :: 異常なファイルを含めます。

             /MAX:n :: 最大ファイル サイズ - n バイトより大きいファイルを除外します。
             /MIN:n :: 最小ファイル サイズ - n バイトより小さいファイルを除外します。

          /MAXAGE:n :: 最長ファイル有効期間 - n 日より古いファイルを除外します。
          /MINAGE:n :: 最短ファイル有効期間 - n 日より新しいファイルを除外します。
          /MAXLAD:n :: 最大最終アクセス日 - n で指定する値以後に使用していないファイルを除外します。
          /MINLAD:n :: 最小最終アクセス日 - n で指定する値以後に使用されたファイルを除外します。
                       (n < 1900 の場合、n = n 日です。それ以外は、n = YYYYMMDDの日付です)。

                /XJ :: 接合ポイントとシンボリック リンクを除外します (通常は既定で含まれます)。

               /FFT :: FAT ファイル時間 (2 秒の粒度) を仮定します。
               /DST :: 1 時間の DST 時間差を補正します。

               /XJD :: ディレクトリの接合ポイントとシンボリック リンクを除外します。
               /XJF :: ファイルのシンボリック リンクを除外します。

::
:: 再試行オプション:
::
               /R:n :: 失敗したコピーに対する再試行数: 既定値は 1,000,000。
               /W:n :: 再試行と再試行の間の待機時間: 既定値は、30 秒です。

               /REG :: /既定の設定としてレジストリに R:n と /W:n を保存します。

               /TBD :: 共有名が定義されるのを待ちます (再試行エラー 67)。

::
:: ログ オプション:
::
                 /L :: リストのみ - いずれのファイルにも、コピー、タイムスタンプの追加、または削除を実施しません。
                 /X :: 選択されたファイルのみではなく、余分なファイルをすべて報告します。
                 /V :: スキップされたファイルを示す詳細出力を作成します。
                /TS :: 出力にコピー元ファイルのタイム スタンプを含めます。
                /FP :: 出力にファイルの完全なパス名を含めます。
             /BYTES :: サイズをバイトで出力します。

                /NS :: サイズなし - ファイル サイズをログに記録しません。
                /NC :: クラスなし - ファイル クラスをログに記録しません。
               /NFL :: ファイル リストなし - ファイル名をログに記録しません。
               /NDL :: ディレクトリなし - ディレクトリ名をログに記録しません。

                /NP :: 進行状況なし - コピーの完了率を表示しません。
               /ETA :: コピーするファイルの推定完了時刻を表示します。

      /LOG:ファイル :: ログ ファイルに状態を出力します (既存のログを上書きします)。
     /LOG+:ファイル :: ログ ファイルに状態を出力します (既存のログ ファイルに追加します)。

   /UNILOG:ファイル :: ログ ファイルに UNICODE で状態を出力します (既存のログを上書きします)。
  /UNILOG+:ファイル :: ログ ファイルに UNICODE で状態を出力します (既存のログに追加します)。

               /TEE :: コンソール ウィンドウとログ ファイルに出力します。

               /NJH :: ジョブ ヘッダーがありません。
               /NJS :: ジョブ要約がありません。

           /UNICODE :: 状態を UNICODE で出力します。

::
:: ジョブ オプション:
::
      /JOB:ジョブ名 :: 名前の付いたジョブ ファイルからパラメーターを取得します。
     /SAVE:ジョブ名 :: 名前の付いたジョブ ファイルにパラメーターを保存します。
              /QUIT :: コマンド ラインの処理後に終了します (パラメーターの表示のため)。
              /NOSD :: コピー元ディレクトリを指定しません。
              /NODD :: コピー先ディレクトリを指定しません。
                /IF :: 後続のファイルを含みます。

::
:: 注釈 :
::
       ボリュームのルート ディレクトリに対して /PURGE または /MIR を使用すると、これまでは、
       robocopy は要求された操作をシステム ボリューム情報ディレクトリ内のファイル
       にも適用していました。この動作は変更されました。
       どちらかを指定すると、robocopy はその名前を持つファイルまたはディレクトリを
       (コピー セッションの最上位レベルのソースと宛先ディレクトリで) スキップします。

まとめ

  • Windows 10のバックアップはわざわざシステムイメージまるごと取る必要はない
  • 個人使用で大事なデータは主に C:\Users の下にある
  • ファイルのバックアップだけならrobocopyが簡単便利で早い

という話でした。

Windows標準でもバックアップ機能はあるんですけどねー。ファイルの履歴機能とか。

個人的にはいまひとつWindowsの標準機能には頼りたくない気持ちがあります。

というのも昔はBackupExecという他社のバックアップソフトをWindowsの標準バックアップ機能としていた過去がありますし、7でシステムイメージのバックアップを搭載したかと思えばWindows 10移行では非推奨となったり。

どのファイルをバックアップすれば良いのかはわかっているわけですし、わからないのならそれこそが問題だと思うんですよ。スマホなんかでもアプリが保存するデータがどこにあるのかユーザーに意識させない作りになっていますが、それってどうなのかなぁーと。

まぁおっさんらしい古い考え方ですがw 大事なデータなんだからそれがどことどこにあって、いつバックアップしているのか、そのくらいは自分自身で把握しておきたいな、という気持ちもあって、公私ともにrobocopyのお世話になっています。

2020年8月追記

『Windowsのバックアップはrobocopyが簡単便利で早い』へのコメント

  1. 名前:キク 投稿日:2021/03/09(火) 19:36:14 ID:ff0f93af6 返信

    はじめまして。キクと申します。初めてこちら拝見させて頂きました。当方Officeソフトを少しいじれる程度の知識しかありません。
    古い外付けHDDから、新しい外付けHDDへまるごとコピーする方法を探しておりました。
    古HDDをEドライブ、新HDDをFドライブとした場合、こちらで紹介されている方法ですと、
    robocopy E:/ F:/
    のコマンド入力でよろしいのでしょうか。

    • 名前:とっちら 投稿日:2021/03/09(火) 19:49:50 ID:1b13c919e 返信

      robocopy E:/ F:/ /MIR
      というように/MIRを付けると良いかと思います。/MIRを付けないと空のディレクトリがコピーされません。
      また、
      robocopy E:/ F:/ /MIR /DCOPY:T
      というように /DCOPY:T オプションを付けるとフォルダのタイムスタンプ(更新日付)もコピーされるため、更におすすめです。

  2. 名前:キク 投稿日:2021/03/09(火) 20:18:43 ID:ff0f93af6 返信

    おお。とっちら様、早速のご回答に感謝です。近いうち、まとまった時間ある時に実行してみます!ありがとうございます!!