iOSデバイスでLinuxシステムを動かす試みについては、以前iSH Shell TerminalとUTM VMのやり方を取り上げました。今回は、iPhoneへ直接Linuxシステムを入れることを試します。
1. 背景#
checkm8はAppleにとって近年最大級の脆弱性と言えます。checkra1nソフトウェアと組み合わせることで、起動前に脱獄操作を完了できます。2020年には、すごい人がProject Sandcastleを立ち上げ、iPhone 7でAndroid 10を動かすことに成功しました。作者はLinux kernelの移植にも着手し、Appleに訴えられかけたにもかかわらず、このプロジェクトは今も開発が続いています。
最近ではLineageOSの移植版も開発されています。たとえばAndroid device tree for “snowcastle”は、対応するiPhoneで最新のAndroid 16を動かせます。
数年後、さらに多くの開発者が他のiPhone上でLinuxを動かそうと試みました。checkm8が依存する脆弱性はA7 ~ A11チップにしか対応していません。つまりiPhone 5S ~ iPhone Xのデバイスです。それより古いもの、あるいは新しいものはどちらも無理です。
理想的には、iPhone 7が現在比較的状態のよいデバイスです。AFPSにpostmarketOSをマウントして起動でき、さらにはWaylandを動かせるようにした開発者までいます。残念ながら僕はこの機種を持っていません。
僕の手元にはcheckm8に対応する古いiOSデバイスが2台あります。iPhone SE (iOS 15)とiPod touch 6 (iOS 12)です。ネット上にはLinuxの起動に成功した事例が多くありますが、彼らのiOSバージョンは書かれていません。iOS 15以上ではpalera1nでしか脱獄できず、palera1n -p -fコマンドでpongoOS Shellを起動する必要がありますが、僕が試したところ別の問題がありました。そこでiPod touch 6を使ってテストします。この機種のプロセッサはiPhone 6に近いので、理論上はいけるはずです。
では、どうやってLinuxを動かすのか?まずcheckra1nでpongoOS Shellに入り、そこからLinuxの起動を誘導します。
どのLinuxディストリビューションを選ぶのか?RedditではUbuntuをコンパイルして起動した人がいて、TwitterでもAsahi Linuxを動かした人がいます(文末の参考資料を参照)。ただ、postmarketOS Wikiには成功写真がより多く載っており、このコミュニティはLinuxモバイルデバイスの話題に比較的関心があるので、このディストリビューションをベースに試します。
その後の方法は2つあります。1つ目はLinuxをramdiskとしてコンパイルして起動する方法で、再起動するとデータは消えます。
2つ目はpmbootstrap Netboot を使ってネットワークブートする方法です。再起動後もデータはやはり消えますが、rootfsはPC側に残ります。
うん、なので厳密に言えば、これらはどれもiPhoneへLinuxシステムを本当に「インストール」しているわけではありません。システムはiPhoneのディスクに実際には書き込まれず、一時的にLinuxで起動しているだけです。現状どの方法でも、Linuxへ起動するにはPCによる誘導に依存する必要があります。
2. 準備するもの#
- LinuxまたはMacのPC。僕はUbuntu 24.04を使いました
- checkra1nに対応するiOSデバイス。つまりA7 ~ A11チップ、iPhone 5S ~ iPhone Xのデバイスです。僕はiPod touch 6を使い、システムバージョンはiOS 12.5.7です。
- Lightning to USB OTGアダプタ、マウスとキーボード。Linuxにはタッチドライバがないため、iPhone起動後はキーボードとマウスで操作する必要があります。SSHコマンドでX11を操作するのに慣れているなら、なくてもまあ構いません。
3. pongoOSをコンパイルする#
pongoOSはiOS XNU kernelを読み込む前に実行されるプログラムです。
pongoOSをコンパイルする前に、checkr1anに依存します。(paler1anではpongoOSをコンパイルする必要はありません)
公式サイトからcheckra1n実行ファイルをダウンロードし、システムディレクトリへ入れます
wget https://assets.checkra.in/downloads/linux/cli/x86_64/dac9968939ea6e6bfbdedeb41d7e2579c4711dc2c5083f91dced66ca397dc51d/checkra1n
sudo mv checkra1n /usr/bin/- LinuxにClang 11をインストールします
sudo apt install clang-11 xdd- checkra1nのパッケージリポジトリからld64とcctools-stripをインストールします。他のディストリビューションでは、新しいClang向けに手動でコンパイルする必要があります。
echo 'deb https://assets.checkra.in/debian /' | sudo tee /etc/apt/sources.list.d/checkra1n.list
sudo apt-key adv --fetch-keys https://assets.checkra.in/debian/archive.key
sudo apt update
sudo apt install ld64 cctools-strip- pongoOSのソースコードを取得してコンパイルします。konradybcioのforkを使います。
git clone https://github.com/konradybcio/pongoOS
cd pongoOS
LD_LIBRARY_PATH="/usr/lib/llvm-11/lib/" EMBEDDED_CC="/usr/bin/clang-11" EMBEDDED_LDFLAGS=-fuse-ld=/usr/bin/ld64 STRIP=cctools-strip make all注:pongoOSのソースコードは長らく更新されていないため、コンパイルに失敗することがあります。macOS仮想マシンでコンパイルしてもよいです。以下はmacOS VenturaでXcodeを使ってコンパイルするコマンドです:
xcode-select --install
git clone https://github.com/konradybcio/pongoOS
cd pongoOS
make all最終的にbuild/Pongo.binが得られます。
4. Linux kernelをコンパイルする#
- コンパイル依存パッケージをインストールします
sudo apt install build-essential clang libncurses5 flex git bc bison- konradybcioが提供するlinux-apple kernelソースコードを取得します
git clone https://github.com/konradybcio/linux-apple
cd linux-apple- SoMainlineが提供するdefconfigを取得します
wget https://raw.githubusercontent.com/SoMainline/linux-apple-resources/master/example.config -O ./.config- PAGESIZEを調整します
make ARCH=arm64 LLVM=1 menuconfig/を押して検索し、_PAGEと入力して1を押しますPAGESIZEは、A8プロセッサなら4K、A9プロセッサ以上なら16Kに設定します。その後Exitを押して、.configを保存します。

