在linux(arm)系统上压缩TF卡系统分区,以实现制作低容量img镜像,从而进行镜像移植至其他TF卡上的方法

        试想一个情景,当你开发完一个linux系统后,想要将其TF卡制作成img镜像来移植到其他TF卡上来实现大规模部署时,你选择将写有系统的TF卡插入读卡器,插入你的win10系统的电脑上,打开Win32DiskImager读取TF卡上的数据制作成img镜像后,你将另一张空的TF卡插入读卡器,使用Win32DiskImager将刚刚的img镜像写入这张TF卡时,极大概率会出现如下图所示的十分尴尬的错误。

 

        让我们来分析一下这个错误产生的原因,这个img镜像需要124735488的空间,所选的TF卡可用的空间未122142720,换言之,也就是TF卡的容量小于镜像需要的容量。

        为什么会出现这种问题?其实很好理解,使用64G的卡做出来的镜像就是64G的,即便在Linux系统上通过dd制作成10几个G的tar文件,解压后还是64G的img镜像。目前市面上的TF卡质量参差不齐,目前实验室有四家不同品牌的TF卡,分别为实际内存容量为57.3GB的闪迪旗舰店的闪迪Ultra、59.2GB的海康威视旗舰店的闪迪Ultra、57.9GB的创乐博旗舰店的闪迪Ultra、58.2GB的金士顿旗舰店的SDCG3和59.3GB的三星存储旗舰店的EVO Plus,由于原先开发的Linux系统使用的是59.2GB的海康威视旗舰店的闪迪Ultra,故制作出来的img镜像实际大小为59.2GB,经测试,只有59.2GB的海康威视旗舰店的闪迪Ultra和59.3GB的三星存储旗舰店的EVO Plus可以正常进行写入。

        为此,本人在三天的不眠之夜中,分别尝试了Linux制作tar文件法、Linux备份镜像法、DiskGenius克隆分区法、DiskGenius压缩rootfs区法、DiskGenius更改原TF卡分区空间制作img镜像法、SDFormat覆盖式格式化法,均以失败告终。

        而今天,终于通过Linux分区法成功实现制作低容量img镜像的方法,下面是具体操作步骤。

        首先,我们将装有原系统的TF卡放入读卡器中,插入另一台装有linux系统的电脑(或树莓派皆可),本文以树莓派4B为例。

        首先,等待自动挂载完成,若未自动挂载,请根据其他文章的方法手动挂载。

        

         进入终端,输入sudo su以开启所有权限。

         随后输入df -h,查看挂载情况及可用空间。

        如图所示,/dev/sda2容量为54G,已使用15G,挂载地为/media/ubuntu/rootfs

        我们输入umount  /media/ubuntu/rootfs ,让其变为非挂载状态,同时df -h确认一下

        

        此时,/dev/sda2已经处于非挂载状态,开始进行我们的关键操作

        输入e2fsck -f /dev/sda2  用于检查sda2这个分区的状态

        执行完后输入resize2fs /dev/sda2 20G  (这里20G是因为sda2使用了15G,只要填写大于15G且小于该分区总容量的54G皆可)

        执行完后我们是用parted进行分区修改

        我们输入parted /dev/sda

        随后输入unit s print free 以检查目前TF卡各卷大小

 

         由于我原先对2区域进行过一次分区,所以2区域有5个G大小的剩余空间。

         我们需要记住2区域开始的532480s和End的121536511s这两串数字。

         随后我们删除2这个分区,并新建一个分区,尤其需要保证开始扇区数不变,但是结束扇区数变小。

         如果你要空出30GB,那就把之前的End扇区数减掉30 * 1000 * 1024 * 2以上。我这里计算后得出的是63295487。

         输入rm,输入2,此时删除了2这个分区。

         随后输入mkpart primary 532480s 63295487s

        恭喜!我们的新分区已经建立好了!!!!(啪啪啪鼓掌)

        不出意外的话,此时会提示rootfs重新挂载了。

         输入unit s print free 查看分区情况。

                

         这时我们已经分离出了30G的空闲空间。

         然后我们输入quit,退出parted

         输入resize2fs /dev/sda2

         此时,我们成功将主系统所在的ext4卷进行了压缩。(鼓掌)

        现在,我们将TF卡和读卡器拔出,插在我们的win10电脑上,打开Win32DiskImager,新建一个空的img镜像,勾选"仅读取已分配分区"(很重要!!!!!!!!!!!)

         按下读取,我们便开始制作我们的小容量镜像了。

         制作完成,我们的镜像大小未30.1GB,远小于原先镜像的59.4GB。

         随后,我们便可以将这个镜像顺利地烧录到我们的新TF卡里了。

        

        但此时新TF卡的容量只有30GB,我们需要手动进行一次扩容,扩容的操作与文章上述的建立分区的方法并无二致,仅仅是更改mkpart primary 532480s 63295487s为

mkpart primary 532480s (你想要的数字)s

         我以将其恢复到54GB为例,输入mkpart primary 532480s 114495487s

         重复其他步骤,此时我们的TF卡恢复为54G容量(使用64GB内存卡,容量不能超过本身最大容量)

 

 

        至此,本文章的任务圆满结束!!!!!!可以关电脑,飞奔出实验室,回去躺床上打原神啦!!!!! 

        结语:本人嵌入式小白,第一次在CSDN上写文章,如果有错误,请大家批评指正。

部分方法参考文章:在树莓派上缩小系统ext4分区的方法_MICROAU的博客-CSDN博客

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
下面是在QEMU中模拟ARM开发板并使用U-Boot引导系统镜像进行系统移植的详细步骤: 1. 安装QEMU:首先,你需要安装QEMU模拟器。根据你的操作系统选择适合的版本,并按照官方文档的指导进行安装。 2. 获取ARM开发板固件:你需要获取一个ARM开发板的固件镜像,这包括U-Boot引导加载器和操作系统映像文件。通常可以从开发板供应商或开源社区获取这些镜像。 3. 创建虚拟机:打开终端或命令提示符窗口,运行以下命令来创建一个虚拟机实例,其中`path_to_uboot_image`是指向U-Boot镜像文件的路径,`path_to_kernel_image`是指向内核映像文件的路径,`path_to_rootfs_image`是指向根文件系统映像文件的路径: ``` qemu-system-arm -M <machine> -m <memory> -kernel <path_to_uboot_image> -dtb <path_to_dtb_file> -append "console=ttyAMA0" -sd <path_to_rootfs_image> ``` 其中,`machine`是指定要模拟的ARM开发板型号(例如`versatilepb`),`memory`是指定虚拟机的内存大小(例如`256M`),`path_to_dtb_file`是指向设备树二进制文件(DTB)的路径。 4. 启动虚拟机:运行上述命令后,QEMU将启动虚拟机,并加载U-Boot引导加载器。你将在终端或命令提示符窗口中看到U-Boot的输出信息。 5. 进行系统移植:一旦虚拟机启动成功,你可以在U-Boot的命令行界面中输入命令来配置和加载操作系统。你可能需要设置环境变量、加载内核映像和设备树,以及设置启动参数等。 6. 测试和调试:完成系统移植后,你可以在虚拟机中进行测试和调试。你可以运行应用程序,测试系统的功能和性能。 需要注意的是,U-Boot的配置和使用可能因不同的开发板和需求而有所不同。确保阅读U-Boot的文档以了解更多配置和使用细节。 希望这些详细步骤能够帮助你在QEMU中模拟ARM开发板,并使用U-Boot引导系统镜像进行系统移植。如果你有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值