preinit:/etc/preinit
boot_hook_init preinit_essential
boot_hook_init preinit_main
boot_hook_init failsafe
boot_hook_init initramfs
boot_hook_init preinit_mount_root
for pi_source_file in /lib/preinit/*; do
. $pi_source_file
done
boot_run_hook preinit_essential
pi_mount_skip_next=false
pi_jffs2_mount_success=false
pi_failsafe_net_message=false
boot_run_hook preinit_main
=========================================================
boot_hook_init:/lib/functions/preinit.sh
boot_hook_init() {
local hook="${1}_hook"
export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook"
export -n "$hook="
}
boot_hook_add() {
local hook="${1}_hook${PI_HOOK_SPLICE:+_splice}"
local func="${2}"
[ -n "$func" ] && {
local v; eval "v=\$$hook"
export -n "$hook=${v:+$v }$func"
}
}
boot_run_hook() {
local hook="$1"
local func
while boot_hook_shift "$hook" func; do
local ran; eval "ran=\$PI_RAN_$func"
[ -n "$ran" ] || {
export -n "PI_RAN_$func=1"
$func "$1" "$2"
}
done
}
/bin/mount -o noatime,move /proc $1/proc && \
pivot_root $1 $1$2 && {
/bin/mount -o noatime,move $2/dev /dev
/bin/mount -o noatime,move $2/tmp /tmp
/bin/mount -o noatime,move $2/sys /sys 2>&-
/bin/mount -o noatime,move $2/overlay /overlay 2>&-
return 0
}
}
fopivot() { #
/bin/mount -o noatime,lowerdir=/,upperdir=$1 -t overlayfs "overlayfs:$1" /mnt
pivot /mnt $2
}
ramoverlay() {
mkdir -p /tmp/root
/bin/mount -t tmpfs -o noatime,mode=0755 root /tmp/root
fopivot /tmp/root /rom 1
==================================================
/etc/preinit脚本只是对preinit_mount_root这类函数初始化,这类函数的真正的执行还是在该do_mount_root()函数中----》该函数
又在[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_mount_root中被添加到preinit_main中通过执行preinit_main间接被执行到:
do_mount_root() {
mount_root
boot_run_hook preinit_mount_root
[ -f /sysupgrade.tgz ] && {
echo "- config restore -"
cd /
mv sysupgrade.tgz /tmp
tar xzf /tmp/sysupgrade.tgz
rm -f /tmp/sysupgrade.tgz
sync
}
}
[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_mount_root
注:在/etc/preinit脚本中会将/lib/preinit目录下的所有脚本中的函数都进行分类:
preinit_essential
preinit_main
failsafe
initramfs
preinit_mount_root-------------->
for pi_source_file in /lib/preinit/*; do
. $pi_source_file
done
=========================================================
preinit_main和preinit_mount_root等不是某个具体的函数,而是一类函数
preinit_main类函数中最后执行pi_init_cmd,即执行了busybox的init进程启动系统。
pi_init_path="/bin:/sbin:/usr/bin:/usr/sbin"
pi_init_cmd="/sbin/init"
=========================================================
标准内核将mtd挂载root的流程:
1.1系统执行指向busybox的init---->init_main.c----->/etc/inittab---->/etc/rc.S
----->mount -a//加载文件/etc/fstab文件中的选项;mdev -s//在/dev 目录下建立必要的设备节点。
fstab:将内核sysfs、proc和tmpfs中的内容分别挂载到/sys、/proc等目录。
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
temps /tmp tmpfs defaults 0 0
temps /dev tmpfs defaults 0 0
1.2boot_hook_init preinit_mount_root:
在preinit_mount_root这类脚本中本来有大量启动脚本函数,现在在/lib/preinit目录下找不到一个添加到
preinit_mount_root中的脚本函数---->因为被搬到procd或ubox的代码中实现了。
阅读(2180) | 评论(0) | 转发(0) |