Pixel3をAndroid11でroot化したよ!
どんなメリットがあるの?
それは色々ありすぎて、目的によるね!
そんなマニアックなネタ、需要あるの?
はいー! ぴーちゃんの言う通り、マニアックネタになります。しかし、root化によるメリットは結構あります。もちろんデメリットもありますが、実際にいろいろ触って体験してみましょう。あと自己責任でよろしくね!真似して何か不利益が起きても著者は知りませんよ。
そもそも、root化ってなに?
このブログの趣旨としては、なるべく専用用語を使わずわかりやすく一般の人にも理解してもらいたい・そー著者は思っております。
すべて使わないのは無理があるわね!
root化 (Android OS)
https://ja.wikipedia.org/wiki/Root%E5%8C%96_(Android_OS)
出典: フリー百科事典『ウィキペディア(Wikipedia)』
wikiではこのように説明されていますね。一言で言えば、Androidの最高管理権限をゲットするということです。一体、この権限を取得して何をするのか? ということが、本来大事ですよね。目的があってこそのroot化です。
root化して何するの・・・?
今回、スマホ(Pixel3)をroot化したいなと思った1つの大きな目的はtermux です。Termuxは、root化しなくてもいろんなアプリが動作する大変面白い神アプリですが、1024ポート未満は、root権限がないと動作しません。例えば、nginxを80番ポートで動作させようとすると以下のようになります。
$ nginx
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /data/data/com.termux/files/usr/etc/nginx/nginx.conf:3
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
このようにroot権限がないと、バインドできないんです。WEBサーバ以外にも、例えばDNSの53ポートや、SSLの443など、なるべくそのままのポートで動作させたいものがあります。root化していれば、この制限がなくなります。つまり、今の所、内部向けDNSと、WEB・SSLサーバをスマホで動作させたいのが root化の大きな目的です。
現在、このブログが動作している Umidigi F2というスマホにもtermuxが動作していて、そこでは8080と8443ポートで動作しているWordPressがあります。現在は外向け用に、グローバルIP+ポートをプライベートIP+内部ポートに変換して運用していますが、内部からのアクセスだとUターンNATができないルータの影響で、内部ネットワークからはドメイン名でWordPressにアクセスできないのです。ポート変換がなければ、内部向けDNSを作ればシンプルに解決できますので、ポート53で動作する省電力DNSサーバとWEB/SSLサーバが欲しかったわけです。まだ検討中なので、実運用するかどうかはわかりません。
というわけで、Pixel3のroot化やってみましょうか。
ステップ1 概要
こういうのは、全体像が見えていることが大事です。今回、Pixel3のAndroid11最新バージョンの状態でroot化をどのようにするか、要点をまとめてみます。
・Magiskというツールを使い、twrpは使わない
・Magiskを使い、純正ファクトリーイメージに含まれるBootにパッチする
・adb純正ツールで、BootをPixelに書き込む
・Termuxはroot権限を利用できるようMagiskに設定しておく
root化というのは、Bootプロセスの一部に細工を加えその後に展開されるOSイメージのroot権限を奪取して、永続化できるよう書き換えるというものです。Pixelの場合は、ブートローダは普通にだれでもアンロックできますので boot.imgを程よく書き換えればその後マウントされる中でrootがイキの状態に持っていけるということです。
他にも違うやり方はあると思いますが、Magiskというツールがなかなかよかったので、今回はこれでやることにします。boot中にどのような手法でやっているのか(一部、脆弱性を利用していると思いますが)、その具体的な手法については未調査です。
ステップ2 必要なツールと準備
さて、まずは前準備が大切です。
SDK・プラットフォームツール
https://developer.android.com/studio/releases/platform-tools.html
::
これは最新にしておいてね!
AndroidStudioから、最新にする方法もあります。また入れてあれば上記からDLして、本来入っているところに上書きしておけばOKです。現在の最新は以下のバージョンです。
$ adb --version
Android Debug Bridge version 1.0.41
Version 30.0.4-6686687
次はファクトリーイメージをダウンロードしておきます。
Factory Image
https://developers.google.com/android/images
::
“blueline” for Pixel 3
::
11.0.0 (RP1A.200720.009, Sep 2020)
Pixel3のコードネームは、bluline です。これの現在最新の11.0.0 (RP1A.200720.009, Sep 2020)をダウンロードしておきます。コマンドでやる場合は以下のようになります。著者は、ルート直下にsrcディレクトリ作ってますが、別にどこでやってもいいです。パスが長くなるのが嫌だっただけです。
$ sudo mkdir /src
$ sudo chmod 777 /src
$ cd /src
$ wget https://dl.google.com/dl/android/aosp/blueline-rp1a.200720.009-factory-145e4cc4.zip
$ shasum -a 256 blueline-rp1a.200720.009-factory-145e4cc4.zip
※ Checksum を確認しておいてね。RP1A.200720.009
ステップ3 ファクトリーイメージを展開
ダウンロードしたファイルを展開します。
$ unzip blueline-rp1a.200720.009-factory-145e4cc4.zip
$ tree blueline-rp1a.200720.009
blueline-rp1a.200720.009
├── bootloader-blueline-b1c1-0.3-6623201.img
├── flash-all.bat
├── flash-all.sh
├── flash-base.sh
├── image-blueline-rp1a.200720.009.zip
└── radio-blueline-g845-00107-200702-b-6648703.img
さらにその中のイメージファイルを展開
$ mv blueline-rp1a.200720.009/*.zip ./
$ mv blueline-rp1a.200720.009/*.img ./
$ unzip image-blueline-rp1a.200720.009.zip -d image-blueline-rp1a.200720.009
$ tree image-blueline-rp1a.200720.009
image-blueline-rp1a.200720.009
├── android-info.txt
├── boot.img
├── dtbo.img
├── product.img
├── super_empty.img
├── system.img
├── system_ext.img
├── system_other.img
├── vbmeta.img
└── vendor.img
$ mv image-blueline-rp1a.200720.009/boot.img ./
ステップ4 Magisk Managerを入れる
スマホのアプリなので、スマホから操作です。
Magisk Manager Canary
https://github.com/topjohnwu/Magisk
※ Magisk Manager Canary から、APKをDLして入れておく
Canaryビルドのほうが、現時点ではインターフェイスが新しくなって使いやすかったです。
ステップ5 boot.img をスマホに転送
さきほど、ファクトリーイメージの中から取り出した、boot.img をスマホに転送しておきます。adb コマンドでやる場合は以下
$ adb push ./boot.img /sdcard/Download/
./boot.img: 1 file pushed, 0 skipped. 83.1 MB/s (67108864 bytes in 0.770s)
Android File Transfer とか使ってもOKです。何らかの方法でスマホに転送してね。
ステップ6 Magisk Managerアプリでパッチ
スマホに転送したboot.imgをMagisk Managerアプリでパッチを当てます。
追記
匿名さんからコメントいただきましたので修正、補足しておきます。
Magiskマネージャーはインストール後、設定→更新チャンネルをβ版に変更しておきます。記事執筆時。
boot.imgを選択して、LET`S GO→ です。
All done! でパッチ当て成功です。
ステップ7 magisk_patched.img をPCにダウンロード
PCから、adbコマンドでパッチしたboot.imgを書き込みますのでさきほどの、magisk_patched.img をPCにダウンロードしておきます。adb コマンドでやる場合は、以下
$ adb pull /sdcard/Download/magisk_patched.img ./
/sdcard/Download/magisk_patched.img: 1 file pulled, 0 skipped. 69.2 MB/s (67108864 bytes in 0.925s)
ステップ8 OEMロック解除
開発者オプションから、OEMロック解除をOnにしておきます。あと、USBデバックはONで。
一回、電源を落とします。電源オフの状態から電源+ボリューム下キーを長押し “Fastboot Mode” を起動。
$ fastboot flashing unlock
スマホ本体よりボリューム↑↓キーで『Unlock the bootloader』を選択、電源キーで確定します。
$ fastboot reboot
ステップ9 PCからイメージファイルを書込
PCから、adbコマンドでいろいろ書き込みます。まずは、スマホをFastboot modeにしておきます。
・再起動>ボリューム下キー
→ Fastboot mode でスマホが起動
PCから認識されているか確認しておきます。以下のようにシリアルナンバーが表示されていればOKです。
$ fastboot devices
8*******6 fastboot
ファクトリーイメージに含まれる、以下ファイルを書き込みます。
$ fastboot flash bootloader <以下ファイルをD&D>
bootloader-blueline-b1c1-0.3-6623201.img
追記
匿名さんから、つまずいた点をご指摘いただきましたので記載しておきますね。
半角スペース忘れないこと→例:fastboot flash bootloader<半角スペース><ファイルパス>
実行例は以下です。
$ fastboot flash bootloader ./bootloader-blueline-b1c1-0.3-6623201.img
Sending 'bootloader_b' (8537 KB) OKAY [ 0.290s]
Writing 'bootloader_b' (bootloader) Flashing Pack version b1c1-0.3-6623201
(bootloader) Flashing partition table for Lun = 0
(bootloader) Flashing partition table for Lun = 1
(bootloader) Flashing partition table for Lun = 2
(bootloader) Flashing partition table for Lun = 4
(bootloader) Flashing partition table for Lun = 5
(bootloader) Flashing partition msadp_b
(bootloader) Flashing partition xbl_b
(bootloader) Flashing partition xbl_config_b
(bootloader) Flashing partition aop_b
(bootloader) Flashing partition tz_b
(bootloader) Flashing partition hyp_b
(bootloader) Flashing partition abl_b
(bootloader) Flashing partition keymaster_b
(bootloader) Flashing partition cmnlib_b
(bootloader) Flashing partition cmnlib64_b
(bootloader) Flashing partition devcfg_b
(bootloader) Flashing partition qupfw_b
(bootloader) Flashing partition storsec_b
(bootloader) Flashing partition logfs
OKAY [ 0.825s]
Finished. Total time: 1.384s
で、このコマンドをやっておきます。
$ fastboot reboot bootloader
実行例は以下です。
$ fastboot reboot bootloader
Rebooting into bootloader OKAY [ 0.081s]
Finished. Total time: 0.081s
radioファイルを書き込みます。
$ fastboot flash radio <以下ファイル>
radio-blueline-g845-00107-200702-b-6648703.img
実行例は以下です。
$ fastboot flash radio ./radio-blueline-g845-00107-200702-b-6648703.img
Sending 'radio_b' (71436 KB) OKAY [ 1.670s]
Writing 'radio_b' (bootloader) Flashing Pack version SSD:g845-00107-200702-B-6648703
(bootloader) Flashing partition modem_b
OKAY [ 0.555s]
Finished. Total time: 2.495s
で、このコマンドをやっておきます。
$ fastboot reboot bootloader
実行例は先と同じなので省略です。
Android11の本体イメージを書き込みます。
$ fastboot --skip-reboot update <以下ファイル>
image-blueline-rp1a.200720.009.zip
実行例です。ここは少し時間がかかります。途中リブートしましたがほっとけばOKです。
$ fastboot --skip-reboot update ./image-blueline-rp1a.200720.009.zip
--------------------------------------------
Bootloader Version...: b1c1-0.3-6623201
Baseband Version.....: g845-00107-200702-B-6648703
Serial Number........: 8*******6
--------------------------------------------
extracting android-info.txt (0 MB) to RAM...
Checking 'product' OKAY [ 0.058s]
Checking 'version-bootloader' OKAY [ 0.060s]
Checking 'version-baseband' OKAY [ 0.060s]
Setting current slot to 'b' OKAY [ 0.396s]
extracting boot.img (64 MB) to disk... took 0.503s
archive does not contain 'boot.sig'
Sending 'boot_b' (65536 KB) OKAY [ 1.531s]
Writing 'boot_b' OKAY [ 0.468s]
extracting dtbo.img (8 MB) to disk... took 0.017s
archive does not contain 'dtbo.sig'
Sending 'dtbo_b' (8192 KB) OKAY [ 0.280s]
Writing 'dtbo_b' OKAY [ 0.170s]
archive does not contain 'dt.img'
archive does not contain 'recovery.img'
extracting vbmeta.img (0 MB) to disk... took 0.000s
archive does not contain 'vbmeta.sig'
Sending 'vbmeta_b' (8 KB) OKAY [ 0.120s]
Writing 'vbmeta_b' OKAY [ 0.067s]
archive does not contain 'vbmeta_system.img'
archive does not contain 'vendor_boot.img'
extracting super_empty.img (0 MB) to disk... took 0.000s
Rebooting into fastboot OKAY [ 0.060s]
< waiting for any device >
※端末がリブート > もう一度リブート
>fastbootd 画面になる
>さらに、コマンドが流れる
Sending 'system_b' (4 KB) OKAY [ 0.001s]
Updating super partition OKAY [ 0.006s]
Deleting 'system_a' OKAY [ 0.005s]
Deleting 'vendor_a' OKAY [ 0.005s]
Resizing 'product_b' OKAY [ 0.005s]
Resizing 'system_b' OKAY [ 0.005s]
Resizing 'system_ext_b' OKAY [ 0.006s]
Resizing 'vendor_b' OKAY [ 0.006s]
archive does not contain 'boot_other.img'
archive does not contain 'odm.img'
extracting product.img (1871 MB) to disk... took 14.110s
archive does not contain 'product.sig'
Resizing 'product_b' OKAY [ 0.006s]
Sending sparse 'product_b' 1/8 (262140 KB) OKAY [ 6.294s]
Writing 'product_b' OKAY [ 2.634s]
Sending sparse 'product_b' 2/8 (262140 KB) OKAY [ 6.388s]
Writing 'product_b' OKAY [ 1.599s]
Sending sparse 'product_b' 3/8 (262140 KB) OKAY [ 6.376s]
Writing 'product_b' OKAY [ 1.598s]
Sending sparse 'product_b' 4/8 (262140 KB) OKAY [ 6.399s]
Writing 'product_b' OKAY [ 1.648s]
Sending sparse 'product_b' 5/8 (262140 KB) OKAY [ 6.375s]
Writing 'product_b' OKAY [ 1.612s]
Sending sparse 'product_b' 6/8 (262140 KB) OKAY [ 6.385s]
Writing 'product_b' OKAY [ 1.625s]
Sending sparse 'product_b' 7/8 (262140 KB) OKAY [ 6.404s]
Writing 'product_b' OKAY [ 1.586s]
Sending sparse 'product_b' 8/8 (81204 KB) OKAY [ 2.447s]
Writing 'product_b' OKAY [ 0.579s]
extracting system.img (784 MB) to disk... took 4.331s
archive does not contain 'system.sig'
Resizing 'system_b' OKAY [ 0.006s]
Sending sparse 'system_b' 1/4 (262140 KB) OKAY [ 6.089s]
Writing 'system_b' OKAY [ 2.647s]
Sending sparse 'system_b' 2/4 (262140 KB) OKAY [ 6.203s]
Writing 'system_b' OKAY [ 1.607s]
Sending sparse 'system_b' 3/4 (262140 KB) OKAY [ 6.149s]
Writing 'system_b' OKAY [ 1.631s]
Sending sparse 'system_b' 4/4 (16400 KB) OKAY [ 0.806s]
Writing 'system_b' OKAY [ 0.171s]
extracting system_ext.img (183 MB) to disk... took 0.944s
archive does not contain 'system_ext.sig'
Resizing 'system_ext_b' OKAY [ 0.005s]
Sending 'system_ext_b' (187564 KB) OKAY [ 4.167s]
Writing 'system_ext_b' OKAY [ 2.209s]
extracting system_other.img (68 MB) to disk... took 0.385s
archive does not contain 'system.sig'
Sending 'system_a' (69880 KB) OKAY [ 1.558s]
Writing 'system_a' OKAY [ 0.420s]
extracting vendor.img (408 MB) to disk... took 2.065s
archive does not contain 'vendor.sig'
Resizing 'vendor_b' OKAY [ 0.005s]
Sending sparse 'vendor_b' 1/2 (262140 KB) OKAY [ 5.997s]
Writing 'vendor_b' OKAY [ 2.631s]
Sending sparse 'vendor_b' 2/2 (156584 KB) OKAY [ 3.825s]
Writing 'vendor_b' OKAY [ 1.022s]
archive does not contain 'vendor_dlkm.img'
archive does not contain 'vendor_other.img'
Finished. Total time: 162.157s
最後です。スマホでパッチしたboot.imgを書き込みます。
$ fastboot flash boot <以下パッチしたimgファイル>
magisk_patched.img
実行例です。
$ fastboot flash boot ./magisk_patched.img
Sending 'boot_b' (65536 KB) OKAY [ 1.454s]
Writing 'boot_b' OKAY [ 0.392s]
Finished. Total time: 1.855s
ステップ10 スマホをリブートする
スマホの画面は、fastbootd になっていますので、「Reboot system now」が選択された状態で電源ボタンを押します。リブートは40秒くらいして、OSが起動しました。
ステップ11 確認
Magiskアプリは以下のようになっていれば、root化は成功しています。Termuxからrootパッケージを入れて、su すると許可画面が出るのでOKしておけば以下のようにスーパーユーザーの画面に出てきます。
逆にアプリから隠したい場合は、MagiskHideからアプリを選択しておきます。Termux側からの操作、例えばrootパッケージを入れてどうなったかなどは次回また紹介することにします。あと、OSの自動アップデートはOffにしておいてくださいね。ここ、めちゃ大事。開発者オプションから選択できます。
まとめ
今回、作業してみての感想やまとめは以下です。
・root化は久しぶりで事情がだいぶ変わっていた
・Magiskアプリはよくできている
・TWRPは、対応したらやってみる。たぶんUmidigiF2でやることになりそう
・日本語で、まとまっているサイトがなかった
・今年中にまたOSアップデートが来ると思うが、その時は状況みて導入するか考える
あとがき
ステップ9はわけるべきだったか迷いました。まぁ、流れは書き込みなのでいいかな?w で、root化すると、tcpdump も使い放題、他のアプリ領域のデータも見放題となり、随分いろいろと物色してしまいました。また、当初の目標だった、1024ポート以下のサービス起動も問題なくできていろいろできることが増えそうです。
あと、termux-root-packagesを見ていると知らないアプリがあって興味津々です。たとえば、tincとかっていうVPNデーモン。これすごく使いやすそうです。
著者にメッセージ
コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。
間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。