Umidigi F2 をroot化したよ!

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

Termuxを1024ポート以下でデーモン起動できるから、やっぱりroot化はやっておきたいよね。

今までサーバ利用していたUmidigiF2をroot化するのね!

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

そうそう! UmidigiF2の公式ファームウェアを使ってroot化です。

ちょっと検索してみたけど、まとまってる日本語記事ってないですね!

ぴー
ぴー

さてさて、今日から4連休です! 初日の本日は今までこのブログのWordPressサーバとして約1ヶ月利用していたUmidigiF2をroot化してみましたので、忘れないうちにその方法を書いておきます。日本語でまとまっている情報はなかったので、どこかで役に立つかもしれませんね。

root化とは?そのメリットは?

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

https://junkhack.gpl.jp/2020/10/05/pixel3android11rroot/

以前、Pixel3のroot化したときも書きましたが、簡単にいえばAndroidの最高管理権限をゲットして普通では出来ないことをやれるようします。なお、同じことをされる場合は、bootを純正以外にしますので自己責任でお願いしますね。

 で、root化する今回の目的も前回と同じで termuxを動かした時rootパッケージを使えるし、1024ポート番号以下のデーモンを起動できます。例えば、WEBサーバの80番ポートや、SSLの443番ポートです。

 というわけで、UmidigiF2のroot化やってみましょうか。

ステップ1 概要

こういうのは、まず全体像が見えていることが大事です。UmidigiF2をroot化するにあたり、概要は以下となります。

・UmidigiF2のBootローダーのロック解除をする
・Magiskというツールを使い、twrpは使わない
・Magisk Managerを使い、純正ファクトリーイメージに含まれるBootにパッチする
・adb純正ツールで、パッチしたBootをUmidigiF2に書き込む
・Termuxはroot権限を利用できるようMagiskに設定しておく

今回も、Pixel3の時と同じように、Magiskというツールで行いました。TWRPのオフィシャルに行ってきたんですが、てっきりUmidigiF2はTWRP公式ビルドにあると思っていたんですよね。残念ながら、公式ビルドにはないようでした。

TeamWin – TWRP Devices

https://twrp.me/Devices/

一方、MagiskはAndroidパーティションスキームに準拠していれば使えるはずです。オフィシャルサイトであるソース配布元のGitは以下になります。

Magisk

https://github.com/topjohnwu/Magisk

さぁ、やってみましょうか!

ステップ2 必要なツールと準備

まずは前準備です。今回もosxでやっていますがLinuxでもWindowsでもChromeBookでもできると思います。オフィシャルのマニュアルも参照してね。

Magiskオフィシャルインストール手順

https://github.com/topjohnwu/Magisk/blob/master/docs/install.md

上記だけでは、全体がまだ見えてきませんね。つまり、ざっくりと以下が必要です。

(1)fastbootとadbコマンドが動作する環境
 これは、SDK Platform-Toolsを入れればOKです。Googleからリリースされていますので最新を入れておきます。AndroidStudioを入れてある環境ならばすでに入っていますが、ツールだけであれば以下からダウンロードできます。現在の最新は、Version 30.0.4です。

SDK Platform-Tools 

https://developer.android.com/studio/releases/platform-tools.html

(2)UmidigiF2のファクトリーイメージ(StockROM)
 今手元のUmidigiF2で動いているバージョンを確認してください。筆者の場合は最新のUMIDIGI_F2_V1.0_20200402_20200506-1120が入っていたので以下をダウンロードしておきました。これはワイヤレスアップデート画面から現在のバージョンを確認できます。あとから、Boot.imgを取り出してMagiskでパッチします。

StockROM UMIDIGI F2
 UMIDIGI_F2_V1.0_20200506.V3.17.rar

https://community.umidigi.com/forum.php?mod=forumdisplay&fid=228

(3)MagiskManagerのアプリ
 これは以下のオフィシャルサイト(GitHub)からダウンロードできます。筆者はCanaryビルドを使いました。安定番は、MagiskManagerv8.0.2です。

純正に戻す場合はこれ以外にも必要ですが、今のバージョンをroot化するだけなら以上でOKです。

ステップ3 ファクトリーイメージを展開

オフィシャルサイトからダウンロードした、UMIDIGI_F2_V1.0_20200506.V3.17.rar を展開しておきます。rarファイルを展開するといろいろありますが、今回使うのは boot.img と、vbmeta.img です。わかりやすいよう1つ上の階層にでもコピーしておきましょう。

.
└── UMIDIGI_F2_V1.0_20200506.V3.17
::
    ├── boot.img
