教你樹莓派4B的系統備份方法教程大全(全卡+壓縮備份)


引用:https://www.hao4k.cn/thread-41764-1-1.html


在 Windows 上用 VMware 安裝 Linux 虛擬機有個「快照」的功能,就是把你當前的系統做個備份,一旦后來誤操作把系統搞掛了之后可以恢復到備份的那個時間節點。Linux 系統開放的權限比較高,以 root 權限操作的話很有可能就會誤刪一些系統文件導致系統崩潰。我就曾把樹莓派的系統搞掛過好幾次,每次只能重新刷入鏡像,開機后還得重復一大堆操作,所以備份樹莓派的系統就很重要了。還可以把已經部署好的樹莓派系統,批量復制到更多的樹莓派上。

系統備份分為
「全卡備份」和
「壓縮備份」兩種。「全卡備份」就是將 SD 卡整體備份,操作簡單,SD 卡是多大空間的備份的鏡像就有多大,系統還原時需要更大的 SD 卡才行。「壓縮備份」只備份 SD 卡中有內容的分區,備份出來的鏡像大小基本和原來的鏡像文件差不多,方法有點復雜,備份的鏡像體積大大減小。原始的樹莓派官方鏡像第一次啟動后會自動擴展整個 SD 卡空間,恢復備份鏡像后首次開機需要 sudo raspi-config 擴展 SD 卡使用空間。
一、全卡備份
1. Win32DiskImager
全卡備份是最簡單的一種,首先在硬盤上創建一 img 后綴的空文件,打開 Win32DiskImager,選擇剛剛創建的空img 文件和 SD 卡盤符,點擊 read 既可。

等待幾分鍾后就得到了備份的 img 文件,用 Win32DiskImager 來制作鏡像時因為無法讀取到 Linux 分區,所以是全卡備份,該方法的缺點是備份文件會和 SD 卡的容量一致,而且在還原的時候必須使用比鏡像更大容量的 SD 卡。

可以看到 Raspbian 原系統只有 3.5G,備份文件是 7.4G(8G 的 SD 卡)。
2. 樹莓派上直接復制系統
准備一張空白 SD 卡,格式化 SD 卡插入讀卡器,然后插入樹莓派上,使用 umount 卸載該掛載,使用命令dd bs=4M if=/dev/mmcblk0 of=/dev/sda 就可以把樹莓派系統內容全部拷貝到 SD 卡上,mmcblk0 就是樹莓派上系統 TF卡,sda 就是插入的 SD 卡(使用 lsblk 查看),等待完成后既可以關機插入新卡重啟。

除了將原系統拷貝到 SD 卡外,也可以拷貝到 U盤之類的移動存儲設備,樹莓派3B+ 支持直接從 USB 啟動系統,樹莓派4B 暫時還不支持。
通過sudo blkid獲取已燒錄好系統的 U盤或者移動硬盤的 PARTUUID。

將系統 TF卡中/boot/cmdline.txt 中 rootpartuuid 修改為上述 uuid 重啟,即可從 USB 設備啟動系統。


該方法本質上是將原系統鏡像寫入另外一張 SD 卡,適合將你的系統復制給小伙伴用,不適合用作備份。


樹莓派的桌面系統自帶 SD Card copier,無需輸入命令,也可完成復制過程。
3. dd 命令
在樹莓派上 mount 一個共享目錄(空間大於系統的 TF 卡),然后直接用 dd 就可以備份樹莓派 dd if=/dev/mmcblk0 of=raspberrypi.img bs=1M 共享目錄在電腦上的話建議用網線連接,無線網會很慢。
或者在 Ubuntu 虛擬機中操作(會自動掛載 SD卡,未自動掛載SD卡則需要先手動掛載)。下圖中的 /dev/sdb1 /dev/sdb2 就是樹莓派的 SD 卡,其中 256M 的分區 sdb1 是 boot 分區,7.1G 的分區 sdb2 是樹莓派的系統文件分區。

使用 dd 命令可以直接備份 SD 卡。這里樹莓派的 SD 卡的路徑是 /dev/sdb1 和 /dev/sdb2 ,所以備份整個 SD 卡的路徑就是 /dev/sdb。
輸入備份命令:sudo dd if=/dev/sdb | gzip>/home/hanson/Documents/rpi-back2.gz,其中備份文件要保存的位置、文件名和 SD 卡的路徑要根據實際選擇。備份的時候終端沒有進度條,像卡死一樣,等着就行。可以另開一個終端,運行如下命令,可以觀察到目標文件大小的變化。
watch -d -n 5 ls -lh /home/hanson/Documents/rpi-back2.gz

