259.ラズパイ無双[6_バックアップと復元]
初回:2022/6/1
Raspberry Pi (ラズベリーパイ、通称"ラズパイ")で何か作ってみようという新シリーズです。今回は、ラズパイのOSを含むSDカードの丸ごとバックアップと復元について、述べたいと思います。
P子「SDカードの書き換え寿命も気になるもんね」※1
256.ラズパイ無双[4.SDカード延命]編でも述べたように、SDカードは1000回から数千回の書き込み寿命と言われています。ある程度設定が完了した時点で、SDカードを丸ごとバックアップしておけば、万一つぶれた場合でも復元が簡単にできます。
バックアップと言っても、個別のファイルの事ではなく、イメージバックアップについて説明します。
イメージバックアップの利点は、インストールや設定情報など、すべての状態をバックアップしておける点です。逆に欠点としてはデータ容量が大きくなるという事です。それこそ、SDカードの容量と同じサイズのイメージファイルが作成されてしまいます。なので、イメージファイルそのものを縮小してから、ZIP圧縮することで、保管しておくファイル容量を出来るだけ小さくします。
1.SDカードのまるごとバックアップ
(1)Win32DiskImagerのダウンロード
Windows PCに Win32DiskImagerをダウンロードします。
https://sourceforge.net/projects/win32diskimager/files/latest/download
(2)Win32DiskImagerのインストール
ダウンロードしたインストーラをダブルクリックして実行します。
(3)SDカードイメージの吸い上げ
丸ごと吸い上げなので、SDカードの容量分のイメージが作成されます。
(a) コピーしたいSD カードをWindows PC に挿します。
(b) Win32DiskImager のアイコンをダブルクリックして起動します。
(c) コピーしたいSD カードのドライブ表示を確認します。
(d) ドライブ表示の横のフォルダーアイコンをクリックしてSDカードの
保存先フォルダとファイル名を指定します。
ファイル名は、保存する前は存在しないため、「ファイル名」欄に
打ち込んで「開く」ボタンを押します。
(e) 指定した保存先が、ファイル名の欄に反映されます。
(f) Read ボタンを押して、SD カードイメージの吸い上げを実行します。
間違えてWrite ボタンを押さないよう注意してください。
(g) 完了したらWin32DiskImager を終了し、SD カードを取り外す操作を
行って、PC から抜きます。
≪参考資料≫
https://physical-computing-lab.net/wp-content/uploads/1114c4425345d2a18eb789c235960f2c.pdf
2.SDカードの縮小
丸ごとバックアップしたイメージファイルを縮小します。同一容量表示のSDカードでも実質の容量は微妙に異なります。イメージファイルのサイズが、移し替えるSDカードの容量より大きい場合、コピーできませんが、イメージファイルを縮小しておけば、移し替えが可能になります。
縮小には色々な方法がありますが、Windows上に作成した共有フォルダをラズパイからマウントして、resizeimage.pl というperlスクリプトを、ラズパイ上で実行する方法で行います。
(1) WindowsにSDカードのバックアップ用のフォルダを作成します。
例) c:\rpibk 共有名を、rpibk とします。
フォルダ作成 → 右クリック:アクセスを許可する
→ 特定のユーザー
→ 共有する相手を選ぶところで、ユーザーを追加する
→ アクセス許可のレベルを書き込みもできるようにします。
(2) 作成したフォルダに、縮小したいイメージファイルをコピーします。
例) c:\rpibk\rspai_Bullseye64.img
(3) Windows の共有フォルダを、ラズパイからマウントする。
https://qiita.com/fstyle/items/284508cfc33af54d826d
1.cifs-utilsのインストール
$ sudo apt install cifs-utils ※ すでに install済みでした。
2.マウント用ディレクトリの作成
$ sudo mkdir /mnt/rpibk
$ sudo chmod 777 /mnt/rpibk
3.マウント
$ sudo mount.cifs //≪WindowsのIP≫/rpibk /mnt/rpibk -o user=≪ユーザー≫,password=≪パスワード≫
※ マウントの解除
$ sudo umount /mnt/rpibk
(4) 縮小スクリプトを取得する
1.「resizeimage.pl」の内容を、RPiフォーラムの『Reducing Raspbian File System Image Size』より、コードをコピーする。
https://forums.raspberrypi.com/viewtopic.php?f=91&t=58069
2.コピーした Perl のスクリプトコードを、Windowsのマウントしたフォルダにコピーする。
※改行コードLF (\n)で保存すること。
例) c:\rpibk\resizeimage.pl
/mnt/rpibk/resizeimage.pl として見えるはずです。
通常このファイルはラズパイで実行しますが、Windows でマウントしたイメージを縮小するなら、Windows 側においておけばよいでしょう。
3.スクリプトのパーミッションを変更しておく。
$ sudo chmod 755 /mnt/rpibk/resizeimage.pl
(5) 縮小処理の実行
この perl は、イメージを上書きしますので、それが嫌ならオリジナルをよけておいてください。イメージファイル名は、フルパス指定が必要ですし、実行は、resizeimage.pl のフォルダまで下がって実行します。
$ cd /mnt/rpibk
$ sudo perl ./resizeimage.pl /mnt/rpibk/rspai_Bullseye64.img
rspai_Bullseye64.img:
==========
Old size - 30436 MB (29.72 GB)
New size - 5757 MB (5.62 GB)
Image file was reduced by 24678 MB (24.10 GB)
3.イメージのZIP(7z) 圧縮
圧縮されたファイル(rspai_Bullseye64.img)を、ZIP圧縮します。
※ 32bit環境の zip は、4GBの壁があるので、7zip をインストールします。
$ tar czvf rspai_Bullseye64.img
でいいやんという意見もあるかもしれませんが、好みの問題です。
$ sudo apt -y install p7zip-full
$ cd /mnt/rpibk
$ sudo 7z a -tzip rspai.zip rspai_Bullseye64.img
<< ※ 補足 Windows上で圧縮する >>
Windows上で、7zipを使う場合、『7-Zip 64ビットWindows x64(Intel 64 or AMD64)用』 を使うと思いますが、コマンドラインで色々と行いたいので、『7-Zip Extra: コマンドラインバージョン、7z形式のライブラリ、FAR Manager用のプラグイン』を使用します。
https://sevenzip.osdn.jp/download.html
ダウンロード後、解凍して、7za.exe を c:\rpibk にコピーします。
> cd c:\rpibk
> 7za a -tzip rspai_Bullseye64.zip rspai_Bullseye64.img
4.イメージの復元
Windows上に 圧縮・縮小されたイメージを、SDカードにコピーするのは、balenaEtcher などのツールを使用します。
https://www.gigafree.net/system/os/Etcher.html
raspbianのイメージファイルを、ZIPのまま、選択することができます。
balenaEtcher は、zip 圧縮されたイメージでも、そのまま復元できます。
https://www.balena.io/etcher/
5.容量を拡張
先のイメージの復元では、まだ、縮小されたイメージのままなので、SDカードのすべての容量を使い切っていません。そこで、ラズパイ上で、SDカードいっぱいまで容量を拡張します。
※ 補足
Raspberry PiのOSイメージは、"boot"ドライブにあるcmdline.txtに、
init=/usr/lib/raspi-config/init_resize.sh
という記述があり、初期起動時に自動的に領域を拡張します。
起動後、init_resize.sh が削除されるので、次回以降は通常の起動となります。
よって、ここで作成したイメージは、自動的に拡張しないので、手動で拡張してやる必要があります。
$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/root 6.4G 4.6G 1.5G 76% /
・・・・・・・・・・・・・・・・・
$ sudo raspi-config
7 Advanced Options
A1 Expand Filesystem
または、コマンドで実行できます。
https://qiita.com/niwaken/items/2f62005ab36d10c22133
$ sudo raspi-config --expand-rootfs
一旦リブートして、df -h でファイルサイズを確認します。
なお、固定IPアドレスの場合は、コピー元のイメージと同じIPアドレスになっているため、このタイミングで変更しておきます。
とりあえず、/etc/dhcpcd.conf ファイルを直接編集しました。
$ sudo nano /etc/dhcpcd.conf
interface eth0
static ip_address=172.27.26.43/24
static routers=172.27.26.230
static domain_name_servers=172.22.1.55
static domain_search=172.20.0.100
$ sudo reboot
$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/root 29G 4.6G 24G 17% /
・・・・・・・・・・・・・・・・・
SDカードをバックアップした時から時間が経過していますので、update を実行しておきます。
$ sudo apt update && sudo apt -y upgrade && sudo apt -y autoremove && sudo apt autoclean
6.参考資料
https://arakoki70.com/?p=3621
Raspberry Pi Perlスクリプトによる SDカードの縮小
http://denshikousaku.net/reduce-raspberry-pi-img-file-to-write-on-smaller-micro-sd-card
Raspberry Piのimgファイルを縮小してマイクロSDカードに書き込む
https://pspunch.com/pd/article/rpi_shrink_img.html
imgファイルを縮小する (Win/MacマシンとRPi、USBメモリのみ使用)
https://itdecoboconikki.com/2017/02/16/raspberry-pi-backup-img-make/
ラズベリーパイのバックアップをimgファイルでお手軽に
https://azriton.github.io/2017/11/12/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%AEOS%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E7%84%BC%E3%81%8F%E3%81%A8%E3%81%8D%E3%81%AFEtcher%E3%81%8C%E4%BE%BF%E5%88%A9%EF%BC%86UI%E3%82%AB%E3%83%83%E3%82%B3%E3%81%84%E3%81%84/
ラズパイ の OS イメージを焼くときは Etcher が 便利 & UI カッコいい
https://www.balena.io/etcher/
https://arakan60.mydns.jp/04kousaku/03-05sdcopyshrunk.html
0-3-5. Raspberry Pi SDカードを容量の小さなSDカードにリサイズ
https://arakan60.mydns.jp/04kousaku/03-04sdcopyexp.html
03-4. Raspberry Pi SD Card コピーで容量を拡張する
https://www.sabo-net.info/2014/12/26/windows%E3%81%A7raspberry-pi%E3%81%AEsd%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92%E5%AE%B9%E9%87%8F%E3%81%AE%E5%B0%8F%E3%81%95%E3%81%AAsd%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC/
WindowsでRaspberry PiのSDカードを容量の小さなSDカードにコピーする方法。
AOMEI Partition Assistant
7.最後に
イメージバックアップは、OSの設定やインストールしたプログラムなども復元できる為、ある程度の設定が完了する都度、行うと復元が容易になります。
一通りの環境設定が完了した今の段階でのバックアップは、あくまで初回であり、これから各種ソフトの設定(例えば、openCvなど)が完了した時点で、行うのが良いと思います。
ほな、さいなら
======= <<注釈>>=======
※1 P子「SDカードの書き換え寿命も気になるもんね」
P子とは、私があこがれているツンデレPythonの仮想女性の心の声です。