猫の手なら貸せる

いろいろ共有できたらいいなとおもってます

ラズパイをdumpからrestoreで一部復元した

コマンドの試験をしてる最中にホームディレクトリでrm .bashrc .bash_profile .profileが走り、背筋が凍りましたが毎日Dumpしていたので首の皮一枚で助かりました。

dumpコマンドでバックアップを作れることが皆さんご存知でしょうし、実際やっていると思うのですが、初めてrestoreの方をやる機会が生まれたのでメモがわりに。

Raspbian Busterでは/boot/dev/mmcblk0p1に、//dev/mmcblk0p2にマウントされています。

現環境では、次のようなコマンドでバックアップを作成しています。

if [ $? -ne 1 ]; then
    echo "set directory where dump put in. ex: ./sdump.sh /mnt/nas/"
fi
dest=$1
dump -j3 -0f ${dest}/root.dump.bz2 /dev/mmcblk0p2

シェルにdumpをどこに配置するかを指定しています。
内部的にはdumpをフルバックアップ・bzlibを用いて圧縮レベル3で圧縮ということをしているだけです。

今回restoreを行なったことがなかったので、restoreを試してみようと操作していました。

今回は人間に優しいrestoreの対話モードを利用して復帰させました。ParallelsUbuntu Desktopがこんな形で役に立ってくれて感無量です。

参考。
www.atmarkit.co.jp

ext4を書き込めるだけでもUbuntu仮想マシンを持つ価値があります。始めに復元を行う環境(Ubuntu)にdumpをインストールしました。

ubuntu@paralells:~$ sudo apt install dump
...(中略)...

一応、restoreする先のフォルダを作成しておきます。

ubuntu@paralells:~$ mkdir temp
ubuntu@paralells:~$ cd temp/
ubuntu@paralells:~/temp$ ll
合計 8
drwxr-xr-x  2 ubuntu ubuntu 4096  2月 24 19:30 ./
drwxr-xr-x 22 ubuntu ubuntu 4096  2月 24 19:30 ../

restoreの対話モードへ。英語が読めればなんてことはありません。ただ、ヘルプの出し方が「?」であることは知っていないと使えません。
あと、実行の際には-iを指定し、引数にはリストア先(以下ではカレントディレクトリを指定)を指定します
どうも引数を指定してもしなくてもカレントディレクトリをリストア先に選択するようなので、cdでリストアする先に移動しておく必要があるように見えます。

ubuntu@paralells:~/temp$ sudo restore -if ~/raspbian.dump.gz .
Dump tape is compressed.
restore > ?
Available commands are:
    ls [arg] - list directory
    cd arg - change directory
    pwd - print current directory
    add [arg] - add `arg' to list of files to be extracted
    delete [arg] - delete `arg' from list of files to be extracted
    extract - extract requested files
    setmodes - set modes of requested directories
    quit - immediately exit program
    what - list dump header information
    verbose - toggle verbose flag (useful with ``ls'')
    prompt - toggle the prompt display
    help or `?' - print this list
If no `arg' is supplied, the current directory is used
restore > ls
.:
bin/        etc/        media/      root/       sys/        ved_to 
boot/       home/       mnt/        run/        tmp/
boot.bak/   lib/        opt/        sbin/       usr/
dev/        lost+found/ proc/       srv/        var/

restore > cd home
restore > ls
./home:
razpi/

restore > cd razpi/ 
restore > ls
./home/razpi:
._commands.txt    .bashrc           .profile          cpustat.py@
.bash_history     .gnupg/           .selected_editor 
.bash_logout      .lesshst          .ssh/

restore > add .bashrc  .profile  .bash_logout  
restore > extract
You have not read any volumes yet.
Unless you know which volume your file(s) are on you should start
with the last volume and work towards the first.
Specify next volume # (none if no more volumes): 1
Mount tape volume 1
Enter ``none'' if there are no more tapes
otherwise enter tape name (default: /home/ubuntu/raspbian.dump.gz) 
Dump tape is compressed.
resync restore, skipped 232 blocks
set owner/mode for '.'? [yn] n
restore > quit
ubuntu@paralells:~/temp$ ll
合計 12
drwxr-xr-x  3 ubuntu ubuntu 4096  2月 24 19:33 ./
drwxr-xr-x 22 ubuntu ubuntu 4096  2月 24 19:31 ../
drwxr-xr-x  3 root   root   4096  1月 13 13:44 home/
ubuntu@paralells:~/temp$ cd home/razpi/
ubuntu@paralells:~/temp/home/razpi$ ll
合計 20
drwxr-xr-x 2 ubuntu ubuntu 4096  2月 24 00:25 ./
drwxr-xr-x 3 root   root   4096  1月 13 13:44 ../
-rw-r--r-- 1 ubuntu ubuntu  220  9月 26 09:09 .bash_logout
-rw-r--r-- 1 ubuntu ubuntu 3522  2月  2 22:28 .bashrc
-rw-r--r-- 1 ubuntu ubuntu  807  9月 26 09:09 .profile
ubuntu@paralells:~/temp/home/razpi$ 

addしてextractしてやれば全てが解決。全て復元するのであればadd .すれば良い感じです。
全て復元する場合はそもそも対話モードなんか使わず、sudo restore -rf root.dump.bz2 /でいいと思います。

やろうと思えばオーナー情報も復元できたり、復帰させたファイルのタイムスタンプまできっちり正しかったり至れり尽くせりです。

これで安心してcronにdumpを登録しておけます。