制作树莓派最小镜像-img裁剪瘦身(二)

2 篇文章 0 订阅
2 篇文章 0 订阅

我使用的的是raspberry pi 2+32G高速tf卡,因为全程只在树莓派中操作所以不需要额外的linux系统。

若树莓派所占空间小于sd卡空间的50%即可以使用第一种方法,在树莓派内部直接生成镜像。
若树莓派所占空间大于sd卡空间的50%,可以使用第二种方法,先生成sd卡镜像,然后再其他linux系统中进行裁剪。

在文后,我会提供一键脚本        。

树莓派内部生成镜像

 一、查看当前系统所占容量
用Win32DiskImager来制作镜像时是将sd卡正卡全部做成镜像,是因为无法读取到linux分区的原因,所以我们在制作镜像前,先要确定我们当前系统所占用了多少系统空间,即备份镜像的大小。

#查看当前系统所占用的空间
df -h

 可以看到,树莓派是有两个分区,所以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

用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卡镜像了。

脚本经过以下固件版本测试: 

2020-05-27-raspios-buster-full-armhf(官方版本)

#!/bin/sh
sudo apt-get install -y dosfstools dump parted kpartx
df=`df -P | grep /dev/root | awk '{print $3}'`
df=`echo $df |awk '{print int($1*1.1+57344)}'`
sudo dd if=/dev/zero of=raspberrypi.img bs=1K count=$df
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=`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 chattr +d raspberrypi.img
sudo mount -t ext4 $partRoot /media/
cd /media
sudo dump -h 0 -0uaf - / | sudo restore -rf -
cd
sudo umount /media
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice

附成功状态

 参考博客:

制作树莓派最小镜像-img裁剪瘦身_PaulYoung_Blog的博客-CSDN博客
树莓派系统镜像一键瘦身备份脚本, 生成最小化镜像img(一)_狂奔的蜗牛i的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值