
После написания первого материала я получил достаточно много комментариев и отзывов. Это было очень приятно, спасибо! Обязательно попробую запустить там иксы и прогнать предложенными тестами. Вместе с этим в голове крутилась простая до безобразия мысль: а можно ли поставить туда Linux?
Как только начал изучать этот вопрос, показалось, что установить его будет очень просто. Но реальность преподнесла сюрпризы. Сегодня покажу, как получить работающий Linux на этой игровой консоли с PowerPC-процессором IBM Broadway.
Что такое BootMii
На просторах Сети можно найти много разных образов Linux под этот аппарат. Все они в большинстве своем базируются на старых ядрах, что обусловлено весьма скромными техническими характеристиками Wii. Их объединяет способ запуска — они завязаны на такую штуку, как BootMii. Это небольшой кусок кода, который изначально был разработан вовсе не для запуска сторонних ОС, а чтобы в случае чего дать возможность выполнить аварийное восстановление консоли.
Важно понимать: Wii чем-то похожа на обычный компьютер, но в реальности тут нет ни BIOS, ни UEFI. Если вдруг в процессе исследования что-то пойдет не так, то система просто превратится в бесполезный кирпич без адекватных возможностей восстановления. BootMii был создан как раз на этот случай — он работает максимально близко к «нулевому уровню» загрузки и может легко снять точный побитовый слепок текущего состояния NAND-флешки.
Главным преимуществом BootMii можно назвать то, что он способен запускаться до всего остального софта, включая System Menu. Однако это работает исключительно на старых ревизиях консоли, выпущенных примерно до 2009 года. В более свежих версиях эту фичу убрали на аппаратном уровне (как раз мой случай). Тем не менее остается возмо��ность запуска BootMii изнутри Homebrew channel, а значит, есть вариант сделать полный бэкап.
BootMii
Чтобы эта магическая штуковина заработала, потребуется выполнить ее установку. BootMii идет в комплекте с эксплоитом HackMii, который ставит на консоль Homebrew channel. В моем случае прекрасно сработала уязвимость через особым образом сформированное письмо, так называемый letterbomb. Оно вызывает сбой в механизме обработки сообщений и заставляет консоль выполнить произвольный код. Остальное — дело техники: выбрать нужный пункт меню и немного подождать.
Когда все сделано правильно, вы переходите в Homebrew channel, нажимаете кнопку Home на контроллере и выбираете Launch BootMii:

После этого оказываетесь в интересном меню, где консоль вообще не взаимодействует с контроллером Wiimote. Первые секунды я подумал, что гаджет завис, но нет. В BootMii управление происходит с помощью физических кнопок на корпусе, таких как Power, Reset и Eject. При выборе пиктограммы Backup система предупредит, что запишет файл, а затем его проверит.
Делаю бэкап

Если кто-то помнит, как выглядел процесс дефрагментации жесткого диска в старых версиях Windows, то приятно удивитесь — тут все смотрится примерно так же. Курсор мигает, блоки вычитываются. И да, среди них оказалось немало bad-блоков.
Внутри Wii стоит самый обычный чип флеш-памяти. Непосредственно на производстве он был протестирован и некоторые блоки помечены как сбойные. Можно привести аналогию с «битыми пикселями» на мониторах. Пара-тройка не считаются дефектом и не являются гарантийным случаем. Так же и тут — вполне допустимо иметь небольшое количество сбойных.
Немного иной момент с блоками, обозначенными как Corrected page. Это значит, что при чтении страницы NAND была обнаружена битовая ошибка и она успешно скорректирована механизмом ECC (Error Correction Code). Данные прочитались, и никаких дополнительных проблем при этом не возникло.
Спустя пять минут на SD-карте появился полный образ моей флешки (nand.bin), а также дамп keys.bin с уникальными криптографическими ключами, привязанными к моей консоли. Это, пожалуй, наиболее ценный файл, без которого невозможно выполнить корректную расшифровку содержимого NAND. Теперь если в результате моих экспериментов консоль перестанет работать адекватно, но я смогу добраться до BootMii, то без проблем восстановлю содержимое флеш-памяти.
Выбираем вариант Linux
Прежде чем пускаться во все тяжкие, я решил посмотреть на опыт тех, кому уже удалось успешно развернуть Linux на Wii. В этом мне очень помог ресурс wiibrew.org, где есть список рабочих вариантов. Самый актуальный из них — ArchPOWER, неофициальный порт ArchLinux для архитектур PowerPC/POWER.
Инструкция по запуску была проста и понятна: берешь любой Linux-дистрибутив, копируешь туда установочный скрипт, подключаешь SD-карточку, а остальное уже будет в режиме диалога — выбрать накопитель, отформатировать его и подождать. В процессе скрипт сам скачает образ из Сети и подготовит два раздела. На одном будут лежать файлы для з��пуска из BootMii, а на втором корневой каталог.
Если разбивать SD-карту на разделы не хочется, то можно разместить root на отдельной USB-флешке. Удобно, если Linux будет не основной системой, а использоваться от случая к случаю. Решено — ставлю.
Скачал скрипт:
$ git clone https://github.com/Wii-Linux/pc-installer
И запустил его:
$ cd pc-installer; sudo ./installer.sh
Ответив на все вопросы, через 10 минут я получил готовый образ SD-карты, радостно его воткнул в Wii, стартанул BootMii — и на экране возникло это:

Черно-белая картинка однозначно указывала, что сигнал подавался в NTSC, а у меня приставка PAL. Но больше всего смущало то, что изображение на экране не менялось, а хинт press reset (1x) or press eject to boot никак не помогал. Разумеется, я попробовал следовать советам, но все тщетно. Тогда я полез смотреть, какие файлы установщик разместил в директории /bootmii, и обнаружил, что там отсутствует ожидаемый мной ppcboot.elf.
При этом загрузчик gumboot лежал вообще в отдельной папке вместе с соответствующим файлом .lst. Тут я перепробовал много разного: закидывал gumboot.elf в /bootmii с переименованием в ppcboot.elf, пробовал корректно разместить все файлы не скриптом, а вручную. Максимальный результат, которого удалось добиться, выглядел так:

При этом все зависало, а после перезагрузки консоль переставала видеть контроллер до тех пор, пока не синхронизир��ешь его при помощи кнопок Sync (на самой Wii и на Wiimote внутри батарейного отсека). Дело дошло до того, что я вновь начисто повторил все процедуры, используя SD-карту меньшего размера, — экран загрузки все так же появлялся, и ничего не происходило.
Потратив изрядное количество времени, решил попробовать альтернативу. Если предыдущий вариант был собран на условно свежем ядре 4.5.0, то другие оперировали значительно более старыми ядрами. До 2.6.32 я спускаться не стал, хотя знал, что тот же XWhiite вполне рабочий и даже с графическим интерфейсом.
Вместо этого был выбран условно средний вариант на ядре 3.15.10, проект с названием wii-linux-ngx. Несмотря на то, что работа над ним прекратилась лет пять назад, его многие рекомендовали на форумах и Reddit. Установка тут еще более простая — достаточно записать образ на SD-карту, вставить в Wii и зайти в BootMii.
Результат, с одной стороны, обнадежил, а с другой — наоборот, разочаровал:

Таймер отсчета не тикал, изображение на экране не менялось, и я уже думал, что все зависло. Но внезапно обратил внимание, что начал моргать индикатор присутствия диска:

