樹莓派4B+ 備份鏡像&批量燒錄
原文:https://www.cooooder.com/archives/20200114
寫這篇文章之前,自己找了一些開源腳本,但是可能是因為實際引數與腳本設定不一致,導致一直沒能跑通,故自己一步一步調整命令,整理出以下步驟,如果你也遇到和我一樣的問題,希望你按照下面步驟一步一步來,一些復雜的命令也給出相應的解釋和標注,相信你也可以成功實作SD卡備份鏡像,
0. 準備作業
環境
- 樹莓派4B+
- 樹莓派SD卡(已裝Raspbian buster系統)
- SD讀卡器
- Ubuntu PC 環境
- VMware 虛擬機(安裝Ubuntu桌面作業系統)
準備
- 省略VMware安裝、Ubuntu安裝程序
- SD卡插入讀卡器,插入電腦USB介面
- 掛載SD卡,一般虛擬機會自動識別并掛載
- 沒有自動掛載SD卡的話可以手動掛載,選擇 虛擬機> 可移動設備 > 連接
- 掛載成功可以看到兩個檔案夾

資源
- VMware Workstation 15 Pro中文版 提取碼:t1ip
- ubuntu-20.04.1-desktop-amd64.iso 提取碼:mj7k
萬事俱備,開始備份
1. 安裝必需的工具
parted是一個用于硬碟磁區或調整磁區大小的工具
sudo apt-get install -y dosfstools dump parted kpartx
2. 建立作業目錄
mkdir ~/backupimg
cd ~/backupimg
3. uid和gid根據系統的當前用戶名來確定
uid=edward
gid=edward
4. 確定創建的鏡像IMG大小
這里預估鏡像大小 (1.2G + 53M),安全考慮起見,創建1.5G(1600M)空白鏡像IMG檔案
# 查看SD卡已用空間大小,從而確定待備份的鏡像IMG大小
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/sdb1 253M 53M 200M 21% /media/edward/boot
# /dev/sdb2 15G 1.2G 13G 9% /media/edward/rootfs
5. 創建空白鏡像IMG
# 大小1600M
sudo dd if=/dev/zero of=raspberrypi.img bs=1M count=1600
6. 檢查鏡像大小
確認鏡像檔案大小,必須要是512byte的整數倍,否則應該是第5步操作有誤,
ls -l raspberrypi.img
# -rw-r--r-- 1 root root 1677721600 Jan 13 19:29 raspberrypi.img
# 1677721600 = 1024 * 1024 * 1600
7. 查看磁區表
鏡像檔案需要磁區為bootfs和rootfs(bootfs為FAT32型別,rootfs為ext4型別)
# 執行sudo fdisk -l ,查看磁區表,確定bootfs扇區的起始,獲取三個后面需要用到的引數值:8192,532479,532480
sudo fdisk -l
# Device Start End Sectors Size Type
# /dev/sdb1 8192 532479 524288 256M W95 FAT32(LBA)
# /dev/sdb2 532480 31116287 30583808 14.6G Linux

8. 鏡像檔案磁區
# mklabel msdos:定義磁區表格式,msdos不支持2TB以上容量的磁盤,大于2TB的磁盤選gpt磁區表格式
# mkpart primary start end:primary指磁區型別為主磁區
# 這里的值需要手動執行步驟7,來設定
sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 532479s
sudo parted raspberrypi.img --script -- mkpart primary ext4 532480s -1
9. 檢查磁區是否成功
sudo parted raspberrypi.img
# 在(parted)后面輸入print free
# Number Start End Size Type File system Flags
# 16.4kB 4194kB 4178kB Free Space
# 1 4194kB 273MB 268MB primary lba
# 2 273MB 1677MB 1404MB primary
# 1677MB 1678MB 1049kB Free Space
# 輸入quit退出
10. 鏡像IMG檔案關聯loop device
鏡像檔案掛載到系統,需要利用loop device將檔案掛載到系統上
sudo losetup -f --show raspberrypi.img
# 注意這里的輸出 /dev/loop6
# 這里包括后面的loop6根據上一步命令獲取,實際使用要根據實際獲取的值進行替換
sudo kpartx -va /dev/loop6
# 查詢掛載位置
ls /dev/mapper/loop6p*
# /dev/mapper/loop6p1 /dev/mapper/loop6p2
# loop6p1對應的是img檔案磁區上的 /boot,loop6p2對應的是 /root
11. 鏡像IMG格式化
sudo mkfs.vfat -n boot /dev/mapper/loop6p1
sudo mkfs.ext4 -L rootfs /dev/mapper/loop6p2

