Linux的init

Linux执行完一些初始化以后,第一个启动init进程。init进程是所有进程的父进程,负责启动其它进程,这些进程大多数是服务进程(daemon)。随着时间的推移这个启动过程也在变化。但目前主要有两种:System V style的runlevel式启动和upstart代表的event-based启动。

1,System V style的runlevel启动

init进程会读取/etc/inittab来决定进入哪一个runlevel。

/sbin/init => /etc/inittab => runlevel  rc script [/etc/rcN.d]

runlevel有些类似Windows中你按下F8进入的安全模式,但比Windows划分的更细,除此之外你还可以通过配置决定每个runlevel加载一些什么服务。不同的Linux发行版对runlevel的解释会有所不同,但runlevel思想是一样的:init通过/etc/inittab决定它的runlevel,然后去/etc/rcN.d/(N代表runlevel的数字表示)去找相应的启动脚本。

2,upstart是的启动

通过/etc/inittab的启动已经不能满足当前的需要了,比如支持一些热插拔设备。一种event-based的init启动产生了。ubuntu中就是使用upstart来启动系统的。upstart使用/etc/init/目录来决定系统在启动时运行那些服务。你可以通过intctrl来控制upstart启动的服务。

3,Ubuntu对System V style runlevel的模拟

你若查看/etc/init/目录,你可以看见一个为rc.conf的脚本,这个脚本起到的作用就是对system v style runlevel的模拟。我们看下这个脚本:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# rc - System V runlevel compatibility
#
# This task runs the old System V-style rc script when changing between
# runlevels.
 
description "System V runlevel compatibility"
author      "Scott James Remnant <[email protected]>"
 
emits deconfiguring-networking
emits unmounted-remote-filesystems
 
start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]
 
export RUNLEVEL
export PREVLEVEL
 
console output
env INIT_VERBOSE
 
task
 
exec /etc/init .d /rc $RUNLEVEL

这个脚本通过执行/etc/init.d/rc $RUNLEVEL来运行具体的rc script。这些rc script在/etc/rcN.d/目录下。由此完成了对system v style runlevel的模拟。

不仅如此,ubuntu还提供了update-rc.d命令,你可以通过此命令来完成system v style runlevel启动脚本的配置。比如你想在启动时不启动apache:

update-rc.d apache2 disable

ubuntu将所有启动脚本放在/etc/init.d/这个目录下。当你运行update-rc.d命令时update-rc.d会根据你的参数新建一些symbol link到相应的/etc/rcN.d/目录。

/etc/init.d/目录下的启动脚本编写也比较简单,你可以参考/etc/init.d/skeleton这个示例。


ubuntu10.04以及10.10启动流程与以前的版本相比,启动流程有所不同。我也是初学,琢磨了一个下午,才理清他的工作流程。至于里面详细的脚本文件,简单的能看的懂,复杂的我也不太想去分析,我的目标是驱动程序的编写。
1.加电自检,BIOS找出存储设备中的MBR,加在MBR中的引导程序。
2.找出1-62扇区中的引导程序,并运行他。或者找出MBR中的磁盘分区表,找出活动的磁盘分区。加载并运行位于/或者/boot分区中的第二阶段引导程序
3.读取/boot/grub/grub.cfg配置文件,根据里面的配置,此时在控制台上会出现一个启动菜单。如果是双系统的话,此时让你选择启动windows还是Linux。
4.根据用户的选择,加载系统内核文件和磁盘内存映像文件,将控制权交给内核
5.解压磁盘内存映像文件到/dev/ram0设备中。释放磁盘内存映像占有的内存空间
6.安装/dev/ram0设备,把初始内存映像文件安装成一个临时/文件系统。
7.系统检查硬件环境,配置硬件驱动程序。根据需要加载各种驱动模块。
8.如果系统存在/linuxrc文件,以超级用户执行他。
9.卸载临时/文件系统,释放内存空间,安装实际的/文件系统。
10.访问/文件系统。运行/sbin/init程序,把引导控制权交给init进程。有init进程完成系统的生成过程。
11.init检索/etc/init目录,找出并运行其中的rc-sysinit.conf文件。设置默认的运行水平为2.在这里我们要根据倒数最后两行的脚本文件即:||etc/init.d/rcS这一句。以及下面的切换到默认的运行水平。我们可以看到在rcS脚本中只有一句命令:exec /etc/init.d/rc  S.执行/init.d中的rc脚本文件,参数为S。
12.rc脚本文件会根据传递的参数启动/etc/rcS.d中的shell脚本。我们可以看到rcS.d中全是以S和数字为开头的符号链接,脚本文件会根据符号链接执行相应的脚本。
13:执行完后,执行rc-sysinit.conf中的最后一句,即调度运行telinit程序。切换到默认运行水平
14:根据/etc/init/rc.conf脚本来执行相应运行水平的系统调用etc/init.d/rc  $runlevel
15:rc脚本文件会根据传递的参数启动/etc/rc"runlevel".d中的shell脚本.启动各种服务与进程,直到出现一个登录界面。
注:这是我结合以前的书籍,以自己的理解琢磨的,中间可能有误,等将来相关书籍出现以后,再进行修改。对于这个流程,现在只是进行一个直观的认识。对于下一步的嵌入式Linux学习,有一个直观的概念。以后在进行深入。

ubuntu 修改MySQL开机自启动

取消自动启动

  linux:/etc/init.d">root@sean-linux:/etc/init.d# service mysql stop

  * Stopping MySQL database server mysqld [ OK ]

  root@sean-linux:/etc/init.d# update-rc.d -f mysql remove

  Removing any system startup links for /etc/init.d/mysql ...

  /etc/rc0.d/K21mysql

  /etc/rc1.d/K21mysql

  /etc/rc2.d/S19mysql

  /etc/rc3.d/S19mysql

  /etc/rc4.d/S19mysql

  /etc/rc5.d/S19mysql

  /etc/rc6.d/K21mysql

  手动启动

  root@sean-linux:/etc/init.d# service mysql start

  * Starting MySQL database server mysqld [ OK ]

  * Checking for corrupt, not cleanly closed and upgrade needing tables.

  手动停止

  root@sean-linux:/etc/init.d# service mysql stop

  * Stopping MySQL database server mysqld [ OK ]

  添加自动启动

  root@sean-linux:/etc/init.d# update-rc.d -f mysql defaults

  Adding system startup for /etc/init.d/mysql ...

  /etc/rc0.d/K20mysql -> ../init.d/mysql

  /etc/rc1.d/K20mysql -> ../init.d/mysql

  /etc/rc6.d/K20mysql -> ../init.d/mysql

  /etc/rc2.d/S20mysql -> ../init.d/mysql

  /etc/rc3.d/S20mysql -> ../init.d/mysql

  /etc/rc4.d/S20mysql -> ../init.d/mysql

  /etc/rc5.d/S20mysql -> ../init.d/mysql

  root@sean-linux:/etc/init.d#

  ----------------------------------------------------------------------------

  补充

  Ubuntu 取消 Apache及MySQL等自启动

  1. 装个 sysv-conf-rc

  2. sudo update-rc.d -f mysql remove 删除mysql随机器启动的服务

  sudo update-rc.d -f apache2 remove 删除apache2随机器启动的服务

  3. 查看/etc/rc2.d/里面的apache和mysql启动脚本,通常都是两个阿拉伯数字后再接一个英文字母,再加脚本名称。英文字母是S的都是会自动启动的,K则相反。所以只要找到apache和mysql的启动脚本,把S改成K就可以了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------

Linux 開機:

第一個先執行/sbin/init
然後會執行 /etc/inittab, 但這個node以被移除分散到 /etc/event.d/底下 (ubuntu10.10後則是/etc/init/底下)

描述

在核心載入完畢、進行完硬體偵測與驅動程式載入後,此時你的主機硬體應該已經準備就緒了 (ready)
此時核心會主動的呼叫第一支程式,那就是 /sbin/init 囉
你會發現 init 的 PID 號碼是一號
/sbin/init 最主要的功能就是準備軟體執行的環境,包括系統的主機名稱、網路設定、語系處理、檔案系統格式及其他服務的啟動等。
而所有的動作都會透過 init 的設定檔,亦即是 /etc/inittab (10.10 但這個node以被移除分散到 /etc/event.d/底下) 來規劃,
而 inittab 內還有一個很重要的設定項目,那就是預設的 runlevel (開機執行等級) 啦!

/ etc / event.d /目錄 [10.10版本修改为/etc/init/目录]
是upstart核心,upstart将所有进程的触发、停止等看作事件,存在在此目录。主要有3种:rc-default,rcX(0..6,S),ttyX。
[10.10版本只有/etc/init/rc.conf rcS.conf (没有rcX(0..6))及其他*.conf,
rcS.conf最后:
# Switch, passing a magic flag
start --no-wait rc-sysinit FROM_SINGLE_USER_MODE=y
end script
]

rc-default类似inittab文件,设置默认运行级别。ubuntu默认级别2,可在此文件修改。
[10.10版本修改为rc-sysinit.conf?在该文件看到 env DEFAULT_RUNLEVEL=2,后面的
env RUNLEVEL=
env PREVLEVEL=
...
...
# Switch into the default rundevel
telinit "${DEFAULT_RUNLEVEL}"
end script
]

/ etc / init.d中/目錄

  • 系統啟動需要的腳本及安裝的服務的啟動腳本。
  • S啟動時運行的腳本 K啟動時不運行。
  • nn的運行優先級別,越小越先。

初始化進程啟動的工作

  1. 運行系統級別的自啟動腳本(/etc/ rcS.d)
  2. 確認運行級別的/ etc / event.d / RC -default,默認 2 [10.10版本修改为rc-sysinit.cong]
  3. 運行相應級別的RCX文件/ etc/event.d/rc2
  4. 運行 RC程序/ etc / init.d/ RC 2
  5. 運行用戶級的啟動腳本 / etc/rc2.d/中的腳本

然後就可以登錄了。

管理啟動項目

  1. 圖形界面管理自動加載程序
    • 系統 > 首選項 > 會話
  2. 圖形界面管理自動加載服務
    • 系統 > 系統管理 > 服務
  3. 編輯腳本實現程序自動加載
    • / etc / init.d中/ rc.local中是系統最後一個運行的腳本。sudo gedit /etc/init.d/rc.local 到最後加入要運行的程序
  4. 编辑自己的服务启动脚本
    • sudo gedit /etc/init.d/myscript
      #! /bin/sh
      case "$1" in
      start)
      ...
      ;;
      stop)
      ...
      ;;
      restart | force-reload)
      ...
      ;;
      *)
      exit 1
      esac
      -------

      sudo chmod 755 /etc/init.d/myscript
      ls -s /etc/init.d/myscript /etc/rc2.d/S99myscript

  5. 使用其它工具进行管理

sysv-rc-conf 需要安装 手动编辑/自动编辑(sudo sysv-rc-conf myscript on)

你可能感兴趣的:(Linux的init)