Motivation ¶
ある日、ネットサーフィンをしていたとき、PS4 内蔵HDDにlinuxをインストールして起動する方法(5.05~) - yyoosskのメモ というブログ記事をみつけた。
記事の内容はPSXITAというArch Linux派生のディストリビューション(と呼べるほど分厚いかどうかは疑問)をJailBreak後のPS4の内蔵HDDへインストールするというものだ。
そこにこんなコメントがあったのだ。
Unknown 2021年2月15日 18:21 PS4以外のPCにも入れてちゃんと動きますか?
yyoossk 2021年2月15日 19:48 意味不 記事の題はps4と書いてません? もしかして日本語わからないとか? それならこのブログは日本のブログなのでもうこないでください
上記ブログを書いているyyoossk氏は「意味不」と申されているが、私には痛いほどわかる。Unknown氏はPSXITAが普通のPCで動くかを純粋に知りたいのだろう。
yyoossk氏は何故かご立腹な様だが、PSXITAの話なのだから、それほどoff-topicではないだろう。
実現可能性 ¶
では実現可能性に関して考察していきたい。
PS4はx86_64、PCもx86_64、Linuxにとって大きく異なるのはブートシーケンスやデバイスの見え方位だ。
ブートシーケンスは普通にブートローダーをインストールすれば簡単に上がってくることが容易に想像がつく。
あとはデバイスの見え方が変わる点だが、PCへの移植ならLinuxの標準的なドライバーソフトウェアで不自由無いだろう。
では、実際に動かしてみたいと思う。
準備 ¶
実機にインストールしても良いが、生憎空いているストレージが無い為、普段遣いのWindows 11上に以下の構成のHyper-VのVMを用意した。
- Generation 2 VM (EFI PC)
- RAM 1024MB (default)
- Storage 127GB (default)
- CPU 1 core (default)
そこに光学ドライブを追加し、源流Arch Linuxのインストールメディア archlinux-2022.03.01-x86_64.iso
をマウントする。
また、Arch Linuxのインストールメディアは2022-03-26現在、セキュアブートに対応していない為、 Settings -> Security -> Secure Boot から Secure Boot を無効化した。
Install Battle ¶
全体の流れとしては、Arch LinuxのInstallation Guideを参考にパーティションを切り、その上にPSXITAのイメージを展開し、更新、BootLoaderをインストールするといった形だ。
ではやっていく。
Partitioning ¶
Installation Guide#Example layouts
を参考に gdisk
にて以下のようなパーティションテーブルを作成する。
- 512MB EFI (/boot)
- 512MB Swap
- そこから先 Linux x86-64 root (/)
Format ¶
Installation Guide#Format the partitions を参考に進めていく。
mkfs.fat -F32 /dev/sda1
mkswap /dev/sda2
mkfs.ext4 /dev/sda3
Mount ¶
こちらも Installation Guide#Mount the file systems を参考に行う。
swapon /dev/sda2
mount /dev/sda3 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
Download / Extract ¶
ベースのrootfs
となる psxitarch.tar.xz
をダウンロードし、展開する。今回は、LAN内のWindows PCからダウンロードした。
cd /mnt
scp [email protected]:/cygdrive/c/Users/ray/Documents/psxitarch.tar.xz .
tar xf psxitarch.tar.xz
これは、 Installation Guide#Install essential packages の代替となる。
Configure the System ¶
では、通常のセットアップに戻る。 Installation Guide#Configure the system に従い、セットアップを続けていく。
genfstab -U /mnt > /mnt/etc/fstab
arch-chroot /mnt
Update ¶
展開したばかりの PSXITA は様々なパッケージが古い。 新しく入れるBootLoaderとのかみ合わせもあるので、全てのパッケージを更新していこうと思う。
pacman -Syu
ここで、以下のようなエラーメッセージを得た。
xorg-server and xf86-video-ati-git are in conflict (X-ABI-VIDEODRV_VERSION). Remove xf86-video-ati-git? [y/N]
幸いにもこのPCには不要であるため、削除を選択した。 しかし、多くのpackage conflictが残る。
AURパッケージが入っている様に見えるので、ここで一度AUR helperを先にインストールすることにしてみた。
Morganamilo/paru を参考に、以下を実行。
cd
pacman -S --needed base-devel
以下のようなエラーに見舞われた。
署名を検証するためのキーサーバーが変わっているようだ。 それ単体の更新を素直に試みても、それ自身を検証できず失敗した。
さてどうしたものか。
pacman/Package signing#Change keyserver
を参考に、 /etc/pacman.d/gnupg/gpg.conf
内の keyserver hkp://pool.sks-keyservers.net
とある行を keyserver hkp://keyserver.ubuntu.com
へと書き換え再試行したところ、archlinux-keyring
、base-devel
共に通常通りインストールが完了した。
さて気を取り直してparu
のインストールを再開する。
git clone https://aur.archlinux.org/paru
cd paru
makepkg -si
さてここでglibc
の依存関係が壊れていることに気づく。
様々を更新せずにglibc
だけバージョンが上がったことに起因する問題に見える。
少々強引だが、外側からpacstrap
で様々を更新してから再挑戦する。
pacstrap /mnt pacman gettext glibc lib32-glibc
arch-chroot /mnt
cd ~/paru
makepkg -si
makepkg
は一般ユーザーで動かすべきであることにエラーメッセージから気付かされた。
…何故かsu
が正しく動かない。
pacman
もいつの間にか壊れていた
他にも様々が壊れつつあるので、外側から base
を再インストールしたが解決せず。
su
の破損を治すべく、libtirpc
/ rpcbind
を再インストールしようとした所、conflict。
libxcrypt
が正常にインストールできない様なので、--overwrite *.gz
で黙らせる。
しかし、pacsort
も壊れているようなのでpacman-contrib
を更新。
今度は、libp11-kit
が壊れているようなので同様に--overwrite \*
にて対処。
ここまで来てやっと、rpcbind
の再インストールに望めた。
しかしsu
は使えない。
当てずっぽうでlinux
を更新してみるも、状況変わらず。
ここまで来て、pam
が壊れている可能性に気づき当てずっぽうでpam
を更新したところ、問題が解決した。
気を取り直して、su psxita
を行っていく。
再度paru
のインストールに挑む。
su psxita
git clone https://aur.archlinux.org/paru
cd paru
makepkg -si
llvm
が古すぎるのか、paru
のビルドがコケた。
特権に戻り、 llvm-libs
を更新しようと思ったが、llvm-libs-svn
が既に入っており、mesa-git
がそれに依存しているとのこと。
AURパッケージが多い今、それをちまちま解決するのは激しくダルい。
Go言語製で依存パッケージが少ないと思われる Jguer/yay を使う方針に切り替えた。
コケた。libxcrypt-compat
を導入し、解決。
やっとAUR helperのインストールに成功した。
さてAUR repositoryが見えるyay
なら簡単に依存関係が解決するかと思ったが、そうではないようだ。
見た所3つの依存関係問題が発生している。
jwm-git
lib32-mesa-git
openobex
まず、jwm-git
。
依存関係がエライことになっている∧再インストールが簡単だと推測されるとき、そのパッケージを一時的にアンインストールすると自体解決が早い。
jwm-git
はどうやらデスクトップウィンドウマネージャーの様だ。
単体での再インストールは容易であることが推測できるためとりあえず削除する。
pacman -R jwm-git
次に lib32-mesa-git
と行きたいところだが、パッケージ名をみるからにダルそうなので、後回しにして openobex
に取り掛かる。
openobex
は何らかの依存が生えていて簡単には消せない。
なので単体で更新することによって依存ツリーが解決されることを期待して単体更新を試みる。
yay -S openobex # -> 失敗
html2text
なるpythonライブラリが足りないと申された為、Archレポジトリから導入。
sudo pacman -S python-html2text
yay -S openobex # -> 失敗
何故か同様のエラーで止まってしまった。 ここでふとPythonはバージョン間の互換性が弱いことを思い出した。
python --version # => 3.7.x
sudo pacman -S python
python --version # => 3.10.x
yay -S openobex # -> 成功
私は元々Pythonのパッケージマネジメントがあまり好きではないが、更に少し嫌いになり、また同時に普通にArch Linuxを一から手積みしたほうが楽だという気持ちになってきた。
しかしそれでは Unknown氏 の疑問に答えられない為、Arch Linux Update Battleを続行する。
残る依存関係の問題は lib32-mesa-git
だ。
ダルい問題がそれ単体になったことだけでもまず喜ばしいことだが…。
lib32-mesa-git
の渋い点として、ps4レポジトリ (PSXITA独自のレポジトリ)から入っている点が挙げられる。
これは現行のArchの公式Repositoryと十分な互換性がない可能性があるということになる。
万事休すかと思いドライバをリサーチした所、なんと普通にGitHub (Ps3itaTeam/ps4linux-video-drivers )に更に新しいバージョンがあるではないか。
何故依存関係が更新されているバージョンが入らないのだろうかと疑問に思ってREADME.md
を確認すると、どうやらレポジトリが変わったらしい。
README.md
に従い、/etc/pacman.conf
を修正した。
さてここまでの手順を踏むとなんとpacman -Syu
が通るではないか。
と思いきや、依存関係は解決されたものの、またconflictが…。
ilmbase
はopenexr
で置き換わったらしいので黙らせた。
sudo pacman -S --overwrite \* openexr
その後、pacman -Syu
を再試行した所解決した。
原状復帰にjwm-git
を復活させれば更新は完了したことになる。
yay -S jwm-git
Setup Bootloader ¶
次にPC向けのBootloaderをインストールする。(ここだけが本質)
今回はsystemd-boot
を採用した。
大凡のインストール手順は systemd-boot#Installation の通りだ。
pacman -S efibootmgr
bootctl install
/boot/loader/entries/arch.conf
に以下を記述する。 (当然PARTUUIDは各環境に合わせて変更する。)
mkinitcpio -P #念の為(どの様なパッケージがPSXITAに含まれるかちゃんとは追ってないので)
Reboot ¶
ブートローダーもインストールしたので、あとは再起動するだけだ。
するとHyper-V上にもかかわらず、当たり前のようにPSXITAのデスクトップ環境が起動し出迎えてくれた。(当たり前だが)
CPU情報等からこれがPS4上ではなく実際に私のWindows PC上であることが分かるのではないだろうか。
実用に向けて ¶
まず間違いなくユーザパスワードを変更するべきだ。 何故か標準でSSHサーバーも建っているため、これは必須と言っても過言ではない。(事実、psxitaの初期パスワードはchangeitだ。)
しかしそれだけでは不十分だ。このままではSSHのホストキーが他のPSXITAユーザーと共通になってしまう為、仮にSSHを使う場合、MITM攻撃がありうる。
以下の記事を参考にSSH Hostkeyを更新するべきだ。
Talk:OpenSSH#Regenerate_host_keys
SSH-Hostkeyが既知ならば(PSXITAのrootfsは配布されているので当然既知)、SSHは単なる平文と何ら変わらない。 具体的なPoCは以下のレポジトリを参照されたし。
https://github.com/jtesta/ssh-mitm
また、CPU脆弱性対策の為、CPUマイクロコードパッケージのintel-ucode
やamd-ucode
等もインストールし、systemd-boot
に設定するべきである。
あとがき ¶
Unknown氏の疑問は理解できるもので、また、当然実現可能なことだ。
yyoossk氏の早合点には疑問を抱かざるを得ない。現に私はPSXITAを一般的なUEFI PC上にインストールしてしまった。
yyoossk氏 Unknown氏ら、そして読者の方々には是非Arch LinuxをInstall Guideに沿ってインストールしてみてほしい。きっと多くの発見があるはずだ。
P.S. ¶
Hyper-V上のMenuに「Turn off PS4」や「Return to ORBIS OS」とあるのはやや面白い。
2022-03-30 追記 ¶
記事を書いた際、Psxitarch Linux v2 を参考に環境を構築したが、 同様に地獄を見ている人間が他にも居た。
Guide to Install PSXITArch Linux on PS4, Enable Wi-Fi and More by Hippie68
元記事は2019-01-31に投稿されているが、この記事は2021-08-22と比較的新しい。
最初から見つけられていればどれほど良かったか…。