12. loop device掛載到系統
mkdir tgt_boot tgt_Root
sudo mount -t vfat -o uid=${uid},gid=${gid},umask=0000 /dev/mapper/loop6p1 ./tgt_boot/
sudo mount -t ext4 /dev/mapper/loop6p2 ./tgt_Root/
13. 備份:備份boot
sudo cp -rfp /media/${uid}/boot/* ./tgt_boot/
14. 備份:備份root
# 設定權限,并把檔案夾清空
sudo chmod 777 tgt_Root
sudo chown ${uid}.${uid} tgt_Root
sudo rm -rf ./tgt_Root/*
cd tgt_Root/
sudo dump -0uaf - /media/${uid}/rootfs/ | sudo restore -rf -
# 注意!注意!
cd ../

15. 查看PARTUUID
# Raspbian啟動要對應磁區的PARTUUID
# 鏡像檔案對應的loop device的兩個磁區的PARTUUID
sudo blkid
# /dev/mapper/loop6p1: SEC_TYPE="msdos" LABEL_FATBOOT="boot" LABEL="boot" UUID="ED9A-5B01" TYPE="vfat" PARTUUID="816d8bf0-01"
# /dev/mapper/loop6p2: LABEL="rootfs" UUID="88f021e9-d2bc-4a0b-b8f2-778d8adbc76a" TYPE="ext4" PARTUUID="816d8bf0-02"
# boot對應816d8bf0-01,root對應816d8bf0-02
# 被替換的PARTUUID
opartuuidb=`sudo blkid -o export /dev/sdb1 | grep PARTUUID`
opartuuidr=`sudo blkid -o export /dev/sdb2 | grep PARTUUID`
# 用于替換的PARTUUID
npartuuidb=`sudo blkid -o export /dev/mapper/loop6p1 | grep PARTUUID`
npartuuidr=`sudo blkid -o export /dev/mapper/loop6p2 | grep PARTUUID`
16. 修改 ./tgt_boot/cmdline.txt
# 用 $npartuuidr 替換 $opartuuidr => PARTUUID=816d8bf0-02 替換 PARTUUID=738a4d67-02
sudo sed -i "s/${opartuuidr}/${npartuuidr}/g" ~/backupimg/tgt_boot/cmdline.txt
17. 修改 ./tgt_Root/etc/fstab
sudo sed -i "s/${opartuuidb}/${npartuuidb}/g" ~/backupimg/tgt_Root/etc/fstab
sudo sed -i "s/${opartuuidr}/${npartuuidr}/g" ~/backupimg/tgt_Root/etc/fstab
18. 卸載磁區
sudo umount tgt_boot tgt_Root
sudo kpartx -d /dev/loop6
sudo losetup -d /dev/loop6
rmdir tgt_boot tgt_Root

19. 燒錄鏡像
使用樹莓派自帶的鏡像燒錄工具燒錄Raspberry Pi Imager,將 raspberrypi.img 燒錄進SD卡,

20. 擴展root磁區
將SD卡插入樹莓派啟動,執行 df -h 查看磁盤空間會發現總大小只有1.5G,需要執行sudo raspi-config命令進行配置,Advanced Options => Expand Filesystem,將根磁區擴展到整張SD卡,
sudo raspi-config
21. Reboot重啟樹莓派生效
reboot
參考:
- 制作樹莓派img鏡像檔案
- 手動一步一步來制作備份Raspberry Pi樹莓派SD卡的img映像檔案(不用dd命令)
- BigBubbleGum-RaspberryBackup
原文:https://www.cooooder.com/archives/20200114
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267016.html
標籤:其他
上一篇:作業系統第一章作業系統引論作業
