[Raspberry Pi] 不再備份整張SD卡,縮小RaspberryPi備份容量

作者

袁佑緣

時間

三小時

難度

***

材料表

  1. Raspberry Pi  (2018 Pi3+測試中)
  2. PC
  3. SD Card

在使用Raspberry Pi時, 我們常希望如果能夠將辛辛苦苦安裝完的系統備份起來, 以後只要將這個備份出來的映像檔燒錄到新的SD Card上, 就可以還原之前的系統了。

好比說在這篇文章中 [AI人工智慧應用] 在Raspberry Pi上安裝NCSDK , 光是安裝NCSDK以及編譯OpenCV函式庫就要花上快半天的的時間, 要是能夠直接備份系統的話, 以後就不用再花時間一直重新安裝了。

所以本篇將介紹如何備份Raspberry Pi的系統, 並把它做成映像檔存起來, 另外,一般來說備份出來的映像檔都會相當大, 好比說原本的記憶卡是16GB大小的, 備份出來的映像檔就會有16GB這麼大, 保存或傳輸檔案都非常不方便, 所以文章的後半段會探討怎麼縮減備份映像檔, 希望盡量壓縮到方便傳輸的大小, 例如本範中將原本16GB的映像檔縮減並壓縮到3.8GB大小的壓縮檔。

 

Windows系統下備份映像檔

在Windows作業系統下備份映像檔我們需要額外下載額外的工具, 請到以下的網址下載win32diskimager。

下載完成後, 請打開win32diskimager程式, 如下圖, 並點擊Device旁邊的資料夾圖示, 選擇映像檔要存檔的位置。

如下圖,選好存檔位置後,打上要存檔的檔名。

完成後,請將要備份的Raspberry Pi SD Card插到電腦上, 並在Device那邊選擇磁區, 如下圖的F槽, 選完按下下方的Read按鈕就會開始備份囉!

Linux系統下備份映像檔

在Linux系統下進行備份的話, 除了可以使用指令直接進行備份外, 還可以對備份出來的映像檔進行縮減大小的加工。

如果讀者的電腦不是Linux的作業系統的話, 建議可以參考此篇的教學[AI 人工智慧應用] MovidiusNCS在PC中設定Ubuntu虛擬機並執行NCSDK(上),使用虛擬機安裝一個Ubuntu linux的作業系統。

接下來我們進到正題, 首先請打開終端機, 輸入以下的指令

sudo dd bs=4M if=/dev/mmcblok0 | zip NCS-raspbian.zip -

讓我們一步步拆解這行指令的內容, /dev/mmcblok0是Raspberry Pi的SD Card插到電腦上後, 電腦辨識出的磁區位置(不同的電腦可能會辨識出不同的位置), 接著我們用dd指令將整個SD Card上的資料以4M的block size進行備份, 備份的過程中我們把這個備份出來的映像檔, 經過pipe(|)傳到zip指令中, 即時的使用zip指令將這個映像檔做壓縮, 最後存成一個壓縮檔叫做NCS-raspbian.zip, 至於前面加了sudo是因為要取用/dev/mmcblk0的話, 會需要用到超級使用者的權限。

順代一提, 使用dd這個備份工具的話, 預設是沒有明顯的備份過程顯示, 所以常常不知道現在的進度到那裡了, 所以筆者建議可以在dd指令中多加一個參數, 將dd的狀態(status)用progress這隻小程式顯示出來。

sudo dd bs=4M if=/dev/mmcblok0 status=progress | zip NCS-raspbian.zip -

備份過程如下圖。

另外如果說讀者的電腦上沒有progress這隻小程式的話, 可以透過系統的套件管理員來安裝, 如下圖(以Ubuntu系統為例)。

sudo apt-get install progress

縮減備份映像檔的大小

實際上, 備份出來的映像檔雖然經過zip壓縮後, 看起來會比較小, 但是在燒錄到新的SD Card時, 還是會解壓縮成原始的大小, 也就是原本的SD Card大小如果是16GB(即便是Raspberry Pi的系統實際上只用了6GB左右), 所以在這一小節, 我們要來探討一下怎麼縮減掉映像檔中不必要的部份。

