俗话说要想技术好,踩坑少不了。技术的好坏和踩坑的多少基本是成正比的。这次就大大的提升了一次技术(大大的踩了一次坑)。废话少说,直奔主题。

最近入手了一块正点原子的IMX6ULL开发板,跟着视频教程和开发指南一步步学习。虽然小坑不少,但是也基本顺利。大多数都是手误把命令敲错了。不过这两天在使用MfgTool工具烧写自己的系统时踩到了一个大坑,整整折腾了一天半才找到原因。特此记录一下。

跟着文档一步步从uboot 到设备树到Linux内核移植,最后到根文件系统移植,都比较顺利。自己测试的各种实验结果和预期的也一样。

使用MfgTool工具烧写NXP官方的系统也没有问题,但是当用自己的文件替换完NXP官方的文件后,在使用MfgTool工具烧写到开发板上之后,内核奔溃了。

按照文档的方法开始烧写系统

双击打开mfgtool2-yocto-mx-evk-emmc.vbs文件开始烧写。由于自己的文件系统比较小,所以这次烧写的就比较快,几分钟就烧写完成。

点击Stop按钮,在点击Exit按钮。

将拨码开关重新拨回到EMMC模式,然后重启开发板,然后打开串口终端。

从系统打印的信息可以看出,系统的编译时间是刚才编译的。板子的名称也和设置的一样。说明系统下载成功了。

但是最后一行信息提示网络地址没有设置,下面开始设置网络相关环境变量。

192.168.1.50是开发板的IP地址,192.168.1.66是Ubuntu的IP地址。

重启开发板

此时就不会报FEC1错误了。然后打印环境变量

可以看到IP地址也设置好了。

为了确认下烧写的文件是不是正确,可以查看下mmc中的内容。

使用 ls mmc 1:1 命令将mmc中的文件列表打印出来。

可以将这两个文件的大小和烧写文件的大小比较一样,看看是否一样。

可以看出mmc中的文件和烧写的文件大小一致,说明烧写是成功的。

接下来设置环境变量bootcmd 和 bootargs。

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'

setenv bootcmd 'mmc dev 1:fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000 imx6ull-14x14-evk.dtb;bootz 80800000 - 83000000;'

然后重启系统,在倒计时结束前 按下键盘上任意键。使用print命令打印环境变量。

可以看到bootcmd和bootargs这两个环境变量的值已经设置成功了。

接下来继续输入boot指令,启动系统。

这时候出现了一个错误,内核惊恐了。此时我也惊恐了?这可咋整呀?难道又是自己手抖哪一步输入错了?

那么从头一步步查找原因吧。

首先通过USB接口,使用MfgTool工具烧回NXP官方的系统,烧写完成后测试一切都正常。中间没出现任何问题。

接下来再用自己的文件去替换NXP官方文件,一步步仔细替换完后,继续烧写自己的文件。烧写完成后启动系统,错误依然存在。难道是文档中遗漏了哪个步骤吗?

于是又重新开始看视频教程,跟着视频教程一步一步做,错误依然存在。

那么难道是自己的这4个文件一开始就有问题吗?

那么就一步步开始排除吧。

首先是u-boot.imx文件

在U-Boot开始移植的时候,就已经测试过了好多测这个u-boot.imx,而且这个文件通过SD卡也烧写了好多次。再说在开发板启动uboot后还能正常设置环境变量。说明这里是没有任何问题的。

接下来就是设备树和内核镜像文件了。

这两个文件在内核移植的时候测试了也不止一两次,应该也不会出错。

虽然说在内核测试的时候,是通过网络加载设备树和镜像文件的。而这次是用MfgTool直接烧写到EMMC中。但是这几个文件都是直接从Ubuntu系统中复制到Windows系统中的。

难道是复制文件的时候出错了,于是又重新将这几个文件从Ubuntu系统中复制了一次,而且复制的时候还特意看了一下文件的修改时间和文件大小。都是一模一样的,应该不会出错。

复制文件测试之后,错误依然存在。

那么这时候就只有rootfs根文件系统值得怀疑了。

不过根文件系统也是跟着教程一步步测试过的

应该也不会有问题。

根文件系统测试的时候,是通过网络直接访问Ubuntu系统中的rootfs文件夹。而这次烧写的时候,是将文件夹压缩后复制到Windows系统中的。

会不会压缩包出现问题了?

于是找到了正点原子提供的根文件系统,用正点原子的压缩包替换自己的压缩包,然后重新烧写系统测试。

结果测试一切正常,系统可以正常启动,没有任何异常。

那么到这里就可以确定是rootfs根文件系统出现了问题。

而根文件系统通过网络加载的时候系统可以正常运行,打包后就不能正常运行。难道是打包的姿势不对?

于是仔细对比自己的打包方法和正点原子的打包方法,终于找出了差距。

自己打包的方法是在 rootfs文件夹外面 输入的命令

而正点原子的打包方法是,直接进入到rootfs文件夹里面打包的。

那么就实际测试一下,在文件夹外面打包和文件夹里面打包有什么不一样。

使用命令 cd rootfs   进入到rootfs文件夹中

然后使用打包命令打包所有文件 tar -vcjf rootfs.tar.bz2 *

打包完成后查看文件大小

果然发现了猫腻

在文件夹外面打包的文件大小为 39690704

在文件夹里面打包的文件大小为 39672219

外面的压缩包比里面的压缩包大了18488。

难道真的是这个导致了系统错误?

于是将文件夹里面的压缩包复制到Windows下,然后更改文件名,替换烧写软件中的文件。重新开始烧写。

这下竟然成功了。

