1. 程式人生 > >openwrt 檔案系統的啟動流程

openwrt 檔案系統的啟動流程

總結一下OpenWrt的啟動流程:1.CFE->2.linux->3./etc/preinit->4./sbin/init ->5./etc/inittab ->6./etc/init.d/rcS->7./etc/rc.d/S* ->8.

 OpenWrt是一個開放的linux平臺,主要用於帶wifi的無線路由上。

類似於Ubuntu、Red Hat、之類的linux發行版本,它也有一套自己的啟動流程。下面,我就以我的Linksys 的WRT54G為平臺介紹一下,OpenWrt的啟動流程。

      1.首先,CFE(common firmware environment)--它就是一個bootloader,類似u-boot,redboot之類,有點broadcom公司御用之嫌--

最先啟動。它的任務只是創造一個簡單的環境,讓系統先執行起來。除了能夠跳轉到特定地址上啟動作業系統(如Linux)外,

它還能讓你download東西到上面,比如download一個linux,然後啟動它。

另外,值得一提的是,CFE在啟動之後會有1,2秒的時間等待由tftp上傳的核心並燒寫到flash上,

這就給一些作業系統損壞但CFE還能工作的"磚頭"板一個起死回生的機會。請注意一旦linux啟動之後,將由linux全部接管系統,

       2.這時候就沒CFE什麼事情了。唯一的瓜葛是CFE傳遞給核心一個命令列的引數,這個可以在linux啟動起來之後用下面的命令檢視:

[email protected]
:/# cat /proc/cmdline

console=ttyS0,115200 mtdparts=spi_flash:1m(u-boot)ro,3m(kernel),-(rootfs)

之後,linux系統啟動起來了。它使用類似如下的指令碼命令來解析cmdline:

for x in $(cat /proc/cmdline); do

case $x in

init=*)

init=${x#init=}

;;

root=*)

ROOT=${x#root=}

case $ROOT in

LABEL=*)

ROOT="/dev/disk/by-label/${ROOT#LABEL=}"

;;

UUID=*)

ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"

;;

esac

;;

rootflags=*)

ROOTFLAGS="-o ${x#rootflags=}"

;;

cryptopts=*)

cryptopts="${x#cryptopts=}"

;;

nfsroot=*)

NFSROOT="${x#nfsroot=}"

;;

nfsopts=*)

NFSOPTS="-o ${x#nfsopts=}"

;;

boot=*)

BOOT=${x#boot=}

;;

resume=*)

RESUME=${x#resume=}

;;

noresume)

NORESUME=y

;;

quiet)

quiet=y

;;

ro)

readonly=y

;;

rw)

readonly=n

;;

debug)

debug=y

exec >/tmp/initramfs.debug 2>&1

set -x

;;

break=*)

break=${x#break=}

;;

break)

break=premount

;;

esac

done

對於OpenWrt這個cmdline的意思就是:root=/dev/mtdblock2 檔案系統在第三個flash分割槽上(mtdblock0,1,2);

rootfstype=squashfs,jffs2 檔案系統型別是squashfs和jffs2(為什麼兩種型別,目前還不清楚,

不過可以確定OpenWrt使用了較為複雜的檔案系統,實現了squashfs的壓縮和jffs2的可寫 ); 

init=/etc/preinit 執行該初始化,noinitrd console=ttyS0,115200

沒有initrd和console口設定。

   3.

init=/etc/preinit 是linux會執行的初始化,具體內容如下:

[email protected]:/# cat /etc/preinit

#!/bin/sh

# Copyright (C) 2006 OpenWrt.org

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

. /etc/diag.sh

failsafe_ip() {

ifconfig $ifname 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.2 55 up

}

failsafe() {

[ -n "$ifname" ] && grep "$ifname" /proc/net/dev >/dev/null && {

failsafe_ip

netmsg 192.168.1.255 "Entering Failsafe!"

telnetd -l /bin/login <> /dev/null 2>&1

}

lock /tmp/.failsafe

ash --login

}

