Linux学习笔记---记一次rootfs根文件系统下载时掉进的大坑
俗话说要想技术好,踩坑少不了。技术的好坏和踩坑的多少基本是成正比的。这次就大大的提升了一次技术(大大的踩了一次坑)。废话少说,直奔主题。
最近入手了一块正点原子的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根文件系统下载时掉进的大坑相关推荐
- 超强linux学习笔记,值得一看(附PDF下载)
这次整理了linux最常用的学习笔记 很实用,很具操作性 先来看看这份笔记都有什么东西( 笔记共有154页 太长了就不一一截图 下载: Linux学习笔记(强悍总结值得一看).pdf 欢迎关注微信 ...
- 韦东山uboot_内核_根文件系统学习笔记4.4-第004课_根文件系统-第004节_构建根文件系统之构建根文件系统
一 最小的根文件系统需要的项(笔记4.1 4.2小结) (init 进程需要) 打开终端: /dev/console, /dev/NULL 不设置 inittab 格式中的 id(标准输入.输出和标准 ...
- linux学习笔记(实验楼) 实验7 文件系统操作与系统管理
一.实验介绍 1.1 实验内容 本节实验的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习 Linux 和实验楼后续其他课程的过程中有极大帮助. 因为本课程的定位 ...
- Linux学习笔记:用户、用户组、文件系统和网络
文章目录 一.用户身份与用户组记录的文件 二.用户与用户组操作 1.查看用户信息
- Linux学习笔记(自用)
Linux学习笔记(自用) 该笔记由尚硅谷的"3天上手LInux"视频整理而成,若有侵权,请联系作者删除 文章目录 Linux学习笔记(自用) 1. 概述 2. 下载 3.文件与目 ...
- 玩转mini2440开发板之【编译烧录rootfs根文件系统全过程记录】
前段时间研究了一下如何使用busybox编译和生成最简linux根文件系统(rootfs),并在mini2440开发板上使用NFS网络文件系统进行挂载启动,今天继续研究如何将该根文件系统烧录到开发板上 ...
- linux 串口信息记到日志,[linux学习笔记]之一:ubuntu ch340调试备忘
[linux学习笔记]之一:ubuntu ch340调试备忘 已有 2183 次阅读2016-11-8 21:52 |个人分类:linux 最近迷上了Linux,入了一块板.电脑使用win7+ubun ...
- Linux学习笔记---使用BusyBox创建根文件系统(四)
目录 软件运行测试 设置程序为后台运行 设置开机自启动 外网连接测试 软件运行测试 进入到rootfs文件夹中新建一个drivers文件夹,用于存放编写的软件. 新建hello.c文件 输入以下代码 ...
- Linux学习笔记---使用BusyBox创建根文件系统(三)
目录 创建/etc/init.d/rcS 文件 创建/etc/fstab 文件 创建/etc/inittab 文件 创建/etc/init.d/rcS 文件 通过nfs加载根文件系统成功后,在串口终端 ...
最新文章
- Window.Open- ShowModalDialog- Window.Open Session丢失的Solution
- 复现经典:《统计学习方法》第21章 PageRank算法
- 七点建议,帮助你编写出简洁、干练的Java代码
- js判断用户是否离开当前页面
- 30岁前不要在乎的29件事(转载)
- ES6新特性_ES6模块化引入NPM包--JavaScript_ECMAScript_ES6-ES11新特性工作笔记046
- SAP License:PS的进度管理流程
- Linux C++ STL用法介绍(1)
- AlexNet做文档布局分析 (版面分析)数据集
- 机器学习降维之主成分分析
- Linux查找link文件,Linux下查找一个文件的所有软硬链接
- 调查了23款加速器,只剩这几款可以白嫖了!
- VC++每个版本对应的vcredist
- dig命令查询结果解析
- 交大计算机软件学院,上海交通大学软件学院
- CISP考试的全过程
- 人工智能简史�_人工智能简史
- 1分钟搞定 OneNote自己账号扩容到15G永久免费空间
- 冈萨雷斯《数字图像处理》学习笔记(五)图像复原
- C语言浮点数不能取余,C语言浮点型数据能不能取余?
热门文章
- Linq 中的Aggregate一些用法
- nyoj138 哈希的简单应用(查找)
- 修改Extmail和Extman的源代码增加公司部门和中文名字段
- 思科Catalyst1900交换机上速配VLAN
- CSRF verification failed. Request aborted.
- (转)调用System.gc没有立即执行的解决方法
- winform实现word转换为PDF(.doc)
- 最好用最方便的sqlite管理工具
- 文件夹选择对话框 JS实现(转)
- OXite 微软一款基于asp.net mvc架构的blog内容管理系统