首先我們把剛剛備份出來的壓縮映像檔解壓縮。 請輸入以下指令來解壓縮, 並存成映像檔NCS-raspbian.img。

unzip NCS-raspbian.zip NCS-raspbian.img

接著我們使用fdisk看一下這個映檔的內容以及大小, 如下圖, 應該會看到兩個部份, 一個其實就是Raspbian的boot的部份, 另外一個則是存放root系統的磁區。

我們記下第二個部份的Start位置, 如上圖的94208, 接下來將這個sector數值乘上512, 轉成標記第二個磁區的offset(單位是bytes) 並用losetup掛載到Linux系統上的loop device(/dev/loop0)

sudo losetup /dev/loop0 NCS-raspbian.img -o $((512*94208))

完成後, 先確認所使用的系統中有沒有gparted這隻程式, 如果沒有的話, 請使用套件管理員將它安裝完成, 以Ubuntu為例,

sudo apt-get install gparted

接著輸入以下的指令來對/dev/loop0這個裝置進行進一步的操作,

sudo gparted /dev/loop0

成功執行的話, 應該可以看到如下的視窗跳出。

請點選/dev/loop0這個裝置, 並按下右鍵選擇Resize, 最後拉動上方的磁區大小滑桿, 拉到想要縮減到的大小(建議在Minimum size外再留一些空間會比較好喔), 如下圖。

Resize設定完成後, 回到主畫面, 並按下上方的Apply按鈕, 開始進行重新劃分大小。

劃分過如下圖。

Resize完成後, 先別急著關掉, 請在Details那邊找到shrink file system底下的resize2fs -p ‘/dev/loop0’ 8388608K (詳細的數字可能有所不同), 這個數字是待會要進行縮減映像檔大小時會用到的數字。

 

怕忘記的話, 建議讀者可以按下Save Details把資料存起來。

最後我們不需要這個loop裝置了, 請輸入以下指令將它消掉。

sudo losetup --detach-all

最後我在重新使用losetup將整個映像檔掛到loop裝置上, 並使用fdisk工具來對它做重新切割磁區。

sudo losetup /dev/loop0 NCS-raspbian.img
sudo fdisk /dev/loop0

接下來, 在fdisk中輸入 d(刪除磁區), 2(指定刪除磁區2), n(新增一個磁區), p(選擇主要磁區), 2(選擇為磁區2), 94208(使用前面記下的起始sector), +8388608K(使用剛剛gpated中記下的縮減後的大小)

實際操作如下圖。

最後輸入w(寫入新的磁區分割), 過程中如果出現以下的提示, 請輸入N, 以保留ext4的檔案格式。

重新切割完磁區後可以輸入

sudo losetup --detach-all

來退出loop裝置。

改完磁區大小後, 我們要把映像檔中的多餘的部份去掉, 請先輸入

fdisk -l NCS-raspbian.img

並記下End Sector的位置, 如圖中的16871423。

最後使用truncate指令來去掉End Sector以後不要的部份。

truncate -s $((512*(16871423+1))) NCS-raspbian.img

讀者可以輸入以下的指令來查看裁剪過的映像檔明顯變小了(14.7GB → 8.1GB)

ls -lh NCS-raspbian.img

(補充) 使用pishrink來縮減映像檔大小

這邊補充網路上有人分享的專門用來縮減Raspberry Pi映像檔的工具, 叫做pishrink, 詳細的介紹可以去參考這個

請輸入以下的指令下載pishrink腳本。

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

將pishrink檔案屬性改為執行檔, 並用超級使用者的權限去執行縮減映像檔大小, 如以下的範例中, 用pishrink來縮減backup.img這份備份的映像檔。

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

燒錄映像檔到新的SD Card上

以上的映像檔縮減操作完成後, 建議可以重新做個壓縮檔, 讓檔案在更小一點方便傳輸。

zip NCS-raspbian.zip NCS-raspbian.img

現在如果說我們要將這個備份的映像檔壓縮檔燒錄到新的SD Card上時, 我們可以透過https://etcher.io/[Etcher]燒錄軟體,

指定映像檔的壓縮檔位置

插入SD Card後選擇裝置的位置,按下Flash燒錄即可。

 相關文章:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *