這裡介紹在 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,就會看到這樣的操作畫面。

Win32 Disk Imager

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

Win32 Disk Imager

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

Win32 Disk Imager

「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

ifof 對調就會變成回復的動作,當然這個動作就會把原本 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

畫面會像這樣:

使用 diskutil 查看硬碟狀況

我們可以從磁碟的大小與分割區的檔案系統來判斷 Raspberry Pi 的 MicroSD 卡是哪一張,以這個例子來說,/dev/disk2 就是一張有安裝 Raspberry Pi 系統的 16GB MicroSD 卡。

確定了 MicroSD 卡的編號之後,就可以使用 dd 來備份 MicroSD 卡的資料了:

sudo dd if=/dev/rdisk2 of=~/Desktop/backup.img bs=1m

ddif 參數是指定資料來源,也就是 MicroSD 卡,而 of 則是指定備份影像檔的儲存路徑與檔案名稱,請依照自己的狀況修改。

要從備份檔回覆 MicroSD 卡的話,就將 ifof 所指定的位置對調:

sudo dd if=~/Desktop/backup.img of=/dev/rdisk2 bs=1m

diskutil 所列出來的 MicroSD 卡是 /dev/disk2,而這裡 ddif 參數所使用的是 /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

參考資料