最小化備份樹莓派系統鏡像

    做工程時希望將樹莓派sd卡的系統備份成鏡像文件,需要使用時直接燒錄至sd卡即可。一些傳統方法製作出來的鏡像通常爲sd卡容量大小,即一張32G的sd卡實際使用空間爲4G,但製作出來的鏡像爲32G。希望製作出來的備份鏡像與sd卡實際使用的空間大小一樣,都爲4G。只通過命令行實現。

    參考文章:https://blog.csdn.net/zhufu86/article/details/78821056

    準備工具:需要備份的SD卡,讀卡器,PC(Linux)

1、安裝必備工具軟件:

sudo apt-get install dosfstools dump parted kpartx

2、將裝載sd卡的讀卡器插入PC,查看sd卡使用的空間

df -h

     如圖,此次sd卡對應的設備名爲/dev/sde,其中sde1爲boot文件,sde2爲/根目錄文件。可見,sd卡使用了7.5G+20M,則鏡像預設的大小爲8G即可。

3、建立工作目錄

mkdir ~/backupimg

cd ~/backupimg/

4、掛載源sd卡

mkdir src_boot

mkdir src_Root

sudo mount -t vfat -o uid=pcl-02,gid=pcl-02,umask=0000 /dev/sde1 ./src_boot/

sudo mount -t ext4 /dev/sde2 ./src_Root/

 

    注意,第三行指令的uid和pid爲此次備份我使用的PC的系統的用戶id和組id,使用不同的PC或不同的賬戶需要做相應修改。

5、建立一個8000M的空白img文件。

sudo dd if=/dev/zero of=ardusub-raspbian-ros.img bs=1M count=8000

    建立過程需要時間,可以在新終端通過以下指令觀察img文件大小變化可以查看進度。

watch –d –n 5 ls –lh ~/backupimg

 

6、給鏡像文件分區

cd ~/backupimg

sudo parted ardusub-raspbian-ros.img --script -- mklabel msdos

sudo parted ardusub-raspbian-ros.img --script -- mkpart primary fat32 8192s 122479s

sudo parted ardusub-raspbian-ros.img -- mkpart primary ext4 122880s -1

 

7、檢查分區是否成功

sudo parted ardusub-raspbian-ros.img

 

    輸入print free可以顯示分區內容,輸入quit退出。

8、img文件對應的loop device的設置

sudo losetup -f --show ardusub-raspbian-ros.img

 

    通過輸出結果可知此次對應的device號爲18。

sudo kpartx -va /dev/loop18

ls /dev/mapper/loop18p*

 

如上圖,loop0p1對應的是img文件上的/boot,loop0p2對應的是/根目錄。

9、格式化img文件中的兩個分區

sudo mkfs.vfat -n boot /dev/mapper/loop18p1

sudo mkfs.ext4 /dev/mapper/loop18p2

 

10、掛載img文件的兩個分區

mkdir tgt_boot

mkdir tgt_Root

sudo mount -t vfat -o uid=pcl-02,gid=pcl-02,umask=0000 /dev/mapper/loop18p1 ./tgt_boot/

sudo mount -t ext4 /dev/mapper/loop18p2 ./tgt_Root/

 

    注意,第三行指令的uid和pid爲此次備份我使用的PC的系統的用戶id和組id,使用不同的PC或不同的賬戶需要做相應修改。

11、備份/boot

sudo cp -rfp ./src_boot/* ./tgt_boot/

 

12、備份/(根目錄文件)

    由於使用dump/restore的方法遇到了不少問題,故採用了tar壓縮複製解壓的方法。

    首先對目標掛載點設置合適的權限,並清空。

sudo chmod 777 tgt_Root

sudo chown pcl-02.pcl-02 tgt_Root

sudo rm -rf ./tgt_Root/*

 

    注意第二行指令的pid.uid爲pcl-02.pcl-02爲此次PC的用戶ID和組ID,需要根據實際情況更改。

    然後壓縮根目錄下文件

cd src_Root/

sudo tar pcf ../backup.tar .

 

    壓縮過程需要較長時間,可以在新終端通過以下指令觀測backup.tar大小估計壓縮進度。

watch –d –n 5 ls –lh ~/backupimg/

 

    打包過程結束後將tar包解壓縮至img文件的根文件系統。刪除壓縮文件

cd ../tgt_Root/

sudo tar pxf ../backup.tar

cd ..

sudo rm backup.tar

 

12、修改PARTUUID

    首先獲取PARTUUID

sudo blkid

 

    找到loop18p1和loop18p2的PARTUUID。

    修改相應PARTUUID參數:

sudo vim ./tgt_boot/cmdline.txt

sudo vim ./tgt_Root/etc/fstab

    得到結果如下圖:

13、卸載各掛載的分區

sudo umount src_boot src_Root tgt_boot tgt_Root

 

14、刪除loop device

sudo kpartx -d /dev/loop18

sudo losetup -d /dev/loop18

 

15、刪除掛載點目錄

rmdir src_boot src_Root tgt_boot tgt_Root

 

16、此時,工作目錄下只剩下備份好的img鏡像文件,在linux下可以使用dd指令進行燒錄,在windows下可以使用etcher進行燒錄。

    若是覺得img鏡像文件還是太大,可以再進行壓縮

zip -r ardusub-raspbian-ros.img.zip ardusub-raspbian-ros.img

 

    得到的zip文件才2G多一點,該zip文件也使用etcher可以直接燒錄。

17、使用etcher燒錄至sd卡後,開機可能會出現sd卡空間未充分使用的情況。即系統提示只有10G的可用空間,而sd卡有32G的使用空間。此時可參照以下博客。

https://blog.csdn.net/weixin_40490238/article/details/89320293

藉助ubuntu下gparted工具,步驟基本爲:

①打開gparted;②選擇sd卡;③umount  sd卡;④調整sd卡空間大小;⑤應用修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章