Openwrt 安全模式failsafe分析

安全模式作用:

只加載基本的文件系統,可以修改密碼,網絡配置等,可以進行升級系統,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 文件即可;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章