在 Icenowy 的帮助下用上了 Icenowy

随身设备

我一直想要一台顺手且独特(随身出门当然 show off)的随身设备,无论是笔记本、派、还是手机。顺手在于能满足我 SSH / VNC 的需求,独特在于机器比较奇妙,例如其环境配置或机器型号、性能。

几年下来,我尝试过不少随身设备。

在我大一的时候,我尝试过直接在手机上办公,只要随身带一个充电宝和一个蓝牙键盘。经过一番折腾和尝试,我放弃了。一方面是手机上装一个顺手的环境很痛苦(Termux 并不顺手,我现在只会临时用用),另一方面就是屏幕实在太小,是一种折磨。

之后我又在物色随身电脑,于是在咸鱼上收了一台 400 块钱(!)的十年前(!)的笔记本,CPU 是 Intel Core 2 Duo SU9300 2 x 1.2 GHz (Intel Core 2 Duo),内存有 3G,硬盘是 SSD(这个极大提升体验),10寸的屏幕。我在这台机器上折腾 Arch Linux,用的 i3 ,一路用了两年,性能完全能用(哈哈,能打过 unmatched),体验相当不错,尤其是其老式键盘,敲起来非常舒服。可惜的是,这台机器由于年久,续航非常不行,只有一个半小时,我出门只能带上一个12万毫安时(你没看错,12万)的充电宝,也只能续航 5 到 6 个小时,没办法嘛,45nm 工艺。再加上其 720p 屏幕非常目害,我逐渐有了换新的想法。

图来自之前 Bluetooth 的那篇,那台随身机器是左边的机器。

与此同时,随着年岁学识的增长(主要是内网机器的增多),我开始对 x86 阵营感到审美疲劳,准备换个架构换换脑子(勇敢做各个软件的 corner case,哈哈)。

20年底想过 pinebook(aarch64),可惜被群友劝退了(当时穷穷);

21年夏天,由于群友都在做 riscv,所以被安利入了 riscv 的坑,也便有了上一篇文章,在 Nezha D1 上安装 Arch Linux RISC-V,可惜的是,由于 Nezha D1 SDK 过于难受,内核也非常脏,vendor 内核和主线内核都不是很能用(vendor 内核缺功能,主线内核起不来 Wifi 和屏幕,没人想从 vendor SDK 里面把东西 port 过来),我在最终折腾出 i3 桌面后便不再想折腾了,因为当时从键盘敲击到渲染到屏幕上,中间有体感上200ms的延迟,这没法忍;

在21年10月份,就是在 M1Max 发布的当天,由于不是群友预告的 M2,失望之下,我准备49年入国军:把旧版的 M1 给买了,但不是切换到 Mac 那套生态,而是在 M1 上启 Linux,这里就非常感谢 Asahi Linux 一直以来的工作了,当时我是想着两周之内折腾好,折腾不好就无条件退货,于是我成功把 Linux 内核起来了,可惜由于当时没有 NVMe 驱动和 MBP 的键盘驱动,机器不是很能用,当时也很忙没空折腾(指从别人的树上 cherry-pick 驱动回来自己当小白鼠)(主要还是机器贵,坏了没法手修),于是就退货了。


我当时有个想法是,aarch64 随身电脑和 riscv 随身电脑哪个先实现用哪个。

华为擎云 L420

某天,突然有消息说华为有一款神秘笔记本,其 CPU 非常神秘,名叫麒麟 9006C,不在官网上挂出。群友热烈讨论了这个事情,某群友甚至在咸鱼上收了一台回来,经过探索发现其就是一个大号手机,CPU 的配置和麒麟9000是一样的(1+3+4 大中小三种核),只是砍掉了基带等芯片。当时我一看:5nm 的手机 CPU 拿来做笔记本,续航相当可用啊,价格也可以接受(相比 XPS,随身电脑作为 Thin Client 不要性能)(同时也相比国内其他 ARM 笔记本),于是手一莽就收了回来。

今年年初,终于收回来了,收了回来发现一些有趣的事情(其中有一些是 Icenowy 和群友共同发现的)

  • 机器应该是工程样机
  • 内核是工程内核,并没有被包管理器管理,开机后内核全是 log,还有很多 kernel function backtrace
  • 内核编译的时候没有开模块支持,所以不需要 initrd 等
  • 不知道为什么,内核读不到外置硬盘上的 rootfs,只能读到内置 UFS 上的 rootfs
  • 主板上有串口,可惜我们不知道是在哪里引出的
  • Wifi 和显卡是专有驱动
  • Wifi 的固件在 /vendor/firmware 下
  • /vendor 下有一堆奇妙东西,比如蓝牙,比如指纹,比如 TEE
  • 操作系统是银河麒麟,有配合内核和专有驱动做的奇妙二进制(比如 ukui-kwin-wayland)和 systemd-service
  • 最重要的:我们没有内核源码