這個命令可以在備份的同時打包文件,壓縮完成后的 .gz 文件只有 1.9G,解壓后是 7.5G,本質上也是全卡復制。
還原的時候在 Windows 下解壓文件需要加上.img 后綴。Linux 下的還原方法 sudo gzip -dc /home/hanson/Documents/rpi-back2.gz | sudo dd of=/dev/sda
二、壓縮備份
1. 原理
樹莓派的官方系統是基於 Debian 的,主要是兩個分區:啟動分區(boot)、根分區(root),燒錄系統的時候就是將這兩個分區寫入 SD 卡。首次開機后需使用raspi-config來擴展 root 分區的大小,boot 分區不變,來達到使用所有 SD 卡內容量的目的(最新的系統已經不需要擴展操作)。
對於樹莓派系統的備份,主要就是對 boot 和 root 分區的備份。而 root 分區里面只有一部分空間存儲有內容,剩下的部分是空的,如果直接備份的話那就是整個 SD 卡空間備份,也就是上面所說的全卡備份。而壓縮備份則是備份 boot 分區和 root 分區中有內容的空間。


2. PiShrink 裁剪
PiShrink 是 Github 上開源的樹莓派壓縮工具,通過裁剪上面用 Win32DiskImager 或者 dd 命令全卡備份的鏡像,去掉沒有內容的分區,從而減小備份鏡像的大小。

先將全卡備份的鏡像文件復制到 Linux 中,打開終端執行wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh 下載 sh 腳本文件,默認存到/home/user目錄下,將其拷貝到鏡像所在文件夾下。執行chmod +x pishrink.sh 增加執行權限,然后執行sudo bash pishrink.sh rpi-back.img 即可。


原來 7.5GB 的備份文件就被縮減到 3.4GB。
如果你的 linux 系統是語言是中文,可能會報錯,需要制定英文運行sudo pishrink.sh raspberrypi.img
sh 腳本文件裁剪的方法比較簡單,比如果你想要在 Linux 單純使用命令行方式裁剪全卡備份文件,可以參考使用linux裁剪樹莓派完整sd卡鏡像
3. gparted
根據上述壓縮備份原理,先在 Linux 環境中將 root 分區拆分內容空間和空白空間,然后在 Windows 上用Win32DiskImager 軟件僅讀取內容空間進行備份。以下以 Windows 10 64位 + 虛擬機 Ubuntu 19.10 為例,對樹莓派4B 的 Raspbian 系統進行壓縮備份。
(1).打開虛擬機,在終端輸入sudo apt install gparted 安裝 gparted
(2).將需要備份的 SD 卡插入讀卡器然后插入電腦,等待 Linux 讀取成功。
(3).輸入sudo gparted啟動 gparted,在右上角選擇 SD 卡,可以看到 ext4 分區當中置使用了 3.78G,剩余10.88G 都是空白的。

(4).在 ext4 分區上右擊點擊 umount 卸載,然后繼續右鍵點擊更改大小。


(5).在彈出的窗口中重新分配大小,在新大小一欄填入比最小值(3689)大上三四百就行,我這里大 300M,在點擊空余空間會自動計算,然后點擊右下角 Resize,之后可以看到原來的分區只剩下 4.07G,剩下的 10.58G 空間未分配。

(6).然后點擊綠色的對號鍵確認,在彈出的對話框中點應用。


(7).等待執行完成,可以看到分區由14.66G 縮小到 4.07G,然后彈出 SD 卡,到這里 Linux 上的操作完成。


(8).將 SD 卡重新插到 Windows 上,新建一個空白 img 文件,打開 Win32DiskImager 軟件,選中該文件,然后勾選‘’僅讀取已分配分區‘’(注意要最新版,舊版本沒有這個功能)。


(9).等待讀取完成,壓縮的鏡像備份就制作完成了,源鏡像文件 3.9GB,備份的鏡像文件 4.5GB,如果壓縮一下的話就只有 1.8GB 了,適合存儲。