::
    ├── vbmeta.img
::

ステップ4 Bootローダーのロック解除

通常であれば、開発者向けオプションの「OEMロック解除」項目はこのようにグレーアウトした状態となっていますが、これをONにしておきます。

まず、ここにたどり着くには開発者向けオプションを有効にして、次にOEMロック解除をONにします。

[設定]> [端末情報]> [ビルド番号]を複数回タップして[開発者向けオプション]を有効にしておきます。

[設定]> [システム]> [詳細設定]で[開発者向けオプション]を開き「OEMロック解除」を有効にし、確認のためにパスワードを入力します。「USBデバッグ」も有効にしておきます。

次に、USBケーブルでPCと接続し、「adb reboot bootloader」とターミナルからタイプします。

$ adb reboot bootloader

すると、スマホはfastbootモードで再起動します。

再起動したら黒い画面でスマホは止まりますので、以下から認識しているか確認しておきます。

$ fastboot devices
F2xxxxxxxxxxxx3	fastboot

ここから先は、スマホが初期化されますので注意を!

スマホは黒い画面で左下に少し文字が見える状態だと思います。以下をタイプしてボリュームの+ボタンを押しブートローダーのロックを解除します。

$ fastboot flashing unlock

次に以下をタイプしてボリュームの+ボタンを押しセキュアパーティションのロックを解除します。

$ fastboot flashing unlock_critical

続けて以下で再起動させます。

$ fastboot reboot

起動は5秒くらい遅れますが、ホーム画面がでればOKです。これで先ほどの「OEMロック解除」は以下のようになっているはずです。

fastbootモード中、スマホの画面に表示される文字が小さくてみずらいですが、上記のように操作すれば問題ないはずです。

ステップ5 Boot.imgのパッチ

boot.imgをスマホに転送し、Magisk Managerを使用してパッチを適用します。

まずは、MagiskManagerのアプリを入れておきます。
 https://github.com/topjohnwu/Magisk

アプリを入れたら、起動させ「Magiskのインストール」からboot.imgを選択してパッチを当てます。以下のようになれば成功です。

パッチしたboot.imgファイル(magisk_patched.img)はPCにダウンロードしておきます。

ステップ6 パッチしたBoot.imgを書込

引き続き、USB接続したPCから操作です。以下をタイプでリブートします。

$ adb reboot bootloader

再起動したら黒い画面でスマホは止まりますので、以下から認識しているか確認しておきます。

$ fastboot devices
F2xxxxxxxxxxxx3	fastboot

カレントディレクトリに、magisk_patched.img があるとしたら以下のコマンドで書込みます。verityしないオプションはつけなくても大丈夫とは思いますが、まだ試していません。

$ fastboot --disable-verity --disable-verification flash boot ./magisk_patched.img

以下、実行例です。

    $ fastboot --disable-verity --disable-verification flash boot ./magisk_patched.img 
    Sending 'boot' (32768 KB)                          OKAY [  0.721s]
    Writing 'boot'                                     OKAY [  0.731s]
    Finished. Total time: 1.455s

オフィシャルのストックロムから取り出した、vbmeta.imgを書込みます。

$ fastboot --disable-verity --disable-verification flash vbmeta ./vbmeta.img

実行例は以下です。

    $ fastboot --disable-verity --disable-verification flash vbmeta ./vbmeta.img 
    Rewriting vbmeta struct at offset: 0
    Sending 'vbmeta' (4 KB)                            OKAY [  0.013s]
    Writing 'vbmeta'                                   OKAY [  0.001s]
    Finished. Total time: 0.016s

最後にリブートです。

$ fastboot reboot

root化の確認

リブート後、MagiskManagerを起動するとこのようになっていると思います。

例えば、Termuxからrootパッケージを入れて、rootになれるか確認です。

$ tsu
# whoami
root
# id
uid=0(root) gid=0(root) groups=0(root)
# 

tsuコマンドはtermuxのsuコマンドです。これを行うとmagiskにroot権限を許可するか聞かれますのでOKとしておきます。

まとめ

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

・スマホに入っているバージョンと同じROMをパッチすることでSP Flash Toolを使わなくてもOKだ。
・SP Flash Toolは、WindowsとLinuxしかない。
・元の状態に戻したい場合は、SP Flash Toolが必要。
・今のところ問題なさそう。もう少し遊びながら様子見。

あとがき

これでPixel3で試せなかったことが実験できます。本来、Pixel3は、手元であれこれアプリのテストに使いたいので、UmidigiF2がこのブログのメインマシンになる予定です。そのうち、また入れ替えたいと思います。

著者にメッセージ

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

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

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



      

    メルカリ880円のルータに組み込みLINUXのOpenWrtで内部DNSを動かす!

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

    やっとPixel3に引っ越しできたよ!

    おめでとー! 何をそんなに苦労してたの?

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

    いやー、ローカルにDNSを立ち上げようとあれこれとね!

    結局、どうやってローカルDNS立ち上げたの?

    ぴー
    ぴー

    ということで、今見ているこのWordPressブログはUMIDIGI F2から Google Pixel3のスマホに引っ越ししました!

     一番嬉しいのは、ローカルからブログを書く時、もうVPNを繋げて書かなくてもよくなった点ですね! 今まではUターンNATの問題で内部ネットワークからはこのブログにアクセスできなかったのです。ブログ記事を書く時もVPN経由で外からアクセスしていたので、記事を書くのが少し面倒だったんです。今回は、Pixel3に引っ越ししてローカルDNSを立ち上げた事を記事にしようかなと思います。

    ローカルDNSを立ち上げろ!

    なぜローカルDNSを立ち上げる必要があったかは、このあたりを見ていただくとその経緯がわかるかなと思います。

    ポートフォワードの経路で、Uターン NATとかヘアピンNATが使えないルータの場合のあれこれ

    Link

    ローカルにDNSを立ち上げれば、UターンNATがダメなルータを使っていても迂回した経路が作れます。そして、Termuxの1024以下ポートが使えない問題は、root化した Pixel3を使って回避しました。つまり、今動いているNGINXは、port80とport443で動作しています。こんな感じ!

    # ps axu | grep nginx
    root     12762  0.0  0.0 10868580 2144 ?       Ss   02:14   0:00 nginx: master process nginx
    u0_a218  12763  0.0  0.1 10869584 3912 ?       S    02:14   0:00 nginx: worker process
    ::
    u0_a218  12771  0.0  0.0 10868708 2312 ?       S    02:14   0:00 nginx: cache manager process
    
    # netstat -an | egrep ':80 |:443 ' | grep LISTEN
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN  

    当初は、このroot化したPixel3にDNSを起動させる予定だったんですが、思いの外うまく動かなくて結局、安いルータをメルカリでゲットしました。なんとお値段、送料込み880円!

    I-O DATA WN-AC1167GR

    11ac対応867Mbps(規格値)Wi-Fiルーター
    WN-AC1167GR

    https://www.iodata.jp/product/network/wnlan/wn-ac1167gr/index.htm

    このルータに、OpenWrtというオープンソースな組み込み用Linuxがあって、このI-Oデータのルータにも適合したファームウェアがあります。これを使って、dnsmasqというDNSが使えるので、ローカルDNSとして活用してみました。

    I-O DATA WN-AC1167GRにOpenWrtを!

    まずは、OpenWrtを入れます。このファームウェアは以下にあります。

    OpenWrt Project Techdata: I-O Data WN-AC1167GR

    https://openwrt.org/toh/hwdata/i-o_data/i-o_data_wn-ac1167gr

    Firmware OpenWrt Install URL から、ファクトリーイメージがあるので、これを純正のファームウェアアップデートから書き込みするだけです。LANポートは、デフォルトで192.168.1.1/24 のネットワークになっていてDHCPサーバも動いています。

    このCPUは、MediaTek MT7620Aが載っているようですね。32bitのarmで1coreのようです。

    MediaTek MT7620N/A

    https://www.mediatek.jp/products/mt7620n-a

    詳細な設定は、省きますがLAN側のネットワークに上位ルーター側で使っているネットワークを割り振っているだけです。DHCPはこのルータでは止めてあります。WAN側の青いLANは使っていません。FireWallも全部外してあります。うまく設定すれば、WAN側とLAN側をブリッジさせて同一ネットワークで使うこともできると思いますが、なぜかうまくいかず結局、シンプルな設定にしました。

     あと、とりあえず、いろいろ試して5Ghz帯の無線LANは安定しなかったので、2GHZの無線LANにしています。何か設定の勘所があるのかもですが、ちょっと追うのはヤメておきます。

    このようにインターフェイスはLAN側のポートだけ使って、あとは無線LANの設定をLANに紐づけているだけです。いわゆるブリッジ接続(アクセスポイント的な)で使っている感じですね。

    OpenWrtで、DNSMASQの設定を!

    OpenWrtルータは、SSHも出来ますのでログインしてdnsmasqがどの設定ファイルを見ているか確認してみます。管理画面からも設定はできるんですが、どの設定項目がどのパラメータなのかわかりにくいので、直接設定ファイルを見てみました。

    psコマンドは、BusyBoxのやつを使っているようですね。オプションは効きませんでした。こんな感じでdnsmasqの起動オプションを確認。

    root@OpenWrt:~# ps | grep dnsmasq
      847 dnsmasq   1344 S    /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.cfg01411c -k -x /var/run/dnsmasq/dnsmasq.cfg01411c.pid

    -C オプションが設定ファイルです。このファイルの中は、こんな感じです。

    # auto-generated config file from /etc/config/dhcp
    conf-file=/etc/dnsmasq.conf
    filterwin2k
    no-negcache
    strict-order
    localise-queries
    read-ethers
    enable-ubus
    expand-hosts
    bind-dynamic
    quiet-dhcp
    domain=gpl.jp
    server=/gpl.jp/
    server=8.8.8.8
    server=192.168.1.1
    dhcp-leasefile=/tmp/dhcp.leases
    resolv-file=/etc/resolv.conf
    stop-dns-rebind
    rebind-localhost-ok
    dhcp-broadcast=tag:needs-broadcast
    addn-hosts=/tmp/hosts
    conf-dir=/tmp/dnsmasq.d
    user=dnsmasq
    group=dnsmasq
    
    
    dhcp-ignore-names=tag:dhcp_bogus_hostname
    conf-file=/usr/share/dnsmasq/dhcpbogushostname.conf
    
    
    bogus-priv
    conf-file=/usr/share/dnsmasq/rfc6761.conf

    あとは、hostsの内容はWEB GUI画面から管理できます。

    リモートのmacから、digで確認してみます。

    $ dig @192.168.1.100 hack.gpl.jp
    
    ; <<>> DiG 9.10.6 <<>> @192.168.1.100 hack.gpl.jp
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2575
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;hack.gpl.jp.			IN	A
    
    ;; ANSWER SECTION:
    hack.gpl.jp.		0	IN	A	192.168.1.47
    
    ;; Query time: 0 msec
    ;; SERVER: 192.168.1.100#53(192.168.1.100)
    ;; WHEN: Mon Oct 26 03:55:29 JST 2020
    ;; MSG SIZE  rcvd: 56

    管理外のドメインも引いてくれるか確認しておきます。なんとか大丈夫そうなので、設定はよしとします。ハマった点としては5Ghz帯の無線LANだとどうしても、接続が切れてしまうようでした。何か、設定があるのかもですが解決できなかったので2Ghz帯のにしています。無線LANとスマホは近くに置いてあるのでまぁ実質問題ないでしょう。Pixel3からスピードテストすると以下のようです。

    監視サイトからの読み込みも 2秒くらいなのでまぁ良いかなと。

    まとめ

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

    ・OpenWrtは、iptablesも設定できるようなのでうまく応用すればいろいろ使えそう
    ・今回は、5Ghzの無線LANは通信が切れてしまう現象が起きた
    ・なので、2Ghzの無線LANで運用することに
    ・DNSMASQは、それなりに動いているようだ
    ・無線LANの機器なので消費電力は5Wくらい。省電力
    ・違う無線LAN配下からは、pingが通らない。これはなぜか?
    ・上位ルータからはPingは通る
    ・引っ越ししたroot化したpixel3は今の所、調子良さそう

    あとがき

    無線LANがぶつぶつ切れて、設定がぜんぜん進まず、どうしようかと思ったんですが2Ghzにしてなんとか安定しているように見えます。組み込みのLinuxと無線LANドライバーは、弄れる知識がないのでいつかチャレンジしてみようとは思いますが、今はもうお腹いっぱいです。設定疲れました!でも、なんとか当初の目標がクリアできてよかったです。たかが、内部DNSですが、消費電力が少なくて今のところ便利に使えています。あとは、そのくらい安定して動作するか検証ですね。

    著者にメッセージ

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

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

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



        

      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を動作させることだったんですがこれは当分、違う方法でやることにします。

      著者にメッセージ

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

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

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



          

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

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

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

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

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

        冷蔵庫は約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化していると、オーバークロックもできるようですがまだ試していません。

        著者にメッセージ

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

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

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



            

          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の買い替え需要も発生するので、ますます安くて高性能なスマホが入手できる環境になります。無限の可能性を感じますね!

          著者にメッセージ

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

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

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



              

            まだ広告で消費してるの? 知らないと損!! 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があれば、かなりこの消耗が少なくなります。今の所、知ってる人だけ使っている機能で、広告業界はこれに対抗する術がまったくありません。今後、どうなるのでしょうかね。

            著者にメッセージ

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

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

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