這裡介紹在 Windows、Linux 與 Mac OS X 中,如何備份與回復樹莓派 Raspberry Pi 的 MicroSD 記憶卡。
在使用樹莓派(Raspberry Pi)時,不管是開發與測試嵌入式系統,或是作為娛樂用途,對於新手而言,不小心把整個系統搞砸以致於重灌整個系統是常有的事情,雖然樹莓派的安裝過程很容易,不過要依照異己的環境調整許多系統上的偏好設定,並且更新所有的套件也是很費時又費力的苦工。
而對於我自己這種 Linux 老手而言,雖然系統都很熟,不至於把系統搞砸,不過因為時常要測試各種核心的模組與參數,為了確保測試環境的單純,都會使用剛安裝好的系統來進行測試,所以也是常常會需要重灌系統。
除了重灌系統之外,我們也可以直接將安裝好樹莓派系統的 MicroSD 記憶卡直接備份起來,在需要的時候直接從備份檔還原,省去冗長的安裝與設定過程,以下介紹在 Windows、Linux 與 Mac OS X 中備份 MicroSD 記憶卡的步驟。
Windows
在 Windows 中若要備份或回復 MicroSD 卡的資料,可以使用 Win32 Disk Imager 這個開放原始碼的免費工具。
名稱:Win32 Disk Imager
下載網址:sourceforge
Win32 Disk Imager 是專門用來備份 USB 隨身碟、SD 卡或 CF 卡的小工具,安裝好之後,先將 MicroSD 卡插進電腦,並執行 Win32 Disk Imager,就會看到這樣的操作畫面。

首先選擇備份影像檔的儲存路徑與檔案名稱(Image File),應且選擇要備份的設備(Device),接著按下「Read」按鈕即可將 MicroSD 卡的資料全部備份至檔案中。

如果要從備份影像檔中將資料回復至 MicroSD 卡,則按下「Write」按鈕即可。