4. 樹莓派 / Linux 命令行
這種方法完全利用 Linux 命令操作,使用 dump 和 restore 來制作樹莓派的 img 鏡像,具體過程來自CSDN的Blog,我按照文中步驟實際操作了一番。

(1).查看系統所占容量
先用 df -h 命令查看當前系統所占容量,以確定將來要生成備份鏡像的大小,若樹莓派所占空間小於 SD 卡空間的 50%,就可以在樹莓派內部直接生成鏡像。否則要將備份的鏡像生成到掛載的外置 SD 卡里面。

可以看到樹莓派有 boot 和 root 兩個分區,所占大小為 3.5G+253M=3.8G,因為格式轉換,所以會損耗 5%~10%,總大小大約 3.8*1.1=4.2G。如果 SD 卡剩余空間大於這么多就可以接着往下進行了。
(2)安裝所需的軟件
sudo apt-get install dosfstools dump parted kpartx
dosfstools:fat32分區格式化工具 dump:dump & restore 備份工具 parted & kpartx:虛擬磁盤工具
(3).根據第一步計算的系統所占用空間,用 dd 命令創建一個大約 4.5G的空白鏡像 raspberrypi.img,這個過程大約幾分鍾完成。 sudo dd if=/dev/zero of=raspberrypi.img bs=1M count=4500
注意這里 bs=1M(1M=1024x1024Bytes)。

(4).分割虛擬磁盤
通過sudo fdisk -l /dev/mmcblk0得知:第一個分區為 boot 分區,采用 FAT32 格式,由 sector 8192 開始到sector 532480;第二個分區采用 EXT4,由 sector 540672 開始到空白 img 結尾。

sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 532480s
sudo parted raspberrypi.img --script -- mkpart primary ext4 540672s -1
分區的起始扇區數都是 8192 的倍數,上述命令中 8192 基本是固定的,532480 和 540672 根據你自己的實際查詢情況修改,-l 表示到文件末尾。
檢查分區是否成功sudo parted raspberrypi.img,在 parted 程序中,輸入 print free 命令可以顯示分區內容,輸入 quit 退出。

(5).掛載虛擬磁盤並格式化
設置 img 文件對應的 Loop device:sudo losetup -f --show raspberrypi.img下一行命令輸出了 /dev/loop0。(如果不是 loop0 的話以后的各個步驟里的 loop0 都要改成和這里一樣的)。

接着sudo kpartx -va /dev/loop0


此時 loop device 就設置好了,loop0p1 對應的是 img 文件分區上的 /boot,loop0p2 對應的是 /(根)。
然后格式化 img 文件中的兩個分區。
sudo mkfs.vfat -n boot /dev/mapper/loop0p1
sudo mkfs.ext4 /dev/mapper/loop0p2

