从EMMC启动CoreElec,理论上适用所有盒子, UNT413A测试成功
本帖最后由 beijingliantong 于 2022-11-24 13:49 编辑从EMMC启动CoreElec,理论上适用所有盒子, UNT413A测试成功
使用U盘启动CoreELEC有段时间了,总是感觉有点不完美,实在不能忍。
CoreELEC自带的安装工具只支持有限的设备。移动送的安卓盒子的分区有点奇怪,用ceemmc -x强制安装估计会搞坏盒子。
经过一番研究后,终于到一个非常稳妥的方法把CE写入EMMC。
====================原理============================
原理部分比较长,可以直接跳到正题部分,不影响操作。
一、不要动现有的分区表。
正规的分区表是放在EMMC的开头,后面是所有的分区。
通过分析Amlogic的内核和UBoot的代码,可以发现它的分区表放在某个固定的位置,操作不当就给覆盖了,然后就变砖了。
据说是历史遗留的兼容问题,我倒觉得是偷懒不想改—— 要是我,只要不出问题就继续用着,业内称之为祖传代码。
现有分区里可以利用上的有
/dev/cache1GB左右,适合存放个人数据:图片、安装包、视频等
/dev/sysem 1GB左右,适合当CE的启动盘
/dev/data 容量最大的分区,8G的盒子这个分区有3GB左右。适合当CE的存储盘
二、CE的启动原理
1、CE的启动脚本有两个 aml_autoscript和cfgload。
通过分析Amlogic的UBoot的源代码(不要看MainLine和linux-meson版的uboot),可以发现盒子进入recovery或update模式时(安卓里的启动到外部设备的app,本质上就是让盒子进入update模式),会先运行下aml_autoscript脚本。
CE里利用了这一点搞了点事情,把Uboot的环境变量魔改了。
2、魔改变量后的盒子每次启动时,会按 sd卡、u盘、内置Emmc的顺序,搜一遍所有分区。如果找到cfgload文件就执行它。
这就是为什么只有第一次需要进入update模式,后面插上U盘就能自动进入CE的原因。
网上说CE跟armbian不能共存,原因是两个系统魔改的方式不同。他们都是靠截胡盒子原有启动流程实现的。
如果动手能力强,可以试着改下cfgload脚本,让它能支持CE和Armbian双启动。
千万别改aml_autoscript脚本,这个是脚本执行后会把环境变量存起来,是永久的,如果没弄好盒子就编砖了。
cfgload每次启动时执行一次,不存盘。如果改坏了。可以重新做一个CE的启动U盘,反复尝试。
3、cfgload负责加载内核和dtb文件,并启动。
linux内核启动后,它自己不知道自己位于哪个分区,更不知存储分区在哪。
看linux的源代码就知道,那帮搞内核的人快魔怔了。因为,实际上内核是知道自己在哪的,但经过几次代码重构后。这部分代码全删了,完全交给initramfs处理。
实际应用中,大家都把initramfs嵌到内核里一起使用。
反过来看uboot代码,设计的简直就是没设计:一个板子对应一套uboot代码,简单省事。
实际应用中,initramfs里也不会把启动盘路径硬编码进程序。需要cfgload给它传参数。
=============================================================
前面是写给爱好动手的人,希望有所帮助。
现在进入正题
==========================正题===============================
总的来说就是把启动盘内容复制进/dev/system分区。修改cfgload脚本,把system分区和data分区的卷标传给linux内核。
1、启动进CE后,用ssh登录进控制台。
2、格式化/dev/cache /dev/system /dev/system三个分区
/dev/cache和 /dev/data 格式化成ext4分区
/dev/system 格式化成fat分区(跟U盘一样,CE启动U盘就是俩分区,一个用于启动,另一个用于存储)
卷标很重要,linux内核就是靠卷标区分分区的用途的。卷标名字是有cfgload传给linux内核的。
CoreELEC:~ # mkfs.ext4 /dev/cache
CoreELEC:~ # mkfs.ext4 -L CE_STORAGE /dev/data
CoreELEC:~ # mkfs.fat -n CE_FLASH /dev/system
3、复制内容
mkdir /media/system
mkdir /media/data
mount /dev/system /media/system
mount /dev/data /media/data
systemctl stop kodi
cp -r /flash/*/media/system/
cp -r /storage/* /media/data/
4、修改/media/system/cfgload
找到下面这行:
if test "${ce_on_emmc}" = "yes"; then setenv rootopt "BOOT_IMAGE=kernel.img boot=LABEL=CE_FLASH disk=FOLDER=/dev/CE_STORAGE"; fi
把disk=FOLDER=/dev/CE_STORAGE
修改成
disk=LABEL=/dev/CE_STORAGE
非常奇怪,为什么disk参数不用卷标,用的是路径。 我图省事就没继续研究,改成卷标也能用。
5、关机,拔掉U盘,启动
顺利的话,这时候就进入EMMC上的CE了。
U盘的启动优先级比EMMC高,所以没弄对,还可以重新进U盘版的CE。
====================完结============================
本帖最后由 beijingliantong 于 2022-12-1 15:27 编辑
修改/media/system/cfgload这一步还一个更简单的办法:
在/media/system/config.ini后面追加一行:
rootopt='BOOT_IMAGE=kernel.img boot=LABEL=CE_FLASH disk=LABEL=CE_STORAGE'
优点就是:
cfgload是个二进制文件编辑起来有点费劲,config.ini是纯文本文件,可以用记事本编辑。
支持一下 不懂的路过,也表示支持 真正大神 楼主可不可以提供ddbr备份 楼主unt413a刷了coreelec可以用无线吗? 好贴,我那个dev下,没有data和system分区。有没有办法 这是真正的技术大神啊,能看懂Linux内核代码,还分析出了解决办法。
现在好像新出的盒子都不能通过coreelec内置的ceemmc命令直接单系统写入emmc了,楼主这个办法完全绕过了官方工具,而且原理说得很清楚,完全可以自己通过命令一步一步操作实现emmc的写入。
明天我就试试看看能不能奏效,再次感谢。 nine1999 发表于 2024-4-29 22:19
好贴,我那个dev下,没有data和system分区。有没有办法
其实有没有都无所谓,楼主介绍的是原理。你可以有什么分区就用什么分区(/dev/xxx都可以),命令里面对应改一下分区名称就行了,主要是卷标label要是CE_STORAGE,CE_FLASH,因为最后cfgload是传的卷标。甚至你自己重新分区都可以
页:
[1]
2