История Linux на PS3 довольно интересна. Если вы знакомы с историей PS3, то, вероятно, знаете, что Sony выпустила её в 2006 году с поддержкой возможности запуска других операционных систем при помощи функции под названием OtherOS. OtherOS позволяла пользователям устанавливать операционные системы наподобие Linux или FreeBSD во второй раздел жёсткого диска PS3.
В 2010 году Sony в прошивке 3.21 избавилась от поддержки OtherOS «из соображений безопасности». На самом деле это означало, что некоторые люди начали использовать эту функцию для глубокого изучения внутренностей PS3 и разбираться, как пиратить игры. Благодаря модифицированной прошивке, можно использовать OtherOS с современными прошивками; именно этим мы и займёмся.
Технические характеристики PS3:
CPU: Cell Broadband Engine
ОЗУ: 256 МБ
GPU: не имеет значения, потому что в конце концов я его так и не использовал
Накопитель: 2,5-дюймовый SATA SSD
Если вы незнакомы с архитектурой PS3, то, вероятно, задаётесь вопросом: что это за Cell Broadband Engine?
Ох, трудновато будет объяснить… CPU консоли PS3 — сложное и странное устройство, а я, наверно, недостаточно умён, чтобы объяснять его структуру. Если вы хотите прочитать подробное объяснение Cell Broadband Engine, то крайне рекомендую абсолютно фантастическую статью Родриго Копетти об архитектуре PS3[1].
В упрощённом виде можно сказать, что Cell Broadband Engine, который я далее буду называть Cell — это CPU, разработанный IBM, Sony и Toshiba для применения в суперкомпьютерах. Поэтому Sony решила, что это идеальный выбор для игровой консоли. Cell работает на частоте 3,2 ГГц, а его основной CPU называется Power Processing Element (PPE). PPE — это одноядерный двухпоточный 64-битный CPU PowerPC, спроектированный IBM. Сама по себе идея одноядерного CPU с hyperthreading звучит абсолютно ужасно, особенно в сравнении с трёхядерным шестипоточным CPU Xenon консоли Xbox 360, но хотя основным процессором Cell является PPE, он не единственный. Cell также содержит в себе восемь Synergistic Processing Element (SPE). SPE — это более мелкие ядра, спроектированные на основе проприетарной архитектуры, предназначенные для программирования на выполнение специфических задач с целью снижения нагрузки на PPE. Идея заключалась в том, чтобы PPE передавал конкретные задачи ядрам SPE, например, приказывая одному из них выполнять обработку аудио, декодирование MPEG и тому подобное. Вместо специализированных чипов для обработки конкретных функций, у разработчиков было шесть SPE, которые можно было использовать для любых специализированных операций в их играх.
Но ведь вы кажется сказали, что их восемь?
Ну, хотя теоретически в Cell их было восемь, Sony представила разработчикам доступ только к шести из них. Одно ядро всегда отключается сразу после запуска. Это сделано для того, чтобы если в процессе производства одно SPE оказалось неисправным, не пришлось выбрасывать весь чип. Ещё одно ядро использовалось гипервизором и ядром PS3 для задач, связанных с безопасностью.
И это самое хорошее объяснение процессора Cell, которое я могу дать. Если вам нужно больше подробностей, то прочитайте статью Родриго о PS3. Также стоит посмотреть другие его статьи про интересующие вас консоли, они все потрясающие.
Впрочем, наша статья должна быть про Linux.
Итак, запуск Linux на PS3. Если у вас не первая «толстая» модель PS3 с прошивкой старше 3.21, то вам сначала придётся подвергнуть её моддингу и запустить модифицированную прошивку. Я не буду вдаваться в подробности, если вам любопытно, то изучите вики[2].
У нас есть PS3 и на ней установлена модифицированная прошивка. Здорово, я могу пиратить игры, но мне хочется запустить эту штуку с пингвином!
На самом деле, я не знаю, с чего начать разговор о запуске Linux на PS3. Я экспериментировал с этим примерно пять лет назад, в конечном счёте найдя старый пост на форуме, который использовал в качестве руководства.
Установка Windows 2000 в QEMU в полной эмуляции x86 внутри Red Ribbon Linux на PS3 в 2018 году
В 2018 году я воспользовался в качестве инструкции по установке Linux на PS3 этим постом на PSX-Place[3]. К счастью, ссылки на скачивание в этом посте всё ещё работают, поэтому первым делом я скачал все файлы и заменил жёсткий диск PS3, чтобы не стереть случайно какие-то игры. Затем я установил специальную прошивку из поста, которая была модифицирована: при форматировании жёсткого диска она создаёт раздел для OtherOS. Затем я проделал простой процесс записи образа для установки загрузчика Petitboot на PS3, и можно было приступать.
Ну, или типа того…
Теперь у меня есть возможность запустить Linux, но мне всё равно нужен был дистрибутив с хорошей поддержкой ppc64 и ядром, которое заработает на PS3. После всех своих безуспешных предыдущих попыток компиляции работающего ядра для Xbox 360 я решил начать с того, чтобы поискать готовое скомпилированное ядро, которое бы заработало. Довольно быстро я нашёл на archive.org это[4] ядро 5.6.0 с патчами ядра Gentoo; я решил, что с Gentoo начать будет вполне неплохо.
Я скачал архив, положил ядро и другие загрузочные файлы из архива в раздел FAT32 на флэшку, создал на ней второй раздел ext4 и извлёк на него Gentoo stage3 tarball. Затем я просто вставил её в PS3 и запустил Petitboot.
Загрузчик Petitboot
Gentoo, запущенная на найденном мной ядре 5.6.0
Я был в таком восторге, что всё заработало и уже хотел скачать stage3, чтобы извлечь его в другой раздел OtherOS и начать работать с Gentoo, но потом осознал, что есть проблема. У этого ядра не было драйверов для чтения таблицы разделов PS3. Это означало, что Gentoo не сможет увидеть область жёсткого диска, которую создала для неё OtherOS. У меня было два варианта. Или просто установить Gentoo с USB, или попытаться скомпилировать ядро с поддержкой таблицы разделов PS3.
Поначалу я выбрал вариант с USB, потому что не хотел тратить кучу времени на то, чтобы заставить работать ядро. Всё шло хорошо, пока на следующий день я не осознал, что скачал 32-битный powerpc stage3 вместо 64-битного. Это значило, что придётся начинать всё сначала. Я решил, что если нужно начать сначала, то я всё-таки попытаюсь добиться поддержки таблицы разделов PS3.
Так с чего же начать создание собственного ядра?
Сильно упрощало ситуацию то, что, в отличие от Xbox 360, в ядре основной ветви по-прежнему сохранялась поддержка PS3. Ядро основной ветви не имеет поддержки таблицы разделов и кое-чего другого, но имеет поддержку, по сути, всего оборудования. Мне оставалось найти патчи для накопителя, и проблема бы решилась. После длительных исследований я нашёл этот[5] пост на форуме PSX-Place, в котором кто-то опубликовал множество патчей для современных ядер; самыми свежими были патчи для 5.15, поэтому я решил выбрать его.
Скачав патчи ядра, которые могли работать, я скачал исходники ps3-linux 5.15[6] и патчи Gentoo для 5.15[7]. Теперь, когда у меня было всё необходимое, настало время для сборки. Прежде чем пробовать найденные мной патчи ядра, я решил просто установить только патчи Gentoo и собрать его, чтобы убедиться, что скомпилированное мной действительно заработает.
Я решил собирать ядро на своём сервере, потому что хотел, чтобы оно собралось как можно быстрее. На компиляцию ядра ушло всего две минуты, однако мне пришлось пожертвовать своим слухом[8].
Итак, потратив кучу электричества в доме своих родителей, я получил двоичный файл ядра powerpc. Оставался лишь один вопрос: работает ли он?
Да
Теперь мне оставалось всего лишь запечь в ядро драйверы USB и применить патчи таблицы разделов ps3. Ещё немного минут вреда для моего слуха, и у меня появилось новое ядро для проверки.
Клавиатура заработала и нашла рут Gentoo на флешке. Увидит ли он раздел OtherOS?
Нет.
Потому что я применил патчи, но не включил их в menuconfig.
Ладно, скомпилируем ещё раз, надеюсь, теперь я его увижу?
Да
У меня получилось! Я скомпилировал работающее ядро! Я, идиот! Мне удалось сделать что-то правильно!
После всех этих восторгов я наконец-то приступил к работе с Gentoo. Я просто максимально точно следовал инструкциям, потому что раньше никогда не пользовался Gentoo. Пока я выполнял небольшие шаги наподобие конфигурирования CFLAGS и прочего, я начал искать, делал ли кто-нибудь что-то интересное с Linux на PS3. Так я нашёл ps3linux.net[9]. Моё внимание на этом сайте привлекла одна вещь.
Да, этот веб-сайт полностью хостится[10] на моём джейлбрейкнутом Linux-сервере PS3. Единственном в мире (попробуйте доказать, что это не так).
Тогда я понял, что мне нужно сделать: доказать неправоту владельца сайта.
Примерно в то же время я начал обновлять world[11] set, поэтому должно было пройти какое-то время, прежде чем можно будет приступать к установке apache или nginx. Однако у меня был Python, а у Python есть встроенный http-сервер. Меня он вполне устраивал. Я быстренько набросал веб-сайт и настроил на своём сервере iptables, чтобы он мог находиться онлайн. Если кому-то любопытно, он находится по адресу ps3.lilysthings.org[12]. Он проработает несколько дней после публикации этого поста, но рано или поздно я отключу его, чтобы снова играть в игры на PS3.
После этого совершенно бессмысленного мероприятия я мог спокойно ложиться спать, зная, что доказал чью-то неправоту в Интернете, и надеясь, что к утру всё скомпилируется.
На следующее утро всё действительно завершилось. На этом этапе я закончил с настройкой Gentoo и уже мог сделать с ней что-нибудь. Я не знал, что хочу сделать, поэтому решил попытаться запустить X. Мне пришлось начать компилировать всё для openbox, после чего всё было готово к работе. Вскоре после этого я запустил компиляцию cmake, зная, что она, вероятно, не закончится, даже когда я вернусь домой.
Разумеется, так и произошло. На самом деле, не закончилась даже раскрутка компилятора.
Я решил попробовать заставить работать distcc, чтобы переложить всю тяжёлую нагрузку на сервер. Спустя множество проб и ошибок я смог заставить его работать, и cmake был готов всего примерно через полчаса. Я скомпилировал ещё множество разных вещей, но потом мне пришлось отправиться на несколько дней к своей маме. Я собрал PS3 и понял, что можно просто запустить distcc на своём ноутбуке там.
Но что бы я ни делал, мне не удавалось запустить distcc на ноутбуке и PS3.
На этом этапе я потерял веру в Gentoo, потому что не собирался возвращаться к компилированию на самой PS3. Я решил выбрать Void Linux, потому что существовал его неофициальный порт для powerpc, всё ещё имевший хорошую поддержку. На этот раз я не хотел заморачиваться с жёстким диском, чтобы не стирать установленную Gentoo, поэтому просто запустил его с USB. Void настолько мал, что на самом деле это неважно. Я скачал rootfs tarball, он весил всего 37 МБ.
Void запустился без проблем и после того, как начал обновление, я задумался, что мне хочется с ним сделать? У меня не было никаких идей. Я попробовал настроить X, но как ни пытался, мне не удавалось заставить его работать. Примерно в это время я решил, что пора заканчивать с этим проектом, так что придумал последнее, что можно сделать. Я скачал T2SDE, так как это был единственный дистрибутив, по-прежнему активно поддерживал PS3, и я знал, что X в нём работал.
Но он вообще не заработал.
Я даже не смог заставить запуститься установщик.
Он запускался, но зависал каждый раз, когда я пытался выполнить какую-нибудь команду. Так как T2SDE создавался с целью разработки, я решил, что, вероятно, ему нужна дополнительная память, которая имеется у девкитов PS3. У меня этого устройства не было, поэтому я решил, что на этом и закончу проект.
Как бы ни интересно мне было, я начал уставать от того, что смотрю в терминалы и пытаюсь заставить всё работать.
Все файлы и остальное, что я использовал для запуска Linux, в том числе и собранное мной ядро можно найти здесь[13].