【树莓派】制做树莓派最小镜像:img裁剪瘦身

 

摘录部分要点内容以下(若是做者不容许转载,请联系即删除):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

 

其他参考:

 

赠人玫瑰
手留余香

咱们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是心里的淡定与从容……咱们曾如此期盼外界的承认,到最后才知道:世界是本身的,与他人毫无关系!-杨绛先生

相关文章
相关标签/搜索