История 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.
В упрощённом виде можно сказать, что 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, то вам сначала придётся подвергнуть её моддингу и запустить модифицированную прошивку. Я не буду вдаваться в подробности, если вам любопытно, то изучите вики.
У нас есть PS3 и на ней установлена модифицированная прошивка. Здорово, я могу пиратить игры, но мне хочется запустить эту штуку с пингвином!
На самом деле, я не знаю, с чего начать разговор о запуске Linux на PS3. Я экспериментировал с этим примерно пять лет назад, в конечном счёте найдя старый пост на форуме, который использовал в качестве руководства.
Установка Windows 2000 в QEMU в полной эмуляции x86 внутри Red Ribbon Linux на PS3 в 2018 году
В 2018 году я воспользовался в качестве инструкции по установке Linux на PS3 этим постом на PSX-Place. К счастью, ссылки на скачивание в этом посте всё ещё работают, поэтому первым делом я скачал все файлы и заменил жёсткий диск PS3, чтобы не стереть случайно какие-то игры. Затем я установил специальную прошивку из поста, которая была модифицирована: при форматировании жёсткого диска она создаёт раздел для OtherOS. Затем я проделал простой процесс записи образа для установки загрузчика Petitboot на PS3, и можно было приступать.
Ну, или типа того…
Теперь у меня есть возможность запустить Linux, но мне всё равно нужен был дистрибутив с хорошей поддержкой ppc64 и ядром, которое заработает на PS3. После всех своих безуспешных предыдущих попыток компиляции работающего ядра для Xbox 360 я решил начать с того, чтобы поискать готовое скомпилированное ядро, которое бы заработало. Довольно быстро я нашёл на archive.org это ядро 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. Ядро основной ветви не имеет поддержки таблицы разделов и кое-чего другого, но имеет поддержку, по сути, всего оборудования. Мне оставалось найти патчи для накопителя, и проблема бы решилась. После длительных исследований я нашёл этот пост на форуме PSX-Place, в котором кто-то опубликовал множество патчей для современных ядер; самыми свежими были патчи для 5.15, поэтому я решил выбрать его.
Скачав патчи ядра, которые могли работать, я скачал исходники ps3-linux 5.15 и патчи Gentoo для 5.15. Теперь, когда у меня было всё необходимое, настало время для сборки. Прежде чем пробовать найденные мной патчи ядра, я решил просто установить только патчи Gentoo и собрать его, чтобы убедиться, что скомпилированное мной действительно заработает.
Я решил собирать ядро на своём сервере, потому что хотел, чтобы оно собралось как можно быстрее. На компиляцию ядра ушло всего две минуты, однако мне пришлось пожертвовать своим слухом.
Итак, потратив кучу электричества в доме своих родителей, я получил двоичный файл ядра powerpc. Оставался лишь один вопрос: работает ли он?
Да
Теперь мне оставалось всего лишь запечь в ядро драйверы USB и применить патчи таблицы разделов ps3. Ещё немного минут вреда для моего слуха, и у меня появилось новое ядро для проверки.
Клавиатура заработала и нашла рут Gentoo на флешке. Увидит ли он раздел OtherOS?
Нет.
Потому что я применил патчи, но не включил их в menuconfig.
Ладно, скомпилируем ещё раз, надеюсь, теперь я его увижу?
Да
У меня получилось! Я скомпилировал работающее ядро! Я, идиот! Мне удалось сделать что-то правильно!
После всех этих восторгов я наконец-то приступил к работе с Gentoo. Я просто максимально точно следовал инструкциям, потому что раньше никогда не пользовался Gentoo. Пока я выполнял небольшие шаги наподобие конфигурирования CFLAGS и прочего, я начал искать, делал ли кто-нибудь что-то интересное с Linux на PS3. Так я нашёл ps3linux.net. Моё внимание на этом сайте привлекла одна вещь.
Да, этот веб-сайт полностью хостится на моём джейлбрейкнутом Linux-сервере PS3. Единственном в мире (попробуйте доказать, что это не так).
Тогда я понял, что мне нужно сделать: доказать неправоту владельца сайта.
Примерно в то же время я начал обновлять world set, поэтому должно было пройти какое-то время, прежде чем можно будет приступать к установке apache или nginx. Однако у меня был Python, а у Python есть встроенный http-сервер. Меня он вполне устраивал. Я быстренько набросал веб-сайт и настроил на своём сервере iptables, чтобы он мог находиться онлайн. Если кому-то любопытно, он находится по адресу ps3.lilysthings.org. Он проработает несколько дней после публикации этого поста, но рано или поздно я отключу его, чтобы снова играть в игры на 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, в том числе и собранное мной ядро можно найти здесь.