備忘録:Termuxで、Pixel3のUnixBench

じゃんくはっく
じゃんくはっく

Pixel3が来たんでUnixBenchとっておきます!

あ〜、ごみジャンクなPixel3が到着したのね!

ぴー
ぴー
じゃんくはっく
じゃんくはっく

・・・いちいち、ジャンク〜と言うのね!w

ごみ、よりいいでしょ?w

ぴー
ぴー

はい、ジャンクなPixel3が到着しました。メルカリは面白いですね。値下げ文化みたいなのがあって、売り手と買い手のせめぎ合いです。今回、自分はそういうのには参加せず、8500円まで値下げされていた状態で発見しました。さらに、買い手が7500円でどうか?と打診中に、8500円でゲットしたという感じです。ヤフオクはそういうのがないので、なんか新鮮に感じましたが、売り手は慣れないと「まーた、値下げかよ!」みたいな感じになるのかなと。Pixel3は発売価格9.5万円ですからね!

なぜ、今頃Pixel3なんかゲットしたの?

え〜っとw。目的は root化した状態の termux で遊びたかったからです。UmidigiF2はこのブログが動作しているので、あれこれできないのです。

で、どうせなら、Umidigi F2 よりも速そうで Androidリファレンス機のPixelシリーズが良いな! という感じです。Pixelという機種は、知らない人もいるかもしれませんが Google から発売されている機種で、AndroidOSの最新版が最初にリリースされます。つい最近も、Android11がリリースされましたよね!なので、いち早くandroidOSの最新にアップデートできます。

アプリ開発者とPixel

 アプリ開発者は、1年に1回9月ごろにAndroidOSのアップデートがあるので、情報調査など春頃から準備しています。9月には新しいOSが出るから、それにアプリを対応させるんです。これは慣例作業なので、大概アプリ開発やってる人や会社は、Pixelシリーズを持っています。iOSもこの時期にOSアップデートがあり、アプリ開発者は新年度〜秋にかけて大忙しです。iosとandroidの両方のアプリが扱っているので結構大変ですが、一番面白い時期でもあります。

 また、秋〜春にかけては新しいOSが実装した新機能にアプリをどう対応させるのか、またその機能を実装するのか?など様々な検討が繰り広げられています。つまり、1年中あれこれやることが嫌でもあるわけです。

まずはAntutu8 でベンチマーク

Antutuの情報はたくさんあるんですが、意図的にPixel3で OS10とOS11でベンチマークした結果はほぼ無いと思うので、載せておきます。なお、Antutuは何も意識しないと常駐するのでOS初期化後に入れて計測したら速攻、消したほうがいいです。そのうち、この指標も違うものがスタンダードになると思うのですが、今は antutuスコアがピンときますよね。

約、25マン〜27マンで今ではミドルクラスの上位というスコアです。計測の誤差なのか、少しAndroid11で計測したときの方が速くなっていますね。Kernel周りの影響か、チューニングを変えて来たのかそのあたりは不明です。

計測時のKernelバージョンは以下となります。

Termux入れて、設定

termuxを入れて、アプリが良い状態で動作するよう以下の設定をやっておきます。

・Wakelockを有効にしておく。

画面右の状態にしておきます。wakelockとは何か知りたい人は以下を参照してね。Termuxは、wakelockしておくか、しないか選択できるようになっています。

デバイスの起動状態を維持する

https://developer.android.com/training/scheduling/wakelock?hl=ja

・電池の最適化をしない 設定にしておく

この表現、紛らわしいですよね! つまり、標準ではシステム関連のプリイン・アプリの一部以外、つまりストアから入れたアプリは、最適化していて電池消費を抑える仕組みです。これを意図的に、「最適化しない」状態にしておきます。

UnixBenchiを計測!

結果から。どちらも1回限りの結果ですので計測誤差の範囲かと思います。

・Pixel3 Android10の場合
 CPU:Snapdragon 845
 Hardware : Qualcomm Technologies, Inc SDM845

シングル:546.9
8CPU:1396.4

・Pixel3 Android11の場合

シングル:520.0
8CPU:1343.3

・Pixel3 Android11 再計測

シングル:590.1
8CPU:1732.6

UmidigiF2や、Redmi Note 9S より速いですね。比較のため、スコアを載せておきます。

・UmidigiF2 Android10の場合
 CPU MediaTek Helio P70
 Hardware : MT6771V/CT

シングルCPU・・・スコア406.2
8CPU・・・・・・スコア1312.3

・Redmi Note 9S Android10の場合
 CPU:Qualcomm Snapdragon 720G
 Hardware : Qualcomm Technologies, Inc SM7125

シングルCPU・・・スコア571.9
8CPU・・・・・・スコア1127.1

詳細は以下に載せておきます。インストール方法は、以下参照してね。

衝撃価格7500円でゲットしたRedmi Note 9SにLinux入れてUnixBenchを計測

・Android10の場合

$ cat /proc/cpuinfo | head
Processor	: AArch64 Processor rev 13 (aarch64)
processor	: 0
BogoMIPS	: 38.00
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer	: 0x51
CPU architecture: 8
CPU variant	: 0x7
CPU part	: 0x803
CPU revision	: 12

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: localhost: Android
   OS: Android -- 4.9.210-g28c696160049-ab6386370 -- #0 SMP PREEMPT Fri Apr 10 23:00:22 UTC 2020
   Machine: aarch64 (unknown)
   Language: en_US.utf8 (charmap=, collate=)
   13:25:54 up  1:07,  load average: 6.94, 6.06, 4.72; runlevel 

------------------------------------------------------------------------
Benchmark Run: Fri Oct 02 2020 13:25:54 - 13:54:01
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       29151129.2 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     6277.5 MWIPS (9.9 s, 7 samples)
Execl Throughput                                308.0 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        425891.2 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          167742.2 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1012005.2 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1057618.2 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  49668.9 lps   (10.0 s, 7 samples)
Process Creation                               1233.6 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   1388.6 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    478.6 lpm   (60.1 s, 2 samples)
System Call Overhead                        1024417.8 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   29151129.2   2498.0
Double-Precision Whetstone                       55.0       6277.5   1141.4
Execl Throughput                                 43.0        308.0     71.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     425891.2   1075.5
File Copy 256 bufsize 500 maxblocks            1655.0     167742.2   1013.5
File Copy 4096 bufsize 8000 maxblocks          5800.0    1012005.2   1744.8
Pipe Throughput                               12440.0    1057618.2    850.2
Pipe-based Context Switching                   4000.0      49668.9    124.2
Process Creation                                126.0       1233.6     97.9
Shell Scripts (1 concurrent)                     42.4       1388.6    327.5
Shell Scripts (8 concurrent)                      6.0        478.6    797.7
System Call Overhead                          15000.0    1024417.8    682.9
                                                                   ========
System Benchmarks Index Score                                         546.9

