Site IconAlex Haydock Home | Posts | Blogroll | About

博客部署在 Nintendo Wii 上

2025-04-21 17:40 netbsd shitpost 如果你正在阅读这条消息,那么下面的实验仍在进行中。这个页面是由一台真实的 Nintendo Wii 为你提供的。 你可以查看 Wii 的实时状态页面来获取系统负载信息。

长期以来,我一直很喜欢在非通用硬件上运行通用操作系统的想法。 这些年来,有一些很好的例子,包括一些经过 OEM 官方认可的例子。以前,我的 PS3 运行的是 Yellow Dog Linux,而且我已经寻找一个(价格合理的)PS2 Linux 副本超过 10 年了。

还有一些其他不错的非官方例子,例如 Dreamcast Linux,或者 PSPLinux。 但是,这些系统的一个共同点是,它们现在已经非常过时了。或者它们是爱好者移植的版本,有人曾经运行过一次,但长期支持从未上传。 PSP Linux 内核镜像最后一次构建是在 2008 年,而 Dreamcast Linux 甚至更复古,使用的是 2001 年构建的 2.4.5 内核。

我没有看到很多这样的项目,可以让我放心地将其作为实际生产工作负载的一部分来运行。直到现在。

最近在浏览 the NetBSD website 时,我注意到在“安装介质”部分的主页上有一个“Wii”选项,它与其他一等目标(如 Raspberry Pi 和通用 x86 机器)并列。

与上面其他过时且未维护的示例不同,点击 NetBSD Wii 端口会将你带到 2024 年 12 月发布的最新稳定 NetBSD 10.1 版本。甚至 daily HEAD builds 也是为 Wii 编译的。

当我发现它得到完全支持和维护时,我就知道我必须尝试在其上部署实际的生产工作负载。这个工作负载就是你现在正在阅读的博客。

寻找一台牺牲的 Wii

我们的故事始于 EMF Camp 2024 Swap Shop - 你预先喜爱的游戏机、装满 56k 调制解调器的纸板箱和放射性孤儿源的主要来源。

The EMF Wii being rescued from the Swap Shop

我拿起这个,希望主要用于自制游戏和模拟,但我不认为它会想到这个命运。

它足够快吗?

所以我们有一台备用的 Wii。和一个拥有主线支持的操作系统。但是 Wii 实际上足够快来处理这个作为生产工作负载吗?

Wii 中的单核“Broadway”CPU 是 IBM 对 PowerPC 750 产品线的持续发展的组成部分,其历史可以追溯到 Apple 标志性的 1998 Bondi Blue 鱼缸 iMac。虽然 Broadway 是 750 的后期版本之一,但商业上可用的等效芯片 - PowerPC 750CL - 的最大 TDP 仅为 9.8 W,并且时钟频率比 Wii 中的版本高约 33%。

因此,凭借基于 90 年代末架构的单核芯片和远低于 10 W 的 TDP,很明显我们在计算性能方面可能受到相当大的限制。

话虽如此,您可能熟悉的另一个 PowerPC 750 部署目前漂浮在距离地球 1,500,000 公里的地方,以前所未有的细节绘制宇宙最深处的地图。所以,如果我不能让这东西提供一个静态网站,那么我认为现在是执行我长期计划,退出科技行业并开设一家猫咪咖啡馆的时候了。

James Wii Space Telescope

更严肃地说,你可以阅读 in this NASA presentation 中有关 James Wii Space Telescope 对 PowerPC 750 的使用。 750 实际上在航天和卫星应用中得到了大量使用,因为有一个抗辐射版本可用,称为 RAD750。该芯片的一些其他最新用途包括火星 CuriosityPerseverance 探测器。

在 Wii 上安装 NetBSD

好的,Nintendo 的律师们请避开视线。

我已经很久没有软刷 Wii 了。我记得 Twilight Hack,它涉及利用 Twilight Princess 保存游戏处理程序中的缓冲区溢出来运行未签名代码。

