dd コマンドだけで実現する raspiのバックアップ

はじめに

少電力で手軽に始めるラズパイによる家庭のサーバー。家庭サーバーでも自分のデータ保存場所だったりして、バックアップは重要だ。ラズパイによるバックアップを色々試してみた。

前提として

(1)サーバーは正常に稼働していること、

(2)dd コマンドでお手軽にバックアップできること。
dd コマンドで利用できれば、障害時にもディスクを入れ替えるだけで立ち上げられるからだ。

SDカードだけで運用している場合

SDカードだけで運用している場合は起動ディスクの名称はmmcblk1 という名称が与えられている

mmcblk1 179:0 0 116.4G 0 disk
|-mmcblk1p1 179:1 0 200M 0 part /boot
`-mmcblk1p2 179:2 0 116.2G 0 part /

これにバック先のディスクとして同じメーカーの同じSDカードをUSBカードリーダー(例えばMR3-D011BKなど)を介してUSB接続する。

このディスクには /dev/sda と認識されます。

この状態でdd コマンドを使用してバックアップを行う。

$ sudo dd if=/dev/mmcblk1 of =/dev/sda bs=4096 && sync

なお、/etc/fstab は起動ドライブが最初のSDカードだけとなっている。

/dev/mmcblk1p1 /boot vfat defaults 0 0
/dev/mmcblk1p2 / ext4 defaults 0 0

再起動も問題はない。cron などに定期実行させれば、全自動バックアップシステムとなる。楽ちん!

出来上がったディスク構成は、以下のとおり。

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 1 116.4G 0 disk
|-sda1 8:1 1 200M 0 part
-sda2 8:2 1 116.2G 0 part mmcblk1 179:0 0 116.4G 0 disk
|-mmcblk1p1 179:1 0 200M 0 part /boot
-mmcblk1p2 179:2 0 116.2G 0 part /

$ sudo blkid

当然ではあるが、全く同じ UUID を持つディスクが出来上がっているので、障害時にはSDカードを入れ替えるだけでよい。

/dev/mmcblk1p1: SEC_TYPE=”msdos” UUID=”A9DD-87BD” BLOCK_SIZE=”512″ TYPE=”vfat” PARTUUID=”63f5a944-01″
/dev/mmcblk1p2: UUID=”dfef8c4f-f82f-44a3-a43b-d3f5dac07624″ BLOCK_SIZE=”4096″ TYPE=”ext4″ PARTUUID=”63f5a944-02″
/dev/sda2: UUID=”dfef8c4f-f82f-44a3-a43b-d3f5dac07624″ BLOCK_SIZE=”4096″ TYPE=”ext4″ PARTUUID=”63f5a944-02″
/dev/sda1: SEC_TYPE=”msdos” UUID=”A9DD-87BD” BLOCK_SIZE=”512″ TYPE=”vfat” PARTUUID=”63f5a944-01″

USB接続のHDD(SSD)で運用している場合

一番かんたんなのは、USBーAからSDカードに変換するアダプターがあればよいのだが、そんなものは聞いたこともないし、ググっても出てこない。この逆はいくらでも存在するが・・・・

前提として、USB接続のHDDで起動できるようになっていること。

そのためにはこのあたりを参照のこと。

そして、SDカードでの運用と同じことをやればできるかと思い始めたのがきっかけ。

現在のシステム構成を書き出すと以下のとおり。

OS: Rasberry Pi OS (Linux N2 5.10.103-v8+ #1529 SMP PREEMPT Tue Mar 8 12:26:46 GMT 2022 aarch64)
USB-HDD: I-O DATAカクうす 1TB
この容量であれば個人で運用するには十分だし、特別の補助電源がいらないので非常に便利。

現在のディスク構成は

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 49M 1 loop /snap/core18/2289
loop1 7:1 0 49M 1 loop /snap/core18/2349
loop2 7:2 0 49M 1 loop /snap/core18/2406
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 256M 0 part /boot
└─sda2 8:2 0 931.3G 0 part /

これにもう1台のカクうすをUSB接続して dd コマンドでバックしたい、というのがここでの狙いです。

(1)/etc/fstab の修正と再起動

$ sudo nano /etc/fstab

同じUUIDのディスクが出来上がるので、UUIDによる起動はできません。

proc /proc proc defaults 0 0
PARTUUID=0f72a50c-01 /boot vfat defaults 0 2
PARTUUID=0f72a50c-02 / ext4 defaults,noatime 0 1

↓ 以下のように書き換えます。

/dev/sda1 /boot vfat defaults 0 2
/dev/sda2 / ext4 defaults,noatime 0 1
# PARTUUID=0f72a50c-01 /boot vfat defaults 0 2
# PARTUUID=0f72a50c-02 / ext4 defaults,noatime 0 1

再起動して、この設定で無事立ち上がることを確認します。

$ sudo shutdown -r now

(2)同一のドライブの追加

そのままディスクをUSB接続すると、認識は可能ですが、以下のようなエラーを吐き、dd コマンドによるコピーに失敗します。無限ループに入るからです。CTRL +Z でこの無限ループは抜け出せます。

dd: error reading ‘/dev/sda’: Input/output error
612605+162906 records in
775511+0 records out
3176493056 bytes (3.2 GB, 3.0 GiB) copied, 74.5537 s, 42.6 MB/s

しかし、こうなると強制的に電源を切るしかなくなります。

$ sudo reboot

-bash: /usr/bin/sudo: Input/output error

コマンドを受け付けません。

電圧不足と考えられますので、ACアダプターによる補助電源を準備します。別売りなので、私は後から買い足しましたが、こういう用途に使用することが決まっている場合は、最初から買い足しておくと便利です。私はここでセクターエラー??などと、別のディスクを用意したりハマってしまいました。別のディスクを用意してやったら、強制的にリセットがかかったことがあり、電圧不足か?と気づいた次第です。

気を取り直してやり直し。

接続すると、以下のようなドライブ構成になった。

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 49M 1 loop /snap/core18/2289
loop1 7:1 0 49M 1 loop /snap/core18/2349
loop2 7:2 0 49M 1 loop /snap/core18/2406
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 256M 0 part /boot
└─sda2 8:2 0 931.3G 0 part /
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 256M 0 part /media/pi/boot
└─sdb2 8:18 0 931.3G 0 part

$ sudo blkid

/dev/loop0: TYPE=”squashfs”
/dev/loop1: TYPE=”squashfs”
/dev/loop2: TYPE=”squashfs”
/dev/sda1: LABEL_FATBOOT=”boot” LABEL=”boot” UUID=”71DB-60DA” TYPE=”vfat” PARTUUID=”0f72a50c-01″
/dev/sda2: LABEL=”rootfs” UUID=”1d91ff59-94c1-4271-a4d5-fdf142647058″ TYPE=”ext4″ PARTUUID=”0f72a50c-02″
/dev/sdb1: LABEL_FATBOOT=”boot” LABEL=”boot” UUID=”71DB-60DA” TYPE=”vfat” PARTUUID=”0f72a50c-01″
/dev/sdb2: LABEL=”rootfs” UUID=”1d91ff59-94c1-4271-a4d5-fdf142647058″ TYPE=”ext4″ PARTUUID=”0f72a50c-02″

新規接続したディスクはUUIDが同一で、/media/pi/boot に自動マウント。これじゃだめじゃん、とばかりにマウントを解除。

$ sudo umount -R /media/pi/boot

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 49M 1 loop /snap/core18/2289
loop1 7:1 0 49M 1 loop /snap/core18/2349
loop2 7:2 0 49M 1 loop /snap/core18/2406
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 256M 0 part /boot
└─sda2 8:2 0 931.3G 0 part /
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 256M 0 part
└─sdb2 8:18 0 931.3G 0 part

よしよし!マウント解除できたので早速実行。

$ sudo dd if=/dev/sda of =/dev/sdb bs=4096 && sync

だいぶ時間がかかるので気長に待つ。2時間30分くらいかかったが、無事終了。

bs オプションの値を変えればもっと早くなるはず。ここを参照のこと。

それは後の課題として、いよいよ再起動します。

$ sudo shutdown -r now

再起動後のドライブ構成は

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 49M 1 loop /snap/core18/2406
loop1 7:1 0 49M 1 loop /snap/core18/2289
loop2 7:2 0 49M 1 loop /snap/core18/2349
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 256M 0 part /boot
└─sda2 8:2 0 931.3G 0 part /
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 256M 0 part
└─sdb2 8:18 0 931.3G 0 part

起動ドライブを入れ替えても無事起動しました。

これをCronに設定すれば、夜寝ている間にバックアップされます。

コメント

タイトルとURLをコピーしました