initramfs编译到内核似乎没运行,都怪自己没看官方教程
现象
Kernel挂载自定义的文件系统后似乎没有任何提示,不知文件系统制作是否成功。
背景
Linux的根文件系统调试方式有很多种,uboot传递相应参数告知从Kernel从哪里挂载根文件系统: MTD、硬盘、NFS、SD卡、initramfs。这里我选择的是initramfs的方式挂载,目的是尽可能 排除其他环境因素影响文件系统测试,包括:NFS root没有执行权限;uboot的NAND纠错算法(ECC)和 Kernel的不一致导致MTD数据载入错误。
initramfs是直接和Kernel绑定在一起,同时解压到内存,踩坑的概率要小很多 ,保证文件系统 足够小、内存足够大,基本不会遇到问题。
之所以写这篇文章是没仔细读取Kernel官方文档:Documentation/filesystems/ramfs-rootfs-initramfs.rst。
1. 制作方式
上文说了initramfs要保证文件系统足够小、内存足够大。没有什么比一句话代码的容量更小。 万能的儿童版Hello world教程,这个例位于linux源码 Documentation 目录下,注意后面的休眠2秒,
为什么休眠2秒,这里先埋个包袱 。
源码最好静态编译,避免遗漏拷贝 .so 影响测试。
配置内核填入initramfs的根目录
uboot传递启动参数:setenv bootargs ‘console=ttyAM0,115200n8 rdinit=/sbin/init’ 。
Kernel的ramdisk_execute_command字符串接受这个参数,rdinit是initramfs执行的第一个程序位置, 进程的PID是1。
console这么传递请参考上一篇文章《uboot传递console究竟怎么填?ttyX傻傻分不清》。
Kernel最后加载文件系统阶段首先检查是否存在rdinit所指的文件,不存在则从其他媒介设备 挂载文件系统。从Kernel角度来说,无论是rdinit和其他媒介设备的文件系统内核都同等对待, 只是找到谁就执行谁而已。
相关源码位于init/main.c
走你,咦!内核启动结束后没看到期待的 “Hello world” 。
2. 提出排查方向
起初怀疑3个方向:
文件没有找到文件找到了,却没执行权限文件找到了,也执行了,但没找到stdout3. 排除设想1、2
从输出结果怀疑方向,首先最先排除的是“设想1”,肯定是找到/sbin/init,否则不会出现倒数第二行 “CPU 0执行的init进程PID 1 退出”,没执行哪来的退出,于是排除“设想2”。
验证方案也很简单,删除/work/ramfs/sbin/init再测试一次。
输出内容有明显差异,输出意思:rdinit所指文件不存在,尝试从其他媒体设备挂载文件系统,而其他媒体 设备位置却没有传递,请纠正 “root=” 参数。
5. 确认设想3
回头看 Warning: unable to open an initial console 。某个console没有打开?会不会是 “设想3”的stdout呢?
该字符串出现在源码 init/main.c。尝试打开/dev/console作为标准输入/输出/错误,节点的信息照抄 本地PC的 “ls -l /dev/console”。照葫芦画瓢创建节点。
sudo mknod -m 622 console c 5 1
再次上电测试成功看到 “Hello world”
为什么延时2秒
延时2秒是为了看效果,系统正常运行时是不允许PID 1退出,它很特殊起到脱孤进程的作用,一旦退出系统认为出大事咯,立即打印出堆栈信息,并停止运行。
基于AM335X开发板 ARM Cortex-A8——NAND FLASH版本核心板使用说明
前 言:
NAND FLASH版本和eMMC版本核心板使用方法基本一致。本文主要描述U-Boot编译、基础设备树文件编译、固化Linux系统NAND FLASH分区说明和NAND FLASH启动系统、固化Linux系统、AND FLASH读写测试等,NAND FLASH版本与eMMC版本核心板在使用方面的不同之处,相同之处将不重复描述。
创龙科技TL335x-EVM-S是一款基于TI Sitara系列AM3352/AM3354/AM3359 ARM Cortex-A8高性能低功耗处理器设计的评估板。
评估板接口资源丰富,引出双路千兆网口、LCD、HDMI、GPMC、CAN等接口,方便用户快速进行产品方案评估与技术预研,应用在通讯管理、数据采集、人机交互、运动控制、智能电力等典型领域。
U-Boot编译
进行U-Boot编译选项配置时,请执行如下命令。
Host# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- am335x_evm_s_nandboot_defconfig
图 1
我司提供经过验证的U-Boot镜像文件位于产品资料“4-软件资料\Linux\U-Boot\image\u-boot-2017.01-[Git系列号]-[版本号]\”目录下,分别为MLO-nand、u-boot.img-nand。系统启动卡制作完成后,请将MLO-nand和u-boot.img-nand文件复制到系统启动卡BOOT分区下,备份原有的eMMC版本MLO、u-boot.img文件,并将MLO-nand和u-boot.img-nand文件重命名为MLO、u-boot.img。
图 2
Host# sudo cp MLO-nand MLO
Host# sudo cp u-boot.img-nand u-boot.img
图 3
基础设备树文件编译
基础设备树源文件为内核源码“arch/arm/boot/dts/”目录下的tl335x-evm-s-nandflash.dts和tl335x-evm-s-nandflash-hdmi.dts,重新编译基础设备树时请使用此文件。我司提供经过验证的基础设备树文件为产品资料“4-软件资料\Linux\Kernel\image\linux-rt-4.9.65-[Git系列号]-[版本号]\”目录下的tl335x-evm-s-nandflash.dtb和tl335x-evm-s-nandflash-hdmi.dtb,请将其分别复制到系统启动卡rootfs分区以及rootfs-backup分区的boot目录下。
图 4
请执行如下命令将tl335x-evm.dtb软链到tl335x-evm-s-nandflash.dtb文件。tl335x-evm-s-nandflash.dtb支持LCD显示,如需使用HDMI显示,则将tl335x-evm.dtb软链到tl335x-evm-nandflash-hdmi.dtb文件即可。
Host# sudo rm tl335x-evm.dtb
Host# sudo ln -s tl335x-evm-s-nandflash.dtb tl335x-evm.dtb
Host# ls -l
图 5
使用替换了U-Boot和基础设备树文件的Linux系统启动卡启动评估板,进入文件系统执行如下命令可查看到NAND FLASH分区信息,即说明文件替换成功。
Target# cat /proc/mtd
图 6
固化Linux系统
本章节介绍Linux系统固化过程,包括固化U-Boot、内核、设备树和文件系统至NAND FLASH。
NAND FLASH分区说明
进入评估板系统后执行如下命令,查看NAND FLASH分区信息。
Target# cat /proc/mtd
图 7
表 1
NAND FLASH
MTD0
nand.spl:存放U-Boot第一阶段启动文件MLO
MTD1
nand.u-boot:存放U-Boot第二阶段启动文件u-boot.img
MTD2
nand.env:存放环境变量
MTD3
nand.devicetree:存放设备树文件
MTD4
nand.kernel:存放内核镜像
MTD5
nand.logo:存放LOGO文件
MTD6
nand.mini-fs:备用分区,一般存放小型文件系统(暂未使用)
MTD7
nand.rootfs:存放文件系统
固化Linux系统
Linux系统启动卡制作时,已将系统固化的脚本文件mknandboot.sh复制到了Linux系统启动卡文件系统的“/opt/tools/”目录下。
图 8
执行如下命令进行一键固化。
Target# /opt/tools/mknandboot.sh
图 9
脚本会进行如下操作:
擦除NAND FLASH。将Linux系统启动卡BOOT分区中的U-Boot、LOGO固化至NAND FLASH对应分区。将Linux系统启动卡rootfs-backup分区中的文件系统boot目录下的内核镜像和基础设备树文件固化至NAND FLASH对应分区。将Linux系统启动卡rootfs-backup分区中的文件系统固化至NAND FLASH对应分区。用时约5~10min,Linux系统固化成功,同时串口调试终端打印提示信息。
从NAND FLASH启动系统
评估板断电,将Linux系统启动卡从评估板Micro SD卡槽中取出,根据评估底板丝印将拨码开关拨为10110(1~5),此档位为NAND FLASH启动模式。评估板上电,串口调试终端将会打印如下类似启动信息。
图 10
图 11
NAND FLASH读写测试
本章节对NAND FLASH的MTD6分区进行读写速度测试。MTD6是NAND FLASH的备用分区,一般存放小型文件系统,大小为32MByte。读写测试会将该分区内容擦除,请做好数据备份。
执行如下命令查询NAND FLASH分区,确认MTD6分区大小(读写请勿超出分区大小),将该分区内容擦除。
Target# cat /proc/mtd
Target# flash_erase /dev/mtd6 0 0
图 12
NAND FLASH写速度测试
进入评估板文件系统,执行如下命令对NAND FLASH进行写速度测试。
Target# time dd if=/dev/zero of=/dev/mtd6 bs=1024k count=30
图 13
此处一共写30MByte测试数据到NAND FLASH的MTD6分区下,可看到本次测试的NAND FLASH写速度约为:30MByte/7.79s=3.85MB/s。
NAND FLASH读速度测试
重启评估板,进入评估板文件系统,执行如下命令对NAND FLASH进行读速度测试。
Target# time dd if=/dev/mtd6 of=/dev/null bs=1024k count=30
图 14
此处从NAND FLASH的MTD6分区读取30MByte数据,可看到本次测试的NAND FLASH读速度约为:30MByte/4.44s=6.75MB/s。
相关问答
iphone现在开不了机了 出现以下英文[ NAND ]-FindFlashMediaAn...这是硬件故障问题没办法自己维修,去厂家返修吧,不是刷固件能解决的,到售后应当几乎换全部。有用(0)回复HAC上图片有用(0)回复qinyuntao学习英语,或者送...
3ds如何备份 nand ?要备份3DS的nand,首先需要安装一个自制软件,比如GodMode9。然后,将SD卡插入电脑,复制并备份SD卡上的所有文件。接下来,在3DS主界面上,启动GodMode9软件,...
为什么我复制到U盘的文件不能用?盘f...之后,在出来的命令窗口输入convertf:/fs:ntfs/x注意,那个x意思是你的u盘的盘符。比如,你的u盘叫可移动磁盘f,就要把x改成f,之后就行了。U盘为什么...
插入读卡器没反应是怨什么[回答]卡插入插槽,端口与计算机相连并安装所需的驱动程序之后,计算机就把存储卡当作一个可移动存储器,从而可以通过读卡器读写存储卡。按所兼容...按所兼...
gw怎么做虚拟 系统 ?1.sd卡放上最新2.3b的launcher.dat,在根目录2.系统设置→その他设定→ユーザー情报,最后按住L键点击DSソフト用设定3.进去后先选择backupnand,然后等待,不要...
Gw卡怎样升级虚拟 系统 ?要好好看升级说明啊你刷完红卡只是进入了gateway模式和升级没关系的你要做的事情是进入gateway菜单儿先备份下你的nand大概1g左右然后用电脑把备份好的...
为什么nfs一直挂载失败-ZOL问答在UNIX类操作系统上定义的网络服务有两层级别的权限设置,一是文件系统级别的权限设置,另一个是网络服务自定义的权限设置。参见有用(0)回复1830676226开发...
如何评价英特尔QLC M.2 SSD 660p?整个M.2SSD采用单面设计,正面有两个NAND芯片空焊位置,加上了就可以组成2TB容量。下面先来看看CrystalDiskMark中的成绩,Intel660p1TB表现不错,顺序读写性......
link2sd是什么?首先说在SD卡上安装程序,以两种方式为主,一个是APP2SD,另一个是Link2SD。这里提到的APP2SD是2.2以后系统中就包括的一种安装方式。在2.1之前App2SD也是第三方...
nandflash 最快读写速度?NAND闪存的最快读写速度取决于具体的技术和规格。目前,高性能NAND闪存的读取速度可以达到几百兆字节每秒(MB/s),而写入速度通常在几十到一百多兆字节每秒之间...