系统的加载过程

POST-->BIOS(BOOT sequence) --> MBR(bootloader,446)-->kernel(将kernel加载到内存并解压,利用虚根系统加载硬盘驱动(当伪文件系统退出时,需将/dev,/sys,/proc目录搬运至新根))-->initrd(RHLE5)/initramfs(RHEL6)-->init进程(用户空间的主导程序)

POST-->BIOS(boot squence)-->MBR(bootloader)-->kernl-->initrd--(rootfs)/sbin/init


虚根系统:

    一般是将内存的一段空间做为磁盘使用(RHLE5叫ramdisk-->名称叫initrd,RHLE6叫rmfs

    -->名称叫initramfs)

bootloader加载内核的同时,也加载initrd


kernel功能:

文件管理

进程管理

内存管理

网络管理

安全功能

驱动程序


内核设计风格:

    单内核:所有功能都做进内核,即单内核。linux使用的内核方式。linux上线程叫LWP.(轻量进             程)

           模块化的设计:

                核心:KO(kernel object),readhat suse可以实现动态加载模块功能                                   内核命名:vmlinuz-2.6.32-->/boot/vmlinuz-*(单内核)

                        /lib/modules/2.6.32* (包含了外围模块等内容)

                外围模块:内核路径:/lib/modules/”内核版本号命名的目录“下

    微内核:只是核心,外围功能都做成子系统,需要用的时候,由内核高度使用,windows,solaris

            微内核真正支持多线程的


/lib/modules/2.6.32-279.e16.X86_64/kernel目录模块:

arch:平台

crypto:加密

drivers:驱动

fs:文件系统

kernel:内核自身的额外功能

lib:库

mm:内存管理

net:网络

sound:声卡


chroot命令:将root切换至一个指定的目录

chroot /path/to/temprootdir [command...] 默认是运行bash

    1、创建指定目录

    2、复制bash到指定目录下的/bin目录下

    3、使用ldd命令,查看bash的依赖库,并复制到/lib目录下

    4、chroot /path/to/tmeprootdir

 

ldd命令

ldd /path/to/binary_file:显示二进制文件所依赖的共享库     

[root@localhost kernel]# ldd /bin/bash
        linux-vdso.so.1 =>  (0x00007fff3a1fe000)(虚的,不需要复制)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f15df7df000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f15df5db000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f15df219000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f15dfa1d000)

运行级别:0-6

    0:halt

     1:single user mode(单用户模式,直接登陆管理员,不需要密码)s,S,single

     2:multi user mode(多用户模式,不启动nfs功能)

     3:multi user mode (多用户模式,文本格式,text mode)

     4:reseved(保留级别)

     5: multi user mode ,graphic mode(多用户模式,图形界面)

     6:reboot

/etc/inittab:定义了系统启动的默认级别


详解启动过程

一、grub引导程序设备及修复和加载过程

bootloader(MBR)

常见的bootloader程序(linux):
    LILO:linux loader(8G以上不支持)

    grub:grand unified bootloader

        stage1:MBR.位于/boot/grub/stage1

        stage1.5:用于识别常见不同的文件系统

        stage2:/boot/grub/stage2

grub配置文件:/boot/grub/grub.conf ,grub一切操作都是需要找到boot目录,在boot目录中加载

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0  #设定默认启动的title的编号,从0开始编号
timeout=5  #等待用户选择的超时时长,单位是秒
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz  #指定grub背景图片
hiddenmenu #隐藏菜单
password PASSWD # 给grub设定密码
password --md5 $1$/xVOE$JGcDpajNc05m1KIDcCKgI.
title CentOS 6 (2.6.32-504.el6.x86_64) #引导的内核或操作系统标题,纯字符串,可修改
  root (hd0,0) #内核文件所在的设备,所有类型硬盘一律为HD,(hd#,#) #表示第几个硬盘和分区
        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=8e3b9a7c-8d09-4fed-8cec-6811d0286063 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=128M LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet #内核文件路径,及传递给内核的参数    
        initrd /initramfs-2.6.32-504.el6.x86_64.img #ramdisk文件(虚根路径)
        password --md5 $1$/xVOE$JGcDpajNc05m1KIDcCKgI. #把密码放到title里面,表示在启动内核时需输入密码。

