使用tar或partclone備份樹(shù)莓派linux系統(tǒng)【備份包600多MB,可網(wǎng)絡(luò)備份恢復(fù)】
前言
- 我的樹(shù)莓派3B有兩個(gè)U盤,速度快的U盤用做日常服務(wù)運(yùn)行,以下簡(jiǎn)稱“業(yè)務(wù)U盤”。速度慢的U盤用來(lái)做救援U盤,救援U盤只是一個(gè)Lite版的Raspi OS。救援U盤平常不會(huì)插在樹(shù)莓派上。如果你不用U盤,那就假設(shè)自己有一個(gè)U盤+一張TF卡,請(qǐng)舉一反三(無(wú)非就是類似于sdb對(duì)應(yīng)mmcblk1, sdb1對(duì)應(yīng)mmcblk1p1,sdb2對(duì)應(yīng)mmcblk1p2)。
- 備份我是使用windows的git bash(安裝git就會(huì)有一個(gè)unix命令行工具),我使用的是網(wǎng)絡(luò)備份,操作比較方便。
- 相比分區(qū)克隆(比如dd),備份文件的體積小很多。Raspberry Pi OS Bookworm備份出來(lái)600多MB。
- 備份恢復(fù)有兩種方法,一種是tar,一種是partclone。tar方法是文件打包,partclone是塊級(jí)別的備份(只備份有數(shù)據(jù)的塊,所以體積和tar方式差不多)
- 本博文是作者“進(jìn)取有樂(lè)”原創(chuàng),僅發(fā)布于博客園,其他網(wǎng)站轉(zhuǎn)載請(qǐng)注明出處。
操作注意事項(xiàng)
- 下面的命令操作分
windows git bash執(zhí)行和樹(shù)莓派root用戶執(zhí)行,樹(shù)莓派root用戶執(zhí)行是指:使用類似putty、XShell之類的工具登錄樹(shù)莓派的命令行終端,使用root用戶執(zhí)行命令。 - 所有操作務(wù)必謹(jǐn)慎,結(jié)合lsblk -f、 fdisk -l、 blkid之類的命令,通過(guò)大小或其他方式確認(rèn)被操作的存儲(chǔ)設(shè)備是正確的。
- gzip壓縮/解壓可以放在樹(shù)莓派端完成,也可以放在windows端完成。windows端cpu性能高一些。兩種方式的命令是有差異的。
方法1:tar
備份步驟簡(jiǎn)述
- 插救援U盤啟動(dòng)樹(shù)莓派,再插入業(yè)務(wù)U盤,準(zhǔn)備好環(huán)境。
- 備份業(yè)務(wù)U盤第一分區(qū)前面的所有扇區(qū)
- tar命令備份業(yè)務(wù)U盤的第一分區(qū)(啟動(dòng)分區(qū))和第二分區(qū)(根分區(qū))文件系統(tǒng)上的文件
備份的詳細(xì)操作步驟
1. 插救援U盤啟動(dòng)樹(shù)莓派,再插入業(yè)務(wù)U盤,準(zhǔn)備好環(huán)境。
-
建立windows主機(jī)和樹(shù)莓派之間的ssh信任關(guān)系:
-
windows git bash執(zhí)行:
ssh root@192.168.1.33# (假設(shè)我的樹(shù)莓派ip地址是192.168.1.33)。 看看是否需要輸入密碼,如果不用輸入密碼就能直接登錄樹(shù)莓派,則可以直接跳到步驟 “獲取分區(qū)情況”。 -
檢查救援U盤的sshd服務(wù)是否可以使用密碼、公鑰登錄root賬戶,如果不行,則在樹(shù)莓派的/etc/ssh/sshd_config的末尾增加4行:
Match User root PermitRootLogin yes PasswordAuthentication yes PubkeyAuthentication yes然后重啟樹(shù)莓派sshd服務(wù),樹(shù)莓派root用戶執(zhí)行:
systemctl restart sshd.service -
如果沒(méi)有ssh秘鑰,可以在windows的git bash執(zhí)行
ssh-keygen命令來(lái)生成一個(gè)ssh密鑰對(duì),提示輸入密碼的時(shí)候,記得留空。 -
建立windows主機(jī)和樹(shù)莓派之間的ssh信任關(guān)系,使用公鑰免root密碼登錄樹(shù)莓派。操作如下:
使用windows的git bash執(zhí)行:
ssh-copy-id root@192.168.1.33# 輸入root密碼,那么兩者之間的信任關(guān)系就建立了,此時(shí)后續(xù)執(zhí)行任何ssh命令都不用輸入root密碼。
如果執(zhí)行上面命令的時(shí)候出現(xiàn)類似以下的"中間人攻擊"提示,而導(dǎo)致命令執(zhí)行失敗:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ED25519 key sent by the remote host is SHA256:MKshLA8/djHM3kxCi9S94Mak+YIOIKbP4p+fafZcGIM. Please contact your system administrator. Add correct host key in /c/Users/XXX/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /c/Users/XXX/.ssh/known_hosts:3 Host key for pi has changed and you have requested strict checking. Host key verification failed.則可以清空known_hosts文件,消除該提示,操作如下:
windows的git bash執(zhí)行:>/c/Users/XXX/.ssh/known_hosts#注意這里的XXX請(qǐng)?zhí)鎿Q成你的提示中實(shí)際出現(xiàn)的名字。
-
-
獲取分區(qū)情況:
樹(shù)莓派root用戶執(zhí)行:fdisk -l /dev/sdb# 我的是U盤,所以這里是/dev/sdb,如果插的是TF卡,則使用fdisk -l /dev/mmcblkX, (X表示數(shù)字)。
回顯如下:Disk /dev/sdb: 115.5 GiB, 124017180672 bytes, 242221056 sectors Disk model: DataTraveler 3.0 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xdf3f5459 Device Boot Start End Sectors Size Id Type /dev/sdb1 16384 1064959 1048576 512M c W95 FAT32 (LBA) /dev/sdb2 1064960 242221055 241156096 115G 83 Linux我們發(fā)現(xiàn):業(yè)務(wù)U盤第一分區(qū)的范圍是16384~1064959扇區(qū),第二分區(qū)起始于1064960扇區(qū),第一分區(qū)是FAT32文件系統(tǒng),第二分區(qū)根分區(qū)使用blkid查看,發(fā)現(xiàn)是ext4文件系統(tǒng)。
上面的回顯我們把他存在windows主機(jī)中的fdisk.txt,方便后面查看。
2. 備份業(yè)務(wù)U盤第一分區(qū)之前的所有扇區(qū)
-
其實(shí)樹(shù)莓派3B只需要備份業(yè)務(wù)U盤0號(hào)扇區(qū)就可以了,因?yàn)镸BR分區(qū)表就是存儲(chǔ)在磁盤第0號(hào)扇區(qū)的后64字節(jié)。樹(shù)莓派3B的OS不像PC的linux系統(tǒng),沒(méi)有g(shù)rub2在LBA1-62邏輯扇區(qū)寫入數(shù)據(jù)。至于樹(shù)莓派4、5我不清楚,所以建議大家保守點(diǎn),把第一分區(qū)之前的扇區(qū)都備份下來(lái)。windows的git bash執(zhí)行:
ssh root@192.168.1.33 "dd if=/dev/sdb count=16384" |dd of=udisk.dd -
注意,上面命令中/dev/sdb后沒(méi)有數(shù)字,如果你的是TF卡,/dev/sdb就替換成類似于/dev/mmcblkX,千萬(wàn)不能寫成/dev/mmcblkXpY (這里的X和Y表示數(shù)字)。
此時(shí)windows主機(jī)上,就出現(xiàn)了一個(gè)udisk.dd的文件,這個(gè)文件是業(yè)務(wù)U盤第一分區(qū)之前的16384個(gè)扇區(qū)的備份,也就是U盤的第0扇區(qū)到第16384扇區(qū)的備份
此處16384這個(gè)數(shù)字怎么來(lái)的,請(qǐng)看前面步驟。樹(shù)莓派使用不同操作系統(tǒng)這個(gè)數(shù)字會(huì)有差異,有些操作系統(tǒng)是8192個(gè)扇區(qū)。
3. tar命令備份業(yè)務(wù)U盤的第一分區(qū)和第二分區(qū)文件系統(tǒng)上的所有文件
-
樹(shù)莓派上掛載好業(yè)務(wù)U盤的第一分區(qū)和第二分區(qū),樹(shù)莓派root用戶執(zhí)行:
cd /mnt
mkdikr bootfs rootfs
mount /dev/sdb1 bootfs
mount /dev/sdb2 rootfs -
備份業(yè)務(wù)U盤的第一分區(qū)文件:
windows的git bash執(zhí)行:
ssh root@192.168.1.33 "tar -C /mnt/bootfs --one-file-system -zcpf - ." |dd of=bootfs.tar.gz bs=4K# 此時(shí),windows主機(jī)上,就出現(xiàn)了一個(gè)文件bootfs.tar.gz, 該文件是業(yè)務(wù)U盤第一分區(qū)里面所有文件的tar.gz壓縮包(壓縮是在樹(shù)莓派端完成的)。當(dāng)然你也可以把gzip壓縮放在windows電腦端完成(tar命令去掉-z選項(xiàng),不用dd命令):ssh root@192.168.1.33 "tar -C /mnt/bootfs --one-file-system -cpf - ." |gzip -c >bootfs.tar.gz -
備份業(yè)務(wù)U盤的第二分區(qū)(根分區(qū))文件:
windows的git bash執(zhí)行:
ssh root@pi "tar -C /mnt/rootfs --one-file-system --exclude=./dev/* --exclude=./lost+found -zcpf - ." |dd of=rootfs.tar bs=4K# 此處的--exclude=./dev/*的星號(hào)是指排除業(yè)務(wù)U盤根分區(qū)/dev目錄下的所有文件,而不排除/dev目錄本身
此時(shí),windows主機(jī)上,就出現(xiàn)了一個(gè)文件rootfs.tar.gz, 該文件是業(yè)務(wù)U盤第二分區(qū)(根分區(qū))里面所有文件的tar.gz壓縮包
至此,備份完成!!,windows主機(jī)上,存在4個(gè)文件:
fdisk.txt # 業(yè)務(wù)U盤的分區(qū)信息
udisk.dd # 業(yè)務(wù)U盤第0個(gè)扇區(qū)至第一個(gè)分區(qū)之前的所有扇區(qū)備份文件
bootfs.tar.gz # 業(yè)務(wù)U盤第一分區(qū)的所有文件壓縮包
rootfs.tar.gz # 業(yè)務(wù)U盤第二分區(qū),也就是根分區(qū)的所有文件壓縮包
恢復(fù)步驟簡(jiǎn)述
- 插救援U盤啟動(dòng)樹(shù)莓派,再插入業(yè)務(wù)U盤,準(zhǔn)備好環(huán)境。
- dd恢復(fù)業(yè)務(wù)U盤第一分區(qū)之前的所有扇區(qū)
- 在業(yè)務(wù)U盤的第一分區(qū)和第二分區(qū)上創(chuàng)建文件系統(tǒng)
- 掛載分區(qū),并用tar命令恢復(fù)業(yè)務(wù)U盤兩個(gè)分區(qū)的文件
- 修復(fù)cmdline.txt和fstab中的UUID
恢復(fù)的詳細(xì)操作步驟
1. 查看業(yè)務(wù)U盤情況
插救援U盤啟動(dòng)樹(shù)莓派,再插入業(yè)務(wù)U盤,準(zhǔn)備好環(huán)境。
樹(shù)莓派上,確認(rèn)業(yè)務(wù)U盤已經(jīng)識(shí)別。樹(shù)莓派root用戶執(zhí)行:
fdisk -l /dev/sdb # 回顯如下:
Disk /dev/sdb: 115.5 GiB, 124017180672 bytes, 242221056 sectors
Disk model: DataTraveler 3.0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdf3f5459
Device Boot Start End Sectors Size Id Type
/dev/sdb1 8192 242221055 242212864 115.5G 7 HPFS/NTFS/exFAT
樹(shù)莓派root用戶執(zhí)行:
blkid # 命令回顯如下:
/dev/sda2: UUID="e85df659-e51e-41f4-8cec-6954e76db4e1" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="eaf036ba-02"
/dev/sda3: UUID="7DEF-F9C3" BLOCK_SIZE="512" TYPE="exfat" PTTYPE="dos" PARTUUID="eaf036ba-03"
/dev/sda1: UUID="A039-117D" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="eaf036ba-01"
/dev/sdb1: UUID="7ECD-3E3C" BLOCK_SIZE="512" TYPE="exfat" PTTYPE="dos" PARTUUID="df3f5459-01"
從回顯看,我的業(yè)務(wù)U盤被借走,居然全部格式化了,整個(gè)業(yè)務(wù)U盤變成一個(gè)exfat分區(qū)了。
2.恢復(fù)U盤第一分區(qū)之前的所有扇區(qū)
windows的git bash執(zhí)行:
dd if=udisk.dd |ssh root@192.168.1.33 "dd of=/dev/sdb" # 從windows主機(jī)的udisk.dd文件恢復(fù)到樹(shù)莓派的/sdb,這里sdb后面沒(méi)有數(shù)字,因?yàn)檫@里對(duì)整個(gè)U盤的前16384個(gè)扇區(qū)進(jìn)行操作。
樹(shù)莓派root用戶執(zhí)行:
lsblk # 執(zhí)行l(wèi)sblk,我們發(fā)現(xiàn)業(yè)務(wù)U盤的分區(qū)變成了兩個(gè)了, 命令回顯如下:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 1 233G 0 disk
├─sda1 8:1 1 512M 0 part /boot/firmware
├─sda2 8:2 1 21G 0 part /
└─sda3 8:3 1 211.5G 0 part
sdb 8:16 1 115.5G 0 disk
├─sdb1 8:17 1 512M 0 part
└─sdb2 8:18 1 115G 0 part
3.在業(yè)務(wù)U盤的第一分區(qū)和第二分區(qū)上創(chuàng)建文件系統(tǒng):
樹(shù)莓派上root用戶執(zhí)行:
mkfs.vfat /dev/sdb1 # 業(yè)務(wù)U盤第一個(gè)分區(qū)建立vfat文件系統(tǒng)
mkfs.ext4 /dev/sdb2 # 業(yè)務(wù)U盤第二個(gè)分區(qū)建立ext4文件系統(tǒng)
4.tar命令恢復(fù)兩個(gè)分區(qū)的文件:
先掛載兩個(gè)分區(qū),樹(shù)莓派上用root用戶執(zhí)行:
cd /mnt
mount /dev/sdb1 bootfs
mount /dev/sdb2 rootfs
使用tar命令恢復(fù)分區(qū)文件,windows的git bash執(zhí)行:
dd if=bootfs.tar.gz bs=4K |ssh root@192.168.1.33 "tar --numeric-owner -C /mnt/bootfs -zpxf -" # 恢復(fù)第一分區(qū), gzip解壓是在樹(shù)莓派端完成,如果想在windows端完成解壓,則應(yīng)該寫成 gzip -dc bootfs.tar.gz |ssh root@192.168.1.33 "tar --numeric-owner -C /mnt/bootfs -pxf -"
dd if=rootfs.tar.gz bs=4K |ssh root@192.168.1.33 "tar --numeric-owner -C /mnt/rootfs -zpxf -" # 恢復(fù)第二分區(qū), 時(shí)間有點(diǎn)久,gzip解壓是在樹(shù)莓派端完成的。如果想要在windows端做gzip解壓,請(qǐng)參考上一條命令注釋。
5. 修復(fù)cmdline.txt和fstab中的UUID
-
樹(shù)莓派root用戶執(zhí)行:
blkid# 查看分區(qū)的UUID或PARTUUID。回顯如下:/dev/sdb2: UUID="0a6f7f53-6091-4310-9adf-c1704a8991a6" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="df3f5459-02" /dev/sdb1: PARTUUID="df3f5459-01" -
查看業(yè)務(wù)U盤第一分區(qū)的cmdline.txt文件和第二分區(qū)的fstab文件
樹(shù)莓派使用root用戶執(zhí)行:
cat /mnt/bootfs/cmdline.txt# 回顯如下:console=serial0,115200 console=tty1 root=PARTUUID=eaf036ba-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=CN我們發(fā)現(xiàn)/mnt/bootfs/cmdline.txt和/etc/fstab文件中的PARTUUID值和blkid顯示的值不同。那么我們只需要把上面文件中的PARTUUID修改成blkid命令顯示的真實(shí)值就可以了。
/mnt/bootfs/cmdline.txt文件中的root=PARTUUID=XXXXXXXX-YY表示過(guò)了initrd啟動(dòng)階段后,找PARTUUID值為XXXXXXXX-YY的分區(qū)作為根分區(qū)來(lái)啟動(dòng)操作系統(tǒng)。文件中的這部分內(nèi)容要修改成blkid命令回顯的實(shí)際值。所以修改后如下:
root=PARTUUID=df3f5459-02。 #當(dāng)然,如果你不想要PARTUUID,而是想要使用UUID來(lái)指定操作系統(tǒng)根分區(qū)也可以:root=UUID=0a6f7f53-6091-4310-9adf-c1704a8991a6
/mnt/rootfs/etc/fstab文件的修改同理。至此樹(shù)莓派操作系統(tǒng)的恢復(fù)操作全部完成
方法2:partclone
備份
備份步驟的前兩步(建立windows主機(jī)和樹(shù)莓派信任關(guān)系、dd備份業(yè)務(wù)U盤第一分區(qū)之前的所有扇區(qū))和方法1的操作一樣,可以參考前面。
樹(shù)莓派上root用戶執(zhí)行:
lsblk -f # 確認(rèn)業(yè)務(wù)U盤是否掛載,如果掛載了,就用umount卸載業(yè)務(wù)U盤,防止后面的備份過(guò)程中有寫入操作。同時(shí)這里我們也能看出業(yè)務(wù)U盤第一個(gè)分區(qū)是vfat文件系統(tǒng)。所以備份第一個(gè)分區(qū)我們要使用partclone.vfat命令
windows的git bash執(zhí)行:
ssh root@192.168.1.33 "partclone.vfat -c -s /dev/sdb1" |gzip -c >bootfs.vfat.partclone.gz # 備份業(yè)務(wù)U盤第一分區(qū),gzip壓縮是在windows端完成的。如果你想在樹(shù)莓派端完成gzip壓縮,則要寫成:ssh root@192.168.1.33 "partclone.fat32 -c -s /dev/sdb1 |gzip -c " | dd of=bootfs.fat32.partclone.gz bs=4K
ssh root@192.168.1.33 "partclone.ext4 -c -s /dev/sdb2" |gzip -c >rootfs.ext4.partclone.gz # 備份業(yè)務(wù)U盤第二分區(qū)
恢復(fù)
恢復(fù)的前3個(gè)步驟和方法1的一樣,可以參考前面。
windows的git bash執(zhí)行:
gzip -dc bootfs.vfat.partclone.gz |ssh root@192.168.1.33 "partclone.vfat -Cr -o /dev/sdb1" # 恢復(fù)業(yè)務(wù)U盤第一分區(qū),解壓縮是在windows端完成的
gzip -dc rootfs.ext4.partclone.gz |ssh root@192.168.1.33 "partclone.ext4 -r -o /dev/sdb2" # 恢復(fù)業(yè)務(wù)U盤第二分區(qū)
修復(fù)業(yè)務(wù)U盤的UUID或PART-UUID可以參考方法1的步驟,這里不贅述。
業(yè)務(wù)U盤壞了,怎么辦?
簡(jiǎn)單,自己找一個(gè)好的U盤或TF卡,然后使用parted建一個(gè)fat32分區(qū)和一個(gè)ext4分區(qū),分別用于啟動(dòng)分區(qū)和根分區(qū),掛載好兩個(gè)分區(qū),然后把備份文件用tar命令釋放到這兩個(gè)新分區(qū),修復(fù)uuid即可。(我的是樹(shù)莓派3B,沒(méi)用到grub2。樹(shù)莓派4、5是否用到grub2?如果用到grub2,那么最后要記得重新安裝grub2)
posted on 2025-06-14 18:21 進(jìn)取有樂(lè) 閱讀(180) 評(píng)論(1) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)