raspberry pi のUbuntu のバックアップを取ろうと思いました。
バックアップとるといえば、dd
dump/restore
が定番ですが、今回は、ブートの書き換えと、initramfs の再構築のために、Raspberry上でRaspberryPiのバックアップを取る必要がありました。いちいち電源停止して再起動してたらめんどくさいので、稼働中のバックアップを取れないか模索しました。
RaspberryPi4 (arm64)のバックアップを取る--one-file-system
GNU コマンドには、--one-file-system
という便利なオプションがあることを知りました。
これを使えば、マウント中のルートファイルシステムのバックアップを取ることが可能です。
--one-file-system
をつかえば、マウント箇所を無視してコピーを取れます。
rsync
と --one-file-system
でバックアップ
--one-file-system
を rsync で使えば、この通り。
rsync -avz --progress --one-file-system / server01:/home/takuya/backup
たとえば、USBメモリに、バックアップを取る。
mkdir -p /mnt/work/chroot mount /dev/sdb1 /mnt/work/chroot rsync -avz --progress --one-file-system / /mnt/work/chroot
tar
と --one-file-system
でバックアップ
--one-file-system
をtar コマンドとを使えばこの通り。
tar cvf - / --one-file-system | ssh server01 'cat | pigz - > raspi.tgz '
USBメモリに、tar バックアップを取る。
tar cvf --one-file-system - / | tar xvf - -C /mnt/work/chroot
なぜこんなことをしているのか。
感のいい読者さんなら、なぜdump/restore
を使わないんだ。なぜLVM Snapshotを使わないんだと思うかもしれません。
dump/restore は ext4 ファイルシステムが前提です。今回は非ext4 でした。
なぜLVMスナップショットを使わないのかは、そもそもRaspberry Pi は標準インストールがext4です。LVMは非搭載です。
btrfs なら send /recieve があるだろ。と思うかもしれません。今回はbtrfs に限定せずにext4 でも btrfs でも使える方法を模索した結果です。
Raspberry Pi のような ext4 ディスクに最適です。dump/restoreやdd/ddrescue別コマンド体系を覚えなくてすみます。初心者向けではないでしょうか。
--one-file-system
のメリット
--one-file-system
はいくつかのGNUコマンドで使えます。
私がちょっと調べた限りでは、 tar
、 rsync
、なんと cp
コマンドで扱える。
ファイルシステムを横断しない、別のファイルシステムは無視するので、ext4 ベースのシステムには便利です。
バックアップのために仮想マシンを停止しなくて良い、スナップショットをつかなくてもいい。とある程度手軽です。
デメリット
巨大ファイルの高頻度の書き込みがあると、rsync に失敗する。rsync 中にファイルが更新されてしまうと、Rsyncに失敗します。
そのため、巨大ファイルがある場合は、プロセスを停止しておくか、Syncのインターバルの調整が必要です。
例 スワップファイルを停止する
sudo swapoff /var/swapimg
例 ext4 に書き込みタイミングを遅らせる /etc/fstab
### ext4 に書き込みは5分一回にする。 LABEL=writable / ext4 discard,errors=remount-ro,commit=300 0 1
まとめ
--one-file-system
でルートファイルシステムのコピーは恐ろしく簡単になります。
とくに、RaspberryPi( / , /boot 分離構成
かつ Ext4デフォルト
) のルートファイルシステムを手軽に扱えて便利でした。
もっと早く知りたかった。
参考資料
https://superuser.com/questions/626141/rsync-recursive-on-same-mount-only