现在事情变得容易多了。 Wilbrand exploit 似乎是人们现在普遍推荐的。与其他一些漏洞利用一样,它利用了 SD 卡可用于存储和检索 Wii Message Board 消息这一事实。利用这一点允许执行未签名代码,这允许我们启动安装 Homebrew Channel 的 HackMii 工具。

这是一个简单的 mod,只需要知道控制台的 MAC 地址并生成一些要从 SD 卡加载的文件。 here 有一个方便的基于浏览器的工具,可以为你完成所有繁重的工作。

在使用较大的 SDHC 卡运行 Wilbrand exploit 时,我确实遇到了一些问题,但使用 1GB 非 SDHC 卡的效果最好。 SD 卡兼容性 seems to be a known issue 对于 Wii 自制软件,但总的来说,我仍然认为这个过程相当轻松。

一旦我们破解了控制台,我们应该在我们的 Wii 菜单中提供 Homebrew Channel: The Homebrew Channel now available on the Wii Menu

现在我们可以准备我们的 NetBSD SD 卡。我们通过从 front page of the NetBSD site 下载 wii.img.gz 镜像来做到这一点。

对于这张卡,我选择使用一张相当快的 32GB SDHC 卡。 Wii 不支持 SDXC 或更新的卡,这意味着我们仅限于 32GB。较大的闪存设备也 通常 比小型设备更快且更具弹性。而且 NetBSD 似乎不像 Wilbrand exploit 那样担心生活在更大的卡上。所以总的来说,如果你想尝试这个,我建议购买一张质量不错的快速 32GB 卡。

我们可以随意解压缩和写入此镜像,但我喜欢使用 Raspberry Pi Imager,因为它会完成提取镜像并为我们验证写入后工作:

Using the Raspberry Pi Imager to write and verify the image

此时,事情变得非常容易。 NetBSD Wii 镜像具有所有必要的元数据和结构,可以像任何其他类型的自制应用程序一样直接从 Homebrew Channel 启动。我认为这里有很多功劳应该归功于 NetBSD developer Jared McNeill,他似乎是 Wii 端口的主要作者。

将我们的 SD 卡放入控制台并启动 Homebrew Channel 是我们准备启动 NetBSD 所需要做的全部:

NetBSD, ready to launch

一旦启动到 NetBSD 中,我们可以正常使用 USB 键盘,但最好让 SSH 工作,这样我们就可以远程管理系统。 SSH 守护程序已经开箱即用运行,因此我们需要进行的唯一更改是为 root 用户设置密码,然后通过将 PermitRootLogin yes 添加到 sshd_config 来启用以 root 身份登录。

你可以在这里设置一个非特权用户或做任何你喜欢的事情,但我很想尽快让 SSH 运行,因为由于 ~~我的服务器区域缺少支持 HDMI 的屏幕~~ 懒惰,我正在使用 macOS 上的采集卡和 Photo Booth 来完成这项工作,它实际上不支持禁用视频源上的图像翻转:

If you thought it was hard to exit Vim, try doing it back to front

如果你认为退出 Vim 很难,试试倒着做。

安装后,我通过编辑 /etc/ifconfig.axe0 并重新启动主机来设置静态网络配置。

关于这一点,我正在使用官方的 RVL-015 Wii LAN 适配器。我竭尽全力以合理的价格追踪其中一个,以获得最佳的兼容性机会。经过反思,这可能是不需要的,因为当我们启动到 NetBSD 中时,我们应该可以使用所有 NetBSD 的驱动程序,所以我希望大多数通用 USB 适配器可能(理论上!)都可以工作。

如果有人想知道,以下是来自 dmesg 的适配器和芯片组的具体信息:

[   2.089988] axe0 at uhub2 port 1
[   2.089988] axe0: ASIX Electronics (0x0b95) AX88772 USB 2.0 10/100 ethernet controller (0x7720), rev 2.00/0.01, addr 2
[   2.549988] ukphy0 at axe0 phy 16: Asix Semiconductor AX88772 internal PHY (OUI 0x007063, model 0x0001), rev. 1
[   2.559992] ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
[   2.559992] axe0: Ethernet address 9c:e6:35:73:f0:44

