(開発者向け) Windows のクライアント PC をバックアップするための覚え書き

# はじめに
私は仕事でもプライベートでも Windows をガッツリ使っているのですが、バックアップやリストアが大変なんですよね。苦労するのはもうコリゴリ、ということで少しずつやり方を整えてきました。ある程度形になったのでまとめてみます。

# 前提
- （特に断りがなければ）Windows 7 を想定

# 対象読者
- Windows を常用していて...
  - PC を替える度に大変な思いをしている方
  - バックアップしたいとは思っているが、どうやればいいかわからない方
  - ドライブ丸ごとコピーや標準機能のバックアップ機能は試したが、時間かかりすぎ or 上手くリストアされない等で投げ出した方
  - バックアップ方法や考え方について興味がある方

# バックアップ対象
具体的に何をバックアップするか、またどうやってバックアップするかについて、対象毎にまとめます。

## Windows の設定（コントロールパネル）
エクスポートできないので以下のように **設定内容だけメモしておき、リストア時は手作業で復旧します**。だるいです :sweat:

- フォルダオプション
  - 拡張子表示 on
  - 隠しファイル表示 on
- UNC を無効にする
- システムのプロパティ > パフォーマンスを優先する
- コンピュータの簡単操作センター
  - キーボードを使いやすくします > 固定キー off
  - マウスを使いやすくします > Aeroスナップ off
  - コンピュータの作業に集中しやすくします > ウィンドウが画面の端に… on
- （必要なら）インターネットオプション > プロキシ設定
  - 設定を自動的に検出する off
  - 自動構成スクリプトを使用する on
- ユーザアカウント
  - メンテナンス用に管理者ユーザを一つ追加しておく
