關於在iOS裝置跑Linux系統的嘗試,我之前討論過 iSH Shell終端機、 UTM虛擬機的作法,現在我要來嘗試直接在iPhone裝Linux系統。
1. 背景#
chem8可說是Apple近年來最大的漏洞,搭配checkra1n軟體,能夠在開機之前完成越獄操作。2020年,有神人搞了Project Sandcastle,成功在iPhone 7跑Android 10,作者也著手移植Linux核心,儘管差點被Apple告了,這個專案依然繼續開發。
幾年後,更多開發者嘗試在其他iPhone上跑Linux。checkm8仰賴的漏洞僅支援A7 ~ A11晶片,也就是iPhone 5S ~ iPhone X的裝置,更舊或更新的裝置都不行。
理想上iPhone 7是目前狀態相對好的裝置,能夠在AFPS掛載postmarketOS開機,甚至有開發者讓它能跑Wayland了。可惜我沒有這台。
我有兩台支援checkm8的舊iOS裝置,分別為iPhone SE (iOS 15)和iPod touch 6 (iOS 12)。網路上有許多成功啟動Linux的案例,但沒寫他們的iOS版本。iOS 15以上只能用palera1n越獄,得用指令paleran1 -p -f
啟動pongoOS Shell,但我測試過有其他問題。所以改用iPod touch 6測試,這台的處理器跟iPhone 6相仿,理論上可行。
至於要怎麼跑Linux呢?首先要透過checkra1n進入pongoOS Shell,再引導Linux開機。
要選哪個Linux發行版呢?雖然Reddit有人成功編譯Ubuntu開機,Twitter也有人跑起Asahi Linux(見文末參考資料),但是postmarektOS Wiki上面有更多人成功的照片,加上這個社群是比較關注Linux行動裝置議題的,所以我以這個發行版為基礎下去嘗試。
後續有二種作法,一是將Linux編譯成ramdisk開機,重開機後資料就會消失。
二是利用 pmbootstrap提供的Netboot功能,進行網路開機,重開機後資料依然會消失,不過rootfs會留在電腦上。
嗯,所以嚴格說來這些都不是真正的「裝」Linux系統到iPhone上,系統沒有真正寫入到iPhone磁碟,只是暫時用Linux開機而已。目前不論用什麼方法,都得依賴電腦引導才能開機進入Linux。
2. 準備項目#
- Linux或Mac電腦,我使用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核心之前執行的程式。
編譯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核心#
- 安裝編譯依賴套件
sudo apt install build-essential clang libncurses5 flex git bc bison
- 取得konradybcio提供的linux-apple核心原始碼
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
,按1PAGESIZE,A8處理器設定4K,A9處理器以上設定為16K。之後按下Exitt,儲存.config。
編譯核心
make ARCH=arm64 LLVM=1 -j$(nproc) Image.lzma dtbs
最終會得到
arch/arm64/boot/Image.lzma
取得dtbpack指令稿,放到Linux核心所在目錄
wget https://raw.githubusercontent.com/SoMainline/linux-apple-resources/master/dtbpack.sh
chmod +x dtbpack.sh
- 生成dtbpack
./dtbpack.sh
5. 編譯postmarketOS的rootfs#
安裝 pmbootstrap
初始化,機型選apple-iphone6。桌面環境選xfce4。
pmbootstrap init
- 建立rootfs
pmbootstrap install
6. 開機進入Linux#
設定 libimobiledevice,確認Linux認得到iPhone。
將iPhone插上電腦,手動進入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的neboot
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/initramfs
等待Linux開機…結果kernel panic,幹。
如果正常開機的話,再傳送Netboot的rootfs,即可進入Linux系統。
pmbootstrap netboot serve
ssh [email protected]
7. 總結#
每次幹這種事的時候我就會想到這首歌。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