Его хаотичность натолкнула на мысль: а что если он сейчас играет роль HDD LED? И да — так оно и было. Как только дисковая активность прекратилась, решил посмотреть DHCP leases на роутере и внезапно обнаружил, что в списке устройств появился хостнейм wii-linux-ngx. Ну а раз так, то сразу же постучался на IP-адрес SSH-клиентом.
В документации было сказано: логин — root, пароль — root. Но если попытаться так зайти по SSH, то получаю отказ. И дело здесь вовсе не в реквизитах, а в директиве PermitRootLogin, которая по умолчанию запрещает вход root по SSH. Поскольку вся файловая система лежит на SD-карте, я просто отредактировал /etc/ssh/sshd_config и прописал туда PermitRootLogin yes.
Загрузился — и вот оно чудо! Приветственный баннер встретил меня цитатой японского геймдизайнера Сигэру Миямото:
Linux wii-linux-ngx 3.15.10ngx+ #169 Sat Aug 19 22:49:32 CEST 2017 ppc The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. There are big lines between those who play video games and those who do not. For those who don't, video games are irrelevant. They think all video games must be too difficult. Shigeru Miyamoto
Посмотрел информацию о процессоре:
root@wii-linux-ngx:~# lscpu Architecture: ppc CPU op-mode(s): 32-bit Byte Order: Big Endian CPU(s): 1 On-line CPU(s) list: 0 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 1 Vendor ID: IBM Model: nintendo,wii BogoMIPS: 121.56 L1d cache: 32K L1i cache: 32K
Но вот df -h выдал немного печальную картину, подтвердив, что места на диске фактически нет:
root@wii-linux-ngx:~# df -h Filesystem Size Used Avail Use% Mounted on /dev/mmcblk0p2 340M 340M 0 100% / devtmpfs 37M 0 37M 0% /dev tmpfs 7.4M 152K 7.2M 3% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 15M 0 15M 0% /run/shm /dev/mmcblk0p1 40M 3.6M 36M 9% /boot tmpfs 40M 0 40M 0% /tmp
Карточка у меня на 16 Гб, а это значит, что есть вариант расширить корневой каталог до максимального размера. Сделал я это так:
root@wii-linux-ngx:~# fdisk /dev/mmcblk0
Удалил раздел номер 2 и сразу же создал его еще раз, но не 340 МБ, а до конца SD-карты:
Disk /dev/mmcblk0: 15.1 GiB, 16172187648 bytes, 31586304 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xbb8434da Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 2048 83967 81920 40M b W95 FAT32 /dev/mmcblk0p2 83968 31586303 31502336 15G 83 Linux
Сохранил изменения и перезагрузился. После этого расширил файловую систему на свободные блоки:
root@wii-linux-ngx:~# resize2fs /dev/mmcblk0p2
Эта процедура заняла 10–15 минут. Затем проверил доступное место на диске:
root@wii-linux-ngx:~# df -h Filesystem Size Used Avail Use% Mounted on /dev/mmcblk0p2 15G 377M 14G 3% / devtmpfs 37M 0 37M 0% /dev tmpfs 7.4M 152K 7.2M 3% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 15M 0 15M 0% /run/shm /dev/mmcblk0p1 40M 3.6M 36M 9% /boot tmpfs 40M 0 40M 0% /tmp
Теперь можно приступать к обновлению пакетов и установке дополнительного софта. По умолчанию в системе прописан очень старый репозиторий, который давно ушел в офлайн. Так что отредактировал /etc/apt/sources.list и оставил там только:
deb http://archive.debian.org/debian jessie main contrib non-free
Теперь можно запускать обновление пакетов, вот это пресловутое
root@wii-linux-ngx:~# apt update && apt -y upgrade
и смело уходить заниматься своими делами на пару часов. Увы, оперативной памяти очень мало, а без дополнительных ухищрений, вроде конфигурирования zram, система работает откровенно медленно. Но тем не менее операция завершилась успехом, и я смог установить screenfetch прямо из apt:

Заключение
Но что же с изображением на экране, спросите вы. А его нету, никакого. Ну то есть все время, пока система исправно работает, на дисплей не выводится ровным счетом ничего. Может быть, видеорежим не соответствует нужному, initramfs не поднимает консоль или же вообще надо искать корень проблемы в gumboot. Победить этот глюк мне пока что не удалось. Сама же по себе система загружается стабильно и довольно быстро.
В ближайших планах — проверить еще раз ArchPOWER: есть у меня подозрение, что и там старт ОС был, но я этого не понял из-за отсутствия картинки. Скорее всего, там я тоже смогу зайти по SSH и получить более свежее ядро. Еще в планах попробовать Fedora 20 и Ubuntu 14.04, как будет побольше свободного времени.
Ну а если говорить о практическом смысле — что ж, буду с вами честен. Установка Linux была уже чисто спортивным интересом в отличие от NetBSD. Хотелось понять, насколько сложной будет эта процедура и сможет ли Wii работать стабильно на этой ОС. В итоге убедился, что да — запуск Linux возможен, но проблем и багов больше. Из плюсов — добавляется беспроводное соединение, а не только работа через сетевую карту USB.
Наверное, в обозримом будущем закрою еще один гештальт: попробую запустить на ней MacOS 9 и обязательно поделюсь с вами этим опытом. Ну а пока что пойду вновь перезаписывать SD-карту.