掛載目標 img 文件 loop device 到新建的目錄下。
mkdir tgt_boot tgt_Root sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/ sudo mount -t ext4 /dev/mapper/loop0p2 ./tgt_Root/
這里是在樹莓派系統里面做備份操作的,如果是用其他 Linux 系統,請注意 uid 和 gid 的設置。
(6).開始備份
【備份/boot】
首先備份 /boot,直接拷貝即可sudo cp -rfp /boot/* ./tgt_boot/(如果是用其他 Linux 系統,/boot/* 換成你掛載的 SD 卡,比如 dev/sdb1)

運行完出來一堆提示:failed to preserve ownership for...,進圖形界面查看了下:


文件都復制成功了,只是文件的權限沒有復制過來,影響不大。

【備份“/”】
備份根文件系統用 dump/restore 方法,首先對目標掛載點設置合適的權限,並清空。(如果是用其他 Linux 系統,將 pi.pi 替換成對應的用戶名和用戶組)
sudo chmod 777 tgt_Root sudo chown pi.pi tgt_Root sudo rm -rf ./tgt_Root/* cd tgt_Root/
然后開始備份
sudo dump -0uaf - / | sudo restore -rf - (如果是用其他 Linux 系統,/ 換成你掛載的 SD 卡,比如 dev/sdb2)

整個 dump/restore 過程需要幾分鍾時間,看到 DUMP IS DONE 就說明備份成功了。
如果上述方法的 sudo dump … 那一步出現 Broken pipe、 Illegal instruction等錯誤而失敗的話,可以使用tar方法,把源 SD卡的根文件系統打包,所以在本機系統空間里需要額外的和源SD卡的根文件系統已用空間大小一樣的可用空間,詳細過程見原作者。
(7).修改相應的 PARTUUID
此時備份已經完成,還需要修改下 Raspbian 啟動對應分區的 PARTUUID,也就是修改目標 img 文件里的下面兩個文件:./tgt_boot/cmdline.txt 和./tgt_Root/etc/fstab
首先查看 img 文件對應的 loop device 的兩個分區的 PARTUUID: sudo blkid

這里可以看到 /boot 對應的是 594e62d6-01 , / 對應的是 594e62d6-02
修改 cmdline.txt 文件 sudo vi ./tgt_boot/cmdline.txt

修改 fstab 文件 sudo vim ./tgt_Root/etc/fstab


(8).收尾工作
卸載各個掛載的分區: sudo umount tgt_boot tgt_Root
刪除loop device:sudo kpartx -d /dev/loop0 和 sudo losetup -d /dev/loop0
刪除掛載點目錄:rmdir tgt_boot tgt_Root
最后只剩下 img 文件

將其通過 WinSCP 拷貝到 Windows 電腦上保存。或者直接在樹莓派中 dd if=/home/xxx/xxx.img of=/dev/sdb bs=4M ; sync 燒寫 img 文件到其他 SD 卡中(鏡像目錄使用 if= 來指定,外接U盤設備的地址使用 of= 來指定,不一定是 sdb,最后的 bs=4M 指定一次寫入字節數,sync 同步數據),同樣的在樹莓派中運行后,要先用 raspi-config 先把分區空間 expand 一下。
這種方法雖然步驟比較多,但是照着一步步走下來可以對整個備份的全部技術細節有詳細的了解。
5. sh 腳本一鍵備份
上述純 Linux 命令行進行壓縮備份的步驟繁瑣,可以把全部步驟寫成一個 .sh 腳本文件,這樣的話只需要執行該腳本文件就能自動執行完壓縮備份命令了。
使用上述腳本只需要在樹莓派中新建一個.sh文件sudo vi backup.sh,sudo chmod 777 backup.sh 更改權限,然后 sudo ./backup.sh 就可以在當前腳本目錄中生成樹莓派的備份鏡像文件了,然后還需要手動修改下PARTUUID。之后既可以在 Windows 中用 Win32DiskImager 將鏡像恢復到SD卡,也可以在 Linux 用 dd 命令還原到 SD 卡,當用此 SD 卡啟動樹莓派的時候執行 raspi-config ->Expand Filesystem 即可擴展未使用的空間。
sh 腳本首先需要能夠讀懂才能使用,里面有的參數需要修改以適合你自己的環境。sh 腳本如果報錯了不容易查找問題原因,建議還是先把 Linux 命令的全部流程走通了再來用這個腳本,這樣的可以知道哪一步出錯了從而修改。
6. 推薦腳本
這里還有一個腳本是我最推薦使用的,程序內容太長,我就不貼上來了,具體腳本內容我也沒有完全讀懂,反正簡單易用,也是我目前使用的備份方法,可以去這里下載,使用方法如下:
step1:下載腳本文件 rpi-backup.sh 到 Linux 系統中
step2:把需要備份的 SD 卡插入 Linux 系統中,用 df -h 命令查詢下 SD 卡對應的設備名。

step3:進入腳本文件 rpi-backup.sh 所在目錄,只需要下面兩行命令即可完成 SD 卡備份,最終 img 文件會生成在~/backupimg/文件夾下。
sudo chmod +x rpi-backup.sh (需要賦可執行權限)
./rpi-backup.sh /dev/sdb1 /dev/sdb2(腳本執行有兩個參數,第一個參數是樹莓派SD卡/boot分區的設備名:/dev/sdb1,第二個參數是/分區的設備名:/dev/sdb2,視情況修改)

三、總結
全卡備份肯定是不可取的,如果你是新手小白的話,建議先在 Windows 上用 Win32DiskImager 或者樹莓派上的 SD Card copier 全卡備份,然后用 PiShrink 進行裁剪,代碼量最低,簡單不容易出錯,就是比較耗時。
如果你熟悉一點 Linux 的基本操作的話可以在 Linux 虛擬機中用 gparted 圖形界面來進行備份。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM