บล็อกนี้โฮสต์อยู่บน Nintendo Wii
(blog.infected.systems)- Nintendo Wii เครื่องจริงกำลังให้บริการบล็อก Hugo แบบสแตติกด้วย NetBSD 10.1 และ
lighttpdและระหว่างที่การทดลองยังดำเนินอยู่ ผู้อ่านกำลังดูหน้าที่ส่งตรงจาก Wii - พอร์ต NetBSD สำหรับ Wii แตกต่างจากพอร์ตงานอดิเรกเก่า ๆ ตรงที่มีทั้ง รีลีสเสถียรล่าสุด และ daily HEAD build ทำให้สถานะการบำรุงรักษาดีพอที่จะลองนำ workload สำหรับใช้งานจริงไปรันได้
- ขั้นตอนติดตั้งเริ่มจากการทำ softmod ให้ Wii เพื่อเปิด Homebrew Channel จากนั้นเขียน
wii.img.gzลง SD card แล้วตั้งค่า SSH, เครือข่ายแบบ static,pkginและlighttpd - CPU single-core ตระกูล PowerPC 750 ของ Wii จัดการ HTTP แบบสแตติกได้ แต่รับมือกับ คำขอ TLS ที่เข้ารหัส สมัยใหม่จำนวนมากแบบขนานได้ยาก จึงให้ Caddy อยู่ด้านหน้าเพื่อทำ TLS termination และจัดการใบรับรอง ACME
- แม้มีข้อจำกัดว่าหลังรีบูตต้องใช้ Wiimote และ sensor bar แต่ด้วยพลังงานขณะ idle ราว 18W และการใช้ไฟฟ้าต่อเดือนราว 13.2kWh การทดลองที่ดูเหมือนของเล่นจึงกลายเป็นสภาพแวดล้อมเรียนรู้โครงสร้างพื้นฐานจริงได้
การทดลองให้บริการบล็อกจริงจาก Wii
- ระหว่างที่การทดลองดำเนินอยู่ Nintendo Wii เครื่องจริงกำลังให้บริการบล็อกนี้
- สามารถดูโหลดของระบบ Wii ได้ที่ live(-ish) status page
- จุดเริ่มต้นมาจากความสนใจในการรันระบบปฏิบัติการอเนกประสงค์บนฮาร์ดแวร์ที่ไม่ได้มีไว้เพื่อวัตถุประสงค์อเนกประสงค์
- ในอดีตก็มีตัวอย่างอย่าง Yellow Dog Linux บน PS3, PS2 Linux, Dreamcast Linux และ PSPLinux
- อย่างไรก็ตาม image ของเคอร์เนล PSP Linux ถูก build ครั้งสุดท้ายในปี 2008 และ Dreamcast Linux ใช้เคอร์เนล 2.4.5 ที่ build ในปี 2001 จึงไม่เหมาะกับ workload ที่ต้องรันระยะยาว
พอร์ต NetBSD สำหรับ Wii ทำให้การทดลองเป็นไปได้
- ในส่วน installation media ของเว็บไซต์ NetBSD มี Wii แสดงอยู่ร่วมกับเป้าหมายระดับหนึ่งอย่าง Raspberry Pi และเครื่อง x86 ทั่วไป
- พอร์ต NetBSD สำหรับ Wii เชื่อมไปยัง NetBSD 10.1 ซึ่งเป็นรีลีสเสถียรล่าสุดในเดือนธันวาคม 2024
- มี daily HEAD builds สำหรับ Wii ด้วย
- เพราะสถานะการบำรุงรักษายังมีชีวิตอยู่ จึงสามารถทดลอง deploy workload สำหรับใช้งานจริงลงบน Wii ได้ และ workload นั้นก็คือบล็อกนี้
เงื่อนไขด้านฮาร์ดแวร์และประสิทธิภาพ
- Wii ที่ใช้ทดลองได้มาจาก EMF Camp 2024 Swap Shop
- CPU single-core Broadway ของ Wii อยู่ในสายตระกูล IBM PowerPC 750
- ตระกูลนี้ย้อนกลับไปถึง Apple Bondi Blue iMac ในปี 1998
- ชิปเชิงพาณิชย์ระดับเดียวกันอย่าง PowerPC 750CL มี TDP สูงสุด 9.8W และมี clock สูงกว่ารุ่นที่อยู่ใน Wii ประมาณ 33%
- ด้วยเงื่อนไขแบบ single-core, มีพื้นฐานสถาปัตยกรรมช่วงปลายทศวรรษ 1990 และ TDP ต่ำกว่า 10W ทำให้สมรรถนะการประมวลผลมีข้อจำกัด
- ตระกูล PowerPC 750 ยังถูกใช้ในวงการอวกาศและดาวเทียมด้วย และมีรุ่นเสริมความทนทานต่อรังสีอย่าง RAD750
- สามารถตรวจสอบกรณีใช้งาน PowerPC 750 ได้จากเอกสารของ NASA
- มีกรณีการใช้ชิปที่เกี่ยวข้องในรถสำรวจดาวอังคาร Curiosity) และ Perseverance) ด้วย
การทำ softmod ให้ Wii และติดตั้ง NetBSD
- ใช้ Wilbrand exploit เพื่อรันโค้ดที่ไม่ได้ลงลายเซ็นบน Wii
- Wilbrand ใช้ความสามารถในการบันทึกและโหลดข้อความของ Wii Message Board ผ่าน SD card เพื่อให้รันโค้ดที่ไม่ได้ลงลายเซ็นได้
- ผ่านกระบวนการนี้จึง boot HackMii และติดตั้ง Homebrew Channel
- งานนี้ต้องใช้ MAC address ของเครื่องคอนโซลและการสร้างไฟล์ที่จะวางบน SD card โดยมีเครื่องมือบนเบราว์เซอร์ช่วยจัดการขั้นตอนนี้
- เมื่อรัน Wilbrand ด้วย SDHC card ขนาดใหญ่มีปัญหา และทำงานได้ดีที่สุดกับการ์ด non-SDHC ขนาด 1GB
- SD card สำหรับ NetBSD เตรียมโดยดาวน์โหลด image
wii.img.gzจากเว็บไซต์ NetBSD- Wii ไม่รองรับ SDXC ขึ้นไป จึงถูกจำกัดไว้ที่ 32GB
- NetBSD ทำงานกับการ์ดขนาดใหญ่ได้ไม่จุกจิกเท่า Wilbrand จึงเลือกใช้ SDHC card ขนาด 32GB ที่เร็วและคุณภาพดี
- หากใช้ Raspberry Pi Imager จะจัดการทั้งการคลายบีบอัด image, การเขียน และการตรวจสอบความถูกต้องได้พร้อมกัน
- image NetBSD สำหรับ Wii มี metadata และโครงสร้างที่ boot ได้โดยตรงจาก Homebrew Channel เหมือนแอป homebrew ทั่วไป
- เครดิตควรยกให้ Jared McNeill นักพัฒนา NetBSD ซึ่งดูเหมือนเป็นผู้เขียนหลักของพอร์ต Wii
การตั้งค่าระบบเบื้องต้น
- หลัง boot NetBSD แล้ว คีย์บอร์ด USB ทำงานได้ตามปกติ แต่ตั้งค่า SSH เพื่อการจัดการจากระยะไกล
- SSH daemon รันอยู่เป็นค่าเริ่มต้น และต้องตั้งรหัสผ่าน
rootกับเพิ่มPermitRootLogin yesในsshd_config - ตั้งค่าเครือข่ายแบบ static โดยแก้ไข
/etc/ifconfig.axe0 - อะแดปเตอร์เครือข่ายที่ใช้คือ RVL-015 Wii LAN Adapter อย่างเป็นทางการ
- ใน
dmesgแสดงเป็นคอนโทรลเลอร์ ASIX Electronics AX88772 USB 2.0 10/100 Ethernet - หลัง boot NetBSD แล้วสามารถใช้ไดรเวอร์ของ NetBSD ได้ ดังนั้นตามทฤษฎีแล้วอะแดปเตอร์ USB ทั่วไปก็น่าจะทำงานได้
- ใน
การจัดการแพ็กเกจและตั้งค่าเว็บเซิร์ฟเวอร์
- ตัวจัดการแพ็กเกจ
pkginของ NetBSD ติดตั้งด้วยpkg_add pkginหลังตั้งค่าตัวแปรสภาพแวดล้อมแล้ว - path ของแพ็กเกจใช้
https://cdn.NetBSD.org/pub/pkgsrc/packages/NetBSD/evbppc/10.1/All/ - แพ็กเกจที่ติดตั้งมี
bsdfetch,iperf3,lighttpd,nano,rsync - เว็บเซิร์ฟเวอร์เลือกใช้ lighttpd ซึ่งเหมาะกับสภาพแวดล้อมที่ทรัพยากรจำกัด
- คัดลอกสคริปต์ rc ตัวอย่างของ
lighttpdไปที่/etc/rc.dเพิ่มlighttpd=YESใน/etc/rc.confแล้วเริ่มใช้งาน - path ของ static content ค่าเริ่มต้นคือ
/srv/www/htdocs - บล็อกเป็นชุดหน้าเว็บสแตติกที่ build ด้วย Hugo จึงคัดลอกไฟล์ด้วย
rsyncแล้วให้บริการผ่าน HTTP มาตรฐานได้ทันที
โหลด TLS และ Caddy reverse proxy
- จากผลทดสอบโหลดเป็นเวลานาน PowerPC 750 แสดงอาการรับภาระเมื่อให้บริการหลายหน้าพร้อมกันที่เข้ารหัสด้วย TLS สมัยใหม่
- เพื่อคืนทรัพยากร จึงปิดบริการบางส่วนที่รันเป็นค่าเริ่มต้นบน NetBSD
- ปิด
devpubd,dhcpcd,inetd,mdnsd,postfix - เปลี่ยน
sendmail,mailq,newaliasesใน/etc/mailer.confให้เป็น/bin/trueเพื่อป้องกันไม่ให้โปรเซสที่เกี่ยวข้องถูกรัน
- ปิด
ntpdใช้ RAM ของระบบ 15.6% จึงปิดใช้งาน- ยังจำเป็นต้อง sync เวลา จึงเพิ่ม
ntpdate time.cloudflare.comในcrontabให้รันทุกชั่วโมงที่นาที:42 - สุดท้าย TLS termination ของบล็อกให้ Caddy instance ที่อยู่หน้า Wii รับผิดชอบ
- Caddy ทำหน้าที่เป็น reverse proxy และจัดการการเข้ารหัสกับใบรับรอง ACME
- ไม่ได้เปิด option caching ใน Caddy
- คำขอทั้งหมดถูกจัดการโดย Wii โดยตรง และเมื่อรวมรูปภาพในบทความนี้แล้ว การโหลดทั้งหน้ามีขนาดเกือบพอดีที่ 1MB
- ที่ชั้น Caddy มีการบล็อกคำขอจาก User-Agent ของ scraper ที่รู้จัก เพื่อไม่ให้ส่งต่อไปยัง Wii
- ใช้ known scraper User Agents เป็นเกณฑ์การบล็อก
การตั้งค่าการมอนิเตอร์สถานะ
- เมื่อย้าย TLS termination ไปที่ Caddy ก็สามารถใช้ Prometheus exporter ของ Caddy ได้
- ข้อมูลนี้ถูกนำเข้าไปยังสแต็ก InfluxDB + Grafana เพื่อตรวจสอบโหลดของไซต์
- บนตัว Wii เองไม่ได้เพิ่มโปรเซสอย่าง Prometheus exporter โดยตรง
- แทนที่จะทำเช่นนั้น มีการสร้าง shell script ง่าย ๆ ให้
crontabรันทุก 15 นาที และเขียนสถานะระบบออกเป็นไฟล์ HTML ใน web root - หน้า status แสดงข้อมูลอย่าง
uname -aและuptime - ดูหน้า status ทั้งหมดได้ที่ blog.infected.systems/status
ข้อจำกัดในการใช้งานและการใช้พลังงาน
- การตั้งค่าทั้งหมดทำงานได้ดีกว่าที่คาดมาก และติดตั้งได้ง่ายด้วย
- เมื่อรีบูต NetBSD ไม่ได้เป็นเพียงการรีสตาร์ตแอป NetBSD เท่านั้น แต่คอนโซล Wii ทั้งเครื่องจะรีบูตและกลับไปที่ Wii Menu
- หลังการ patch เคอร์เนลหรืออัปเกรดระบบ Wiimote และ sensor bar จะกลายเป็นองค์ประกอบจำเป็นของโครงสร้างพื้นฐานในการดำเนินงาน
- จากการทดสอบโดยอิงการมอนิเตอร์ UPS Wii เพิ่มการใช้ไฟรวมของ homelab ขณะ idle ประมาณ 18W
- คำนวณแล้วการใช้ไฟฟ้าต่อเดือนอยู่ที่ประมาณ 13.2kWh
- ตามค่าไฟในสหราชอาณาจักร คิดเป็นประมาณ £3.47 ต่อเดือน ซึ่งถูกกว่า VPS ของผู้ให้บริการคลาวด์บางราย
- นี่เป็นการทดลองสนุก ๆ ในช่วงวันหยุดยาว และถ้ายังทำงานได้ดีต่อไป ก็มีแผนจะคงไว้สักระยะ
- ผู้เขียนสนใจการทดลองแบบนี้เพราะสภาพแวดล้อม deploy ที่มีข้อจำกัดแบบตั้งใจช่วยให้เรียนรู้ได้ดี
อัปเดตเดือนกุมภาพันธ์ 2026
- หลังเผยแพร่บทความ มีหลายคนบอกวิธีทำให้ Wii boot เข้า NetBSD ได้โดยตรง
- วิธีคือการติดตั้ง Priiloader และ ตั้งค่า NetBSD เป็นแอป Homebrew ที่จะ boot อัตโนมัติ
- เมื่อใช้การตั้งค่านี้ จะสามารถ ใช้งานแบบ headless ได้เต็มรูปแบบโดยไม่ต้องใช้ Wiimote ที่เคยเป็นสิ่งจำเป็นต่อภารกิจ
2 ความคิดเห็น
จำได้เลยว่าตอนนั้นเคยเอาโทรศัพท์ Android ที่ไม่ได้ใช้แล้วมาลง Debian แล้วรันเป็นเว็บเซิร์ฟเวอร์
ตอนแรกก็สงสัยอยู่ว่าทำไมถึงใช้ทั้ง Caddy และ lighttpd พร้อมกัน แต่ดูเหมือนว่าจะให้ Wii จัดการเฉพาะไฟล์ static ส่วนที่เหลือให้ Caddy บนเครื่องอื่นจัดการครับ