1. 程式人生 > >樹莓派 Raspberry Pi SD卡系統備份與還原

樹莓派 Raspberry Pi SD卡系統備份與還原

近半年時間用來監控陸龜的樹莓派 Raspberry Pi  還算穩定,可到了冬天龜箱裡的加熱燈長時間加熱導致樹莓派溫度很高,時不時的自動重啟。如果每次都能正常起來也就罷了,可偶爾會掛不上SD卡的檔案系統直接宕了,還得用備份還原SD卡(如果沒備份那就悲催了)。

買樹莓派的時候只想到儲存空間大能多存的東西於是買了個16GB的SD卡,可實際用了2G空間不到。最開始備份樹莓派SD卡是用windwos下的Win32DiskImager,這種備份恢復樹莓派的方式最簡單,Windows+讀卡器+Win32DiskImager 就可以對樹莓派的SD做完整的映象備份,可我的樹莓派用的16GB的SD卡,備份還原既浪費空間又浪費時間。

後來發現一種直接用dd備份樹莓派的方法,就是先在樹莓派上mount一個共享目錄(空間大於SD卡的即可),然後用

dd if=/dev/mmcblk0 of=raspberrypi.img bs=1M

備份成raspberrypi.img映象檔案,恢復的方式有兩種:一是用Win32DiskImager在windows系統上直接寫到SD卡中;二是在Linux系統中用(先fdisk -l檢視裝置)

dd if=/path/to/image/raspberrypi.img of=/dev/sdx

這種方式要考慮網路環境,如果你的樹莓派接的無線網絡卡,最好放棄這種方式,太慢!

最後介紹最終極的備份還原樹莓派的方式,利用dump 和 restore。先說明一下這種備份方式的好處:一是可以像Windows的Ghost只dump有效資料,也就是說可以最有效的節省備份空間,樹莓派有多少資料就生成多大的映象檔案;二是可以恢復到比原來SD卡空間的小的SD卡上,我原來用的樹莓派是16GB,現在可以把映象恢復到8GB或者4GB的SD中。下面看詳細步驟(不想看可以直接跳到最後的指令碼)

一、安裝需要的軟體

dosfstools:fat32分割槽格式化工具
dump:dump & restore 備份工具
parted & kpartx:虛擬磁碟工具

執行安裝指令碼

sudo apt-get install dosfstools
sudo apt-get install dump
sudo apt-get install parted
sudo apt-get install kpartx

二、生成新的img檔案
先df -h檢視下樹莓派實際使用空間然後在決定生成檔案大小,下面命令生成塊大小為1MB總大小為2500MB的映象檔案

sudo dd if=/dev/zero of
=raspberrypi.img bs=1MB count=2500

三、分割虛擬磁碟

利用parted將剛才生成的虛擬盤分割成兩個分割槽

  • 第一個分割區採用FAT32格式,由sector 8192開始到sector 12879,約62.9MB
  • 第二個分割區採用EXT4,由sector 122880開始到結束。
sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s122879s
sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s-1

四、掛載虛擬磁碟並格式化

  • loopdevice:執行 losetup 連線 img 檔案的 loop device
  • device:執行完 kpartx 後,虛擬磁碟代號。
  • partBoot:由 device 加上 p1 組合而成的 FAT32 虛擬磁碟分割槽。
  • partRoot:由 device 加上 p2 組合而成的 EXT4 虛擬磁碟分割槽。

首先建立虛擬磁碟並分割槽

loopdevice=`sudo losetup -f --show raspberrypi.img`
device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
device="/dev/mapper/${device}"
partBoot="${device}p1"
partRoot="${device}p2"

格式化虛擬磁碟分割槽

sudo mkfs.vfat $partBoot
sudo mkfs.ext4 $partRoot

五、開始備份
fat32虛擬磁碟分割槽建立好後直接用cp命令備份檔案

  1. sudo mount -t vfat $partBoot /media
  2. sudo cp -rfp /boot/* /media/
  3. sudo umount /media

ext4 linux虛擬磁碟分割槽用dump & restore 備份

sudo mount -t ext4 $partRoot /media/
cd /media
sudo dump-0uaf-/|  sudo restore -rf -
cd
sudo umount /media

六、解除安裝虛擬磁碟

sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice

經過以上六步樹莓派中的資料檔案就全部備份到raspberrypi.img中了,你既可以在Windows中用Win32DiskImager將映象恢復到SD卡,也可以在Linux用dd還原到SD卡,而且不要求恢復SD卡的大小跟原來的一樣(不同品牌相同大小的SD卡實際可用空間不一樣的,坑!),這樣就可以很方便的更換SD卡。當用此SD卡啟動樹莓派的時候執行raspi-config ->Expand Filesystem 即可擴充套件未使用的空間。

這裡就是最後的指令碼,包含了以上六步,只需要編輯sudo vi backup.sh複製以下內容,sudo chmod 777 genimg.sh,然後sudo ./backup.sh就可以在當前指令碼目錄中生成樹莓派的SD卡映象了。

#!/bin/sh
sudo dd if=/dev/zero of=raspberrypi.img bs=1MB count=2500
sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s122879s
sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s-1

loopdevice=`sudo losetup -f --show raspberrypi.img`
device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
device="/dev/mapper/${device}"
partBoot="${device}p1"
partRoot="${device}p2"
sudo mkfs.vfat $partBoot
sudo mkfs.ext4 $partRoot
sudo mount -t vfat $partBoot /media
sudo cp -rfp /boot/* /media/
sudo umount /media
sudo mount -t ext4 $partRoot /media/
cd /media
sudo dump -0uaf - / | sudo restore -rf -
cd
sudo umount /media
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice