Openwrtセキュリティモードfailsafe分析

2933 ワード

セキュリティ・モードの役割:
基本的なファイルシステムだけをロードして、パスワード、ネットワークの配置などを修正することができて、アップグレードシステム、Ubootなどの操作を行うことができます;
hotplugメカニズムに依存する.
Procdでpreinit初期化を行う.hotplugイベントを同時に登録します.
ファイル/etc/hotplug-preinit.json
[
        [ "case", "ACTION", {
                "add": [
                        [ "if",
                                [ "has", "FIRMWARE" ],
                                [
                                        [ "exec", "/sbin/hotplug-call", "%SUBSYSTEM%" ],
                                        [ "load-firmware", "/lib/firmware" ],
                                        [ "return" ]
                                ]
                        ],
                ],
        }, ],
        [ "if",
                [ "and",
                        [ "eq", "SUBSYSTEM", "button" ],
                ],
                [ "exec", "/etc/rc.button/failsafe" ]
        ],
]
すなわち
[[exec],[/etc/rc.button/failsafe]]キーを検出してこのスクリプトを実行
#!/bin/sh

[ "${TYPE}" = "switch" ] || echo ${BUTTON} > /tmp/failsafe_button
return 0

キーピンの状態が変化している限り、/tmp/failsafe_を作成します.buttonファイル、スクリプト/lib/preinit/30_failsafe_wait使用
failsafe_wait() {
        FAILSAFE=
        grep -q 'failsafe=' /proc/cmdline && FAILSAFE=true && export FAILSAFE
        if [ "$FAILSAFE" != "true" ]; then
                pi_failsafe_net_message=true
                preinit_net_echo "Please press button now to enter failsafe"
                pi_failsafe_net_message=false
                fs_wait_for_key f 'to enter failsafe mode' $fs_failsafe_wait_timeout && FAILSAFE=true
                [ -f "/tmp/failsafe_button" ] && FAILSAFE=true && echo "- failsafe button "`cat /tmp/failsafe_button`" was pressed -"
                [ "$FAILSAFE" = "true" ] && export FAILSAFE && touch /tmp/failsafe
        fi
}

boot_hook_add preinit_main failsafe_wait

fs_wait_for_key関数は、キー「f」メッセージを処理し、システムデバッグシリアルポートを介してデバッグ情報出力レベルを設定する.
[ -f "/tmp/failsafe_button"] && FAILSAFE=true &&echo "- failsafe button "`cat/tmp/failsafe_button`"was pressed-"ここでfailsafeを判断するbuttonファイルが存在する、すなわちセキュリティモードに入る.
注意しなければならないのは、procdがキー情報を取得し、hotplugスクリプトを呼び出すのはpreinitフェーズであり、overlayファイルシステムはまだロードされておらず、romfsが使用されているため、セキュリティモードを無効にするには、システム起動後に/etc/rc.button/failsafeスクリプトを変更することはできません.したがってpreinitフェーズでは、romfsが使用され、ユーザーが変更したファイルはoverlayfsにロードされていません.
So,キーを無効にしてセキュリティモードに入る方法は,sysupgrade.binファームウェアコンパイル段階で/etc/rc.button/failsafeスクリプトを変更し,/tmp/failsafe_を作成しないことである.buttonファイルでいいです.