给grub加密:

 方法一:

    password readhat  #设定密码为readhat

 方法二:

    1、使用grub-md5-crypt      

Password: 
Retype password: 
$1$/xVOE$JGcDpajNc05m1KIDcCKgI.

   2、将生成的加密密码串复制到 password后面

grub修复

一、安装stage1,运行grub命令: 

[root@Centos6 ~]# fdisk -l #首先查看有几块硬盘

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002c3d3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1332    10485760   83  Linux
/dev/sda3            1332        1854     4194304   82  Linux swap / Solaris
[root@Centos6 ~]# grub  #运行grub命令
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root (hd0,0) #查看grub所在硬盘和分区,需注意grub的硬盘识别编号与fdisk编号可能不一致
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0) #安装grub,并指定grub所在硬盘
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
[root@Centos6 ~]#sync #将操作同步到硬盘

安装grub(对硬盘的操作)

使用 grub-install --root-directory=DIR

 安装grub程序到主分区硬盘

 1、将要安装grub的硬盘分区挂载到目录(必须要求硬盘中有包含分区,即有分区表的存在)

mount /path/to/dev1 /path/mount/dirctory

2、使用grub--install命令安装grub程序

grub-install --root-directory=/mnt/boot /dev/sdb # /mnt目录下必须包含boot目录,默认是将所有的文件安装到/boot目录下

3、配置/boot目录下的grub.conf文件

[root@Centos6 ~]# cat /mnt/boot/grub/grub.conf 
default=0
timeout=10
title Test linux 6.6
     root (hd0,0)
         kernel /a
         initrd /a

启动时到grub配置界面(grub配置文件丢失等原因造成无法加载内核及initrd文件)

grub> find (hd#,N)/ 使用TAB键补全,即可显示所在分区的内核文件及initrd文件

grub> root (hd0,0)

grub> kernel /PATH/TO/kernel_file

grub> initrd /path/to/initrd_file

grub> boot

再到系统创建grub.conf配置文件,已完成修复

二、kernel的加载及配置

 kernel初始化的过程

    1、设备探测

    2、驱动初始化(可能会从initrd(initramfs)中装载驱动模块)

    3、以只读方式挂载根文件系统

    4、装载第一个进程init(PID:1)




三、 init的初始化

    1、/sbin/init:(/etc/inittab) RHEL6的名称叫upstart(ubuntu开发的)RHEL7上叫systemd

        init只能同时启动一个进程,upstart或systemd可以并行启动多人进程

        upsatrt:使用d-bus机制完成进程单的通信,在/etc/init/目录下有其配置文件,                         将/etc/inittab中的配置切成片,放置到此目录,以.conf结尾

    initab格式

        id:runlevels:action:process   action(动作)

            id:标识符

            runlevels:在哪个级别运行些行

            action:在什么情况下执行此行

            process:要运行的程序

        si::sysinit:/etc/rc.d/rc.sysinit,si不指定ID,sysinit指在系统启动的时候,运行进程

       action:

            initdefault:设定默认运行级别

            sysinit:系统初始化

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

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

    /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文件

启动过程:

  id:3:initdefault:-->si::sysinit:/etc/rc.d/rc.sysinit-->l3:3:wait:/etc/rc.d/rc 3-->/etc/rc.d/rc3.d/1、K* 执行stop 2、S* 执行 start(所有文件都是连接到/etc/rc.d/init.d下的文件)-->/etc/rc.d/rc.local


/etc/rc.d/init.d下的服务脚本支持的参数:

{start|stop|restart|status|reload|configtest}

在/etc/rc.d/init.d目录下的所有服务类脚本,都包含如下两行:

# chkconfig:   345 95 5 
345定义runlevels运行级别,也可以使用“-”,表示没有级别为S*开头的连接 95 即SS定义启动优先次序 5 即KK定义了关闭的优先次序

当chkconfig命令来为此脚本在rc#.d目录下创建连接时,runlevels表示默认创建为S*开头的连接,除此之外的级别默认创建为K*开头的连接,S后面的启动优先级为SS的数字,K后面关闭优先次序为KK所表示的数字

# description: Runs commands scheduled by the "at" command at the time \

用于说明此脚本的简单功能,如果超出一行,使用\续行


chkconfig命令(查看所有独立守护服务的启动设定,即独立守护进程)

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

chkconfig --add SERVICE_NAME 将存入至/etc/rc.d/init.d/SERVICE_NAME的文件创建连接到                          SERVICE_NAME指定的运行级别中。并且生成以K或S开头的文件

chkconfig --del SERVICE_NAME 删除独立守护进程,即删除相应启动项的连接

chkconfig [--level 24] SERVICE NAME {on|OFF}:设定服务的启动级别,level可以省略,默认是2345级


在/etc/rc.d/init.d中创建服务脚本及生成到相应的rc#.d中示例

#!/bin/bash
#
# chkconfig: 2345 77 22
# description: Test Service
# 
LOCKFILE=/var/lock/subsys/myservice

status() {
  if [ -e $LOCKFILE ]; then
    echo "Running..."
  else
    echo "Stopped."
  fi
}

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

case $1 in
start)
  echo "Starting..." 
  touch $LOCKFILE ;;
