zoukankan      html  css  js  c++  java
  • openwrt启动脚本分析

    openwrt是通过一系列shell脚本进行启动流程的组织,下面是启动流程的提纲。如
    果想详细了解启动的过程,则需要仔细走读脚本文件。
    1. 在make menuconfig 选择target平台 Atheros AP147

    2. linux内核的配置文件由下面两个文件组成
    target/linux/ar71xx/config-3.3和根目录下的.config中的内核配置部分组成

    3. 在内核启动时,我们会发现如下的启动参数:
    Kernel command line:  board=AP147 console=ttyS0,115200 mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,6848k(rootfs),1472k(kernel),6144k(rootfs2),1472k(kernel2),64k(config),64k(art),16000k@0x50000(firmware) rootfstype=squashfs,jffs2 noinitrd

    这一部分的参数,实际上是由patch-cmdline这个工具在image生成时patch到kernel中区的,详细内容可以在内核目录搜索CONFIG_IMAGE_CMDLINE_HACK宏

    我们倒回来看,linux内核启动后,首先查找root的启动参数,如果没有的话,首先运行/etc/preinit脚本,详细见build_dir/linux-ar71xx_generic/linux-3.3.8/init/main.c 中的init_post函数


    4. preinit脚本位置在
    package/base-files/files/etc/preinit

    5. preinit脚本是一系列脚本的入口,这一系列脚本放在下面的目录:
    package/base-files/files/lib/preinit
    target/linux/ar71xx/base-files/lib/preinit
    编译完成后,会统一放在rootfs的/lib/preinit目录下,

    02_default_set_state
    03_preinit_do_ar71xx.sh
    05_enable_reset_button_ar71xx
    05_mount_skip
    05_set_iface_mac_ar71xx
    05_set_preinit_iface_ar71xx
    10_check_for_mtd
    10_essential_fs
    10_indicate_failsafe
    10_indicate_preinit
    20_check_jffs2_ready
    20_device_fs_mount
    30_device_fs_daemons
    30_failsafe_wait
    40_init_shm
    40_mount_devpts
    40_mount_jffs2
    40_mount_ubifs
    40_run_failsafe_hook
    41_merge_overlay_hooks
    50_choose_console
    50_indicate_regular_preinit
    60_init_hotplug
    70_initramfs_test
    70_pivot_jffs2_root
    70_pivot_ubifs_root
    80_mount_root
    81_load_wifi_board_bin
    90_init_console
    90_mount_no_jffs2
    90_restore_config
    99_10_failsafe_login
    99_10_mount_no_mtd
    99_10_run_init

    由于脚本众多,因此openwrt的设计者将这些脚本分成下面几类:
    preinit_essential
    preinit_main
    failsafe
    initramfs
    preinit_mount_root
    每一类函数按照脚本的开头数字的顺序运行。

    6. preinit则执行下面的两类脚本
    boot_run_hook preinit_essential
    boot_run_hook preinit_main

    7. preinit执行的最后一个脚本为99_10_run_init,运行
    exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd
    pi_init_cmd为
    pi_init_cmd="/sbin/init"
    因此开始运行busybox的init命令

    8. busybox的init命令执行inittab的脚本,该脚本来自
    package/base-files/files/etc/inittab
    ::sysinit:/etc/init.d/rcS S boot
    ::shutdown:/etc/init.d/rcS K stop
    tts/0::askfirst:/bin/ash --login
    ttyS0::askfirst:/bin/ash --login
    tty1::askfirst:/bin/ash --login
    sysinit为系统初始化运行的 /etc/init.d/rcS S boot脚本
    shutdown为系统重启或关机运行的脚本
    tty开头的是,如果用户通过串口或者telnet登录,则运行/bin/ash --login
    askfirst和respawn相同,只是在运行前提示"Please press Enter to activate
    this console."

    9. 当前启动转到运行 /etc/init.d/rcS S boot,该脚本来自
    package/base-files/files/etc/init.d/rcS
    和preinit类似,rcS也是一系列脚本的入口,其运行/etc/rc.d目录下S开头的的所
    有脚本(如果运行rcS K stop,则运行K开头的所有脚本)

    K10mcproxy
    K50dropbear
    K90network
    K95luci_fixtime
    K98boot
    K99umount
    S05defconfig
    S05luci_fixtime
    S10boot
    S11ubus
    S20network
    S39usb
    S45firewall
    S50cron
    S50dropbear
    S50qos
    S50radvd
    S50telnet
    S50uhttpd
    S59luci_dhcp_migrate
    S60dnsmasq
    S60quagga
    S95done
    S95miniupnpd
    S96led
    S97watchdog
    S98sysntpd
    S99mcproxy
    S99sysctl


    上面的脚本文件来自:
    package/base-files/files/etc/init.d
    target/linux/ar71xx/base-files/etc/init.d

    还有一些脚本来自各个模块,在install时拷贝到rootfs,比如dropbear模块
    package/dropbear/files/dropbear.init
    这些脚本先拷贝到/etc/init.d下,然后通过/etc/rc.common脚本,将init.d的脚
    本链接到/etc/rc.d目录下,并且根据 这些脚本中的START和STOP的关键字,添加
    K${STOP}和S${START}的前缀,这样就决定了脚本的先后的运行次序。

    10.可以看出,openwrt的启动主要是两个阶段,preinit主要是完成系统的初始化
    (如文件系统的准备、模块的加载),rcS主要依次 启动各个模块。

     
    附:脚本走读的一些技巧
    a. rootfs目录在build_dir/target-mips_r2_uClibc-0.9.33.2/root-ar71xx,可以直接在该目录下走读shell脚本。
    b. openwrt的shell脚本比较复杂,因此看脚本时可以通过添加 set -x和echo等命令,直接看shell脚本的结果,而不要花太多的时间硬看脚本,主要是理解其主要的意思和设计思路。
  • 相关阅读:
    Spring Boot 的各种start
    Lombok介绍、使用方法和总结
    JS字符串与二进制的相互转化
    java字符串与二进制的相互转化
    DevExpress WPF v18.2新版亮点(六)
    用MyEclipse开发REST Web Service
    .NET界面控件DevExpress发布v18.2.4|附下载
    DevExpress WPF v18.2新版亮点(五)
    「版本升级」MyEclipse CI 2018.12.0正式发布
    MyEclipse使用教程:在Web项目中使用Web片段
  • 原文地址:https://www.cnblogs.com/issuelinux/p/4251975.html
Copyright © 2011-2022 走看看