Linux系统启动流程(1)

1.开机启动顺序:POST-->BIOS-->MBR-->Kernel-->/sbin/init

 POST:开机上电自检

 BIOS:主要选择以哪种介质启动

 MBR:找到硬盘MBR主引导记录,加载前446个字节bootloader

 Kernel:启动内核,并加载调用initrd(此文件在系统安装时,存有硬盘等硬件驱动程序)

 init:打开主进程init,启动/etc/inittab,/etc/rc.d/rc.sysinit等文件

2.bootloader主引导器解释

bootloader(MBR)分为LILO: LInux LOader 和 GRUB: GRand Unified Bootloader

而GRUB:分为2个阶段Stage1: 存在MBR当中

Stage1_5: 识别文件系统

Stage2: /boot/grub/*  硬盘基础访问分区

2.1./boot/grub/grub.conf文件启动设定解释

default=0   #设定默认启动的title的编号,从0开始

timeout=5   #等待用户选择的超时时长,单位是秒

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz   #grub的背景图片

hiddenmenu   #隐藏菜单

password redhat  #编辑grub时明文设定grub密码

password --md5 $1$Omcgl$JY881OgTYbHRD/HHGLHzK/.  #编辑grub时的加密密码

title Red Hat Enterprise Linux Server (2.6.18-308.el5)  #操作系统名称,可自由修改

  root (hd0,0)       #内核文件所在的设备;所有类型硬盘一律hd开头

  kernel /vmlinuz-2.6.18-308.el5 ro root=LABEL=/ rhgb quiet #内核文件路径及内核参数

  initrd /initrd-2.6.18-308.el5.img # ramdisk文件路径

  password --md5 $1$Omcgl$JY881OgTYbHRD/HHGLHzK/  #启动内核时的加密密码

2.2.如果grub stage1第一阶段损坏,修复过程 

   方法1.当知道grub stage1损坏,但未重启系统时

      grub     输入grub命令

      grub> root (hd0,0) 指定硬盘上第一个分区为grub分区即boot分区

      grub> setup (hd0)  指定硬盘上安装grub

   方法2.: grub-install --root-directory=/或boot目录分区的父目录  指定硬盘

        如:grub-install --root-directory=/  /dev/sda

2.3.如果grub stage2第二阶段损坏,重启系统后:

  grub> root (hd0,0) 指定boot分区

  grub> find (hd0,0)/  按tab键看是否有kernet和initrd等文件即确认/boot分区状况

  grub> kernel /vmlinuz-XXX-XXX 指定kernel文件路径

  grub> initrd /initrd-XXX-XXX 指定initrd文件路径

  grub> boot  重启

2.4.chroot:切换根目录

     格式: chroot 根路径 [命令]

 chroot /tmp/root  [/bin/bash]

   ldd命令:显示二进制文件所依赖的共享库

      格式:ldd 二进制文件路径

          chroot /bin/bash 

  实例:利用chroot切换根目录,至少能运行ls与cd命令

      mkdir /tmp/root  

      mkdir /tmp/root/bin

      mkdir /tmp/root/lib

      cp /bin/bash /bin/ls /tmp/root/bin/

      ldd /bin/bash 显示bash所依赖的库文件

      ldd /bin/ls  显示ls所依赖的库文件

Linux系统启动流程(1)_Linux

      cp  /lib/* /tmp/root/lib/  将上面指定的库文件复制到/tmp/root/lib/下面

     chroot /tmp/root/   切换根目录 

      pwd           查看当前目录 

      ls            检查ls命令是否能执行

      cd /lib         切换到lib目录 

    Linux系统启动流程(1)_启动流程_02

 总结:切换成功,ls,cd命令都OK,由于touch没有像ls等一样把文件复制过来,所有不能执行成功

      

3./etc/inittab系统运行级别解释

3.1. 运行级别:0-6

0:halt  关机

1: single user mode, 相当于windows安全模式 表示有1,s,S,single

2:multi user mode, 没有 NFS 功能

3: multi user mode, 文本模式&正常模式

4:reserved 保留自定义

5: multi user mode, 图形化界面

6: reboot 重启

格式:id:runlevels:action:process

  id:3:initdefault:

        id: 标识符

    runlevels: 运行哪个级别

      action: 哪种情况下运行

     process: 要运行程序

  si::sysinit:/etc/rc.d/rc.sysinit

    initdefault: 设定默认运行级别

       sysinit: 系统初始化

         wait: 等待级别切换至此级别时执行

       respawn: 一旦程序终止,会重新启动

3.2.查看运行级别命令:

 runlevel: 

 who -r

3.3查看内核release号命令:

 uname -r

3.4./etc/inittab的任务:

  1、设定默认运行级别;

  2、运行系统初始化脚本;

  3、运行指定运行级别对应的目录下的脚本;

  4、设定Ctrl+Alt+Del组合键的操作;

  5、定义UPS电源在电源故障/恢复时执行的操作;

  6、启动虚拟终端(2345级别);

  7、启动图形终端(5级别);

4./etc/rc.d/rc.sysinit文件解释

  1、激活udev和selinux;

  2、根据/etc/sysctl.conf文件,来设定内核参数;

  3、设定时钟时钟;

  4、装载键盘映射;

  5、启用交换分区;

  6、设置主机名;

  7、根文件系统检测,并以读写方式重新挂载;

  8、激活RAID和LVM设备;

  9、启用磁盘配额;

  10、根据/etc/fstab,检查并挂载其它文件系统;

  11、清理过期的锁和PID文件;

5./etc/rc.d/init.d/*服务脚本文件 及 /etc/rc.d/rc{0-6}.d/*下以S或K开头的文件解释

5.1.查看/etc/rc.d/init.d/*的文件

# chkconfig: runlevels SS KK  

 当chkconfig命令来为此脚本在rc{0-6}.d目录创建链接时,

 runlevels表示默认创建为S*开头的链接,

 -表示没有级别默认为S*开头的链接;

 除此之外的级别默认创建为K*开头的链接;

 S后面的启动优先级为SS所表示的数字;K后面关闭优先次序为KK所表示的数字;

# description: 用于说明此脚本的简单功能; \, 续行

chkconfig命令:如果省略级别指定,默认为2345级别;

chkconfig --list: 查看所有独立守护服务的启动设定;

chkconfig --list 服务名称 查看指定独立守护服务的启动设定;

chkconfig --add 服务名称  添加指定的守护进程

chkconfig --del 服务名称  删除指定的守护进程

chkconfig [--level 运行级别] 服务名称 {on|off} 

5.2./etc/rc.d/rc.local:系统最后启动的一个服务或脚本

  一般来说简单服务或命令脚本可追加至rc.local文件

5.3.守护进程的类型:

独立守护进程:独立运行

超级守护进程,包含一个或多个瞬时守护进程:不需要关联至运行级别

               典型代表为xinetd:

6.实例:创建一个独立守护进程服务脚本mylinux,系统启动之后,mylinux运行级别仅为3和5

6.1: cd /etc/rc.d/init.d/  切换至系统脚本守护进程目录

6.2: vim mylinux 增加如下自定义脚本

#!/bin/bash

#以下红色两段必须要写,否则当添加至守护进程时,提示此脚本进程不支持chkconfig

# chconfig: 345 66 33

# description: mylinux is text service.

STATUS() {

 if [ -e /var/lock/subsys/mylinux ]; then

   echo "Running"

 else

    echo "Stop..."

 fi

}

case $1 in

start)

 echo "Starting"

 touch /var/lock/subsys/mylinux

;;

stop)

 echo "Stopping"

 rm -rf /var/lock/subsys/mylinux &> /dev/null

 ;;

restart)

 echo "Restarting"

 ;;

status)

  STATUS

  ;;

*)

 echo "`basename $0` {start|stop|restart|status}"

 ;;

esac      

6.3: chkconfig --add mylinux 添加mylinu守护进程

   chkconfig mylinux off  关闭mylinux守护进程所有运行级别

   chkconfig --level 35 mylinux on 仅开启mylinux守护进程运行在级别3和5

   chkconfig --list mylinux 查看mylinu守护进程运行级别开关情况

Linux系统启动流程(1)_系统_03