闲置了好久的一台斐讯 N1 终于被我刷成了 Armbian。早在一年多之前,趁着 N1 还没有涨价到很高,凑巧拼多多有券就一连买了两个 N1。一个到手就被我刷成了电视盒子,现在连着电视,偶尔投屏看看电视和电影。另一台到手后盒子都没拆就一直闲置到现在。之前想的是可以刷成 Armbian,当一台小的家庭服务器来用。这个两个周末正好有空,就拿出来搞了一下,过程还挺曲折的。

一开始我是使用 ADB 连接到 N1,通过 adb connect <ip> && adb reboot update 的方式进行启动到 U 盘中系统的方式,但是这样会有让 U 盘中刷好的镜像被盒子安卓系统破坏的风险,我上周末就是用这种方式搞得,结果启动到 U 盘后,有各种各样奇怪的问题,所以我这边提供了另外其他的方案,流程可能要多一步。

刷写 Linux loader 固件

刷写的方式和刷写普通安卓盒子固件的方式一样,具体步骤不做过多的介绍了,具体步骤可以参考网络上其他的文章。Linux loader 固件会在开机的时候自动执行 reboot update,自动重启到 U 盘,不会对 U 盘中的固件造成影响。

制作启动 U 盘

启动盘制作可以使用 Win32DiskImager,启动镜像从 150balbes 大神的网盘中下载,由于大神发布的镜像现在都统一到了一个文件中,所以只下载 RK_AML_AW 文件夹下面的镜像即可,这边面包含了 rockchip、amlogic、allwinner 三个厂商芯片的系统镜像。

镜像 U 盘制作好了之后就需要对 boot 分区中进行一点设置,这块就遇到了一个坑点,目前从网上搜得到教程大多是比较久之前的了,而现在最新的 Armbian 镜像的 boot 分区的结构发生了变化,所以修改方法也跟着变了。

  • 修改 u-boot-s905x-s912 的文件名为,U-boot.ext
  • 修改 extlinux/extlinux.conf 中的 dtb 文件

我这边提供一个修改好的配置,可以直接替换原有 extlinux.conf 文件。

LABEL Armbian
LINUX /zImage
INITRD /uInitrd

FDT /dtb/amlogic/meson-gxl-s905d-phicomm-n1.dtb
APPEND root=LABEL=ROOTFS rootflags=data=writeback rw console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0

在这里面还遇到了另外一个坑点,就是我下载最新的 11 月份的镜像,结果发现里面没有 s905 的三个 uboot ,所以我是下载的 10月份的镜像。发现不存在 uboot 的看屯昌尝试下其他月份的镜像。

从 U 盘中启动

这一步比较简单,插好 U 盘,接着插入电源,N1 会自动重启到 U 盘,脸上显示器的话可以看到 uboot 的界面,5秒之后就开始加载 Linux 了,如果一切正常就会进入到 Armbian 中,首先需要设置root密码,添加普通用户等等,其他的就不过多说明了。

我在这一步也遇到了不少坑点。首先是我的 U 盘无法启动到被识别,加载了 Linux 之后要过很长时间才能进入到添加 root 密码的界面,我换了另外一个 U 盘就可以了,但是就是速度太慢了。另外一个坑点就是我的高斯双模键盘无法被识别,所以我上周没搞定,这周买了把10块的键盘才搞定了的,,,

刷写固件到 emmc

Caution

刷写固件到 emmc 有变砖的风险,一定要想清楚再操作。

为了不占用一个启动 U 盘,另外也可以提高系统启动速度,决定将系统刷写到 emmc 中。这个过程中也遇到了不少的坑。首先是刷写的脚本变了,之前可以通过 nand–sata-install 命令刷写,现在没了。启动进入系统后,在 root 账户的根目录下面会有一堆可以刷写固件的脚本,我一开始是用的 install-aml-s905x.sh 结果发现刷写后无法从 U 盘启动,之后搜了一下发现不能用这个脚本应该用 install-aml.sh

