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