メインコンテンツへスキップ

iPhone 6にLinuxシステムを入れる:checkra1n脱獄でpostmarketOSを動かす

·
カテゴリー スマートフォン 真のLinuxスマホ
タグ IOS PostmarketOS Checkm8 Jailbreak IPhone
目次

iOSデバイスでLinuxシステムを動かす試みについては、以前iSH Shell TerminalUTM 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を読み込む前に実行されるプログラムです。

  1. pongoOSをコンパイルする前に、checkr1anに依存します。(paler1anではpongoOSをコンパイルする必要はありません)

  2. 公式サイトからcheckra1n実行ファイルをダウンロードし、システムディレクトリへ入れます

wget https://assets.checkra.in/downloads/linux/cli/x86_64/dac9968939ea6e6bfbdedeb41d7e2579c4711dc2c5083f91dced66ca397dc51d/checkra1n

sudo mv checkra1n /usr/bin/
  1. LinuxにClang 11をインストールします
sudo apt install clang-11 xdd
  1. 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
  1. 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をコンパイルする
#

  1. コンパイル依存パッケージをインストールします
sudo apt install build-essential clang  libncurses5 flex git bc bison
  1. konradybcioが提供するlinux-apple kernelソースコードを取得します
git clone https://github.com/konradybcio/linux-apple

cd linux-apple
  1. SoMainlineが提供するdefconfigを取得します
wget https://raw.githubusercontent.com/SoMainline/linux-apple-resources/master/example.config -O ./.config
  1. PAGESIZEを調整します
make ARCH=arm64 LLVM=1 menuconfig
  1. /を押して検索し、_PAGEと入力して1を押します

  2. PAGESIZEは、A8プロセッサなら4K、A9プロセッサ以上なら16Kに設定します。その後Exitを押して、.configを保存します。

  3. kernelをコンパイルします

make ARCH=arm64 LLVM=1 -j$(nproc) Image.lzma dtbs
  1. 最終的にarch/arm64/boot/Image.lzmaが得られます

  2. dtbpackスクリプトを取得し、Linux kernelのあるディレクトリへ置きます

wget https://raw.githubusercontent.com/SoMainline/linux-apple-resources/master/dtbpack.sh

chmod +x dtbpack.sh
  1. dtbpackを生成します
./dtbpack.sh

5. postmarketOSのrootfsをコンパイルする
#

  1. pmbootstrapをインストールします

  2. 初期化します。機種はapple-iphone6を選びます。デスクトップ環境はxfce4を選びます。

pmbootstrap init
  1. rootfsを作成します
pmbootstrap install

6. Linuxへ起動する
#

  1. libimobiledeviceを設定し、LinuxがiPhoneを認識できることを確認します。

  2. iPhoneをPCに接続し、手動でDFUモードに入ります:電源を切り、5秒待ちます。電源ボタンを3秒押し続け、続いて電源ボタン+Homeボタンを10秒押し、それから電源ボタンを離してHomeボタンを押し続けます。

  3. DFUに入ったことを確認したら、pongoOSソースコードのディレクトリで端末を開き、checkra1nでpongoOS Shellへ入ります

cd pongoOS

sudo checkra1n -v -V -p -c -k ./build/Pongo.bin
  1. この時点でiOSデバイスの画面にpongoOS Shellが表示されます

  2. postmarketOSのnetbootを起動します

pmbootstrap initfs hook_add netboot

pmbootstrap export
  1. 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/initramfs
  1. Linuxの起動を待ちます…結果はkernel panic。クソ。

  2. 正常に起動する場合は、さらにNetbootのrootfsを送れば、Linuxシステムへ入れます。

pmbootstrap netboot serve

ssh user@172.16.42.1

7. まとめ
#

毎回こういうことをやるたびに、この曲を思い出します。It’s all a waste of time again.

現時点では実用性はありません。ドライバ対応が悪いAndroid機に無理やりpostmarketOSを焼くようなものです。最大の問題はやはりドライバの対応状況が悪いこと。SoMainline提供的表格を見ればわかりますが、ほぼすべてのハードウェア機能にバツが付いています。

それに、Appleデバイスのドライバをいったい誰がリバースエンジニアリングできるのでしょうか?Asahi Linuxのような熱意ある開発者はいるのでしょうか?しかもLinuxの起動自体、まだハードウェア脆弱性頼みです。

起動していくつかLinuxプログラムを動かせる以外、発展性はあまりありません。

より現実的な戦略としては、iOSデバイス上でJITアクセラレーション付きのUTM仮想マシンを動かし、その中でLinux仮想マシンを走らせるほうが実用的かもしれません。

参考資料
#

関連記事


最後までお読みいただきありがとうございます。本サイトでは公開コメント欄を設けていません。私はソーシャルな反応やアクセス数を追い求めるためではなく、自分の考えを誠実に探求するために文章を書いています。記事を丁寧にお読みいただいたうえで、ご感想やご意見をお寄せいただければ幸いです。誤字・誤り・技術的な問題などを見つけた場合、またはフィードバックを共有したい場合は、Aboutページに記載しているメールアドレスまでお気軽にご連絡ください。