摘錄部分要點內容以下(若是做者不容許轉載,請聯繫即刪除):linux
1、查看當前系統所佔容量
用Win32DiskImager來製做鏡像時是將sd卡正卡所有作成鏡像,是由於沒法讀取到linux分區的緣由,因此咱們在製做鏡像前,先要肯定咱們當前系統所佔用了多少系統空間,即備份鏡像的大小。shell
#查看當前系統所佔用的空間
#查看當前系統所佔用的空間
df -lh
能夠看到,樹莓派是有兩個分區,因此boot 【size】+linux【Used】+分區損耗【由於格式轉換,因此會損耗5%~10%】=鏡像實際大小,因此若used使用百分比超過50%那麼就沒法在sd中建立此鏡像。bash
2、安裝須要的軟件
dosfstools:fat32分區格式化工具
dump:dump & restore 備份工具
parted & kpartx:虛擬磁盤工具app
sudo apt-get install dosfstools dump parted kpartx
3、生成空白img
根據一里面系統所佔用的空間,生成空白的img。ide
#df爲磁盤佔用空間
#df爲磁盤佔用空間
sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df
這也是錯誤比較多的地方,有人不理解原文中
count=2500
參數的意義,此參數是用dd命令建立一個大約2.5G的空白鏡像,若不使用第一步來算出實際鏡像大小的話,製做出來的鏡像就會出錯工具此處注意
dd命令中【1k=1024b;1KB=1000b;1M=1024kb;1MB=1000kb】oop
4、分割虛擬磁盤
咱們已將空白的img建立完畢,如今須要經過parted將磁盤分爲boot與root區
經過sudo fdisk -l /dev/mmcblk0
得知
第一個分區爲boot分區,採用FAT32格式,由sector 8192開始到sector 12879
第二個分割區採用EXT4,由sector 122880開始到空白img結尾。rest
sudo parted raspberrypi.img --script -- mklabel msdos sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879s sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1
5、掛載虛擬磁盤並格式化code
loopdevice:執行 losetup 鏈接 img 文件的 loop device
device:執行完 kpartx 後,虛擬磁盤代號。
partBoot:由 device 加上 p1 組合而成的 FAT32 虛擬磁盤分區。
partRoot:由 device 加上 p2 組合而成的 EXT4 虛擬磁盤分區。blog
首先創建虛擬磁盤並分區
loopdevice=`sudo losetup -f --show raspberrypi.img` device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1` device="/dev/mapper/${device}" partBoot="${device}p1" partRoot="${device}p2"
而後格式化虛擬磁盤分區
#boot分區用fat32進行格式化 sudo mkfs.vfat $partBoot sudo mkfs.ext4 $partRoot
6、開始備份
boot分區爲fat32格式,能夠直接利用cp命令直接拷貝
sudo mount -t vfat $partBoot /media sudo cp -rfp /boot/* /media/ sudo umount /media
linux分區爲ext4格式,須要利用dump & restore備份
#跳過raspberrypi.img不備份 sudo chattr +d raspberrypi.img sudo mount -t ext4 $partRoot /media/ cd /media sudo dump -h 0 -0uaf - / | sudo restore -rf - cd sudo umount /media
這裏原文中也有一點bug,用dump進行磁盤備份時,會將以前建立的空白img一併備份進去,經過chattr跳過raspberrypi.img
7、備份完畢,卸載虛擬磁盤
此時,已將全部數據備份至空白img,此時就能夠卸載虛擬磁盤,將img拷貝出保存了。
而後利用Win32DiskImager或者df命令便可將該raspberrypi.img恢復至sd卡上。
sudo kpartx -d $loopdevice sudo losetup -d $loopdevice
這裏是整理後的腳本,編輯sudo vi backup.sh,複製如下內容,sudo chmod 777 backup.sh,而後sudo ./backup.sh就能夠在當前腳本目錄中生成樹莓派的SD卡鏡像了。
也能夠參考以下shell腳本:
#!/bin/sh sudo apt-get install -y dosfstools parted kpartx rsync df=`df -P | grep /dev/root | awk '{print $3}'` dr=`df -P | grep /dev/mmcblk0p1 | awk '{print $2}'` df=`echo $df $dr |awk '{print int(($1+$2)*1.2)}'` sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df sudo parted raspberrypi.img --script -- mklabel msdos start=`sudo fdisk -l /dev/mmcblk0| awk 'NR==10 {print $2}'` start=`echo $start's'` end=`sudo fdisk -l /dev/mmcblk0| awk 'NR==10 {print $3}'` end2=$[end+1] end=`echo $end's'` end2=`echo $end2's'` sudo parted raspberrypi.img --script -- mkpart primary fat32 $start $end sudo parted raspberrypi.img --script -- mkpart primary ext4 $end2 -1 loopdevice=`sudo losetup -f --show raspberrypi.img` device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1` device="/dev/mapper/${device}" partBoot="${device}p1" partRoot="${device}p2" sudo mkfs.vfat $partBoot sudo mkfs.ext4 $partRoot sudo mount -t vfat $partBoot /media sudo cp -rfp /boot/* /media/ sudo umount /media sudo mount -t ext4 $partRoot /media/ cd /media sudo rsync -aP --exclude="raspberrypi.img" --exclude=/media/* --exclude=/sys/* --exclude=/proc/* --exclude=/tmp/* / ./ cd sudo umount /media sudo kpartx -d $loopdevice sudo losetup -d $loopdevice
其他參考:
贈人玫瑰
手留餘香
咱們曾如此渴望命運的波瀾,到最後才發現:人生最曼妙的風景,竟是心裏的淡定與從容……咱們曾如此期盼外界的承認,到最後才知道:世界是本身的,與他人毫無關係!-楊絳先生