AppleのOSは基本的に、MacやiPhone、iPadなどの自社製ハードウェアでだけで動作するように設計されており、他のハードウェア(仮想マシン含む)で動作させるのは困難となっています。
本日紹介する「QEMU-iOS」は、この困難を乗り越えるための開発がすすめられているオープンソースプロジェクトです。古いレガシーAppleデバイスをQEMU上で動かすたための作業が行われており、現在はiPod Touch(第1世代)と、iPod Touch(第2世代)をサポートしています。
2022年末頃に話題となったプロジェクトですが、今回は実際に手元の環境で実行する方法を説明したいと思います。
QEMU-iOSを実行する方法
今回はM1 MacBook Air(Homebrew環境)上で、iPod Touch(第1世代)/iPhoneOS 1.0をビルドしてみました。Intel MacやMacPortsでも実行可能なはずですが、ライブラリのインストールやパス指定など、適宜変更する必要があると思います。
インストールは公式ドキュメントに従って進めます。
まず、必要なソースファイルをチェックアウトします:
git clone https://github.com/devos50/qemu cd qemu git checkout ipod_touch_1g
ソースコードをビルドします(エラーが発生した場合は後述):
mkdir build cd build ../configure --enable-sdl --disable-cocoa --target-list=arm-softmmu --disable-capstone --disable-pie --disable-slirp --extra-cflags=-I/usr/local/opt/openssl@3/include --extra-ldflags='-L/usr/local/opt/openssl@3/lib -lcrypto' make
--extra-cflags=-I/opt/homebrew/opt/openssl@3/include
と--extra-ldflags='-L/opt/homebrew/opt/openssl@3/lib -lcrypto'
はopenssl3のヘッダファイルとライブラリファイルのパスを正しく指定してください。AppleシリコンMacでHomebrewをデフォルト設定で使用している場合、上記のパスで良いはずです。
ビルドが成功したら起動に必要なファイルをこちらからダウンロードします。すべてダウンロードし任意のフォルダに保存しておきます。nand_n45ap.zipは展開しておきます。
- bootrom_s5l8900
- iboot_204_n45ap.bin
- nand_n45ap.zip
- nor_n45ap.bin
これで準備が完了です。
以下のコマンドで実行します。bootrom、iboot、nand、norファイルのパスは適宜変更し、先ほど保存したファイルを正しく指すように変更してください。
./arm-softmmu/qemu-system-arm -M iPod-Touch,bootrom=/Users/sora/evaluate/ipod1/bootrom_s5l8900,iboot=/Users/sora/evaluate/ipod1/iboot_204_n45ap.bin,nand=/Users/sora/evaluate/ipod1/nand -serial mon:stdio -cpu max -m 1G -d unimp -pflash /Users/sora/evaluate/ipod1/nor_n45ap.bin
実行に成功すると、しばらく待った後にiPod Touchのホーム画面が表示されます。クリックで操作でき、ホームボタンは、「H」キーでエミュレートされています。
エミュレーター内で、ネットワーク関連のアプリは使えませんが、単体アプリは使用することができます。
▲例えば計算機アプリ。
▲設定画面。
ビルドできない場合
環境によってconfigureやmakeでエラーがでることがあります。個人的には以下のインストールが必要でした。
brew install ninja brew install sdl2
また、
configure実行時に「ERROR: "cc" cannot build an executable (is your linker broken?)」というエラーが表示されたのは、--extra-ldflags='-L/opt/homebrew/opt/openssl@3/lib -lcrypto'
のパス指定が間違えていたからでした。
まとめ
QEMU-iOSを実行する方法を説明しました。実際に自分の環境で動かしてみたい方は試してみてはいかがでしょうか。