修改 dtb 解决高负载

N1 armbian 镜像的高负载问题一直都有,解决办法无非就是替换 dtb,直接替换别人提供的 dtb 的话需要注意内核的版本。由于我的内核比较新,没人提供线程的 dtb,所以我选择反编译 dtb 文件,修改后再便宜得到 dtb 文件。

# 反编译固件自带的 dtb 文件,得到 dts 文件
dtc -I dtb -O dts -o n1.dts /boot/dtb/amlogic/meson-gxl-s905d-phicomm-n1.dtb

找到 interrupt-controller@9880 这一行,将下面的 phandle = < 0x21 >; 注释掉。

Caution

修改的 dts 文件的位置一定是 interrupt-controller@9880 而不是其他。

    bus@c1100000 {
      compatible = "simple-bus";
      reg = < 0x00 0xc1100000 0x00 0x100000 >;
      #address-cells = < 0x02 >;
      #size-cells = < 0x02 >;
      ranges = < 0x00 0x00 0x00 0xc1100000 0x00 0x100000 >;

      interrupt-controller@9880 {
        compatible = "amlogic,meson-gpio-intc\0amlogic,meson-gxl-gpio-intc";
        reg = < 0x00 0x9880 0x00 0x10 >;
        interrupt-controller;
        #interrupt-cells = < 0x02 >;
        amlogic,channel-interrupts = < 0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 >;
        status = "okay";
        <!-- 要注释掉的是下面这一行,千万别搞错了 -->
        #phandle = < 0x21 >;
      };
# 编译 dts 文件到 dtb 文件
dtc -I dts -O dtb -o n1.dtb n1.dts
# 备份原有 dtb 文件
sudo cp /boot/dtb/amlogic/meson-gxl-s905d-phicomm-n1.dtb /boot/dtb/amlogic/meson-gxl-s905d-phicomm-n1.dtb.bak
# 覆盖原有 dtb 文件
sudo cp n1.dtb /boot/dtb/amlogic/meson-gxl-s905d-phicomm-n1.dtb
# 重启
sudo reboot

沃拉,负载降下来了。

当然我折腾的时候过程没有这么顺利。。。

修改 dtb 文件的时候找错行了,导致 Linux 无法启动。再修改 dtb 文件之前已经对系统进行了更新和一些配置了,另外我的可以启动的 U 盘速度实在是太慢了,烧录一次要半个小时,所以不太想再重新走一遍刷机的流程。所以想看看能不能救回来。折腾了一下发现可以在 uboot 启动到 Linux 之前,打断自动加载 Linux 的过程,只需要在倒计时5 秒之前按任何键盘的按键即可。进入到 uboot 的界面后就去探索一番,发现有 usb_boot 这个环境变量,通过这个环境变量我们就可以重新从 U 盘启动系统了,只要能够通过 U 盘进入系统就一切还好说。

  • 运行 run usb_boot 启动进入到 U 盘中的系统
  • 在 U 盘的系统中挂载 emmc 系统 root 分区 /dev/mmcblk1p1
  • 将 dtb 修改回原来的备份的 dtb

这里面有趣的是,可以通过 uboot 里面自带的环境变量启动到 U 盘,另外 boot 分区的设备名不要搞错了。一顿折腾终于把系统就回来了。

这大概就是整个折腾的过程,总的来说还是蛮折腾的。

最后放一张 htop 的图吧:

htop

htop

参考

  1. 应广大人民群众要求,搞个 N1 通过 U 盘跑 LINUX (armbian) 的教程
  2. 给 N1/T1 装上原生 Armbian_4.18 内核
  3. 斐讯 N1 Armbian 低负载 dtb 编译
  4. N1 盒子刷 Armbian,看这一篇就够了 ——Armbian 全方位安装指导书
  5. 镜像网盘地址 – Y-disk
  6. 镜像网盘地址 – MEGA
  7. 官方镜像地址