mount proc /proc -t proc

mount sysfs /sys -t sysfs

size=$(awk '/MemTotal:/ {l=5242880;mt=($2*1024);print((s=mt/2)<l)&&(mt>l)?mt-l:s }' /proc/meminfo)

mount tmpfs /tmp -t tmpfs -o size=$size,nosuid,nodev,mode=1777

if grep devfs /proc/filesystems > /dev/null; then

mount devfs /dev -t devfs

M0=/dev/pty/m0

M1=/dev/pty/m1

HOTPLUG=/sbin/hotplug-call

elif [ -x /sbin/hotplug2 ]; then

mount -t tmpfs tmpfs /dev -o size=512K

mknod /dev/console c 5 1

/sbin/hotplug2 --coldplug --set-rules-file /etc/hotplug2-init.rules

/sbin/hotplug2 --no-coldplug --persistent --set-rules-file /etc/hotplug2 -init.rules &

M0=/dev/ptmx

M1=/dev/ptmx

HOTPLUG=

elif [ -x /sbin/udevd ]; then

mount -n -t tmpfs -o mode=0755 udev /dev

/sbin/udevd --daemon

/sbin/udevtrigger

/sbin/udevsettle

M0=/dev/pty/ptmx

M1=/dev/pty/ptmx

HOTPLUG=

fi

mkdir -p /dev/pts /dev/shm

mount devpts /dev/pts -t devpts

# the shell really doesn't like having stdin/out closed

# that's why we use /dev/pty/m0 and m1 as replacement

# for /dev/console if there's no serial console available

dd if=/dev/console of=/dev/null bs=1 count=0 >/dev/null 2>/dev/null && {

M0=/dev/console

M1=/dev/console

}

exec <$M0 >$M1 2>&0

echo "- preinit -"

echo "Press CTRL-C for failsafe"

trap 'FAILSAFE=true' INT

trap 'FAILSAFE=true' USR1

[ -e /etc/preinit.arch ] && . /etc/preinit.arch

set_state preinit

echo "$HOTPLUG" > /proc/sys/kernel/hotplug

eval ${FAILSAFE:+failsafe}

lock -w /tmp/.failsafe

if [ -z "$INITRAMFS" ]; then

mount_root

[ -f /sysupgrade.tgz ] && {

echo "- config restore -"

cd /

mv sysupgrade.tgz /tmp

tar xzf /tmp/sysupgrade.tgz

rm -f /tmp/sysupgrade.tgz

sync

}

echo "- init -"

exec /sbin/init

fi

可見,它主要是掛載一些系統需要的檔案系統,例如tmpfs,proc和sysfs(是否真正掛載取決於核心是否2.6的)。

並且會準備裝置節點和故障恢復(failsafe)的準備。(這裡還沒看懂 )

       4.

最後,exec /sbin/init啟動檔案系統,在OpenWrt上也就是busybox的init程式。

它會自動分析/etc/inittab這個檔案,其內容解釋詳見busybox網站的cmd help。

       5.

/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

     6.

執行/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

    7.

將執行/etc/rc.d/S*這些指令碼: 

[email protected]:/# ls /etc/rc.d/S*

/etc/rc.d/S10boot 

/etc/rc.d/S50cron 

/etc/rc.d/S60led

/etc/rc.d/S20fstab 

/etc/rc.d/S50dropbear 

/etc/rc.d/S95done

/etc/rc.d/S39usb 

/etc/rc.d/S50uhttpd 

/etc/rc.d/S97watchdog

/etc/rc.d/S40network 

/etc/rc.d/S50telnet 

/etc/rc.d/S99sysctl

/etc/rc.d/S45firewall /

etc/rc.d/S60dnsmasq

按照數字從小到大的順序執行。 

二、實現自啟動指令碼

