(Raspi)SDcardは同じサイズのはずが・・・バックアップのやり方を考える

1.理想的には

raspberry pi のバックアップ。みなさんはどうしていますか。ラズパイでサーバー運用に欠かすことのできないバックアップ作業での出来事。

dd コマンドを使用してディスクごと複製するのが理想的な気がしています。なにかトラブルがあったら、そのまま複製したディスクを使用して起動できるからです。

だから、今ではdd コマンドで週1回位の複製ディスクを作成していました。これをsdcopy という名前で /usr/local/sbin/ ディレクトリに保存。

$ sudo nano /usr/local/sbin/sdcopy

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

実行権限を与えて、cron で定期実行します。

$ sudo chmod +x /usr/local/sbin/sdcopy

$ sudo crontab -e

0 5 * * 6 /usr/local/sbin/sdcopy #土曜日ごとにバックアップを実行

2.でもでも 同一メーカの同一カードでない場合

$ lsblk

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.5G 0 disk
|-mmcblk1p1 179:1 0 200M 0 part /boot
-mmcblk1p2 179:2 0 116.3G 0 part /

同じ128GBのMicroSDカードなのですが、微妙にサイズが異なるのです(メーカーは異なります。)。何度か仕切り直してみましたが、やはり同じ結果です。当たり前といえば当たり前・・・

ちなみに 手元にあるMicroSDカードを比較したところ、samsung > transcend > kioxia の順に小さいことがわかりました。samsugなんて119.4Gも確保できるのです。値段もそれなりですが。

このように複製先が複製元のサイズより小さい場合に dd コマンドによる複製を行うと以下のようなエラーが出ます。

dd: error writing ‘/dev/sda’: No space left on device
30502913+0 records in
30502912+0 records out
124939927552 bytes (125 GB, 116 GiB) copied, 5126.35 s, 24.4 MB/s

3.解決策

こんなときはディスクまるごと圧縮ファイルで保存することが考えられ、以下の2通りの方法があると思われます。

  1. 運用をストップしてClonezilla などのアプリを使用する場合(ラズパイ版が存在するのかは調べていません。)
  2. 運用を維持しながら dd コマンドで圧縮ファイルを作成する場合

今回は2つ目の方法でやってみました。

作業手順は、

  1. 複製先のMicroSDカードを仕切り直し、ファーマット。
  2. 複製先のMicroSDカードをマウント
  3. dd コマンドで圧縮ファイルの作成

   になると思います。

$ sudo fdisk /dev/sda

(単一の領域確保し、書き込んで終了。)

$ sudo mkfs.ext4 /dev/sda

$ sudo mkdir /tmp/backup #マウント先を作成

$ sudo mount /dev/sda /tmp/backup

$ lsblk # マウントの確認

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 1 116.4G 0 disk /tmp/backup
mmcblk1 179:0 0 116.5G 0 disk
|-mmcblk1p1 179:1 0 200M 0 part /boot
`-mmcblk1p2 179:2 0 116.3G 0 part /

$ su

# dd if=/dev/mmcblk1 bs=4096 | gzip -c > /tmp/backup/20220123bak.ddimg.gz # ファイル名は日付bak.ddimg.gz

終了すると以下のようなメッセージになる。

30534400+0 records in
30534400+0 records out
125068902400 bytes (125 GB, 116 GiB) copied, 10695.6 s, 11.7 MB/s

念の為ファイルが出来上がっているか確認してみました。

# ls -al /tmp/backup

total 11721100
drwxr-xr-x 3 root root 4096 Jan 23 06:36 .
drwxrwxrwt 11 root root 220 Jan 23 06:27 ..
-rw-r–r– 1 root root 12002380581 Jan 23 09:34 20220123bak.ddimg.gz
drwx—— 2 root root 16384 Jan 23 06:26 lost+found

なお、復元は/dev/sdaをマウント後、以下のようになると思います。実際にはやっていませんが・・・

# gunzip -c /tmp/backup/20220123.ddimg.gz | dd of=/dev/sdb bs=4096

でも、これって正常に稼働するシステム(例えばメインのLinux)があることが前提となるし、このときもやはり復元先のカードはもとのカードより容量大であることが必要。やはりトラブル時の対策としては、同一メーカーの同一MicroSDカードを2枚以上利用してまるごとカードを複製するのが無難だと思います。dd-backup

4.参考

Linuxでの話ですがArchWikiにはrsyncによるフルバックアップの方法が書いてあります。大きくは、(1)rsyncによるデータのコピー、(2)fstabの修正というやり方ですが、これも試してみました。これならディスクの大きさは関係ありませんから。

rsync -aAXv –exclude={“/dev/”,”/proc/”,”/sys/”,”/tmp/”,”/run/”,”/mnt/”,”/media/”,”/lost+found”} /boot /tmp/backup01 &> /dev/null

rsync -aAXv –exclude={“/dev/”,”/proc/”,”/sys/”,”/tmp/”,”/run/”,”/mnt/”,”/media/”,”/lost+found”} / /tmp/backup02 &> /dev/null

これをやるとすべてのファイルが重複して作成されているというエラーが表示されます。1個1個消去すればよいが、波の作業ではありません。

それではって、–delete オプションをつけてやると、linux-firmwareがないっていうエラーが表示されたまま、そこから先に進みません。この方法はだめのようです。

そうそう、できる限り小さなカードに作って原本とし、それを大きなカードに複製( dd コマンド)して、複製したものを使いまわすってのも良いかも。

コメント

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