------------------------------------------------------------------------
Benchmark Run: Fri Oct 02 2020 13:54:01 - 14:22:44
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables       91224897.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    23800.2 MWIPS (9.6 s, 7 samples)
Execl Throughput                               1057.6 lps   (29.6 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        401385.2 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          139250.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1389559.4 KBps  (30.0 s, 2 samples)
Pipe Throughput                             3891494.8 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 249526.0 lps   (10.0 s, 7 samples)
Process Creation                              11033.1 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   4638.3 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                    475.1 lpm   (60.7 s, 2 samples)
System Call Overhead                        3275443.3 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   91224897.9   7817.0
Double-Precision Whetstone                       55.0      23800.2   4327.3
Execl Throughput                                 43.0       1057.6    246.0
File Copy 1024 bufsize 2000 maxblocks          3960.0     401385.2   1013.6
File Copy 256 bufsize 500 maxblocks            1655.0     139250.6    841.4
File Copy 4096 bufsize 8000 maxblocks          5800.0    1389559.4   2395.8
Pipe Throughput                               12440.0    3891494.8   3128.2
Pipe-based Context Switching                   4000.0     249526.0    623.8
Process Creation                                126.0      11033.1    875.6
Shell Scripts (1 concurrent)                     42.4       4638.3   1093.9
Shell Scripts (8 concurrent)                      6.0        475.1    791.9
System Call Overhead                          15000.0    3275443.3   2183.6
                                                                   ========
System Benchmarks Index Score                                        1396.4

・Android11の場合

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: localhost: Android
   OS: Android -- 4.9.223-g5bded8e40b62-ab6647920 -- #0 SMP PREEMPT Thu Jul 2 03:22:48 UTC 2020
   Machine: aarch64 (unknown)
   Language: en_US.utf8 (charmap=, collate=)
   19:02:02 up 18 min,  load average: 2.42, 2.89, 2.08; runlevel 

------------------------------------------------------------------------
Benchmark Run: Fri Oct 02 2020 19:02:02 - 19:30:09
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       27896830.6 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     6039.7 MWIPS (10.0 s, 7 samples)
Execl Throughput                                281.0 lps   (29.6 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        401241.9 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          139431.4 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1020201.2 KBps  (30.0 s, 2 samples)
Pipe Throughput                              826721.2 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  48668.2 lps   (10.0 s, 7 samples)
Process Creation                               1540.1 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   1008.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    514.6 lpm   (60.1 s, 2 samples)
System Call Overhead                        1128058.3 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   27896830.6   2390.5
Double-Precision Whetstone                       55.0       6039.7   1098.1
Execl Throughput                                 43.0        281.0     65.4
File Copy 1024 bufsize 2000 maxblocks          3960.0     401241.9   1013.2
File Copy 256 bufsize 500 maxblocks            1655.0     139431.4    842.5
File Copy 4096 bufsize 8000 maxblocks          5800.0    1020201.2   1759.0
Pipe Throughput                               12440.0     826721.2    664.6
Pipe-based Context Switching                   4000.0      48668.2    121.7
Process Creation                                126.0       1540.1    122.2
Shell Scripts (1 concurrent)                     42.4       1008.3    237.8
Shell Scripts (8 concurrent)                      6.0        514.6    857.6
System Call Overhead                          15000.0    1128058.3    752.0
                                                                   ========
System Benchmarks Index Score                                         520.0

------------------------------------------------------------------------
Benchmark Run: Fri Oct 02 2020 19:30:09 - 19:58:33
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables       95077365.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    24278.9 MWIPS (10.0 s, 7 samples)
Execl Throughput                               1177.7 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        428589.2 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          124505.1 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1293287.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                             3825103.0 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 299481.8 lps   (10.0 s, 7 samples)
Process Creation                              10720.9 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3892.1 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                    386.7 lpm   (60.7 s, 2 samples)
System Call Overhead                        2499234.1 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   95077365.5   8147.2
Double-Precision Whetstone                       55.0      24278.9   4414.3
Execl Throughput                                 43.0       1177.7    273.9
File Copy 1024 bufsize 2000 maxblocks          3960.0     428589.2   1082.3
File Copy 256 bufsize 500 maxblocks            1655.0     124505.1    752.3
File Copy 4096 bufsize 8000 maxblocks          5800.0    1293287.0   2229.8
Pipe Throughput                               12440.0    3825103.0   3074.8
Pipe-based Context Switching                   4000.0     299481.8    748.7
Process Creation                                126.0      10720.9    850.9
Shell Scripts (1 concurrent)                     42.4       3892.1    917.9
Shell Scripts (8 concurrent)                      6.0        386.7    644.6
System Call Overhead                          15000.0    2499234.1   1666.2
                                                                   ========
System Benchmarks Index Score                                        1343.3

追記:10/07

再度、ベンチマーク測っていたらもっと良いスコアが出た。気温とか関係あるのかな? 室温24度でちょっと肌寒くなってきたときに計測したもの。

・Pixel3 Android11 再計測

シングル:590.1
8CPU:1732.6

この時、CPUのクロックは以下となっていました。6881と、1766400と、2803200

# cat /sys/devices/platform/soc/soc:qcom,mincpubw/devfreq/soc:qcom,mincpubw/cur_freq
6881
# cat  /sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freq
1766400
# cat  /sys/devices/system/cpu/cpufreq/policy/cpuinfo_cur_freq
policy0/ policy4/ 
# cat  /sys/devices/system/cpu/cpufreq/policy4/cpuinfo_cur_freq
2803200

平常時には、この値は以下。762と、748800と、825600

# cat /sys/devices/platform/soc/soc:qcom,mincpubw/devfreq/soc:qcom,mincpubw/cur_freq
762
# cat  /sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freq
748800
# cat  /sys/devices/system/cpu/cpufreq/policy4/cpuinfo_cur_freq
825600

これが、良い値が出た時です。計測誤差の範囲を超えているのでメモっておきます。冷蔵庫とか冷凍庫とかに入れて計測したらもう少しよくなるのかも。

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: localhost: Android
   OS: Android -- 4.9.223-g5bded8e40b62-ab6647920 -- #0 SMP PREEMPT Thu Jul 2 03:22:48 UTC 2020
   Machine: aarch64 (unknown)
   Language: en_US.utf8 (charmap=, collate=)
   05:38:19 up 2 days, 19:49,  load average: 0.50, 0.43, 0.44; runlevel 

------------------------------------------------------------------------
Benchmark Run: Wed Oct 07 2020 05:38:19 - 06:06:26
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       29316819.1 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     6350.0 MWIPS (10.0 s, 7 samples)
Execl Throughput                                364.2 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        442024.5 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          190751.4 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1076696.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1154520.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  56229.7 lps   (10.0 s, 7 samples)
Process Creation                               1221.6 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   1494.6 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    519.6 lpm   (60.1 s, 2 samples)
System Call Overhead                        1181160.9 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   29316819.1   2512.2
Double-Precision Whetstone                       55.0       6350.0   1154.6
Execl Throughput                                 43.0        364.2     84.7
File Copy 1024 bufsize 2000 maxblocks          3960.0     442024.5   1116.2
File Copy 256 bufsize 500 maxblocks            1655.0     190751.4   1152.6
File Copy 4096 bufsize 8000 maxblocks          5800.0    1076696.0   1856.4
Pipe Throughput                               12440.0    1154520.1    928.1
Pipe-based Context Switching                   4000.0      56229.7    140.6
Process Creation                                126.0       1221.6     97.0
Shell Scripts (1 concurrent)                     42.4       1494.6    352.5
Shell Scripts (8 concurrent)                      6.0        519.6    866.0
System Call Overhead                          15000.0    1181160.9    787.4
                                                                   ========
System Benchmarks Index Score                                         590.1

------------------------------------------------------------------------
Benchmark Run: Wed Oct 07 2020 06:06:26 - 06:34:46
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables      117327891.2 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    31178.6 MWIPS (10.1 s, 7 samples)
Execl Throughput                               1466.5 lps   (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        667533.5 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          204691.5 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1852436.2 KBps  (30.0 s, 2 samples)
Pipe Throughput                             5170382.3 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 181908.1 lps   (10.0 s, 7 samples)
Process Creation                              12532.5 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   5742.0 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                    734.3 lpm   (60.2 s, 2 samples)
System Call Overhead                        2722146.3 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  117327891.2  10053.8
Double-Precision Whetstone                       55.0      31178.6   5668.8
Execl Throughput                                 43.0       1466.5    341.0
File Copy 1024 bufsize 2000 maxblocks          3960.0     667533.5   1685.7
File Copy 256 bufsize 500 maxblocks            1655.0     204691.5   1236.8
File Copy 4096 bufsize 8000 maxblocks          5800.0    1852436.2   3193.9
Pipe Throughput                               12440.0    5170382.3   4156.3
Pipe-based Context Switching                   4000.0     181908.1    454.8
Process Creation                                126.0      12532.5    994.6
Shell Scripts (1 concurrent)                     42.4       5742.0   1354.2
Shell Scripts (8 concurrent)                      6.0        734.3   1223.8
System Call Overhead                          15000.0    2722146.3   1814.8
                                                                   ========
System Benchmarks Index Score                                        1732.6

まとめ

まとめるほどの記事ではないですが、要点を書いておきます。

・Pixel3は、シングル約550、マルチ8coreで1400くらいのUnixBenchスコア
・手持ちのスマホの中では一番速い
・antutuは、27マンくらいだが、GPUは使わないのでTermuxではもったいない
・今後、root化してtermuxで遊んでみようと思う
・再計測したら、1700超えていた。温度が関係しているくさい。

あとがき

あともう少しで、1400に届きそうでしたが2年前のハイエンドクラスなので検討していますよね。UnixBenchの結果にはグラフィックス性能が含まれないので、UmidigiF2や、Redmi Note 9S と比べてもさほど変わらない感じですね。

 安くて、CPU性能が高いのはいろいろ検討した結果、MediaTek Dimensity 1000+ がいいんじゃないかなーと。このチップは、vivo iqoo z1とかに乗っていて antutuは、CPUで18万、トータルで50万を超えています。

 これ、Termux上のUnixBenchだと2500は超えてきそうですよね!いつか、入手して確認してみたいなと思います。中古ではあまり出回っていないので、画面割れとかジャンクが出るまでは無理ですが。アリエクから新品で買っても3.4万くらいなんでさほど高くはないです。しかし遊びどきは、5Gが普及するあと1、2年後〜が中古市場に出回る時期かなと思います。

別の見方をすれば、あと1、2年すればUnixBench2000〜3000で動作するスマホが、5000円とか1万未満の中古で買えちゃうってことです!

 ARMチップが乗ったスマホの活用の夢が膨らみます!

あと、画面割れのPixel3ですがもし画面を修理するならアリエクで9500円くらいで部品は入りそうです。まぁ、しかしそれほどひどい割れでもないですから、このまま使うかなと。なんか、直したら負けな気がします。w

Pixel3・android11(R)正式リリース版でroot化!

じゃんくはっく
じゃんくはっく

Pixel3をAndroid11でroot化したよ!

どんなメリットがあるの?

ぴー
ぴー
じゃんくはっく
じゃんくはっく

それは色々ありすぎて、目的によるね!

そんなマニアックなネタ、需要あるの?

ぴー
ぴー

はいー! ぴーちゃんの言う通り、マニアックネタになります。しかし、root化によるメリットは結構あります。もちろんデメリットもありますが、実際にいろいろ触って体験してみましょう。あと自己責任でよろしくね!真似して何か不利益が起きても著者は知りませんよ。

そもそも、root化ってなに?

このブログの趣旨としては、なるべく専用用語を使わずわかりやすく一般の人にも理解してもらいたい・そー著者は思っております。

すべて使わないのは無理があるわね!

ぴー
ぴー

root化 (Android OS)
出典: フリー百科事典『ウィキペディア(Wikipedia)』

https://ja.wikipedia.org/wiki/Root%E5%8C%96_(Android_OS)

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
::
“blueline” for Pixel 3
::
11.0.0 (RP1A.200720.009, Sep 2020)

https://developers.google.com/android/images

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
 ※ Magisk Manager Canary から、APKをDLして入れておく

https://github.com/topjohnwu/Magisk

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デーモン。これすごく使いやすそうです。

著者にメッセージ

コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

    入力内容をご確認ください

    お問い合わせ頂きありがとうございます



      

    まだ広告で消費してるの? 知らないと損!! NextDNSを今すぐ設定して楽になろう!

    じゃんくはっく
    じゃんくはっく

    今日はあまりマニアックなネタじゃないので、皆が有益になれると思うよ!

    ちょっとタイトル煽ってますね?w

    ぴー
    ぴー
    じゃんくはっく
    じゃんくはっく

    そう?w 今回のネタは、広告を消す方法です! これだったらみんなメリットあるよね!

    でも、簡単じゃないとだめですよ!

    ぴー
    ぴー

    さて、今日のネタは「広告を消す!」です。しかも設定は簡単で、androidもiosもPC(mac・windows・Linuxも)でもぜーんぶ、簡単に設定できます。ぴーちゃんのご要望通り、設定は簡単なんで記事自体もすぐ終わっちゃいそうですが・・・

    さっそく設定!

    NextDNS

    https://nextdns.io

    まず、ここにアクセスして設定をゲットしましょう。以下のように説明が出ますのでその通りにするだけです。例えばandroidの場合は以下です。

    ****.dns.nextdns.io をコピペします。そして、説明の通りスマホの設定からプライベートDNSをコピペして保存するだけOKです。

    実際に広告が消えたか確認してみましょう。あと、NextDNSはアカウント作っておいたほうがいいです。以下、確認できて気に入ったら登録して使ってみましょうね!

    広告が消える!!!

    さて、今回は説明するために、まださっきの「保存」ボタンは押していません。この状態で、例えば smartnewsのアプリを開きます。ブラウザでどこか広告が表示されるページを開いてもいいのですが、アプリ上の広告も消えますのでその一例です。

    ご覧のように中央にがっつりと、広告が表示されていますよね。smartnewsは好きなんすが、この広告が非常にうっとうしい!んですよね。これは見るべき情報なのか、広告なのかいちいち判断しないといけません。

     で、さきほどの保存(設定)ボタンを押して、NextDNSの設定をイキにさせます。SmartNewsは、↓下に引っ張り情報をリロードします。キャッシュが効いてうまく情報が更新されない場合は、一度アプリをタスクから終了して起動しなおしてみてください。

    なんということでしょう! 中央にデカデカと表示されていた広告はもうありません。それに、どのタブに行っても、もう紛らわしい広告が表示されていません!

    仕組みの概略

    広告を表示するためには、そのURLにアクセスする必要があります。URLにアクセスするためには、そのURLに含まれるドメイン名をIPに変換する必要があります。それを解決するのは通常、DNSのポート53応答によって行われます。プライベートDNSは、DNS問い合わせをどこか違うポートで暗号化通信しているようです。そしてNextDNSに名前解決を問い合わせ、広告関連のURLは全部、名前解決されなずブロックされる・したがって広告は表示できない・という事が原理の概要です。

     つまり、この仕組みなのでブラウザ上でもアプリ上でも広告が消えるというわけです。

    スマホ上でDNSのパケット採取

    上記の推論の一部を実際に確認してみたいと思います。まず、さきほど設定したプレイベートDNSの設定をOffにします。そして、スマホ側でDNS関連のポート53応答をキャプチャー(tcpdump)します。そして、smartnewsを起動してみます。

    $ sudo tcpdump -i wlan0 -nn port 53
    ::
    09:48:34.548342 IP 192.168.1.47.59746 > 192.168.1.1.53: 8385+ A? conf.smartnews-ads.com. (40)
    09:48:34.766102 IP 192.168.1.1.53 > 192.168.1.47.59746: 8385 3/0/0 CNAME conf.smartnews-ads.com.edgekey.net., CNAME e802.g.akamaiedge.net., A 23.41.23.121 (136)
    09:48:35.137376 IP 192.168.1.47.58770 > 192.168.1.1.53: 34097+ AAAA? web.facebook.com. (34)
    09:48:35.166724 IP 192.168.1.1.53 > 192.168.1.47.58770: 34097 3/0/0 CNAME star.facebook.com., CNAME star.c10r.facebook.com., AAAA 2a03:2880:f00f:1:face:b00c:0:1 (105)
    09:48:35.167288 IP 192.168.1.47.50930 > 192.168.1.1.53: 56757+ A? web.facebook.com. (34)
    09:48:35.370994 IP 192.168.1.1.53 > 192.168.1.47.50930: 56757 3/0/0 CNAME star.facebook.com., CNAME star.c10r.facebook.com., A 31.13.82.1 (93)
    09:48:36.332043 IP 192.168.1.47.53699 > 192.168.1.1.53: 35334+ A? www.smartnews.com. (35)
    09:48:36.342106 IP 192.168.1.47.59887 > 192.168.1.1.53: 26778+ A? thumbnail.smartnews-ads.com. (45)
    09:48:36.426088 IP 192.168.1.47.2835 > 192.168.1.1.53: 19416+ AAAA? mp.smartnews.com. (34)
    09:48:36.573501 IP 192.168.1.1.53 > 192.168.1.47.53699: 35334 3/0/0 CNAME any.smartnews.com.edgekey.net., CNAME e1393.d.akamaiedge.net., A 23.41.23.236 (127)
    09:48:36.738275 IP 192.168.1.1.53 > 192.168.1.47.59887: 26778 3/0/0 CNAME any.smartnews-ads.com.edgekey.net., CNAME e802.g.akamaiedge.net., A 23.41.23.121 (140)
    09:48:36.758832 IP 192.168.1.1.53 > 192.168.1.47.2835: 19416 4/0/0 CNAME any-dual.smartnews.com.edgekey.net., CNAME e1393.dscksd.akamaiedge.net., AAAA 2600:140b:4800:394::571, AAAA 2600:140b:4800:3a2::571 (176)
    09:48:36.759283 IP 192.168.1.47.20694 > 192.168.1.1.53: 5578+ A? mp.smartnews.com. (34)
    09:48:36.928482 IP 192.168.1.47.7412 > 192.168.1.1.53: 31103+ A? imasdk.googleapis.com. (39)
    09:48:36.970033 IP 192.168.1.1.53 > 192.168.1.47.20694: 5578 3/0/0 CNAME any-dual.smartnews.com.edgekey.net., CNAME e1393.dscksd.akamaiedge.net., A 23.47.133.205 (136)
    09:48:37.190502 IP 192.168.1.1.53 > 192.168.1.47.7412: 31103 1/0/0 A 172.217.161.234 (55)
    09:48:37.703602 IP 192.168.1.47.64201 > 192.168.1.1.53: 65301+ AAAA? www.googleapis.com. (36)
    09:48:37.722921 IP 192.168.1.1.53 > 192.168.1.47.64201: 65301 4/0/0 AAAA 2404:6800:400a:809::200a, AAAA 2404:6800:400a:80c::200a, AAAA 2404:6800:400a:80b::200a, AAAA 2404:6800:400a:808::200a (148)
    09:48:37.744633 IP 192.168.1.47.61439 > 192.168.1.1.53: 61508+ AAAA? r4---sn-3pm7sn7k.googlevideo.com. (50)
    09:48:37.764935 IP 192.168.1.1.53 > 192.168.1.47.61439: 61508 2/0/0 CNAME r4.sn-3pm7sn7k.googlevideo.com., AAAA 2404:6800:400e:4::a (107)
    09:48:37.765776 IP 192.168.1.47.51232 > 192.168.1.1.53: 57935+ A? r4---sn-3pm7sn7k.googlevideo.com. (50)
    09:48:37.980047 IP 192.168.1.1.53 > 192.168.1.47.51232: 57935 2/0/0 CNAME r4.sn-3pm7sn7k.googlevideo.com., A 74.125.171.106 (95)
    09:48:39.222221 IP 192.168.1.47.52047 > 192.168.1.1.53: 31868+ AAAA? r5---sn-3pm7dn7r.googlevideo.com. (50)
    09:48:39.247036 IP 192.168.1.1.53 > 192.168.1.47.52047: 31868 2/0/0 CNAME r5.sn-3pm7dn7r.googlevideo.com., AAAA 2404:6800:400a:19::a (107)
    09:48:39.247652 IP 192.168.1.47.24883 > 192.168.1.1.53: 34181+ A? r5---sn-3pm7dn7r.googlevideo.com. (50)
    09:48:39.443678 IP 192.168.1.1.53 > 192.168.1.47.24883: 34181 2/0/0 CNAME r5.sn-3pm7dn7r.googlevideo.com., A 74.125.102.202 (95)
    09:48:40.359428 IP 192.168.1.47.34298 > 192.168.1.1.53: 12112+ AAAA? play.googleapis.com. (37)
    09:48:40.383957 IP 192.168.1.1.53 > 192.168.1.47.34298: 12112 1/0/0 AAAA 2404:6800:400a:806::200a (65)
    09:48:40.384632 IP 192.168.1.47.27441 > 192.168.1.1.53: 62063+ A? play.googleapis.com. (37)
    09:48:40.607511 IP 192.168.1.1.53 > 192.168.1.47.27441: 62063 1/0/0 A 172.217.161.202 (53)
    09:48:45.191301 IP 192.168.1.47.38030 > 192.168.1.1.53: 9923+ A? pagead2.googleadservices.com. (46)
    09:48:45.191846 IP 192.168.1.47.45560 > 192.168.1.1.53: 4539+ A? googleads.g.doubleclick.net. (45)
    09:48:45.489110 IP 192.168.1.1.53 > 192.168.1.47.38030: 9923 2/0/0 CNAME pagead.l.doubleclick.net., A 172.217.161.194 (100)
    09:48:45.589661 IP 192.168.1.1.53 > 192.168.1.47.45560: 4539 2/0/0 CNAME pagead46.l.doubleclick.net., A 172.217.26.98 (86)

    192.168.1.1は、ルータアドレス、192.168.1.47はスマホです。

    スマートニュース側には広告が表示されています。どれが広告関連の問い合わせかは不明です しかし、ここではそれはあまり重要ではありません。そこを追うのはやめて、次にプレイベートDNSを設定し、同じようにポート53をキャプチャーしてみます。

    $ sudo tcpdump -i wlan0 -nn port 53
    ::
    パケットが流れません!

    はい、このようにプライベートDNSを設定しているとDNS問い合わせであるポート53応答には何もキャプチャーされません。しかし、実際には広告がない状態で表示されています。つまり、名前解決の問い合わせはどこか違う経路でやっていることになります。ちょっと専門的になりますが以下にその説明があります。

    DNS暗号化について

    https://blog.cloudflare.com/jp/dns-encryption-explained-jp/

    どうやら、DoT(tcp/853)とDoH(tcp/443)かのどちらかのようですね。

     どこがブロックされたのかは、NextDNSのログに載っています。他にも面白い機能がありますので、いつか紹介してみたいと思います。

    まとめ

    今回、なんとなくわかったのは以下となります。

    ・NextDNSは、ちゃんと広告が消える!
    ・仕組みは、DNSの問い合わせを検閲し、ブロックしてくれるようだ
    ・プレイベートDNSは、ポート53ではなく違うポートで通信しているようだ(暗号化については未確認)
    ・DNS over TLS(DoT)または、DNS over HTTPS(DoH)と略されるようだ
    ・ポートはそれぞれ、DoT(tcp/853)とDoH(tcp/443)が使われるようだ
    ・プラットフォームに依存しないので、NextDNSは神アプリ(サービス)だと思う
    ・パケット(今だとギガと表現ですかねw)の消費も節約できる

    あとがき

    ちょっとブラウジングすると、すぐ広告にぶち当たりますよね。でもNextDNSがあれば、かなりこの消耗が少なくなります。今の所、知ってる人だけ使っている機能で、広告業界はこれに対抗する術がまったくありません。今後、どうなるのでしょうかね。

    著者にメッセージ

    記事の間違いや指摘事項など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

      入力内容をご確認ください

      お問い合わせ頂きありがとうございます



        

      TermuxスマホのCPU温度をThingSpeakでリアルタイム・グラフにしてみた!

      じゃんくはっく
      じゃんくはっく

      Root化したPixel3のTermuxで遊んでるんだけど、CPUとかバッテリー温度とか取得できることがわかったよ!

      サーバにするんだったら、温度は見ておきたいですからね!

      ぴー
      ぴー
      じゃんくはっく
      じゃんくはっく

      UnixBenchでCPU温度がどのくらいまで上がるか見ておきたかったんです。

      ねぇ、ThingSpeakってなんなの?

      ぴー
      ぴー

      先日、メルカリでゲットしたPixel3をroot化して遊んでいます。そのうち、今動いているこのブログのサーバマシンとして、UmidigiF2から一旦置き換えてみようと思っています。UmidigiF2も、root化して遊んでみたいなと思っています。

       さて、今回はスマホの中にある温度センサーから取得してグラフ描画にチャレンジしてみます。

      ThingSpeakとは

      ThingSpeak Documentation – MathWorks 日本
      ::
      ThingSpeak は Internet of Things (IoT) プラットフォームであり、クラウドでセンサーのデータを収集および保存したり、IoT アプリケーションを開発したりできます。

      https://jp.mathworks.com/help/thingspeak/index.html

      ThigSpeakは、結構昔からあってIoT機器からデータを投げつける定番のWEBサービスです。4、5年くらい前にも一度さわっていたりします。

      Soracom で IoT はじめました

      https://junkhack.gpl.jp/2016/05/29/iot1/

      もう、Soracomはやめてしまいましたがこの時はOrange PI にUSBデータ通信ドングルをつけてsoracomから、CPU温度をThigSpeakに送信してグラフ化していました。

      Pixel3で温度はどうやって取得する?

      root化したので、いろんな情報が見れます。通常のLinuxとは少し違うので、あれこれ物色していたのですが Android である Pixel3 は、Termux の root シェルから以下のように android のコマンドを使って取得できることがわかりました。例えば、バッテリーの情報は以下のように取得できます。

      # dumpsys battery
      Current Battery Service state:
        AC powered: true
        USB powered: false
        Wireless powered: false
        Max charging current: 750000
        Max charging voltage: 5000000
        Charge counter: 2569000
        status: 5
        health: 2
        present: true
        level: 100
        scale: 100
        voltage: 4355
        temperature: 270
        technology: Li-ion

      temperatureというが、バッテリー自体の温度のようです。他にも現在、AC電源から給電しているとか、状態(health)とかわかるようです。シェルからだと以下に温度が吐かれていることがわかりました。

      # cat /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/battery/temp
      295
      # cat /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/usb/temp
      284
      # cat /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qpnp,fg/power_supply/bms/temp
      295
      # cat /sys/devices/virtual/thermal/thermal_zone1/temp
      34900

      一番最後のが、CPUの温度のようです。本当にCPU温度なのか、UnixBenchを動かしながら温度が上がるのか確認してみたいと思います。

      Pythonスクリプトを用意

      以前、OrengePiのときに動かした Pythonスクリプトがありますのでそれを使ってみました。あの時は、Python version2で書いていたのですが、今は Python Version3系列がメインです。2to3というツールがPython3入れるとあるので、それで変換します。

      2to3 – Python 2 から 3 への自動コード変換

      https://docs.python.org/ja/3/library/2to3.html

      変換は、-w オプションをつけるとオリジナルとバックアップが作られます。

      $ 2to3 -w temp.py 
      RefactoringTool: Skipping optional fixer: buffer
      RefactoringTool: Skipping optional fixer: idioms
      RefactoringTool: Skipping optional fixer: set_literal
      RefactoringTool: Skipping optional fixer: ws_comma
      RefactoringTool: Refactored temp.py
      --- temp.py	(original)
      +++ temp.py	(refactored)
      @@ -13,9 +13,9 @@
           temp = float(t) / 1000
           payload = {'api_key': api_key, 'field1': float(temp)}
           f.close()
      -    print "CPU Temp is:%s"%temp ,
      +    print("CPU Temp is:%s"%temp, end=' ')
           r = requests.get('http://api.thingspeak.com/update', params=payload)
      -    print "Result: ", r.text
      +    print("Result: ", r.text)
           time.sleep(1.0)
       
       def main():
      RefactoringTool: Files that were modified:
      RefactoringTool: temp.py
      $ ls -l
      total 8
      -rw------- 1 u0_a218 u0_a218 573 Oct  8 06:53 temp.py
      -rw------- 1 u0_a218 u0_a218 564 Oct  8 06:52 temp.py.bak

      変換したスクリプト全体は以下となります。api_keyには、書き込み用のKeyを入れておいてください。

      #!/data/data/com.termux/files/usr/bin/python3
      # coding: utf-8
      
      import requests
      import time
      api_key='thingspeak Write API Key'
      
      def sender():
        while True:
          f = open("/sys/class/thermal/thermal_zone0/temp","r")
          t = f.read()
          temp = float(t) / 1000
          payload = {'api_key': api_key, 'field1': float(temp)}
          f.close()
          print("CPU Temp is:%s"%temp, end=' ')
          r = requests.get('http://api.thingspeak.com/update', params=payload)
          print("Result: ", r.text)
          time.sleep(1.0)
      
      def main():
          sender()
      
      if __name__ == '__main__':
        main()

      動かして見ると以下のようになります。

      $ sudo python ./temp.py
      CPU Temp is:43.1 Result:  236518
      CPU Temp is:31.3 Result:  0
      CPU Temp is:31.3 Result:  0
      CPU Temp is:31.3 Result:  0
      CPU Temp is:31.3 Result:  0
      ::

      cronで定期実行

      Termuxにcronはデフォルトでは入っていませんので、入れて起動しておきます。

      $ pkg install cronie -y
      $ crond

      動いているか確認しておきます。

      $ pgrep crond
      23817
      $ ps 23817
        PID TTY      STAT   TIME COMMAND
      23817 ?        S<s    0:00 crond

      では、ループ部分を削除して、cronに登録しておきましょう。2分に1回くらいにしておきます。

      # CPU Temp to ThingSpeak
      # https://thingspeak.com/channels/123997
      */2 * * * * sudo /data/data/com.termux/files/usr/bin/python3 /data/data/com.termux/files/home/.suroot/temp.py

      グラグを見て見る!

      無事にデータが投げられていれば、グラフが描画されていると思います。ThingSpeakのグラフを見て見ましょう。

      まだ登録したばかりなので、グラフの描画は中途半端ですが、大丈夫なようです。以前に、1分ごとに計測してUnixBenchを動作させたときのグラフは以下のようになりました。70度くらいまで上がっていますね。

      それから、root化したのでhtopが正常に8CPU見れています。ベンチ中はフル回転ですね!

      あと、UnixBenchを全開で動作させていたときの消費電力(USB-AC充電)は以下のようでした。

      4.2w〜6.8wくらいです。5wとして計算してみると24時間動かして1ヶ月の電気代は、約97円でした。とても低消費で高パフォーマンスです!

      UnixBenchは、気温が低い時に計測したらなんと、1700を超えていました!

      ・Pixel3 Android11 再計測

      シングル:590.1
      8CPU:1732.6

      まとめ

      今回、なんとなくわかったのは以下となります。

      ・Androidシステムでは、dumpsysコマンドで各種情報がとれる
      ・各種温度は機種によって吐き出される場所が違うようだ
      ・/sys/配下に吐かれる電源関連のbattery、usb、bmsの温度はモニターしておいたほうがいいかも。常時充電しているから
      ・ThingSpeakのグラフは、あまり綺麗じゃないので自分自身で描画する仕組みを作りたい。
      ・MRTGや、RRDtoolなどtermuxで動作するグラフ描画ツールはないか?
      ・snmpdがtermuxで動かせればもっと楽できそうだが、まだなさそう。
      ・しかし、ここのコメントでは動かせる感じ
       https://github.com/net-snmp/net-snmp/issues/155

      あとがき

      スマホサーバ(AndroidOS+Termux)は消費電力も少なくて、お手軽で安く入手できIoTデバイスの情報を集める家庭内サーバとしても使える印象を持ちました。AndroidOS自体は、すごく安定しているので、電池駆動、SIM駆動、しかもタッチ画面付きで大きな戦力になりそうです。これから5Gの買い替え需要も発生するので、ますます安くて高性能なスマホが入手できる環境になります。無限の可能性を感じますね!

      著者にメッセージ

      コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

        入力内容をご確認ください

        お問い合わせ頂きありがとうございます



          

        スマホを冷蔵庫に入れて冷え冷え状態でベンチマークしたらどうなる?

        じゃんくはっく
        じゃんくはっく

        冷蔵庫に入れて冷やしてベンチ測ると、どうなるんだろう?

        なんかググると、スマホは冷蔵庫に入れちゃだめ!ってあるよ。

        ぴー
        ぴー
        じゃんくはっく
        じゃんくはっく

        冷蔵庫は約10度くらいなんで、寒冷地の温度とそう変わらないよね?

        まぁ、気の済むまで実験してくださいw

        ぴー
        ぴー

        以前、Pixel3のベンチマークを計り直したとき、良いスコアが出たので「温度?」が関係しているのかなと思ったんですよね。今回は、冷蔵庫にPixel3をぶっこんでUnixBenchを計測してみたいと思います。

        まず結果から

        スマホはどの程度低温に弱いのか実験!

        https://www.yamareco.com/modules/yamanote/detail.php?nid=1497

        先人がやはりいました。この方は冷凍して実験したようです。人柱ですね!なので、冷蔵庫くらいでは問題なさそうなんじゃないかと思います。

        スマホはこんな感じで冷蔵庫に入っています。猫カンがあるのは突っ込まないでね! まず、結果からご報告です。

        ・Pixel3 Android11 冷蔵庫に入れて計測

        シングル:583.3
        8CPU:1833.7

        なんと過去最高です!

        今回は、CPU温度の他、バッテリー温度もグラフ化しました。ベンチマーク中はこのように上昇しました。冷やした状態からだと、CPU温度は過去最高87度まで上昇したようですね。

         冷やせば速く動作するってことは実験からわかったので、筐体を分解してファンを取り付けて運用するのはアリかもしれません。

        詳細ベンチを・・

        詳細についてはこちらに貼り付けておきます。

        ========================================================================
           BYTE UNIX Benchmarks (Version 5.1.3)
        
           System: localhost: Android
           OS: Android -- 4.9.223-g5bded8e40b62-ab6647920 -- #0 SMP PREEMPT Thu Jul 2 03:22:48 UTC 2020
           Machine: aarch64 (unknown)
           Language: en_US.utf8 (charmap=, collate=)
           13:07:43 up 4 days,  3:18,  load average: 0.22, 0.20, 0.18; runlevel 
        
        ------------------------------------------------------------------------
        Benchmark Run: Thu Oct 08 2020 13:07:43 - 13:35:50
        8 CPUs in system; running 1 parallel copy of tests
        
        Dhrystone 2 using register variables       29344957.6 lps   (10.0 s, 7 samples)
        Double-Precision Whetstone                     6364.3 MWIPS (10.0 s, 7 samples)
        Execl Throughput                                353.6 lps   (29.9 s, 2 samples)
        File Copy 1024 bufsize 2000 maxblocks        448563.7 KBps  (30.0 s, 2 samples)
        File Copy 256 bufsize 500 maxblocks          177698.8 KBps  (30.0 s, 2 samples)
        File Copy 4096 bufsize 8000 maxblocks       1080251.9 KBps  (30.0 s, 2 samples)
        Pipe Throughput                             1151314.0 lps   (10.0 s, 7 samples)
        Pipe-based Context Switching                  53273.4 lps   (10.0 s, 7 samples)
        Process Creation                               1031.2 lps   (30.0 s, 2 samples)
        Shell Scripts (1 concurrent)                   1522.3 lpm   (60.0 s, 2 samples)
        Shell Scripts (8 concurrent)                    599.3 lpm   (60.1 s, 2 samples)
        System Call Overhead                        1186164.4 lps   (10.0 s, 7 samples)
        
        System Benchmarks Index Values               BASELINE       RESULT    INDEX
        Dhrystone 2 using register variables         116700.0   29344957.6   2514.6
        Double-Precision Whetstone                       55.0       6364.3   1157.1
        Execl Throughput                                 43.0        353.6     82.2
        File Copy 1024 bufsize 2000 maxblocks          3960.0     448563.7   1132.7
        File Copy 256 bufsize 500 maxblocks            1655.0     177698.8   1073.7
        File Copy 4096 bufsize 8000 maxblocks          5800.0    1080251.9   1862.5
        Pipe Throughput                               12440.0    1151314.0    925.5
        Pipe-based Context Switching                   4000.0      53273.4    133.2
        Process Creation                                126.0       1031.2     81.8
        Shell Scripts (1 concurrent)                     42.4       1522.3    359.0
        Shell Scripts (8 concurrent)                      6.0        599.3    998.9
        System Call Overhead                          15000.0    1186164.4    790.8
                                                                           ========
        System Benchmarks Index Score                                         583.3
        
        ------------------------------------------------------------------------
        Benchmark Run: Thu Oct 08 2020 13:35:50 - 14:04:03
        8 CPUs in system; running 8 parallel copies of tests
        
        Dhrystone 2 using register variables      133676583.1 lps   (10.0 s, 7 samples)
        Double-Precision Whetstone                    32433.5 MWIPS (10.2 s, 7 samples)
        Execl Throughput                               1466.7 lps   (29.6 s, 2 samples)
        File Copy 1024 bufsize 2000 maxblocks        672443.5 KBps  (30.0 s, 2 samples)
        File Copy 256 bufsize 500 maxblocks          202034.3 KBps  (30.0 s, 2 samples)
        File Copy 4096 bufsize 8000 maxblocks       1920062.6 KBps  (30.0 s, 2 samples)
        Pipe Throughput                             4980247.5 lps   (10.0 s, 7 samples)
        Pipe-based Context Switching                 324913.7 lps   (10.0 s, 7 samples)
        Process Creation                              12358.3 lps   (30.0 s, 2 samples)
        Shell Scripts (1 concurrent)                   5728.2 lpm   (60.1 s, 2 samples)
        Shell Scripts (8 concurrent)                    698.4 lpm   (60.4 s, 2 samples)
        System Call Overhead                        2734159.8 lps   (10.0 s, 7 samples)
        
        System Benchmarks Index Values               BASELINE       RESULT    INDEX
        Dhrystone 2 using register variables         116700.0  133676583.1  11454.7
        Double-Precision Whetstone                       55.0      32433.5   5897.0
        Execl Throughput                                 43.0       1466.7    341.1
        File Copy 1024 bufsize 2000 maxblocks          3960.0     672443.5   1698.1
        File Copy 256 bufsize 500 maxblocks            1655.0     202034.3   1220.8
        File Copy 4096 bufsize 8000 maxblocks          5800.0    1920062.6   3310.5
        Pipe Throughput                               12440.0    4980247.5   4003.4
        Pipe-based Context Switching                   4000.0     324913.7    812.3
        Process Creation                                126.0      12358.3    980.8
        Shell Scripts (1 concurrent)                     42.4       5728.2   1351.0
        Shell Scripts (8 concurrent)                      6.0        698.4   1164.1
        System Call Overhead                          15000.0    2734159.8   1822.8
                                                                           ========
        System Benchmarks Index Score                                        1833.7

        ソースコード

        計測に使ったソースです。

        #!/data/data/com.termux/files/usr/bin/python3
        # coding: utf-8
        
        import requests
        import time
        api_key='Write API Key'
        
        def sender():
            # CPU Temp
            f = open("/sys/class/thermal/thermal_zone0/temp","r")
            t = f.read()
            f.close()
            cpu_temp = float(t) / 1000
            # Battery Temp
            f = open("/sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/battery/temp","r")
            t2 = f.read()
            f.close()
            battery_temp = float(t2) / 10
            # USB Temp
            f = open("/sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/usb/temp","r")
            t3 = f.read()
            f.close()
            usb_temp = float(t3) / 10
            # BMS Temp
            f = open("/sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qpnp,fg/power_supply/bms/temp","r")
            t4 = f.read()
            f.close()
            bms_temp = float(t4) / 10
        
            payload = {'api_key': api_key, 'field1': float(cpu_temp), 'field2': float(battery_temp), 'field3': float(usb_temp), 'field4': float(bms_temp)}
            print("CPU Temp is:%s"%cpu_temp, end=' ')
            print("Battery_temp Temp is:%s"%battery_temp, end=' ')
            print("USB_temp Temp is:%s"%usb_temp, end=' ')
            print("BMS_temp Temp is:%s"%bms_temp, end=' ')
            r = requests.get('http://api.thingspeak.com/update', params=payload)
            print("Result: ", r.text)
            time.sleep(1.0)
        
        def main():
            sender()
        
        if __name__ == '__main__':
          main()

        まとめ

        今回、なんとなくわかったのは以下となります。

        ・冷蔵庫に入れれば冷えてベンチマークは良い結果となる。
        ・UnixBenchは過去最高、マルチで1800を超えた!
        ・バッテリー温度は、13.5度くらいまで下がった
        ・ベンチ中はCPU温度は87度まで上昇した!
        ・今の所、壊れていない。壊れてもいい人以外、真似しないように。
        ・スマホサーバとするなら、分解してヒートシンク+ファンをつけるのが良さそう。

        あとがき

        WiFiアクセスポイントを冷蔵庫付近まで持ってきて電波強度を最強にして夏場は過ごすのもありかもしれません。まぁ、もう暑い季節はすぎてしまったのでやるなら来年、2021年度の夏ですかね!

         あと、root化していると、オーバークロックもできるようですがまだ試していません。

        著者にメッセージ

        コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

          入力内容をご確認ください

          お問い合わせ頂きありがとうございます



            

          D.J.BツールのdaemontoolsをTermuxで動かしてみたよ!

          じゃんくはっく
          じゃんくはっく

          ぴーちゃん、DJBのdaemontoolsって知ってる?

          ・・・まったく知りません!

          ぴー
          ぴー
          じゃんくはっく
          じゃんくはっく

          デーモンを起動管理させるツールなんだけど、これがTermuxで動かせないかな?ってチャレンジしてみたよ。

          またマニアックなネタですね!w

          ぴー
          ぴー

          はいな! またマニアックネタかもしれませんので需要はあまり無いかもしれませんね。w

          daemontoolsとは?

           このツールは、DJBことダニエル・ジュリアス・バーンスタインさん(WIKI参照)が作ったツール群です。DJBさんは、qmailやdjbdnsというメールやDNSも作っています。daemontoolsは、全部で17個の単体プログラムで作られている常駐するプログラムを起動管理するものです。

           DJBツールは、設定や取り扱いがよくわからんという人もいて好き嫌いの別れるツールです。しかし、驚異的にバグが少なく非常に興味深い作りになっています。

          その昔、sendmailやbindに嫌気がさしてqmailやdjbdnsを使っていた時期があったのですが、rpmやdebパッケージなどがないので設定はそれなりにしないと動きません。作者がバイナリ配布を認めていないんです。その為、RedHatはqmailのサポートを明示的に切り捨てています。ちなみに、無償で登録できるRedHatの開発者アカウントがあれば、ナレッジも読めますよ。

          Red Hat は、Red Hat Enterprise Linux で qmail SMTP サーバーの使用をサポートしていますか?

          https://access.redhat.com/ja/articles/2540051

          そんな感じでDJB作のソフトウェアを10年ぶりくらいに使ってみました。あまりに久しぶりすぎて、だいぶ使い方とか忘れていましたがなんとか動いているように見えますのでちょっとメモしておきます。

          daemontoolsの概略

          daemontools とは、デーモンを監視するツールのことで、qmail の作者 D.J.B. によるツールの事。メリットは、daemontools によって監視させておけば、 自動的に再起動してくれます。注意事項は以下。

          • バックグラウンドになるデーモンは管理できない。
          • この為、run から動作させるプロセスは、 & を付けてバックグラウンドにしないこと。

          詳細は、オフィシャルサイトを参照。https://cr.yp.to/daemontools.html

          今回は、Androidで動作するTermuxでdaemontoolsを動作させるように修正をしました。

          インストール

          daemontoolsは、展開したソースディレクトリにコマンドがシンボリック・リンクされます。

          このインストール例では、ホームディレクトリに bin を作成し、そこに展開してインストールします。

          $ mkdir bin
          $ cd bin
          
          $ git clone https://github.com/take-i/termux-daemontools.git
          $ cd termux-daemontools/admin/daemontools-0.76/
          $ package/install

          インストールは以上で終了です! ビルドツールが入れてなくてmakeできない場合は、このように入れておいてください。

          $ pkg install autoconf automake bison bzip2 \
                        clang cmake coreutils diffutils \
                        flex gawk git grep gzip libtool \
                        make patch perl sed silversearcher-ag \
                        tar termux-exec wget -y

          コマンドはどこにあるの?

          コマンドは、termux配下の $PREFIX/bin ディレクトリ以下にありますが、これはシンボリック・リンクです。

          $ which svscan
          /data/data/com.termux/files/usr/bin/svscan

          また、このシンボリック・リンク先は、$PREFIX/command/ になります。

          $ ls -l /data/data/com.termux/files/usr/bin/svscan
          lrwxrwxrwx 1 u0_a257 u0_a257 46 Oct 21 15:10 /data/data/com.termux/files/usr/bin/svscan -> /data/data/com.termux/files/usr/command/svscan

          つまり、コマンドの本体はビルドしたディレクトリ以下にあります。ビルドしたディレクトリを削除するときは注意しましょう。

          $ tree $PREFIX/command/
          ├── envdir -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/envdir
          ├── envuidgid -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/envuidgid
          ├── fghack -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/fghack
          ├── multilog -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/multilog
          ├── pgrphack -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/pgrphack
          ├── readproctitle -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/readproctitle
          ├── setlock -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/setlock
          ├── setuidgid -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/setuidgid
          ├── softlimit -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/softlimit
          ├── supervise -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/supervise
          ├── svc -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svc
          ├── svok -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svok
          ├── svscan -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svscan
          ├── svscanboot -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svscanboot
          ├── svstat -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/svstat
          ├── tai64n -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/tai64n
          └── tai64nlocal -> /data/data/com.termux/files/home/bin/termux-daemontools/admin/daemontools/command/tai64nlocal

          daemontoolsの起動

          必須ではありませんが、明示的にPATHを記載したい場合は以下のように追記しておきます。

          ~/.bashrc

          ::
          #djb tool daemontools
          export PATH=$PATH:$PREFIX/command

          リモートシェルから、Daemontools の起動は、スマートフォンのroot化を行なっている場合は root で起動できます。その場合は、

          $ nohup sudo svscan $PREFIX/service/ &

          一般ユーザーで起動する場合は、

          $ nohup svscan $PREFIX/service/ &

          どちらかの方法で起動してください。なお、Termux:Boot の有償アプリを入れている場合は、~/.termux/boot/ 以下に以下のような起動スクリプトを記載しておくとスマホを再起動してホーム画面まで行った時に自動的に起動します。

          #!/data/data/com.termux/files/usr/bin/sh
          
          export PATH=$PATH:$HOME/bin
          export PATH=$PATH:$PREFIX/command
          export PREFIX=/data/data/com.termux/files/usr
          
          sudo svscan $PREFIX/service/ &

          設定のサンプル

          例えば、crondをdaemontoolsで起動させるサンプルです。ホームディレクトリにbootディレクトリを作成して後から $PREFIX/service/ にシンボリック・リンクを張って起動させます。以下の例では、実態のディレクトリは$HOME/boot/ですが、どこでもOKです。$PREFIX/var/boot/ とか好きなところにディレクトリを作成してください。

          $ cd
          $ mkdir -p boot/crond
          $ cd boot/crond
          
          $ vi run
          #!/bin/sh
          
          export PATH=$PATH:$HOME/bin
          export PATH=$PATH:$PREFIX/command
          export PREFIX=/data/data/com.termux/files/usr
          
          exec 2>&1
          exec > /dev/null
          
          # start up script example.
          # need pkg install cronie
          exec crond -n

          デーモン起動しないように、crond を -n オプションでフォアグランドで起動しています。

          $ cd ../
          $ chmod +t crond

          このようにスティッキービットをディレクトリに付けておきます。

          起動

          シンボリック・リンクを張ると起動します。

          $ ln -s $HOME/boot/crond $PREFIX/service/

          起動確認

          ルートで、svscan を動作させている場合は以下のようにすれば svstatコマンドで確認できます。

          $ tsu
          # svstat $PREFIX/service/crond
          /data/data/com.termux/files/usr/service/crond: up (pid 8704) 191 seconds

          rootで動作させている場合は、プロセスツリーが以下のようになっています。

          init─┬
             ::
               ├─magiskd─┬─logcat
               │         ├─sh───svscan─┬─supervise───run───sleep
               │         │             └─supervise───crond

          つまり、Termuxを完全に落としてもcronは動き続けてくれます!

          サービスの一時的な停止

          $ svc -d $PREFIX/service/crond

          サービスの再開

          $ svc -u $PREFIX/service/crond

          永続的なサービスの削除

          監視ディレクトリからシンボリック・リンクを削除します。

          $ cd $PREFIX/service/
          $ unlink crond

          注意事項

          setuidgidなど、一般ユーザ(termuxをインストールしたユーザ)では動作しないと思います。また、すべてのコマンドをテストしていませんので、動作無保証です。テスト済みのコマンドは以下から確認できます。

          Github:termux-daemontools

          https://github.com/take-i/termux-daemontools/blob/master/readme-jp.md

          まとめ

          今回の要点は以下となります。

          ・daemontoolsは、Termuxでもなんとか動作させることができた
          ・root化されていないTermuxでも動作する
          ・root化されているスマホだと、Termuxをタスクから完全に落としても動作するデーモンを管理できる
          ・メリットとしては、root化されていない端末の場合、サービス起動管理が一元化できそう。
          ・setlockは、いろいろ使えそうなのでちゃんと動くか確認してみたい。

          あとがき

          一応、djbdnsもtermuxで動作させようとあれこれ弄っていたのですが、どうやらうまく動作させることができませんでした。Androidの起動管理がよくわかっていなくて、djbdnsを起動させるとメモリーがどんどん膨らみ、swapも使い果たして再起動してしまいます。これは、djbdnsの問題ではなく、おそらくandroidの起動するシステムが関連している感じですがよくわかっていません。

           当初の目的では、DNSを動作させることだったんですがこれは当分、違う方法でやることにします。

          著者にメッセージ

          間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

            入力内容をご確認ください

            お問い合わせ頂きありがとうございます