软件包管理

重新启动后,我通过设置一些环境变量,然后使用 pkg_add pkgin 来安装 NetBSD 的 pkgin 软件包管理器:

export PATH="/usr/pkg/sbin:/usr/pkg/bin:$PATH"
export PKG_PATH="https://cdn.NetBSD.org/pub/pkgsrc/packages/NetBSD/evbppc/10.1/All/"
pkg_add pkgin

之后,我可以使用 pkgin 安装一堆有用的软件包 - 最重要的是包括我们的 lighttpd Web 服务器,我之所以选择它,是因为它很苗条,并且非常适合资源受限的环境:

pkgin install bsdfetch iperf3 lighttpd nano rsync

之后,我复制了基本的 lighttpd 示例配置,并启用和启动了它:

cp -fv /usr/pkg/share/examples/rc.d/lighttpd /etc/rc.d
echo 'lighttpd=YES' >> /etc/rc.conf
/etc/rc.d/lighttpd start

默认情况下,lighttpd 设置为从 /srv/www/htdocs 提供静态内容。由于我的博客是用 Hugo 构建的静态页面集合,因此我可以简单地 rsync 这些文件,并在几秒钟内让系统通过标准 HTTP 提供我的站点。

它足够快吗? (补遗)

好吧,你明白了。事实证明,虽然 PPC 750 可能足以绘制宇宙最远处的地图,但一点点浸泡测试表明,当试图并发提供大量使用现代 TLS 加密的页面时,它确实有点挣扎。

我尝试通过禁用 NetBSD 开箱即用运行的一堆我不需要的服务来释放资源:

sed -i 's/^dhcpcd=.*/dhcpcd=NO/' /etc/rc.conf || echo 'dhcpcd=NO' >> /etc/rc.conf
sed -i 's/^inetd=.*/inetd=NO/' /etc/rc.conf || echo 'inetd=NO' >> /etc/rc.conf
sed -i 's/^mdnsd=.*/mdnsd=NO/' /etc/rc.conf || echo 'mdnsd=NO' >> /etc/rc.conf
sed -i 's/^postfix=.*/postfix=NO/' /etc/rc.conf || echo 'postfix=NO' >> /etc/rc.conf

我还禁用了 ntpd,它使用了整个系统 RAM 的惊人的 15%:

USER PID %CPU %MEM COMMAND
root 9161 0.0 15.6 /usr/sbin/ntpd -p /var/run/ntpd.pid -g

不幸的是,似乎 ntpd 绝对有必要保持系统时钟的检查。我不确定 Wii 是否漂移了很多,是否特定于 Wii 上的 NetBSD,或者可能是一个近 20 年的控制台中的时钟电池是否已经放弃了,但在禁用它之后,我得到了一些有趣且非常愤慨的错误消息: The world needs more indignant sounding error messages like this

为了补偿,我通过将 ntpd -q -g 添加到主 crontab 中来作弊,因此系统将每小时在 :42 分过去运行它。我们仍然获得时间同步,但我们不需要牺牲六分之一的 RAM 来保持它的驻留:

42  *    *    *    *    /usr/sbin/ntpd -q -g

即使在释放上述资源之后,似乎并行服务多个加密请求对于 750 来说也是一种挣扎,因此我选择将博客的 TLS 终止移动到位于 Wii 前面的 Caddy 实例。

我有 Caddy 充当 Wii 的反向代理,使用 ACME 处理加密和证书管理。 重要的是,Caddy 中未启用任何缓存选项。站点提供的每个请求都由 Wii 直接提供服务 - 包括这篇文章中的大量图像,我几乎肯定会后悔添加它们。我尽可能地优化了,但是当加载所有内容时,此页面仍然几乎完全是 1 MB。

Shitpost diagram of Caddy reverse proxy

通过这种方法,我也能够通过删除来自 known scraper User Agents 的请求(在将它们转发到 Wii 之前)来在 Caddy 的级别沉降 LLM slop-scrapers 。 希望这可能有助于保持我们的单核不会承受太多的痛苦。

状态监控