看到系统成功进入的那一刻,差点留下了激动地泪水。

原来真的是打包的姿势不对。

仔细分析了一下在文件夹内部和文件夹外部 打包命令的差别

sudo tar -vcjf rootfs.tar.bz2 *

sudo tar -vcjf rootfs.tar.bz2 rootfs

文件夹内部打包时使用了是*号符,也就是打包所有的文件。

而文件夹外面的打包命令没有指定是否打包所有的文件。

难道是tar打包命令还有什么隐藏技能吗?在网上搜资料的时候,无意间发现了这个。

那么是不是在文件夹内部和文件夹外部打包文件时,这个隐藏文件导致的呢?

由于根文件系统中的文件太多,目前还没有有效的办法对比出这两个压缩文件具体的差别在哪里。如果以后有机会再回过头来填坑吧!这次就暂时这样解决吧!

看来折腾了一天半,力气没白费,总算找到了原因,看了这次的坑没白跳。

特此写文以纪念这次难忘的经历!!!

2021.5.21

Linux学习笔记---记一次rootfs根文件系统下载时掉进的大坑相关推荐

  1. 超强linux学习笔记,值得一看(附PDF下载)

    这次整理了linux最常用的学习笔记 很实用,很具操作性 先来看看这份笔记都有什么东西( 笔记共有154页   太长了就不一一截图 下载: Linux学习笔记(强悍总结值得一看).pdf 欢迎关注微信 ...

  2. 韦东山uboot_内核_根文件系统学习笔记4.4-第004课_根文件系统-第004节_构建根文件系统之构建根文件系统

    一 最小的根文件系统需要的项(笔记4.1 4.2小结) (init 进程需要) 打开终端: /dev/console, /dev/NULL 不设置 inittab 格式中的 id(标准输入.输出和标准 ...

  3. linux学习笔记(实验楼) 实验7 文件系统操作与系统管理

    一.实验介绍 1.1 实验内容 本节实验的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习 Linux 和实验楼后续其他课程的过程中有极大帮助. 因为本课程的定位 ...

  4. Linux学习笔记:用户、用户组、文件系统和网络

    文章目录 一.用户身份与用户组记录的文件 二.用户与用户组操作 1.查看用户信息

  5. Linux学习笔记(自用)

    Linux学习笔记(自用) 该笔记由尚硅谷的"3天上手LInux"视频整理而成,若有侵权,请联系作者删除 文章目录 Linux学习笔记(自用) 1. 概述 2. 下载 3.文件与目 ...

  6. 玩转mini2440开发板之【编译烧录rootfs根文件系统全过程记录】

    前段时间研究了一下如何使用busybox编译和生成最简linux根文件系统(rootfs),并在mini2440开发板上使用NFS网络文件系统进行挂载启动,今天继续研究如何将该根文件系统烧录到开发板上 ...

  7. linux 串口信息记到日志,[linux学习笔记]之一:ubuntu ch340调试备忘

    [linux学习笔记]之一:ubuntu ch340调试备忘 已有 2183 次阅读2016-11-8 21:52 |个人分类:linux 最近迷上了Linux,入了一块板.电脑使用win7+ubun ...

  8. Linux学习笔记---使用BusyBox创建根文件系统(四)

    目录 软件运行测试 设置程序为后台运行 设置开机自启动 外网连接测试 软件运行测试 进入到rootfs文件夹中新建一个drivers文件夹,用于存放编写的软件. 新建hello.c文件 输入以下代码 ...

  9. Linux学习笔记---使用BusyBox创建根文件系统(三)

    目录 创建/etc/init.d/rcS 文件 创建/etc/fstab 文件 创建/etc/inittab 文件 创建/etc/init.d/rcS 文件 通过nfs加载根文件系统成功后,在串口终端 ...

最新文章

  1. Window.Open- ShowModalDialog- Window.Open Session丢失的Solution
  2. 复现经典:《统计学习方法》第21章 PageRank算法
  3. 七点建议,帮助你编写出简洁、干练的Java代码
  4. js判断用户是否离开当前页面
  5. 30岁前不要在乎的29件事(转载)
  6. ES6新特性_ES6模块化引入NPM包--JavaScript_ECMAScript_ES6-ES11新特性工作笔记046
  7. SAP License:PS的进度管理流程
  8. Linux C++ STL用法介绍(1)
  9. AlexNet做文档布局分析 (版面分析)数据集
  10. 机器学习降维之主成分分析
  11. Linux查找link文件,Linux下查找一个文件的所有软硬链接
  12. 调查了23款加速器,只剩这几款可以白嫖了!
  13. VC++每个版本对应的vcredist
  14. dig命令查询结果解析
  15. 交大计算机软件学院,上海交通大学软件学院
  16. CISP考试的全过程
  17. 人工智能简史�_人工智能简史
  18. 1分钟搞定 OneNote自己账号扩容到15G永久免费空间
  19. 冈萨雷斯《数字图像处理》学习笔记(五)图像复原
  20. C语言浮点数不能取余,C语言浮点型数据能不能取余?

热门文章

  1. Linq 中的Aggregate一些用法
  2. nyoj138 哈希的简单应用(查找)
  3. 修改Extmail和Extman的源代码增加公司部门和中文名字段
  4. 思科Catalyst1900交换机上速配VLAN
  5. CSRF verification failed. Request aborted.
  6. (转)调用System.gc没有立即执行的解决方法
  7. winform实现word转换为PDF(.doc)
  8. 最好用最方便的sqlite管理工具
  9. 文件夹选择对话框 JS实现(转)
  10. OXite 微软一款基于asp.net mvc架构的blog内容管理系统