OpenWRT的啟動指令碼放在 /etc/init.d 目錄下,而系統開機時自動執行/etc/rc.d目錄下的指令碼。所以在rc.d目錄下、有init.d下指令碼的連結檔案。

整理一下

05 defconfig //載入預設引數

10 boot //啟動

39 usb // 載入usbfs

40 network // 設定網絡卡引數

45 firewall // 防火牆

50 dropbear // sshd server

50 cron // .....

50 telnet // 如果沒有修改root密碼,則啟動telnet server

60 dnsmasq // DHCP 和 DNS 服務端

95 done // ...

96 led // 指示燈

97 watchdog // ...

99 sysctl // 最後,進行必要的核心引數調整

然後,我們加入自己的指令碼,實現模組驅動的載入、應用程式的開機自啟動等。

首先在/etc/init.d裡新增需要啟動的shell指令碼

例如:

vim startCamera

內容:

01

#!/bin/sh /etc/rc.common

02

# /init.d/startCamera

03

START=50

04

start()

05

{

06

./opt/ipnc/system_server &

07

}

08

stop()

09

{

10

killallsystem_server

11

}

之後還需要在rc.d目錄下做一個連結,啟動時系統會按順序啟動rc.d目錄下的指令碼連結,對應執行init.d目錄下的啟動指令碼。指令碼的命名要符合系統規範,init.d下telnet指令碼在rc.d目錄下的連結檔名為S50telnet。所以連結檔案要在指令碼名前加S+啟動順序數字,啟動順序要等系統進行完必要的初始化。所以我們命名為S95+指令碼名。

命令:ln -s /etc/init.d/startCamera /etc/rc.d/S95startCamera

重啟,即可

現在實現了應用程式的開機自啟動。

相關推薦

uboot、核心、根檔案系統啟動流程

  0.設定cpu為svc模式,關中斷  1. 為核心的解壓做準備(記憶體,中斷等等)  2.核心自解壓 (vmlinux.lds)  3.跳轉到入口地址執行(head.S--->main.c)start_kernel執行核心  4.硬體的初始化(初始mm  mmu  中斷(request_irq),軟

linux檔案系統啟動流程啟動指令碼

下面是一張Linux啟動流程圖: 在瞭解啟動流程之前,我們應該先知道系統的幾個重要指令碼和配置檔案,他們對應的路徑為: 1. /sbin/init 2. /etc/inittab 3. /etc/rc.d/rc.sysinit 4. /etc/rc.d/rcN.d //這

openwrt 檔案系統啟動流程

總結一下OpenWrt的啟動流程:1.CFE->2.linux->3./etc/preinit->4./sbin/init ->5./etc/inittab ->6./etc/init.d/rcS->7./etc/rc.d/S* ->

Linux系統啟動流程

linux系統啟動流程Linux系統啟動流程Linux系統啟動流程圖1、加電自檢 上電自檢POST,主要負責檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常, 自檢完成後從BIOS中設置的系統啟動順序來搜索用於啟動系統的驅動器2、grub引導(1)grub引導第一階段(stag

CentOS系統啟動流程

centos系統啟動流程CentOS系統啟動流程CentOS的啟動流程總體順序如下(以CentOS 6為例): POST --> BootSequence(BIOS) --> Bootloader --> kernel [-->ramfs] -->rootfs(ro) -->

linux系統啟動流程(CentOS5/6/7為例)

centos 系統一個操作系統要完整啟動起來需要哪些步驟呢?今天以CentOS為例探索一下linux的啟動流程;一、Linux系統的組成--kernel+rootfs(根文件系統)kernel: 內核,進行進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能等等rootfs: 根文件系統1.內核設計流派

系統啟動流程

地址空間 object 2.6 全局 關系 roo 管理 mod 關聯關系 將系統自檢(BIOS)需要用到的指令,映射進CPU可以查找的線性地址空間(ROM),用來檢查硬件是否正常。                                    內核空

CentOS 6 系統啟動流程

linux 系統啟動流程一、Linux系統簡介 ⒈ Linux組成: kernel+rootfs ①kernel主要功能: 進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能 ②rootfs:程序和glibc

Android系統啟動流程(一)解析init進程啟動過程

option 寫入 android change failed miss 通知 target sna 前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們

系統啟動流程&&管道及重定向

備註 -a linux 系統 初始 stdout runlevel 關註 gpo 發生 System startup process && pipeline and redirection. 試驗環境:debian9 物理機。 第一部分,系統啟動流程: 系統

Android系統啟動流程

包名 more dev ted androi cap 執行 ons 開始 當系統引導程序啟動Linux內核,內核會記載各種數據結構,和驅動程序,加載完畢之後,Android系統開始啟動並加載第一個用戶級別的進程:init(system/core/init/Init.c)

Linux系統啟動流程之chkconfig

Linux系統啟動流程chkconfig根據用戶的要求,需要在系統正常啟動後自動運行某些腳本。chkconfig xxx on 這個命令就自動在對應的rc2 rc3 rc4的目錄下創建腳本先拿rc2.d來看看這個是rc2.d目錄裏一個文件的內容,chkconfig 2345 57 432345指明了運行級別,

第七篇:Linux系統啟動流程

.com 標誌位 linu http 操作系統 流程 mbr 我們 png 1.bios:是在主板上的一段程序,決定計算機從哪一塊啟動介質中讀操作系統。2.硬盤最小單位是扇區,一個扇區512byte,計算機啟動第一個讀的扇區叫“主引導記錄”(MBR),446B:引導信息 6

飲冰三年-人工智能-linux-06 系統啟動流程及安全

我們 bio 分享 而且 比較 image 引導 操作系統 狀態 系統啟動流程   BOIS(Basic Input/Output System)基本輸入輸出系統:硬件和軟件之間的接口,而且是很基本的接口。   grub(Grand Unified BootLoade

Linux操作系統啟動流程

ebo 如果 除了 window mbr 關閉 saslauth 一加 sla 一般來說,所有的操作系統的啟動流程基本就是: 總的來說,linux系統啟動流程可以簡單總結為以下幾步:1)開機BIOS自檢,加載硬盤。2)讀取MBR,進行MBR引導。3)grub引導菜單(

Linux 系統啟動流程

認證 don grand 導致 procedure 圖形界面 大小 發行版 內核 內核簡介: kernel功能:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能 庫:函數的集合,同時提供調用接口;不能作為程序的執行入口單獨執行,只能被程序調用  過程調用:pr

linux操作系統啟動流程,實現kickstart文件制作與光盤鏡像制作

spl enc 圖片 登錄 交互式 引導啟動 system 內核模塊 ini 1、 簡述linux操作系統啟動流程 POST:通電自檢; BIOS:BOIS自檢,加載硬盤; 讀取MBR,進行MBR引導; bootloader:grub引導菜單; 加載內核 Kernel(

Python學習之路——Linux基礎之系統啟動流程

grub.conf 加載 text image ffffff 讀取 基礎 單用戶 python學習 系統啟動流程 整體過程:BIOS → MRB → Kernel → init 1.BIOS決定從哪個盤開始讀操作系統 主引導記錄MBR:共512bytes;前

MSM8937系統啟動流程【轉】

本文轉載自:https://blog.csdn.net/chenzhen1080/article/details/54945992?utm_source=blogxgwz8 1 Boot Address for Processors使用的處理器chipsets裡有不同的處理器,下圖顯示了處理器的型別以及啟動

linux操作系統啟動流程和光盤鏡像制作

loader table RoCE pat 所有 相關 validator stage linux. 1、簡述linux操作系統啟動流程 POST (加電自檢):自檢主要硬件設備如:CPU、內存、硬盤是否正常,以及輸入輸出設備是否存在問題等。 BIOS(Boot Seque