【樹莓派】制作樹莓派最小鏡像:img裁剪瘦身


制作樹莓派鏡像,可以參考這篇文章:http://blog.csdn.net/talkxin/article/details/50456282

摘錄部分要點內容如下(如果作者不允許轉載,請聯系即刪除):

一、查看當前系統所占容量 
用Win32DiskImager來制作鏡像時是將sd卡正卡全部做成鏡像,是因為無法讀取到linux分區的原因,所以我們在制作鏡像前,先要確定我們當前系統所占用了多少系統空間,即備份鏡像的大小。

#查看當前系統所占用的空間
df -lh
 

 

這里寫圖片描述 
可以看到,樹莓派是有兩個分區,所以boot 【size】+linux【Used】+分區損耗【因為格式轉換,所以會損耗5%~10%】=鏡像實際大小,所以若used使用百分比超過50%那么就無法在sd中創建此鏡像。

二、安裝需要的軟件 
dosfstools:fat32分區格式化工具 
dump:dump & restore 備份工具 
parted & kpartx:虛擬磁盤工具

sudo apt-get install dosfstools dump parted kpartx

 

 

三、生成空白img 
根據一里面系統所占用的空間,生成空白的img。

#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】

四、分割虛擬磁盤 
我們已將空白的img創建完畢,現在需要通過parted將磁盤分為boot與root區 
通過sudo fdisk -l /dev/mmcblk0得知 
這里寫圖片描述 
第一個分區為boot分區,采用FAT32格式,由sector 8192開始到sector 12879 
第二個分割區采用EXT4,由sector 122880開始到空白img結尾。

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

 

 

五、掛載虛擬磁盤並格式化

loopdevice:執行 losetup 連接 img 文件的 loop device 
device:執行完 kpartx 后,虛擬磁盤代號。 
partBoot:由 device 加上 p1 組合而成的 FAT32 虛擬磁盤分區。 
partRoot:由 device 加上 p2 組合而成的 EXT4 虛擬磁盤分區。

首先建立虛擬磁盤並分區

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

 

六、開始備份 
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

七、備份完畢,卸載虛擬磁盤 
此時,已將所有數據備份至空白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

 

其余參考:

【樹莓派】制作樹莓派所使用的img鏡像(一):http://www.cnblogs.com/haochuang/p/6066532.html

 


免責聲明!

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



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