WSLのバックアップを検討する
はじめに
前の記事(WSL上のVimでの日本語入力を快適にする - concerti.tsukubaのブログ)に書いたように、最近WSL+Vim環境を常用しはじめた。そうすると不安になるのは、いずれ再インストールしたり、別環境に移行したくなったときにどうするかという問題。そこでWSLのバックアップ・リストアについて検討する。2017 Windows 10 Fall Creators Update を前提。VMだとスナップショット機能があるが、現状では WSL にはそのような機能は無く、すべてアンインストールするしかない。
現状の確認
まずWSLのシステム全体が保存されているフォルダはWindowsでみると
C:\Users\[Username]\AppData\Local \packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
に保存されている。プロパティをみたところ、約 3.5 GB 程度だった。
どのようにバックアップをとるか
もっとも簡単には、ルートディレクトリから tar で圧縮するやりかた。今回の場合、ファイルの保存先は /mnt/c 以下に適当なディレクトリをつくってそこに入れれば良いだろう。とりあえず日付のフォルダをつくって、 /mnt/c/bkup/WSL/20180206/ とする。
tar + bzip2 で圧縮するとして、/mnt/c 等は除外したい。そこで除外ファイルリストを作っておき、 -X オプションで指定する(このファイルは日付に依存するものではないので、1つ上のフォルダに置く)。
~$ cat /mnt/c/bkup/WSL/exclude_list.txt /mnt /dev /proc /tmp /sys /run /var/log
圧縮実行
~$ sudo tar -cvpjf /mnt/c/bkup/WSL/20180206/backup.tar.bz2 -X /mnt/c/bkup/WSL/exclude_list.txt /
原理的にはこのファイルのみで良いが、記録としてパッケージリストをテキストファイルに保存しておく。最悪でもこのリストを元に再インストールも可能となる。また、PythonやTeXについては apt-get で入れていないので pip のリスト、tlmgrのパッケージリストも保存する。
~ $ dpkg-query -f '${binary:Package}\n' -W > /mnt/c/bkup/WSL/20180206/list_pkg.txt ~ $ pip list --format=columns > /mnt/c/bkup/WSL/20180206/list_pip.txt ~ $ tlmgr list --only-installed > /mnt/c/bkup/WSL/20180206/list_tex.txt
WSLのアンインストールと、再インストール
以前は lxrun コマンドでインストール・アンインストールを行っていたが、現在はWindows標準である「アプリと機能」からアンインストールする。アンインストールした後、念のためフォルダを確認したところ、
C:\Users\[Username]\AppData\Local\packages
で Canonical.... ディレクトリが削除されていた。
ここで再起動する必要は全く無いが、気分的にWindows再起動したあとで、ストアから Ubuntu を再インストールした。その後、Canonical... ディレクトリのサイズを確認したところ、約600 MB だった。
リストア実行
root directory に移動。念のため -t オプションでテストし、解凍先を確認。その後でファイルをすべて展開する
~$ cd / /$ sudo tar -tvjf /mnt/c/bkup/WSL/20180206/backup.tar.bz2 | more <-- 確認 /$ sudo tar -xvjf /mnt/c/bkup/WSL/20180206/backup.tar.bz2 <-- 展開実行 drwxr-xr-x root/root 0 1970-01-01 09:00 ./ drwxr-xr-x root/root 0 2017-09-23 01:15 bin/ -rwxr-xr-x root/root 1037528 2017-05-16 21:49 bin/bash -rwxr-xr-x root/root 520992 2017-06-16 08:46 bin/btrfs -rwxr-xr-x root/root 249464 2017-06-16 08:46 bin/btrfs-calc-size .....
特にエラー無く終了。展開後に全体のサイズを確認したところ、ほぼ元と同じ容量だった。
念のため、パッケージリストやpipのリストなどを再取得して、前に保存しておいたファイルと diff をとってきちんと再インストールされているかどうかを検証したところ、特に問題なかった。 あとはいくつか TeXとかpythonとか動かしてきちんと動作することを確認した。
結論
これがベストの方法かどうかはともかく、スナップショットをとる代わりとしては十分。 元のフォルダは 3.5 GB程度だったが、今回バックアップしたファイルは bzip2 圧縮で 1.3 GB 程度だった。試しに xz 圧縮 (-J オプション) してみたところ 900 MB 程度になった。ただし、bzip2にくらべると圧縮・展開に時間がかかるのでよほどディスク残量に困らない限りは bzip2 にするつもり。