收到机器,最重要的事情当然是自己换 OS 啦,于是开始以下路径。

NixOS

在21年夏天,由于 TUNA 一堆人的安利,我开始给我的主要工作台换上了 NixOS,体验相当不错,尤其是没有 dirty 的感觉了(adhoc fix /etc, not quite portable)。当然,最重要的还是非 root 用户能自由装包了,不用 gentoo prefix 这种非常消耗 CPU 的办法了,这样我就能在服务器上养一堆妹子(笑)。引用一段经典对话:

[Forwarded from Zenithal]
所以 nix 方便养妹子

[Forwarded from Zenithal]
不然妹子和你好上了来找你要 root

[Forwarded from Zenithal]
你不给还尴尬

[Forwarded from Zenithal]
人家还能 justify 自己要 root 要装包

[Forwarded from Zenithal]
用 nix 的话人家不用 root 也能装包

[Forwarded from Sequencer]
只是分手的时候怕她把你glibc删了

[Forwarded from Zenithal]
对的

Zenithal, [1/14/22 4:37 AM]
另一个问题在于,如果你养了好几个妹子,互相打起来了不会互相扔核弹(指 nuke 了对面家)

Zenithal, [1/14/22 4:38 AM]
后宫嘛,和谐最重要

Zenithal, [1/14/22 4:40 AM]
养后宫最有乐趣的在于一群人一块吃饭一块玩还和和气气的

由于 nixpkgs 这边对 linux-aarch64 的支持也挺不错,于是我开始搓 rootfs。

类似于 debootstrap,Nix 这边搓的方式其实很简单:写好 configuration.nix 之后,直接

1
nix-build --no-link '<nixpkgs/nixos>' -A config.system.build.tarball -I nixos-config=./configuration.nix

就能获得一个 tarball,直接丢到机器的一个分区上,给内核传一个 init,机器就起来了!

这里给一个配置的一部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 不用装内核
boot.isContainer = true;
# 从 x86 NixOS 上 cross 一个 tarball 出来
nixpkgs.crossSystem.config = lib.systems.examples.aarch64-multiplatform.config;
# 打 tarball 的时候把 init 放在简单路径下
system.build.tarball = pkgs.callPackage <nixpkgs/nixos/lib/make-system-tarball.nix> {
storeContents = [
{
symlink = "/init";
object = "${config.system.build.toplevel}";
}
];
contents = [];
compressCommand = "cat";
compressionExtension = "";
};

可惜的是,在最近的 nixpkgs 中,由于对 systemd 的魔改,systemd-udevd 在枚举设备的时候会遗漏几个设备,这样就不能识别机器的键盘和触摸板,Xserver 就没有键盘使用了,切换到老 systemd 后 udev 虽然识别了键盘,但 Xserver 不工作了,体验很难受。

当时正是半夜,我感到 frustrated,再加上 Icenowy 的大力帮助和当时的安利,我直接干掉了 NixOS,切换上了 Icenowy 操作系统。

Icenowy

在讲 Icenowy 之前,我想先讲讲 Icenowy。

除了之前提到的 udev 问题(debug 到 systemd 是有 Icenowy 的协助的),这个内核还有不少问题,例如其 Wifi 起不来;然后由于我对内核模块有要求,没有源码和内核 header 的情况下无法编译能用的模块。

Icenowy 也收了这种机器,于是我找对面请求 tech support,冰冰对着没有源码的内核二进制做了以下补丁:

  • mask 掉一个功能,修好 wifi 接口的返回值
  • 将硬编码在内核中的 /vendor/firmware 路径改为 /lib/firmware
  • 讲内核检查 vermagic 的代码修了一下,可以将不精确匹配的模块插入进去

于是我就有了一个可以用的内核!冰冰非常恐怖!

Icenowy Icenowy

AOSC OS 9 Icenowy 发布的当天(30小时制),我在 Icenowy 的帮助下换上了 Icenowy,用上了可用的 Icenowy,这相当有感觉。

安装方法很直接,aosc 也直接提供 tarball,我直接解压就好,之后的流程便对着 Arch Wiki 走,同时从我的老机器上拷贝一些配置文件回来,系统就起来了,体验和老机器基本一致,但屏幕大可了。

目前 audio,hdmi 之类的还没有调好,需要继续看银河麒麟那边做过什么黑魔法。

一些未满足的需求

用 aarch64 机器一个重要难题在于很多 x86 上的东西你没法很有效得跑,在工作上造成很大的不方便,比如说,「腾 讯 会 议」,比如说 Vivado(这台机器肯定不会装的),这种事情留给时间来检验吧。

本文在 Icenowy 上写成