将 SSL 终止移动到 Caddy 也让我可以启用 Caddy 的 Prometheus exporter,因此我可以将其加载到我的 InfluxDB + Grafana 堆栈中并监控站点负载,而无需给 Wii 带来大量额外的压力。

但我仍然有兴趣(我相信你也有兴趣)在本文发布时监控 Wii 资源的一般状态。

考虑到我不得不禁用 NTP 客户端,因为它使用了太多的 RAM,我认为首先直接在 Wii 上运行像 Prometheus exporter 这样的东西是绝对不可能的。所以我编写了一个简单的 shell 脚本,该脚本每 15 分钟从 crontab 运行一次,并将一些系统统计信息输出到 Webroot 中的基本 HTML 文件中。

⣤⣤⣤⠀⠀⠀⠀⠀⣀⣤⣄⠀⠀⠀⠀⠀⣠⣤⣤⠀⠀⣴⣿⣦⠀⠀⢀⣶⣿⣦
⢸⣿⣿⡇⠀⠀⠀⢠⣿⣿⣿⣇⠀⠀⠀⠀⣿⣿⡿⠀⠀⠻⣿⠟⠀⠀⠈⠿⣿⠟
⠀⢿⣿⣷⠀⠀⠀⣼⣿⡿⣿⣿⡀⠀⠀⢸⣿⣿⠇⠀⠀⣀⣀⡀⠀⠀⠀⣀⣀⡀
⠀⠸⣿⣿⡆⠀⢠⣿⣿⠃⢿⣿⣇⠀⠀⣿⣿⡟⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
⠀⠀⢿⣿⣷⠀⣸⣿⡟⠀⠘⣿⣿⠀⢸⣿⣿⠇⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
⠀⠀⠸⣿⣿⣄⣿⣿⠃⠀⠀⢿⣿⣇⣿⣿⡿⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
⠀⠀⠀⢿⣿⣿⣿⡟⠀⠀⠀⠸⣿⣿⣿⣿⠃⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
⠀⠀⠀⠘⢿⣿⡿⠁⠀⠀⠀⠀⠻⣿⣿⠟⠀⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿
blog.infected.systems NetBSD Wii Status
Generated on: Mon Apr 21 16:30:00 UTC 2025
=== uname -a ===
NetBSD wii 10.1 NetBSD 10.1 (WII) #0: Mon Dec 16 13:08:11 UTC 2024 mkrepro@mkre
pro.NetBSD.org:/usr/src/sys/arch/evbppc/compile/WII evbppc
=== uptime ===
 4:30PM up 25 mins, 1 user, load averages: 0.00, 0.00, 0.00
[...]

你可以在 blog.infected.systems/status 上查看完整的状态页面。

最后的观察

老实说,这比我预期的效果要好得多,而且容易得多。当然,这里的设置也有一些缺点。

重新启动 NetBSD 会重新启动整个控制台,而不仅仅是 NetBSD “应用”,因此在任何内核补丁或系统升级后,你都会发现自己回到了 Wii 菜单。是的,这确实意味着你服务器橱柜中的 Wiimote 和传感器栏现在是生产基础设施的重要组成部分。

我对功耗也相当满意。基于我的 UPS 监控统计信息的一些测试表明,空闲时,Wii 在我的整体 homelab 使用量中增加了一个相当稳定的 ~18 W。

通过我的计算,这意味着我可以预期 Wii 每月使用 ~13.2 kWh,这在我的相当昂贵的英国电力关税中每月约为 3.47 英镑 - 这实际上比我可以在明显的云提供商周围找到的大多数 VPS 都要便宜。所以当你在寻找你的下一个 VPS 时…… 你知道要考虑什么了。

这是一个漫长周末下雨天的有趣实验。如果它真的继续像开始时一样工作,我可能会继续运行一段时间。我经常有兴趣对部署的事物应用人为的约束,因为我发现那是学习的最佳时机。

谁知道呢,到下周这个时候,我可能已经被迫成为 NetBSD TCP 内核可调参数方面的专家了……

最新文章

Home | GitHub | Mastodon | .onion | RSS