N1盒子刷CoreELEC系统
背景
又买了一个N1盒子,外挂SSD硬盘安装上了armbian系统。但是发现有一个问题,在重启时,有一定机率重启回N1盒子上的系统。
于是,一不做二不休,把N1盒子上的系统刷入CoreELEC。
安装
下载工具和资源
- Win32磁盘映像工具 - 1.0
- CoreELEC-PhiComm_N1.arm-9.2.0.img.gz
- N1刷入coreelecv9.2替换文件.zip
制作U盘
- 解压镜像:CoreELEC-PhiComm_N1.arm-9.2.0.img.gz
- 用“Win32磁盘映像工具”将“CoreELEC-PhiComm_N1.arm-9.2.0.img”刷入U盘
- 将“N1刷入coreelecv9.2替换文件.zip”替换掉U盘中的同名文件,共替换9个文件
U盘启动
断电状态下,将U盘插入靠近HDMI线的USB口上,再上电。然后等待屏幕重启若干次,最后到达英文的欢迎页面。
插上USB鼠标,先不要选择语言,直接点Next下一步。
设置Hostname
默认Hostname为CoreELEC。设置好后,点下一步。
连接网络
已经自动连接上了有线,这里我又手动连接上了无线。
SSH和Samba
这两个服务默认禁用的。可以选择启用。
SSH默认账号为root,密码coreelec。选择启用后,会立即要求修改密码。
关闭Kodi自动更新
左上角齿轮设置 --> 最后一个CoreELEC --> Update --> Automatic Updates --> 手动
设置中文
回到 Interface --> Skin --> Fonts --> Arial based,来避免中文乱码。
回到 Interface --> Regional --> Language --> Simple Chinese
回到 Interface --> Regional --> 时间国家 --> 中国
刷入到emmc
刷入前,请先根据我前面的文件,自行备份原系统。
然后ssh到N1盒子上,如下:
##############################################
# CoreELEC #
# https://coreelec.org #
##############################################
CoreELEC (official): 9.2.0 (Amlogic.arm)
执行安装命令,如下:
# /flash/installtoemmc
This script will erase BOOT, SYSTEM, DATA and DTB on your device
and install LE that you booted from SD card/USB drive.
It will create a backup of device tree and recovery partition on your boot media.
The script does not have any safeguards!
Type "yes" if you know what you are doing or anything else to exit: yes
Formatting SYSTEM partition.../dev/system contains a ext4 file system
last mounted on /tmp/system on Fri May 1 00:08:21 2020
Suggestion: Use Linux kernel >= 3.18 for improved stability of the metadata and journal checksum features.
e2fsck 1.45.2 (27-May-2019)
/dev/system: clean, 11/81920 files, 13824/327680 blocks
resize2fs 1.45.2 (27-May-2019)
The filesystem is already 32-bit.
tune2fs 1.45.2 (27-May-2019)
Disabling checksums could take some time.
Proceed anyway (or wait 5 seconds to proceed) ? (y,N) y
done.
Copying SYSTEM files...done.
Do you want to copy your user data to internal data partition? [Y/n] y
Formatting DATA partition...Suggestion: Use Linux kernel >= 3.18 for improved stability of the metadata and journal checksum features.
done.
Stopping Kodi...done.
Copying user data...
All done!
WARNING: If your internal memory layout is different from standard Amlogic, you have to perform this operation again!
Your system will reboot from internal memory.
Would you like to reboot now [y/N]?y
拔掉U盘,重新启动。
配置
电影
可以把Samba上的电影添加到电影中来,具体略。
游戏
安装EmuElec
下载插件 S905X2-script.emuelec.Amlogic-ng.launcher-3.2-Amlogic-ng.zip
,通过zip安装,即有了EmuELEC游戏机。
下载rom
然后自行下载rom,复制到盒子的/storage/roms/目录下。
设置手柄
游戏进入时,需要设置手柄键位。如果设置错了的话,进入游戏后,可以重新设置。
如果卡住了,可以ssh上去重启机器。
具体见本文末尾的参考。
修改主题
自行下载主题 KOFSweet
和 Szkifen
。
将主题上传到盒子的 ~/.kodi/addons/script.emuelec.Amlogic-ng.launcher/config/emulationstation/themes
文件夹下。
打开游戏主菜单,进入 UI SETTINGS --> THEME SET 选择新的主题。
使用新主题后,游戏列表没有乱码了。
中文游戏列表乱码
下载中文字体,如微软雅黑,然后替换掉原来的 ~/.kodi/addons/script.emuelec.Amlogic-ng.launcher/resources/assets/ozone
下面的字体。
电视
添加节目源
电视 --> 插件浏览 --> PVR IPTV Simple Client --> 确定 --> 安装
安装完成后,再进入插件 PVR IPTV Simple Client --> 设置
直接源在github上可以自行搜索到,如Tvlist-awesome-m3u-m3u8。
视频插件
爱发电的zhengfan2014同学制作的插件
部分可以,推荐尝试一下。
感谢他的制作。
高级用法
安装entware
ssh进入盒子,执行 installentware
隐藏功能
默认开发的端口和服务
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2608/sshd
tcp 0 0 0.0.0.0:36666 0.0.0.0:* LISTEN 3881/kodi.bin
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 2817/smbd
tcp 0 0 0.0.0.0:4713 0.0.0.0:* LISTEN 2514/pulseaudio
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 2817/smbd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 3881/kodi.bin
tcp 0 0 :::22 :::* LISTEN 2608/sshd
tcp 0 0 :::36666 :::* LISTEN 3881/kodi.bin
tcp 0 0 :::445 :::* LISTEN 2817/smbd
tcp 0 0 :::4713 :::* LISTEN 2514/pulseaudio
tcp 0 0 :::139 :::* LISTEN 2817/smbd
tcp 0 0 :::111 :::* LISTEN 1/systemd
tcp 0 0 :::8080 :::* LISTEN 3881/kodi.bin
udp 0 0 0.0.0.0:57419 0.0.0.0:* 2137/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp 0 0 192.168.31.255:137 0.0.0.0:* 2813/nmbd
udp 0 0 192.168.31.152:137 0.0.0.0:* 2813/nmbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 2813/nmbd
udp 0 0 192.168.31.255:138 0.0.0.0:* 2813/nmbd
udp 0 0 192.168.31.152:138 0.0.0.0:* 2813/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 2813/nmbd
udp 0 0 0.0.0.0:5353 0.0.0.0:* 2760/avahi-daemon:
udp 0 0 0.0.0.0:53838 0.0.0.0:* 2686/connmand
udp 0 0 :::111 :::* 1/systemd
udp 0 0 :::50375 :::* 2137/rpcbind
udp 0 0 :::5353 :::* 2760/avahi-daemon:
其中 8080 端口是一个web控制页面,可以直接在浏览器中打开。
开机启动顺序
这个顺充是在uboot中进行管理的, 可以通过fw_printenv命令进行查看
……
boot_part=boot
bootargs=rootfstype=ramfs init=/init console=ttyS0,115200 no_console_suspend earlyprintk=aml-uart,0xc81004c0 ramoops.pstore_en=1 ramoops.record_size=0x8000 ramoops.console_size=0x4000 androidboot.selinux=enforcing logo=osd1,loaded,0x3d800000,1080p60hz maxcpus=4 vout=1080p60hz,enable hdmimode=1080p60hz cvbsmode=576cvbs hdmitx= cvbsdrv=0 pq= androidboo jtag=apao androidboot.hardware=amlogic androidboot.serialno=CAQDB5063K21686 mac=FC:7C:02:2A:00:21 androidboot.mac=FC:7C:02:2A:00:21 mac_wifi=fc:7c:02:2a:00:20 androidboot.mac_wifi=fc:7c:02:2a:00:20 androidboot.slot_suffix=_a quiet
bootcmd=run start_autoscript; run storeboot
bootdelay=1
bootfromnand=0
bootup_offset=0x1130180
bootup_size=0x3f4846
cmdline_keys=if keyman init 0x1234; then if keyman read usid ${loadaddr} str; then setenv bootargs ${bootargs} androidboot.serialno=${usid};setenv serial ${usid};fi;if keyman read mac ${loadaddr} str; then setenv bootargs ${bootargs} mac=${mac} androidboot.mac=${mac};fi;if keyman read deviceid ${loadaddr} str; then setenv bootargs ${bootargs} androidboot.deviceid=${deviceid};fi;if keyman read mac_wifi ${loadaddr} str; then setenv bootargs ${bootargs} mac_wifi=${mac_wifi} androidboot.mac_wifi=${mac_wifi};fi;fi;
firstboot=0
init_display=osd open;osd clear;imgread pic logo bootup $loadaddr;bmp display $bootup_offset;bmp scale
preboot=run bcb_cmd; run factory_reset_poweroff_protect;run upgrade_check;run init_display;run storeargs;run upgrade_key;forceupdate;run switch_bootmode;
reboot_mode=normal
recovery_from_flash=setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_part={recovery_part} recovery_offset={recovery_offset};if itest ${upgrade_step} == 3; then if ext4load mmc 1:2 ${dtb_mem_addr} /recovery/dtb.img; then echo cache dtb.img loaded; fi;if ext4load mmc 1:2 ${loadaddr} /recovery/recovery.img; then echo cache recovery.img loaded; wipeisb; bootm ${loadaddr}; fi;else fi;if imgread kernel ${recovery_part} ${loadaddr} ${recovery_offset}; then wipeisb; bootm ${loadaddr}; fi;
recovery_from_sdcard=setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_part={recovery_part} recovery_offset={recovery_offset};if fatload mmc 0 ${loadaddr} aml_autoscript; then autoscr ${loadaddr}; fi;if fatload mmc 0 ${loadaddr} recovery.img; then if fatload mmc 0 ${dtb_mem_addr} dtb.img; then echo sd dtb.img loaded; fi;wipeisb; bootm ${loadaddr};fi;
recovery_from_udisk=setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_part={recovery_part} recovery_offset={recovery_offset};if fatload usb 0 ${loadaddr} aml_autoscript; then autoscr ${loadaddr}; fi;if fatload usb 0 ${loadaddr} recovery.img; then if fatload usb 0 ${dtb_mem_addr} dtb.img; then echo udisk dtb.img loaded; fi;wipeisb; bootm ${loadaddr};fi;
storeargs=setenv bootargs ${initargs} androidboot.selinux=${EnableSelinux} logo=${display_layer},loaded,${fb_addr},${outputmode} maxcpus=${maxcpus} vout=${outputmode},enable hdmimode=${hdmimode} cvbsmode=${cvbsmode} hdmitx=${cecconfig} cvbsdrv=${cvbs_drv} pq=${pq} androidboot.firstboot=${firstboot} androidboot.factorystep=${factorystep} jtag=${jtag}; setenv bootargs ${bootargs} androidboot.hardware=amlogic;run cmdline_keys;setenv bootargs ${bootargs} androidboot.slot_suffix=${active_slot};if itest ${kernellog.enable} == 0; then setenv bootargs ${bootargs} quiet;else fi;
storeboot=if imgread kernel ${boot_part} ${loadaddr}; then bootm ${loadaddr}; fi;run update;
switch_bootmode=get_rebootmode;if test ${reboot_mode} = factory_reset; then run recovery_from_flash;else if test ${reboot_mode} = update; then run update;else if test ${reboot_mode} = cold_boot; then run try_auto_burn; else if test ${reboot_mode} = fastboot; then fastboot;fi;fi;fi;fi;
……
其中 bootfromnand
为0时,表示从(sd, usb)启动,为1时,表示从nand(设备内部存储, eMMC等)启动。
详细分析见 EmuELEC笔记
从nand启动
# rebootfromnand
# shutdown -r now
持久化从nand启动
在 /flash/aml_autoscript
中可以看到,每次进入coreelec后,会执行
setenv bootfromnand 0
在 /flash/n1_autoscript
中有,
if test ${bootfromnand} = 1; then setenv bootfromnand 0; saveenv; run storeboot; fi;
setenv env_addr "0x10400000"
setenv kernel_addr "0x11000000"
setenv initrd_addr "0x13000000"
不能直接修改,因为 /flash是只读的。我们要修改成读写的。
# mount | grep flash
/dev/system on /flash type ext4 (ro,noatime,data=ordered)
# mount -o remount,rw /flash/
# mount | grep flash
/dev/system on /flash type ext4 (rw,noatime,data=ordered)
再修改 /flash/aml_autoscript
文件和/flash/n1_autoscript
文件即可。