stop)
  echo "Stopping..." 
  rm -f $LOCKFILE &> /dev/null
  ;;
restart)
  echo "Restarting..." ;;
status)
  status ;;
*)
  usage ;;
esac
[root@Centos6 tmp]# mv myservice /etc/rc.d/init.d/  #移动服务脚本到/etc/rc.d/init.d目录
[root@Centos6 init.d]# find . -name "myservice"
./myservice
[root@Centos6 rc.d]# chkconfig --add myservice #添加服务脚本
[root@Centos6 rc.d]# find . -name "*myservice"
./rc4.d/S77myservice
./init.d/myservice
./rc1.d/K22myservice
./rc3.d/S77myservice
./rc6.d/K22myservice
./rc0.d/K22myservice
./rc2.d/S77myservice
./rc5.d/S77myservice
[root@Centos6 rc.d]# /etc/rc.d/init.d/myservice status #查看服务运行状态
Stopped.
[root@Centos6 rc.d]# /etc/rc.d/init.d/myservice stop
Stopping...
[root@Centos6 rc.d]# /etc/rc.d/init.d/myservice start
Starting...
[root@Centos6 init]# chkconfig --list myservice
myservice      	0:off	1:off	2:on	3:on	4:on	5:on	6:off


/etc/rc.d/rc.local:系统最后启动的一个服务,准确说,应该执行的一个脚本,可以将系统启动时要执行的命令写入此脚本中,可以完成开机启动



inittab总结:

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

运行级别的原理:
1。在目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)
2。在/etc/rc.d下有7个名为rcN.d的目录,对应系统的7个运行级别
3。rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
4。系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
     对于以K开头的文件,系统将终止对应的服务
     对于以S开头的文件,系统将启动对应的服务

5、/etc/rc.d/rc.local 是最后执行的脚本,可以将命令添加至里面,达到系统启动就运行的效果
6。查看运行级别用:runlevel
7。进入其它运行级别用:init N
8。另外init0为关机,init 6为重启系统

RHEL5 /etc/inittab的任务:

1、定义默认运行级别;

2、运行系统初始化脚本/etc/rc.d/rc.sysinit

3、运行指定运行级别对应的目录下的脚本,K为杀死,S为开始

4、设定ctrl+alt+del组合键的操作

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

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

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


守护进程的类型:

    独立守护进程

        xinetd:超级守护进程,所有守护进程都由他管理,需关联运行级别

    瞬时守护进程:不需要关联至运行级别

查看运行级别:

runlevel

[root@Centos6 ~]# runlevel 
N 3

who -r 

[root@Centos6 ~]# who -r
         run-level 3  May  8 11:18

查看内核release号

  uname -r 

[root@Centos6 ~]# uname -r
2.6.32-504.el6.x86_64

  uname -a

[root@Centos6 ~]# uname -a
Linux Centos6.6A 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux