Openwrt學習之路-(3-Openwrt start-up process)

題圖:gratisography

Openwrt start-up process

OpenWrt是一個典型的嵌入式Linux工程漩氨,主要添加了很多網(wǎng)絡路由等功能,所以其啟動過程與常見的嵌入式系統(tǒng)類似遗增,不外乎Bootloader->EmbededOS->Filesystem->Application這四個過程叫惊,但內(nèi)部細節(jié)它也有一套自己的方式,下面就介紹一下OpenWrt的啟動流程做修。

OpenWrt的啟動流程主要:1.Bootloader->2.linux->3./etc/preinit->4./sbin/init ->5./etc/inittab ->6./etc/init.d/rcS->7./etc/rc.d/S*

1.Bootloader


bootloader即最先啟動的部分霍狰,類似u-boot、barebox饰及、redboot蔗坯。它的任務只是創(chuàng)造一個簡單的環(huán)境,讓系統(tǒng)先運行起來燎含。除了能夠跳轉到特定地址上啟動操作系統(tǒng)(如Linux)外步悠,它還能讓你download東西到上面,比如download一個linux瘫镇,然后啟動它鼎兽。linux啟動之后答姥,將由linux全部接管系統(tǒng)。

另外谚咬,值得一提的是鹦付,bootloader在啟動之后會有1,2秒的時間等待由tftp上傳的內(nèi)核并燒寫到flash上择卦。這就給一些操作系統(tǒng)損壞但bootloader還能工作的"磚頭"板一個起死回生的機會敲长。

2.Linux


這時候就沒bootloader什么事情了。不過bootloader會傳遞給內(nèi)核一個命令行的參數(shù)秉继,這個可以在linux啟動起來之后用下面的命令查看:

root@OpenWrt:/# cat /proc/cmdline
console=ttyS0,115200 mtdparts=spi_flash:1m(u-boot)ro,3m(kernel),-(rootfs)

至于linux系統(tǒng)的啟動流程這邊就不進行細說祈噪,可以參考另一篇文章“Linux start process”,這邊說下Linux執(zhí)行到最后要交給文件系統(tǒng)的部分尚辑。

Linux啟動到后面會執(zhí)行/init/main.c里面的kernel_init()函數(shù)辑鲤,該函數(shù)最后幾句就是調用文件系統(tǒng)的內(nèi)容了伍派,如下:

if (!try_to_run_init_process("/etc/preinit") ||
        !try_to_run_init_process("/sbin/init") ||
        !try_to_run_init_process("/etc/init") ||
        !try_to_run_init_process("/bin/init") ||
        !try_to_run_init_process("/bin/sh"))
        return 0;

可見下一步是要執(zhí)行/etc/preinit腳本伶椿。

3.init=/etc/preinit


/etc/preinit的部分內(nèi)容如下:

(前面十幾行就是初始化一些參數(shù),這些參數(shù)在后面的hook函數(shù)里面用到屯曹,這邊將其省略不貼出)

[ -z "$PREINIT" ] && exec /sbin/init

...

. /lib/functions.sh
. /lib/functions/preinit.sh
. /lib/functions/system.sh

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

對于不同版本的openwrt會發(fā)現(xiàn)其/etc/preinit腳本會有些不一樣瓢喉,openwrt15.05的/etc/preinit最上面會多了一句[ -z "$PREINIT" ] && exec /sbin/init宁赤,后面再說為什么,先往下分析流程栓票。

. /lib/functions.sh
. /lib/functions/preinit.sh
. /lib/functions/system.sh

三個. /將其他三個腳本包含進去决左,因為下面的boot_hook_init函數(shù)就位于/lib/functions/preinit.sh中,內(nèi)容如下:

boot_hook_init() {
    local hook="${1}_hook"
    export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook"
    export -n "$hook="
}

使用boot_hook_init函數(shù)對5個hook鏈進行初始化走贪。

對hook初始化后佛猛,執(zhí)行下面語句

