Ok, /etc/preinit dziala w skrócie w nastepujacy sposob:
1. source'uje wszystkie pliki z /lib/preinit :
for pi_source_file in /lib/preinit/*; do
. $pi_source_file
done
2. po czym odpala na samym końcu wszystkie funckcje/procedury zdefiniowane w powyższych skryptach jako preinit_main
boot_run_hook preinit_main
3. poniżej widzimy kolejność w jakiej odpalane są te funkcje/procedury z kategorii preinit_main z powyższych skryptów:
root@xxx:/lib/preinit$ grep preinit_main *
05_enable_reset_button_ar71xx:boot_hook_add preinit_main preinit_enable_reset_button
05_set_iface_mac_ar71xx:boot_hook_add preinit_main preinit_set_mac_address
05_set_preinit_iface_ar71xx:boot_hook_add preinit_main set_preinit_iface
10_indicate_preinit:boot_hook_add preinit_main preinit_ip
10_indicate_preinit:boot_hook_add preinit_main pi_indicate_preinit
30_failsafe_wait:boot_hook_add preinit_main failsafe_wait
40_run_failsafe_hook:boot_hook_add preinit_main run_failsafe_hook
50_indicate_regular_preinit:boot_hook_add preinit_main indicate_regular_preinit
60_init_hotplug:boot_hook_add preinit_main init_hotplug
70_initramfs_test:boot_hook_add preinit_main initramfs_test
80_mount_root:boot_hook_add preinit_main do_mount_root
90_restore_config:boot_hook_add preinit_main restore_config
99_10_run_init:boot_hook_add preinit_main run_init
root@xxx:/lib/preinit$
4. widac z powyzszego, ze OS czeka na przyciski failsafe (30_failsafe_wait) duzo wczesniej zanim montowanie wszelakich file systemów (80_mount_root). Poniżej jeszcze pokazałem co jest robione przez 80_mount_root. Odpala wszystkie funkcje/procedury zdefiniowane jako preinit_mount_root:
root@xxx:/lib/preinit$ cat 80_mount_root
#!/bin/sh
# Copyright (C) 2006 OpenWrt.org
# Copyright (C) 2010 Vertical Communications
do_mount_root() {
boot_run_hook preinit_mount_root
}
boot_hook_add preinit_main do_mount_root
root@xxx:/lib/preinit$ grep preinit_mount_root *
10_check_for_mtd:boot_hook_add preinit_mount_root check_for_mtd
20_check_jffs2_ready:boot_hook_add preinit_mount_root check_for_jffs2
40_mount_jffs2:boot_hook_add preinit_mount_root do_mount_jffs2
41_merge_overlay_hooks:boot_hook_add preinit_mount_root merge_overlay_hooks
50_determine_usb_root:boot_hook_add preinit_mount_root determine_external_root
55_determine_extroot_sysupgrade:boot_hook_add preinit_mount_root determine_extroot_sysupgrade
60_pivot_usb_root:boot_hook_add preinit_mount_root external_root_pivot
70_pivot_jffs2_root:boot_hook_add preinit_mount_root rootfs_pivot
80_mount_root: boot_run_hook preinit_mount_root
90_mount_no_jffs2:boot_hook_add preinit_mount_root do_mount_no_jffs2
99_10_mount_no_mtd:boot_hook_add preinit_mount_root do_mount_no_mtd
root@xxx:/lib/preinit$
Wniosek z powyższego jest taki, że obsługa failsafe jest robiona dużo dużo wcześniej zanim jeszcze podmontowany jest jffs2 ( /dev/mtdblock3 najpierw w /tmp/overlay a pozniej w zależności czy jest extroot czy nie, to /tmp/overlay jest odmontowany całkowicie i montowany extroot, albo zrobiony pivot do /overlay). Czyli failsafe jest robiony całkowicie z squashfs, wiec albo w obrazie Backfire jest bug albo wydarzyło się to co napisał Cezary:
Cezary napisał/a:1.1 wg obudowy.
Nie można, bo to zwykła zmiana w jffs jest. Natomiast zdarzały się przypadki na innych modelach, że zrobienie czegoś w systemie powodowało uszkodzenie obrazów ze squashfs.
Innych możliwości niestety nie ma skoro system jest pingowalny wiec się musiał w jakimś stopniu załadować i przynajmniej początkowa część preinita musiała się wykonać (chociażby aby ustawić defaultowe IP i uruchomic sieć)....