beijingliantong 发表于 2022-11-22 19:18

从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:25

本帖最后由 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是纯文本文件,可以用记事本编辑。


木偶人1 发表于 2022-11-28 20:19

支持一下

nylyb 发表于 2022-11-29 09:58

不懂的路过,也表示支持

wishfulday 发表于 2022-12-23 23:34

真正大神

这名儿不错 发表于 2023-8-4 18:40

楼主可不可以提供ddbr备份

huichangjio 发表于 2023-8-23 12:46

楼主unt413a刷了coreelec可以用无线吗?

nine1999 发表于 2024-4-29 22:19

好贴,我那个dev下,没有data和system分区。有没有办法

不辣的啤特 发表于 2024-10-11 02:54

这是真正的技术大神啊,能看懂Linux内核代码,还分析出了解决办法。

现在好像新出的盒子都不能通过coreelec内置的ceemmc命令直接单系统写入emmc了,楼主这个办法完全绕过了官方工具,而且原理说得很清楚,完全可以自己通过命令一步一步操作实现emmc的写入。

明天我就试试看看能不能奏效,再次感谢。

不辣的啤特 发表于 2024-10-11 02:58

nine1999 发表于 2024-4-29 22:19
好贴,我那个dev下,没有data和system分区。有没有办法

其实有没有都无所谓,楼主介绍的是原理。你可以有什么分区就用什么分区(/dev/xxx都可以),命令里面对应改一下分区名称就行了,主要是卷标label要是CE_STORAGE,CE_FLASH,因为最后cfgload是传的卷标。甚至你自己重新分区都可以
页: [1] 2
查看完整版本: 从EMMC启动CoreElec,理论上适用所有盒子, UNT413A测试成功