「Read」與「Write」剛好是兩個相反方向的資料複製動作,在使用時請小心選擇,如果按錯了的話,可能會造成全部的資料完全損毀!
接下來會介紹在 Linux 與 Mac OS X 中 MicroSD 卡的備份與回復方法,請繼續閱讀下一頁。
Linux
不管您是使用哪一種 Linux 發行版,備份與還原 MicroSD 卡的步驟都是一樣的。首先將 MicroSD 卡插進電腦中,使用 lsblk 檢查一下磁碟的狀況:
lsblk
輸出會類似這樣:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 400M 0 part ├─sda2 8:2 0 300M 0 part /boot/efi ├─sda3 8:3 0 128M 0 part ├─sda4 8:4 0 200G 0 part ├─sda5 8:5 0 141.6G 0 part ├─sda6 8:6 0 1.9G 0 part [SWAP] ├─sda7 8:7 0 28.4G 0 part └─sda8 8:8 0 93.1G 0 part / sdb 8:32 1 14.9G 0 disk ├─sdb1 8:33 1 60M 0 part /media/gtwang/boot └─sdb2 8:34 1 14.8G 0 part /media/gtwang/ad6203a1-ec50-4f44-a1c0-e6c3dd4c9
我們可以從磁碟的容量來辨識哪一個是 MicroSD 卡,以這裡的例子來說,我的 MicroSD 卡的容量大小是 16 GB,所以是 sdb。
如果是直接使用電腦上的 MicroSD 卡插槽,有可能會有這樣的輸出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 400M 0 part ├─sda2 8:2 0 300M 0 part /boot/efi ├─sda3 8:3 0 128M 0 part ├─sda4 8:4 0 200G 0 part ├─sda5 8:5 0 141.6G 0 part ├─sda6 8:6 0 1.9G 0 part [SWAP] ├─sda7 8:7 0 28.4G 0 part └─sda8 8:8 0 93.1G 0 part / mmcblk0 179:0 0 14.9G 0 disk ├─mmcblk0p1 179:1 0 60M 0 part /media/gtwang/boot └─mmcblk0p2 179:2 0 14.8G 0 part /media/gtwang/ad6203a1-ec50-4f44-a1c0-e6c3
這裡的 mmcblk0 就是 MicroSD 卡。
在 Linux 系統中可以使用 dd 指令來備份 MicroSD 卡:
sudo dd bs=1M if=/dev/sdb of=/home/gtwang/backup.img
if 參數所指定的 /dev/sdb 就是我們剛剛查到的 MicroSD 卡,而 of 參數所指定的 /home/gtwang/backup.img 則是要儲存備份影像檔的路徑與檔案名稱,請依照自己的狀況修改。
要從備份檔回復 MicroSD 卡的話,也是用 dd 指令:
sudo dd bs=1M if=/home/gtwang/backup.img of=/dev/sdb
把 if 與 of 對調就會變成回復的動作,當然這個動作就會把原本 MicroSD 卡中的所有資料覆蓋掉,執行前請確認 SD 卡中的資料不會再使用了。
另外我們也可以配合 gzip 將備份的影像檔壓縮,這樣可以節省備份硬碟的空間,再使用 date 自動產生日期放在檔名中,讓備份檔更好辨識:
sudo dd bs=1M if=/dev/sdb | gzip > /home/gtwang/image-`date +%d%m%y`.gz
經過壓縮的備份影像檔如果要回復的話,就先用 gzip 解壓縮,再給 dd 寫入 MicroSD 卡即可:
sudo gzip -dc /home/gtwang/image.gz | dd bs=1M of=/dev/sdb
這樣使用壓縮的影像檔進行 MicroSD 卡的備份,整個流程也是兩行指令就可以完成,很方便。
Mac OS X
在 Mac OS X 中備份 MicroSD 卡的步驟跟在 Linux 中類似,也是使用 dd 指令,只不過操作步驟有一些小差異。
首先將 MicroSD 卡插進電腦中之後,使用 diskutil 查看硬碟狀況:
diskutil list
輸出為:
/dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *1.0 TB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_HFS Macintosh HD 999.3 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: *13.1 MB disk1 /dev/disk2 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *15.9 GB disk2 1: Windows_FAT_16 RECOVERY 856.8 MB disk2s1 2: Linux 33.6 MB disk2s3 3: Windows_FAT_32 boot 62.9 MB disk2s5 4: Linux 15.0 GB disk2s6
畫面會像這樣:

我們可以從磁碟的大小與分割區的檔案系統來判斷 Raspberry Pi 的 MicroSD 卡是哪一張,以這個例子來說,/dev/disk2 就是一張有安裝 Raspberry Pi 系統的 16GB MicroSD 卡。
確定了 MicroSD 卡的編號之後,就可以使用 dd 來備份 MicroSD 卡的資料了:
sudo dd if=/dev/rdisk2 of=~/Desktop/backup.img bs=1m
dd 的 if 參數是指定資料來源,也就是 MicroSD 卡,而 of 則是指定備份影像檔的儲存路徑與檔案名稱,請依照自己的狀況修改。
要從備份檔回覆 MicroSD 卡的話,就將 if 與 of 所指定的位置對調:
sudo dd if=~/Desktop/backup.img of=/dev/rdisk2 bs=1m
diskutil所列出來的 MicroSD 卡是/dev/disk2,而這裡dd的if參數所使用的是/dev/rdisk2,兩個都是同一張 MicroSD 卡,不過/dev/rdisk2是沒有經過緩衝區、直接進行存取的 raw device,所以讀取與寫入速度會比較快(請參考hdiutil的線上手冊)。如果使用/dev/rdisk2失敗的話,可以改用/dev/disk2。
使用 gzip 將備份的影像檔壓縮:
sudo dd if=/dev/rdisk2 bs=1m | gzip > ~/Desktop/backup.gz
經過壓縮的備份影像檔如果要回復的話,就先用 gzip 解壓縮,再給 dd 寫入 MicroSD 卡即可:
gzip -dc ~/Desktop/backup.gz | sudo dd of=/dev/rdisk2 bs=1m