- マウス
  - ポインタ > [実用マウスカーソル](http://mclover.net/Program/Cursor.htm) にする
  - ポインターオプション > ポインターの速度 をマウスに合わせて調整
- キーボード
  - 表示までの待ち時間: 短め
  - 表示の間隔: MAX
  - カーソルの点滅速度: 速め
- ネットワーク
  - 使用機器やネットワーク環境に応じて実施

## Windows の設定（タスクバー）
- タスクバー > プロパティ
  - 小さいアイコンを使う on
  - 結合しない

## Windows の設定（システム設定 in Win10）
Windows 10 では「コントロールパネル」よりも「システム設定」にシステム設定が集中しているので、コントロールパネルに該当設定が見当たらなかったらそちらを探します。

基本的には **一通り眺めつつ、余計な機能は全部オフにします**。

（余談） Windows 10 になってから余計な機能が一気に増えました。オフにする項目は多いです。ちなみにどこをどう設定したかのメモは数が多すぎるので諦めました :sweat:

## Windows の設定（コマンドで取れる分）
- 環境変数一式
  - `set > set.txt` 
- ネットワーク設定
  - `ifconfig /all > ifconfig_all.txt` 
  - `route print > route_print.txt`

## Windows の設定(レジストリ)
Windows の設定情報はレジストリに保存されますが「じゃあ全部バックアップしよう」というわけにはいきません。

- データサイズが大きすぎる(たぶん GB 超えると思う)
- バックアップ元とリストア先とでレジストリ構造が異なると（リストア後に）最悪 Windows が死ぬ

なので **本当に必要な分のみバックアップしておく** のが良いと思います。

### バックアップ方法
二つあります。

- (1) `reg query (KEY) /s > (FILENAME).regdata` コマンドでエクスポート
  - :o: コマンドなので自動化できる
  - :x: リストアは手動で行う必要がある
      - reg コマンドを工夫すればたぶん自動化もイケます
- (2) レジストリエディタから .reg ファイルにエクスポートする
  - :o: 簡単
  - :o: リストアも .reg ファイルを開くだけで行える
  - :x: 自動化できない（いちいちエディタを触る必要アリ）

### バックアップ対象
私がバックアップしているものです。

- インストールしたアプリ情報の一覧
  - `HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall`
- Windows Update の更新設定:
  - `HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU`
- レジストリエディタのお気に入り
  - `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites`
- シェル拡張
  - `HKEY_CLASSES_ROOT\(FileType)\shell\(KeyName)\open`
      - Excel で「常に新しいウィンドウで開く」系
          - `HKEY_CLASSES_ROOT\Excel.Sheet.(Version)\shell`
      - 全ファイルの右クリックメニューに追加する系
          - `HKEY_CLASSES_ROOT\*\shell`
- シェル拡張、フォルダ背景の右クリックメニュー
  - `HKEY_CLASSES_ROOT\Directory\Background\shell`

## 環境設定（開発環境など）
まずファイル全てのバックアップするのは（サイズや数が多すぎるため）非現実的です。

**設定のみをバックアップする** ようにします。バッチファイルを作っておけば、一発でサクっとバックアップできて便利です。

リストア時は、バックアップした設定を見た後、手動でインストーラをインストールするなりパッケージ管理のコマンドを使うなりしてください。

以下にバックアップバッチの例を挙げます。

```bat
@echo off

rem Python
rem ------
python --version 2> python_version.txt
pip freeze > pip_freeze.txt

rem Git
rem ---
git --version > git_version.txt

rem npm
rem ---
rem ただしラッパーバッチの関係で call で呼ばないとダメ.
call npm list -g > npm_list_global.txt
call npm --version > npm_version.txt
```

## アプリ設定（Dotfiles 系）
開発者向けのアプリ（で特に UNIX や Web 界隈の影響を受けているもの）は Dotfiles の形で設定を保存しています。

`%userprofile%\.*` をバックアップすると良いでしょう。

以下はどんな Dotfiles があるかのサンプルです。

ファイル:

```
$ dir %userprofile%\.* /b /A-D
.babel.json
.bashrc
.bash_history
.bowerrc
.gemrc
.gitconfig
.npmrc
.viminfo
.vimrc
```

ディレクトリ:

```
$ dir %userprofile%\.* /b /AD
.astah
.atom
.gem
.gradle
.heroku
.jude
.kivy
.pit
.serna-free-4.4
.spyder
.ssh
.vscode
```

## アプリ設定（AppData に保存する系）
アプリの設定はレジストリ or ファイルに保存されるのですが、後者の場合は AppData に保存するケースが多いです。AppData とは %appdata% のことで、Windows における推奨のアプリケーションデータ保存先となっています。

この配下はファイルサイズ・ファイル数がバカでかいことがあるので、基本的にバックアップしません。が、 **どうしてもバックアップしたいもの（後述しますが Firefox など）** や、サイズやファイル数がそんなに大きくないものについてはバックアップします。

私の場合、以下をバックアップしています。

- %appdata%\CraftLaunch
- %appdata%\Mozilla\Firefox\Profiles
- %appdata%\Thunderbird\Profiles

ただし Mozilla 系が [リストア手順が煩雑](https://support.mozilla.org/ja/kb/back-and-restore-information-firefox-profiles) なように **アプリによっては専用手順を要することがあります** ので注意。

### アプリ設定（Firefox とか）
Mozilla 系です。ブラウザの Firefox にせよ、メールの Thunderbird にせよ、データはでかいですが、無いと死ぬので頑張ってバックアップします。

以下に示す「プロファイル名」フォルダを丸ごとアップすれば OK です。

- Firefox
  - `%appdata%\Mozilla\Firefox\Profiles\(プロファイル名)`
- Thunderbird
  - `%appdata%\Thunderbird\Profiles\(プロファイル名)`

リストア手順は [公式サイトの手順](https://support.mozilla.org/ja/kb/back-and-restore-information-firefox-profiles) を見ましょう。やや煩雑です。

## アプリ設定（要インストール＆ファイルに保存する系）
`C:\Program files` やら `C:\Program files(x86)` 配下のアプリのうち、設定をファイルで保存するタイプです。

バックアップは **設定ファイルのみ** コピーします。リストアする時は、公式サイトからインストーラを入手してインストールした後、バックアップしておいた設定を上書きしましょう。

私は以下をバックアップしています。

- `WinSCP\WinSCP.ini`
- `ConEmu\ConEmu.xml`
- `Git\etc\ssh\ssh_config`

## アプリ設定（インストール不要＆ファイルに保存する系）
Zip 解凍するだけで使える系のアプリです。

バックアップは **フォルダ丸ごと** 行うのが良いでしょう。リストア時は、フォルダ丸ごと置き直せば早速アプリを使えるようになります。

ただしいくつかノウハウがあります。

- この手のアプリは一箇所に置いておくと管理が楽です。
  - 例: `D:\bin`
  - こうすれば D:\bin を丸ごとバックアップするだけで完了するので楽です
- ファイル数やファイルサイズが多すぎる場合は諦めるのもアリです

## アプリ設定（独自のエクスポートが必要なもの）
フォルダ丸ごとバックアップが非現実的で、設定のバックアップも上記方法ではできないようなアプリもそこそこあります。

バックアップは **各アプリのエクスポート機能を使って** 行いましょう。たいていは GUI で手作業が必要なため、だるいです。

以下、いくつか具体例を挙げておきます。

### Google日本語入力
ユーザー辞書データをバックアップします。

- ツールバー > スパナーアイコン > 辞書ツール > 管理 > 選択した辞書をエクスポート

### 秀丸エディタ
エディタ設定をバックアップします。

- その他 > 設定内容の保存/復元

### Outlook
アドレス帳:

- ファイル > オプション > 詳細設定 > エクスポート > ファイルにエクスポート, windows カンマ区切り, 連絡先/連絡先候補

仕分けルール:

- 仕分けルールの設定ウィンドウの オプション > エクスポート

## データファイル全般
Windows 設定でも環境・アプリ設定でもないデータファイルたち。これらをどうバックアップするかですが、**ケースバイケース** としか言いようがありません。

全てを毎日バックアップできるならそれに越したことはないですが、データサイズやコピー時間の関係でそうもいかないので、対象や頻度について頭を悩ませることになります。

以下、参考までに私の例を挙げておきます。

### （参考）筆者のデータファイルバックアップ戦略
※長い上にオレオレで煩雑なので物好きな方だけどうぞ :sweat:

まず以下コンセプトでデータファイル（と一部アプリ）を集約します。

- 全データを `d:\root` など一フォルダ内に集める（トップフォルダ）
- トップフォルダのサブフォルダを用途別に分類する

まず上記コンセプトでデータファイル（と一部アプリ）をまとめています。バックアップは、各サブフォルダ毎に異なる条件で行っています。具体的には以下に示します。

| サブフォルダ名 | バックアップ頻度 | 説明 |
| -------------- | ---------------- | ---- |
| bin            | 週一             | 解凍系アプリを集めている |
| bin1           | 実施しない       | Ruby/Python/Sublime/Eclipse など言語系や処理系 |
| data           | 毎日             | メモ全般、スクショ全般、proxy.pac、壁紙類 |
| data1          | 月一             | メールデータ、署名、証明書、Office形式の個人データ |
| download       | 月一             | ダウンロードファイル格納先(フォルダ YYYYMM で更に分類) |
| temp           | 実施しない       | 解凍したファイルを放り込んでいる |
| temp1          | 実施しない       | virtualenv, npm, git などの作業ディレクトリ |
| proj           | PJ変更時に一度   | 過去PJのデータ(残しても差し支えない個人ノウハウ等) |
| work           | 実施しない       | 自分の GitHub を clone している | 
| oddjobs        | 週一             | 社内雑務や会社雑務(YYMMDD_TITLE で更に分類)の作業フォルダ |
バックアップツールですが [Backup](http://www2.biglobe.ne.jp/sota/backup.html) を使っています。

バックアップ作業の開始は [自作のタスク管理ツール](https://qiita.com/sta/items/2b1248869078ac8032d6) で制御しており、大体以下のようなスケジュールで登録し、その時になれば忘れることなく実行できるようにしてあります。

- 毎日 → 定時前くらいに毎日実行する定期タスク
- 週一 → 金曜日に週一で実行する定期タスク
- 月一 → 月末平日に月一で実行する定期タスク

# TIPS
バックアップに関連する TIPS を雑多にまとめます。

## オススメのバックアップツール
FFFTP 創始者として知られる Sota 氏の [Backup](http://www2.biglobe.ne.jp/sota/backup.html) がオススメです。

- 参考: 拙筆ですが [FFFTP で知られる Sota 氏のバックアップソフト Backup に関する覚え書き - stamemo](http://stakiran.hatenablog.com/entry/2018/01/26/204857)

## サイズの大きなフォルダを特定するツール
[TreeSizeFree](https://www.jam-software.com/treesize_personal/)  を使うと、指定フォルダをサブフォルダ含めて容量計算して、ツリー状にランキング表示してくれます。 **どのフォルダが全体の何%を占めているかが一目でわかり**、でかいフォルダや不要ファイルの特定に役立ちます。

## ミラーリング
ミラーリングバックアップについて述べておきます。

ミラーリングバックアップとはバックアップの一種で、 **バックアップ先をバックアップ元と全く同じ構成にする** ことです。

- Q: ただのコピーとミラーリングの違いは？

Ans: ただのコピーだとミラーリングになりません。なので **「（バックアップ元では）もう使ってない不要ファイル」がバックアップ先に残ったまま** となり無駄が生じます。ミラーリングだと無駄が生じません。

- Q: ミラーリングはどうやって実現する？

Ans: [Backup](http://www2.biglobe.ne.jp/sota/backup.html) などのツールを使うのがベターでしょう。バッチファイルで頑張るなら「いったんバックアップ先を全部消す」→「バックアップ元をコピーする」ことで実現できなくもないですが削除やコピーに時間がかかります :sweat:

- Q: ミラーリングにおいて注意することはある？

Ans: ミラーリング設定にしくじると **バックアップ先とバックアップ元の両方からファイルを消しちゃって完全に失ってしまう** ことがあります。私も何度かやらかして泣きそうになったことがあります。ミラーリング設定が整うまでは、ただのコピーで全データをどこかに退避しておく、などの保険をかけておくのが吉でしょう。

# おわりに
Windows のクライアント PC をバックアップする方法についてまとめてみました。参考になれば幸いです。

とはいうものの、もうちょっと楽したいのが本音ではあります……。「他にもこんな方法があるよ！」などありましたら、ぜひ教えてください :smile: