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

本文介绍了如何在树莓派系统内制作最小化的img镜像,以节省空间并实现有效备份。通过查看系统占用容量、安装必要软件、创建空白img、分割虚拟磁盘、挂载和格式化、备份数据,以及卸载虚拟磁盘等步骤,详细阐述了整个过程。此外,还提供了一个一键脚本,适用于不同版本的树莓派固件。

修改记录
2016年7月28日修改脚本,动态支持树莓派镜像

最近刚做了一套opencv摄像头监控的程序,想将这套程序做一个镜像备份起来,但发现用Win32DiskImager或dd命令来制作镜像,都是将sd卡整盘进行备份,造成了巨大的硬盘浪费,同时,会局限sd卡本身,也就是说32g卡制作的镜像无法恢复到16g或8g的卡上,即便软件没有占用那么大空间,所以希望将镜像瘦身,做一套最小占用空间的镜像,且不损害镜像本身。

前不久在csdn上看到 liuwei000000的博文与我所希望的结果差不多,所以试着进行一次img瘦身。
不过该博文也有缺点“该方法制作的镜像不能用raspi-config扩展分区”所以即便我们能够将img瘦身也不能轻松的利用raspi-config扩展树莓派了,所以我提炼了奋斗博客博文亲身制作了一把img,并把遇到的问题记录了下来

我使用的的是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 --
<think>嗯,用户想解决rootfs.img文件过大的问题。回顾引用内容,发现几个关键点:引用[1]提到刷机时rootfs.img的分区问题,引用[2]显示这是Squashfs格式的文件,引用[3]给出了用resize2fs扩容的方法,引用[4]提供了挂载和替换文件的步骤。用户上次的问题也涉及镜像大小处理,看来是持续性问题。 用户可能是嵌入式开发工程师,正在处理Rockchip平台的Linux系统部署。刷不进设备的核心矛盾在于镜像尺寸超过分区限制,但ta没有说明具体场景是编译时过大还是运行时空间不足。需要区分两种解决方案:编译阶段优化生成的rootfs大小,或运行时动态扩容。 技术上可以从三个层面解决: 一是源头裁剪,引用[4]的ubuntu_rootfs目录结构暗示可以删除冗余组件,比如清除apt缓存、移除调试符号; 二是压缩优化,引用[2]的Squashfs特性支持高压缩比重构,zstd算法比默认lz4更高效; 三是分区适配,引用[3]的resize2fs方案适用ext4格式扩容,但要注意Rockchip的分区表需同步调整parameter.txt。 考虑到用户刷机受阻的紧急程度,应该优先推荐最快速的镜像瘦身方案。清理缓存和文档能立即见效,而重构Squashfs虽然效果显著但耗时较长。如果用户后续需要长期维护,还可以补充构建系统级的裁剪策略,比如Yocto的IMAGE_OVERHEAD_FACTOR配置。 用户没提及开发环境,但引用中多次出现sudo,推测是Ubuntu主机。需要强调所有磁盘操作前必须umount镜像,避免损坏。另外Rockchip特有的loader分区问题不在当前讨论范围,但若扩容后仍刷机失败可能需要检查烧写工具的日志。 最后生成的问题要覆盖延伸场景:扩容失败如何处理?不同文件系统的调整方法差异?这些都是用户可能遇到的连锁问题。 </think>基于引用内容和系统镜像处理经验,解决 `rootfs.img` 文件过大的问题可通过以下步骤实现,重点围绕 **镜像裁剪**、**压缩优化** 和 **分区调整**: --- ### 一、镜像裁剪(源头瘦身) 1. **挂载镜像检查内容** ```bash mkdir mount_point sudo mount -o loop rootfs.img mount_point # 挂载镜像 ``` - 检查 `/mount_point` 中的冗余文件(如缓存、日志、无用软件包): ```bash sudo du -sh mount_point/* | sort -h # 按大小排序目录 ``` - 删除非必要内容(示例): ```bash sudo rm -rf mount_point/var/cache/apt/* # 清除APT缓存 sudo rm -rf mount_point/usr/share/doc/* # 删除文档 ``` 2. **卸载并提交变更** ```bash sudo umount mount_point ``` --- ### 二、文件系统压缩(Squashfs 优化) 引用[2]显示镜像为 **Squashfs 格式**,可通过高效压缩减小体积: ```bash sudo unsquashfs -d unpacked rootfs.img # 解压原镜像 sudo mksquashfs unpacked new_rootfs.img -comp xz -b 1M # 重压为XZ格式(更高压缩比) ``` - **关键参数**: - `-comp xz` :XZ压缩算法(比默认lz4节省20%-30%空间) - `-b 1M`:块大小1MB(平衡压缩率与解压速度)[^2] --- ### 三、分区扩容(适应存储限制) 若镜像需写入固定分区(如Rockchip设备),需匹配分区表大小: 1. **扩展镜像容量**(引用[3]方案) ```bash sudo truncate -s +2G rootfs.img # 增加2G空间(按需调整) sudo e2fsck -f rootfs.img # 强制检查文件系统 sudo resize2fs rootfs.img # 扩展内部文件系统 ``` - 适用于 **ext4** 格式镜像(非Squashfs) 2. **调整分区表** - 修改设备的 `parameter.txt` 分区表文件,扩大 `rootfs` 分区尺寸 - 刷机时确保分区大小 ≥ 镜像实际大小[^1][^4] --- ### 四、替代方案:动态OverlayFS 若裁剪后仍超限,考虑 **只读rootfs + 可写覆盖层**: ```bash # 刷入只读的rootfs.img(Squashfs) # 在启动脚本中挂载OverlayFS mount -t overlay overlay -o lowerdir=/,upperdir=/mnt/upper,workdir=/mnt/work /new_root ``` - **优势**:原始镜像保持精简,运行时数据写入独立分区[^4] --- ### 总结优先级 ```mermaid graph LR A[镜像过大] --> B{文件系统类型} B -->|Squashfs| C[重压缩-XZ算法] B -->|ext4| D[清理文件+扩容] C & D --> E[调整分区表匹配] E --> F[刷机验证] ```
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值