Blog này được host trên một chiếc Nintendo Wii
(blog.infected.systems)- Một chiếc Nintendo Wii thật đang phục vụ blog Hugo tĩnh bằng NetBSD 10.1 và
lighttpd, và trong suốt thời gian thử nghiệm, độc giả đang xem các trang được phân phối trực tiếp từ Wii - Không giống các bản port mang tính sở thích đã cũ, bản port NetBSD cho Wii có bản phát hành ổn định mới nhất và các bản build HEAD hằng ngày, nên tình trạng bảo trì đủ tốt để chạy cả tải vận hành thực tế
- Việc cài đặt đi theo quy trình chạy Homebrew Channel qua softmod Wii, ghi
wii.img.gzvào thẻ SD, rồi cấu hình SSH, mạng tĩnh,pkginvàlighttpd - CPU đơn nhân dòng PowerPC 750 của Wii có thể xử lý HTTP tĩnh, nhưng khó xử lý song song nhiều yêu cầu mã hóa TLS hiện đại, nên Caddy đảm nhiệm chấm dứt TLS ở phía trước và quản lý chứng chỉ ACME
- Có hạn chế là sau khi khởi động lại sẽ cần Wiimote và sensor bar, nhưng với điện năng nhàn rỗi khoảng 18W và mức tiêu thụ điện hằng tháng khoảng 13.2kWh, thí nghiệm tưởng như đồ chơi này lại trở thành môi trường học hạ tầng thực tế
Thử nghiệm phục vụ một blog thật từ Wii
- Trong thời gian thử nghiệm, một chiếc Nintendo Wii thật đang phục vụ blog này
- Có thể xem tải hệ thống của Wii tại live(-ish) status page
- Điểm xuất phát là sự quan tâm tới việc chạy hệ điều hành phổ dụng trên phần cứng không dành cho mục đích phổ dụng
- Trước đây cũng từng có các trường hợp như Yellow Dog Linux trên PS3, PS2 Linux, Dreamcast Linux, và PSPLinux
- Tuy nhiên, ảnh kernel PSP Linux được build lần cuối vào năm 2008, còn Dreamcast Linux dùng kernel 2.4.5 được build từ năm 2001, nên không phù hợp cho tải vận hành dài hạn
Bản port NetBSD cho Wii giúp thí nghiệm này khả thi
- Trong mục installation media trên website NetBSD, Wii được hiển thị cùng với các mục tiêu hạng nhất như Raspberry Pi hay máy x86 thông thường
- Bản port NetBSD cho Wii liên kết tới NetBSD 10.1, bản phát hành ổn định mới nhất vào tháng 12/2024
- Các daily HEAD builds cũng được cấu hình cho Wii
- Vì tình trạng bảo trì vẫn còn tốt nên có thể thử triển khai tải vận hành thực tế lên Wii, và tải đó chính là blog này
Điều kiện phần cứng và hiệu năng
- Chiếc Wii dùng cho thử nghiệm được lấy từ EMF Camp 2024 Swap Shop
- CPU Broadway đơn nhân của Wii là phần tiếp nối của dòng IBM PowerPC 750
- Dòng này có thể truy ngược về tận Apple Bondi Blue iMac năm 1998
- Chip thương mại tương đương PowerPC 750CL có TDP tối đa 9.8W và xung nhịp cao hơn khoảng 33% so với phiên bản trong Wii
- Với điều kiện đơn nhân, dựa trên kiến trúc cuối thập niên 1990 và TDP dưới 10W, năng lực tính toán là khá hạn chế
- Dòng PowerPC 750 cũng được dùng trong lĩnh vực vũ trụ và vệ tinh, với phiên bản chống bức xạ là RAD750
- Có thể tìm thấy các trường hợp sử dụng PowerPC 750 trong tài liệu của NASA
- Các rover Mars Curiosity) và Perseverance) cũng có các trường hợp sử dụng chip liên quan
Softmod Wii và cài đặt NetBSD
- Để chạy mã không ký trên Wii, thí nghiệm sử dụng Wilbrand exploit
- Wilbrand tận dụng tính năng lưu và tải tin nhắn của Wii Message Board qua thẻ SD để cho phép thực thi mã không ký
- Qua quá trình này có thể khởi động HackMii và cài Homebrew Channel
- Công việc này cần địa chỉ MAC của console và việc tạo các tệp để chép lên thẻ SD, và một công cụ trên trình duyệt xử lý quy trình đó
- Khi chạy Wilbrand bằng thẻ SDHC dung lượng lớn đã gặp vấn đề, và thẻ non-SDHC 1GB hoạt động tốt nhất
- Thẻ SD cho NetBSD được chuẩn bị bằng cách tải ảnh
wii.img.gztừ trang NetBSD- Wii không hỗ trợ SDXC trở lên nên bị giới hạn ở 32GB
- NetBSD ít nhạy cảm hơn Wilbrand với thẻ dung lượng lớn, nên một thẻ SDHC 32GB nhanh và chất lượng tốt đã được chọn
- Dùng Raspberry Pi Imager có thể xử lý luôn việc giải nén ảnh, ghi và xác minh
- Ảnh NetBSD cho Wii có metadata và cấu trúc cho phép boot trực tiếp từ Homebrew Channel như một ứng dụng homebrew thông thường
- Công lớn thuộc về NetBSD developer Jared McNeill, người có vẻ là tác giả chính của bản port Wii
Cấu hình hệ thống ban đầu
- Sau khi NetBSD khởi động, bàn phím USB hoạt động bình thường, nhưng SSH được cấu hình để quản trị từ xa
- SSH daemon chạy sẵn mặc định, chỉ cần đặt mật khẩu
rootvà thêmPermitRootLogin yesvàosshd_config - Cấu hình mạng tĩnh được thiết lập bằng cách chỉnh sửa
/etc/ifconfig.axe0 - Bộ điều hợp mạng dùng là RVL-015 Wii LAN Adapter chính hãng
- Trong
dmesg, nó hiện là bộ điều khiển Ethernet USB 2.0 10/100 ASIX Electronics AX88772 - Sau khi NetBSD khởi động có thể dùng driver của NetBSD, nên về lý thuyết các bộ điều hợp USB thông thường cũng sẽ hoạt động
- Trong
Quản lý gói và cấu hình web server
- Trình quản lý gói
pkgincủa NetBSD được cài bằngpkg_add pkginsau khi thiết lập biến môi trường - Đường dẫn gói sử dụng là
https://cdn.NetBSD.org/pub/pkgsrc/packages/NetBSD/evbppc/10.1/All/ - Các gói đã cài gồm
bsdfetch,iperf3,lighttpd,nano,rsync - Web server được chọn là lighttpd vì phù hợp với môi trường hạn chế tài nguyên
- Script rc mẫu của
lighttpdđược chép vào/etc/rc.d, thêmlighttpd=YESvào/etc/rc.conf, rồi khởi động - Đường dẫn nội dung tĩnh mặc định là
/srv/www/htdocs - Vì blog là tập hợp các trang tĩnh được build bằng Hugo nên chỉ cần chép tệp bằng
rsynclà có thể phục vụ trực tiếp qua HTTP tiêu chuẩn
Tải TLS và reverse proxy Caddy
- Kết quả thử tải dài hạn cho thấy PowerPC 750 gặp áp lực khi phục vụ đồng thời nhiều trang được mã hóa bằng TLS hiện đại
- Để giải phóng tài nguyên, một số dịch vụ chạy mặc định trên NetBSD đã bị tắt
- Tắt
devpubd,dhcpcd,inetd,mdnsd,postfix - Trong
/etc/mailer.conf, đổisendmail,mailq,newaliasesthành/bin/trueđể ngăn các tiến trình liên quan chạy
- Tắt
ntpdbị vô hiệu hóa vì dùng 15.6% RAM hệ thống- Vẫn cần đồng bộ thời gian nên
ntpdate time.cloudflare.comđược thêm vàocrontabđể chạy mỗi giờ vào phút:42 - Cuối cùng, chấm dứt TLS cho blog được giao cho một instance Caddy đứng trước Wii
- Caddy hoạt động như reverse proxy và xử lý mã hóa cùng quản lý chứng chỉ ACME
- Caddy không bật tùy chọn cache
- Mọi request đều do Wii xử lý trực tiếp; tính cả hình ảnh của bài này thì tải toàn bộ trang gần như chính xác là 1MB
- Ở lớp Caddy, các request có User-Agent scraper đã biết sẽ bị chặn để không được chuyển tới Wii
- Tiêu chí chặn dùng known scraper User Agents
Cấu hình theo dõi trạng thái
- Khi chuyển việc chấm dứt TLS sang Caddy, có thể sử dụng Prometheus exporter của Caddy
- Dữ liệu này được đưa vào stack InfluxDB + Grafana để theo dõi tải của trang web
- Trên chính Wii không chạy thêm tiến trình như Prometheus exporter
- Thay vào đó, một shell script đơn giản được tạo ra để chạy mỗi 15 phút trong
crontab, và xuất trạng thái hệ thống thành tệp HTML trong web root - Trang trạng thái hiển thị thông tin như
uname -a,uptime - Có thể xem toàn bộ trang trạng thái tại blog.infected.systems/status
Hạn chế vận hành và mức tiêu thụ điện
- Toàn bộ cấu hình hoạt động tốt hơn dự kiến rất nhiều và việc cài đặt cũng dễ dàng
- Khi khởi động lại NetBSD, không chỉ ứng dụng NetBSD khởi động lại mà toàn bộ console Wii cũng reboot và quay về Wii Menu
- Sau khi vá kernel hoặc nâng cấp hệ thống, Wiimote và sensor bar trở thành thành phần hạ tầng bắt buộc
- Trong thử nghiệm dựa trên giám sát UPS, khi ở trạng thái nhàn rỗi Wii làm tăng tổng mức tiêu thụ của homelab khoảng 18W
- Tính ra mức tiêu thụ điện mỗi tháng vào khoảng 13.2kWh
- Theo giá điện tại Anh, chi phí khoảng £3.47/tháng, rẻ hơn cả VPS của một số nhà cung cấp cloud
- Đây là một thí nghiệm vui trong suốt cuối tuần dài, và nếu vẫn chạy tốt thì sẽ được duy trì thêm một thời gian
- Có hứng thú với những thí nghiệm như vậy vì việc học thường hiệu quả trong môi trường triển khai có áp đặt các ràng buộc nhân tạo
Cập nhật tháng 2/2026
- Sau khi bài viết được đăng, nhiều người đã chỉ cách để Wii boot thẳng vào NetBSD
- Cách làm là cài Priiloader và đặt NetBSD làm ứng dụng Homebrew để tự động khởi động
- Với cấu hình này, có thể vận hành headless hoàn toàn mà không cần Wiimote mang tính sống còn với nhiệm vụ
2 bình luận
Tôi nhớ hồi từng cài Debian lên một chiếc điện thoại Android không dùng đến rồi chạy web server trên đó.
Lúc đầu tôi thấy lạ vì sao lại dùng cả Caddy lẫn lighttpd cùng lúc, nhưng có vẻ là chỉ phục vụ file tĩnh trên Wii còn phần còn lại thì được xử lý bởi Caddy trên một máy khác.