for pi_source_file in /lib/preinit/*; do
    . $pi_source_file
done

依次執(zhí)行/lib/preinit/目錄下的每個腳本,查看/lib/preinit/目錄

/lib/preinit$ ls
02_default_set_state         10_indicate_preinit          70_initramfs_test
03_preinit_do_ramips.sh      10_sysinfo                   80_mount_root
04_handle_checksumming       30_failsafe_wait             99_10_failsafe_login
07_set_preinit_iface_ramips  40_run_failsafe_hook         99_10_run_init
10_indicate_failsafe         50_indicate_regular_preinit

里面的每個腳本都是調用boot_hook_add函數(shù)將鏈名加入對應的hook鏈中厉斟。

/lib/preinit/目錄下的最后一個腳本是99_10_run_init挚躯,打開該腳本會發(fā)現(xiàn)新舊版本的openwrt里面會有些不同强衡,如下:

新:
run_init() {
    preinit_ip_deconfig
}

boot_hook_add preinit_main run_init
舊:
run_init() {
    preinit_echo "- init -"
    preinit_ip_deconfig
    if [ "$pi_init_suppress_stderr" = "y" ]; then
    exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd 2>&0
    else
    exec env - PATH=$pi_init_path $pi_init_env $pi_init_cmd
    fi
}

boot_hook_add preinit_main run_init

可以發(fā)現(xiàn)舊的比新的openwrt多了一句執(zhí)行語句擦秽,這就與上面舊的比新的openwrt少了一句[ -z "$PREINIT" ] && exec /sbin/init相呼應,只不過是執(zhí)行/sbin/init的順序前后改變罷了漩勤。

當hook鏈準備好后感挥,就調用boot_run_hook,進行運行越败。

boot_run_hook preinit_essential
boot_run_hook preinit_main

所以整個/etc/preinit的流程如下:

(其實/etc/preinit到底是要干嘛我也沒理解触幼,只能大概理解其執(zhí)行流程)

4./sbin/init


/sbin/init也就是busybox的init進程,該進程對應的代碼在busybox根目錄下的init/init.c中究飞,這邊將其程序流程如下:

init進程會自動分析/etc/inittab這個文件置谦,根據(jù)配置文件決定啟動那些程序堂鲤,所以該init進程是后續(xù)所有進行的發(fā)起者,接下來就查看inittab配置文件媒峡。

5./etc/inittab


inittab配置文件中的每一條都被看做是一個初始化活動瘟栖,busybox中定義了8種初始化活動供inittab文件使用,對于inittab更具體的用法格式等谅阿,將在另一篇“Linux profile and inittab file”進行講解半哟,這邊主要講Openwrt的啟動過程。

查看/etc/inittab的內(nèi)容:

::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
ttyS0::askfirst:/bin/login
tty1::askfirst:/bin/ash --login

這邊可以看到第一句sysinit后面接的是/etc/init.d/rcS腳本签餐,所以下一步將執(zhí)行rcS腳本寓涨。

6./etc/init.d/rcS


查看/etc/init.d/rcS:

#!/bin/sh
# Copyright (C) 2006 OpenWrt.org
run_scripts() {
    for i in /etc/rc.d/$1*; do
        [ -x $i ] && $i $2 2>&1
    done | $LOGGER
}

LOGGER="cat"
[ -x /usr/bin/logger ] && LOGGER="logger -s -p 6 -t sysinit"
if [ "$1" = "S" ]; then
    run_scripts "$1" "$2" &
else
    run_scripts "$1" "$2"
fi

最主要的一句就是run_scripts "$1" "$2",運行/etc/rc.d/目錄下所有以S開頭的腳本氯檐。

7./etc/rc.d/S*


可以看到/etc/rc.d/目錄下好多S開頭的腳本戒良。

/etc/rc.d$ ls
K50dropbear  K98boot        S10system  S19firewall  S50dropbear  S95done
K85odhcpd    K99umount      S11sysctl  S20network   S50telnet    S96led
K89log       S00sysfixtime  S12log     S35odhcpd    S50uhttpd    S98sysntpd
K90network   S10boot        S12rpcd    S50cron      S60dnsmasq

那這些腳本是哪邊來的呢,細心的你可能會看到/etc/init.d/目錄下的文件名稱怎么都跟這個一樣呢男摧,就差前面幾個字符蔬墩。

/etc/init.d$ ls
boot  dnsmasq  dropbear  led  network  rpcd    sysfixtime  system  uhttpd
cron  done     firewall  log  odhcpd   sysctl  sysntpd     telnet  umount

隨便打開一寫腳本看下,如system里面有START=10耗拓,telnet里面有START=50拇颅,與etc/rc.d/目錄下的前綴一樣。

/etc/init.d/目錄下的腳本第一句話都是#!/bin/sh /etc/rc.common乔询,即為運行 /etc/rc.common x.sh parameters樟插,所以是通過/etc/rc.common腳本,將init.d的腳本鏈接到/etc/rc.d目錄下竿刁,并且根據(jù)這些腳本中的START和STOP的關鍵字黄锤,添加K${STOP}和S${START}的前綴。

enable() {
    name="$(basename "${initscript}")"
    disable
    [ -n "$START" -o -n "$STOP" ] || {
        echo "/etc/init.d/$name does not have a START or STOP value"
        return 1
    }
    [ "$START" ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}"
    [ "$STOP"  ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[0-9][0-9]}"
}

這樣根據(jù)/etc/rc.d/S*的順序就行運行開機腳本食拜,整個系統(tǒng)啟動完成鸵熟,如果我們想自己加入一些啟動腳本也要按/etc/init.d/目錄下腳本的規(guī)則進行編寫,放在/etc/init.d/下负甸,這個比較簡單這邊就不在講解流强。

Openwrt start process的分析就到這邊,有感悟時會持續(xù)會更新呻待。

注:以上內(nèi)容都是本人在學習過程積累的一些心得打月,難免會有參考到其他文章的一些知識,如有侵權蚕捉,請及時通知我奏篙,我將及時刪除或標注內(nèi)容出處,如有錯誤之處也請指出迫淹,進行探討學習秘通。文章只是起一個引導作用为严,詳細的數(shù)據(jù)解析內(nèi)容還請查看Openwrt相關教程,感謝您的查閱肺稀。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梗脾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盹靴,更是在濱河造成了極大的恐慌炸茧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稿静,死亡現(xiàn)場離奇詭異梭冠,居然都是意外死亡,警方通過查閱死者的電腦和手機改备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門控漠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悬钳,你說我怎么就攤上這事盐捷。” “怎么了默勾?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵碉渡,是天一觀的道長。 經(jīng)常有香客問我母剥,道長滞诺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任环疼,我火速辦了婚禮习霹,結果婚禮上,老公的妹妹穿的比我還像新娘炫隶。我一直安慰自己淋叶,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布伪阶。 她就那樣靜靜地躺著煞檩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪望门。 梳的紋絲不亂的頭發(fā)上形娇,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天锰霜,我揣著相機與錄音筹误,去河邊找鬼。 笑死癣缅,一個胖子當著我的面吹牛厨剪,可吹牛的內(nèi)容都是我干的哄酝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼祷膳,長吁一口氣:“原來是場噩夢啊……” “哼陶衅!你這毒婦竟也來了?” 一聲冷哼從身側響起直晨,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搀军,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勇皇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罩句,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年敛摘,在試婚紗的時候發(fā)現(xiàn)自己被綠了门烂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡兄淫,死狀恐怖屯远,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捕虽,我是刑警寧澤慨丐,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站泄私,受9級特大地震影響咖气,放射性物質發(fā)生泄漏。R本人自食惡果不足惜挖滤,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一崩溪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斩松,春花似錦伶唯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钧椰,卻和暖如春粹断,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫡霞。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工瓶埋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓养筒,卻偏偏與公主長得像曾撤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晕粪,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容