開發的過程中免不了許多地修修改改,定期地將資料備份是良好的習慣,當發生不可預期又不可逆的錯誤時,若是沒有備份就欲哭無淚了。
此外,每當要起一個新的樹莓派開發專案,若是每一次都要從頭下載安裝 OS 、安裝開發環境所需套件、進行個人化設定等等,總是要花上不少時間。所以,如果將已經完整設置好開發環境的 SD 卡備份成映像檔保存起來,以後每當開新專案時,就只要將映像檔燒錄到 SD 卡就好,節省許多的手續及時間。
雖然網路上不乏相關教學資源,但我還是花了一點時間才摸索整理出適合自己設備的備份流程,避免日後忘記,趕緊記錄下來。
環境
- MacBook Pro 2016 ( Mac OS Big Sur v11.1 )
備份流程
1. SD 卡插入讀卡機,接上 Mac
2. 開啓 Terminal 指令工具
3. 找 SD 卡的路徑
$ diskutil list
列出所有的硬碟資訊
從檔案大小資訊等蛛絲馬跡中,應該不難找到 SD 卡的路徑 ( /dev/diskN )
以此圖為例:disk2 是 SD 卡 ID ,disk2s1是 boot 分區 ID
4. 卸載 micro SD 卡 boot 分區
$ sudo diskutil unmount /dev/diskNsN
diskNsN 請自行改為 boot 分區 ID
輸入使用者密碼,成功卸載後會顯示 Volume boot on diskNs1 unmounted
5. 執行備份指令,保存 SD 卡資料到映像檔
$ sudo dd if=/dev/diskN of=/PATH/TO/SAVED/BACKUP.dmg conv=sync bs=4k
if 表示 input file,要備份的檔案。diskN 請自行改為 SD 卡 ID
of 表示 output file,欲儲存的檔案路徑及名稱。
輸入指令後就會開始備份,游標會停住不動,等待一段時間後就會備份完畢
6. 退出 SD 卡
$ diskutil unmountDisk /dev/diskN
燒錄流程 ( 備份還原 )
燒錄流程基本上與備份完全相同。
差異在於步驟 5 的指令 if 與 of 要交換過來,diskN 改為 rdiskN( raw 模式存取 )
** 這部分要十分小心,執行 ( Enter ) 前務必再次檢查。若是備份變燒錄,或是燒錄變備份,就GG了...
$ sudo dd if=/PATH/TO/EXTRACTED/BACKUP.dmg of=/dev/rdiskN conv=sync bs=4k
壓縮資料
通常備份的資料都很大,所以可以配合 gzip 壓縮,直接輸出成壓縮過的壓縮檔。
流程都一樣,除了步驟 5 改為:
備份
$ sudo dd if=/dev/diskN conv=sync bs=4k | \
gzip > /PATH/TO/SAVED/BACKUP.img.gz
燒錄
$ gzip -dc /PATH/TO/EXTRACTED/BACKUP.img.gz | \
sudo dd of=/dev/rdiskN conv=sync bs=4k
顯示進度
執行備份或燒錄的時候只看得到游標在閃爍,透過安裝 pv ( pipe viewer ) 可以更愉悅地顯示目前的進度與速度,甚至預估尚需多少時間
安裝 pv
brew install pv
使用
使用 pv 的方法就是把它夾在 input 與 output 中間執行,例如:
$ sudo dd if=/dev/diskN | pv | sudo dd of=/PATH/TO/BACKUP.dmg
添加參數 -s [ 記憶卡容量 ] ,就會以進度條的方式呈現,並預估還要多久,例如:
$ sudo dd if=/dev/diskN | pv -s 8G | sudo dd of=/PATH/TO/BACKUP.dmg
執行時,就會像這樣:
目前最終做法
最後,這是我目前統整與試誤後,第 5 步驟最終使用的指令:
備份
sudo dd if=/dev/diskN conv=sync bs=4k |pv -s 8G| gzip > BACKUP.img.gz
燒錄(還原)
gzip -dc BACKUP.img.gz |pv -s 8G| sudo dd of=/dev/rdiskN conv=sync bs=4k
參考資料
- https://blog.vvtitan.com/2020/01/mac-osx上備份或安裝系統在樹莓派raspberry-pi-sd卡/
- https://justinheart.medium.com/在-mac-電腦上燒錄作業系統映像檔到-micro-sd-卡-5cc76dbfb2c2
- https://blog.gtwang.org/linux/dd-command-examples/