2017年6月12日

如何備份、還原處理 RPi 的 sdcard image

Raspberry Pi 使用的 sdcard 雖然同樣是 16GB,但因為不同廠牌還是有些大小的差異,備份跟還原 sdcard 有些問題,畢竟大檔案的 image 不能還原到稍小的 sdcard 中。

以下紀錄如何備份、還原及縮小 RPi 的 sdcard。

在 MAC 處理 image

  • 使用 [SD Formatter] 可格式化 SD Card
sudo newfs_msdos -F 16 /dev/disk2
  • RASPBIAN 下載 RASPBIAN JESSIE WITH PIXEL,取得 2016-09-23-raspbian-jessie.zip 解壓縮得到2016-09-23-raspbian-jessie.img

  • 重新插入 SD Card,用以下指令的結果,得知 SD Card 在 /dev/disk2 或是 /dev/disk1

diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *480.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            479.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:             Windows_FAT_32 NO NAME                 15.9 GB    disk2s1
  • umount disk2
sudo diskutil unmountDisk /dev/disk2
  • 將 img 寫入 sdcard

如果 rdisk2 有問題,就改成 disk2

sudo dd bs=1m if=~/Downloads/2016-09-23-raspbian-jessie.img of=/dev/rdisk2
  • 將 sdcard dump 到 image
sudo dd bs=1m if=/dev/rdisk2 of=~/Downloads/messenger_20170405.img

在 RPi 開機狀態直接備份 sdcard

在 RPi 上,將新的 sdcard 放入 USB sdcard Reader 接上 RPi

sudo fdisk -l

如果是 Disk /dev/mmcblk0 的設備,就是 RPi 上原始的 sdcard,以 USB sdcard Reader 接上 RPi 後,會看到增加的 /dev/sda 設備,這是新的 sdcard

下載 rpi-clone

git clone https://github.com/billw2/rpi-clone.git
sudo cp rpi-clone/rpi-clone /usr/local/sbin
rm -rf rpi-clone

用以下指令就可以將 sdcard 複製到 新的 sdcard 上

sudo rpi-clone sda -v -x

在 Windows 處理 sdcard image

使用 Win32 Disk Imager 軟體就可以備份及還原 image

縮小 RPi image

使用 PiShrink 可以在 linux 縮小 RPi image

wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh

chmod +x ./pishrink.sh
sudo ./pishrink.sh ./raspbian_backup.img

以下是執行結果,可看到檔案縮小了 2G

Creating new /etc/rc.local
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0: 301607/960992 files (0.2% non-contiguous), 3200117/3841024 blocks
resize2fs 1.41.12 (17-May-2010)
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/loop0 to 3208948 (4k) blocks.
Begin pass 2 (max = 228392)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 118)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 25082)
Updating inode references     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/loop0 is now 3208948 blocks long.

Shrunk ./raspbian_backup.img from 15G to 13G

References

How to Clone Raspberry Pi SD Card on Windows, Linux and macOS

Backup (or Clone) a Raspberry Pi SD Card

用 Win32 Disk Imager 備份和燒錄 Raspberry Pi 的 SD 卡