kernelをコンパイルします
make ARCH=arm64 LLVM=1 -j$(nproc) Image.lzma dtbs最終的に
arch/arm64/boot/Image.lzmaが得られますdtbpackスクリプトを取得し、Linux kernelのあるディレクトリへ置きます
wget https://raw.githubusercontent.com/SoMainline/linux-apple-resources/master/dtbpack.sh
chmod +x dtbpack.sh- dtbpackを生成します
./dtbpack.sh5. postmarketOSのrootfsをコンパイルする#
pmbootstrapをインストールします
初期化します。機種はapple-iphone6を選びます。デスクトップ環境はxfce4を選びます。
pmbootstrap init- rootfsを作成します
pmbootstrap install6. Linuxへ起動する#
libimobiledeviceを設定し、LinuxがiPhoneを認識できることを確認します。
iPhoneをPCに接続し、手動でDFUモードに入ります:電源を切り、5秒待ちます。電源ボタンを3秒押し続け、続いて電源ボタン+Homeボタンを10秒押し、それから電源ボタンを離してHomeボタンを押し続けます。
DFUに入ったことを確認したら、pongoOSソースコードのディレクトリで端末を開き、checkra1nでpongoOS Shellへ入ります
cd pongoOS
sudo checkra1n -v -V -p -c -k ./build/Pongo.binこの時点でiOSデバイスの画面にpongoOS Shellが表示されます

postmarketOSのnetbootを起動します
pmbootstrap initfs hook_add netboot
pmbootstrap export- LinuxのinitramfsをiOSデバイスへ転送します
cd pongoOS
python3 scripts/load_linux.py -k "linux-apple核心目錄/arch/arm64/boot/Image.lzma" -d "linux-apple核心目錄/dtbpack" -r /tmp/postmarketOS-export/initramfsLinuxの起動を待ちます…結果はkernel panic。クソ。

正常に起動する場合は、さらにNetbootのrootfsを送れば、Linuxシステムへ入れます。
pmbootstrap netboot serve
ssh user@172.16.42.17. まとめ#
毎回こういうことをやるたびに、この曲を思い出します。It’s all a waste of time again.
現時点では実用性はありません。ドライバ対応が悪いAndroid機に無理やりpostmarketOSを焼くようなものです。最大の問題はやはりドライバの対応状況が悪いこと。SoMainline提供的表格を見ればわかりますが、ほぼすべてのハードウェア機能にバツが付いています。
それに、Appleデバイスのドライバをいったい誰がリバースエンジニアリングできるのでしょうか?Asahi Linuxのような熱意ある開発者はいるのでしょうか?しかもLinuxの起動自体、まだハードウェア脆弱性頼みです。
起動していくつかLinuxプログラムを動かせる以外、発展性はあまりありません。
より現実的な戦略としては、iOSデバイス上でJITアクセラレーション付きのUTM仮想マシンを動かし、その中でLinux仮想マシンを走らせるほうが実用的かもしれません。
参考資料#
- Resources for Linux on checkm8able iDevices - Github
- Apple iPhone 6 (apple-iphone6) - postmarketOS Wiki
- Running postmarketOS on iPhone 7 - project-insanity.org
- Linux with Wayland is now running on iPhone 7 - project-insanity.org
- SUCCESS: iPhone 7 booting Ubuntu 20.04 to full gnome-shell desktop GUI - Reddit
- Linux on iPad Air 2 - Twitter


