3 คะแนน โดย GN⁺ 2025-04-22 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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

การตั้งค่าการมอนิเตอร์สถานะ

  • เมื่อย้าย 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 ความคิดเห็น

 
ifmkl 2025-04-22

จำได้เลยว่าตอนนั้นเคยเอาโทรศัพท์ Android ที่ไม่ได้ใช้แล้วมาลง Debian แล้วรันเป็นเว็บเซิร์ฟเวอร์

 
ndrgrd 2025-04-22

ตอนแรกก็สงสัยอยู่ว่าทำไมถึงใช้ทั้ง Caddy และ lighttpd พร้อมกัน แต่ดูเหมือนว่าจะให้ Wii จัดการเฉพาะไฟล์ static ส่วนที่เหลือให้ Caddy บนเครื่องอื่นจัดการครับ