Linux系统启动过程详解

Linux系统启动流程:

POST --> BIOS(Boot Sequence引导次序) --> MBR(bootloader,446byte) --> Kernel --> initrd(initramfs) --> (ROOTFS) --> /sbin/init(/etc/inittab)

内核设计风格:

单内核:

所有功能都在一个内核中。Linux采用单内核,但是采用了微内核的设计思想。LWP(轻量级进程 light weight pprocess)。

核心:

/boot/vmlinuz-verison

动态加载ko(kernel object 内核专用模块)。

内核模块(ko):/lib/modules/KERNELVERISON/

常见的装载内核模块命令:

#insmod

#modprobe

微内核:

把其他功能做成子内核。Windows Solaris。真正意义上的多线程。

内核提供的功能:

文件系统

进程管理

内存管理

网络管理

安全功能

驱动程序

内核初始化过程:

1.设备探测。

2.驱动初始化

可能从initrd(initramfs(RHEL6))件中装载驱动模块。

3.以只读模式挂载根文件系统(rootfs)。

4.装载用户空间内第一个进程init(PID=1)

initrd:

一个中间层系统,在系统启动是提供必要的基本驱动,生成一个临时根,为内核提供访问真正根文件系统所需要的基本驱动程序。待内核成功挂载根文件系统后,会把临时根下的 /proc、 /sys、/dev移动到真的根下。

ramdisk --> initrd RHEL5 把内存模拟成磁盘使用。

ramfs --> initramfs RHEL6 把内存模拟成磁盘使用。

#chroot TEMPROOTDIR [COMMAND] 临时切换为根目录

例如:

#chroot /tmp/virroot /bin/csh

#ldd FILE 显示二进制文件所依赖共享库。

init:

系统启动的第一个进程。

bin文件路径:

/sbin/init

/etc/init

/bin/init

内核将会依次按以上目录顺序查找init,若都无法找到init,则内核会执行/bin/sh。

配置文件:

/etc/inittab

每一行记录一个要启动或运行的服务(进程)。

设定的任务:

1.设定默认运行级别。

2.运行系统初始化脚本。

/etc/rc.d/rc.sysinit

3.按照以下顺序运行指定运行级别对应目录下的下的服务类脚本。

/etc/rc.d/init.d

/etc/rc.d/rcNUM.d

/etc/rc.d/rc.local

4.设定ctrlaltdel组合键的动作。

5.定义ups电源在电源故障或恢复是执行的操作。

6.启动虚拟终端(level为2345)。

1:2345:respawn:/sbin/mingetty tty1

...

6:2345:respawn:/sbin/mingetty tty6

7.启动图形终端(level为5)。

x:5:respawn:/etc/X11/perfdm-nodaemon

每行结构如下:

id:runlevels:action:process

id:服务参数的标示,1~4个字符。

id 默认RUNLEVEL

si 系统初始化

l0~l6 指定RUNLEVEL

ca 拦截到ctrl+alt+del

pf 电源失效

pr 电源恢复

NUM 配置NUM号虚拟终端

x 启动x服务

runlevels:在哪个级别下运行。

action:在某个事件下执行的动作。

initdefault 设定默认运行级别。

sysinit 系统初始化。

wait 级别切换至此级别时执行。

ctrlaltdel 重启。

powerfail 电源失效。

powerokwait 电源失效后至关机前电源恢复。

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

process:要运行的程序,定义使用绝对路径。

/etc/init/*.conf

该目录下的文件是把inittab文件进行切片后产生的许多.conf文件。都是基于事件驱动编写的。

重启init:

#init q

#telinit q

#kill -HUP 1

运行级别RUNLEVEL:

各个级别区别在于启动的服务不同。

0:halt

1:single user mode

直接怡管理员身份登录,无需验证。

2:mulit user mode no NFS

不启动NFS等网域功能相关的服务器。

3:mulit user mode text mode

命令行模式

4:reseved

保留级别,暂时未定义。

5:mulit user mode graphic mode

图形模式

6:reboot

运行级别的设定:

修改/etc/inittab

查看运行级别:

#runlevel

LSATLEVEL CURRENTLEVEL

其中LASTLEVEL表示上一个级别,N表示没切换过。CURRENTLEVEL表示当前级别。

切换运行级别:

#init [OPTION] LEVEL

[OPTION]

LEVEL

0 关机

1 单用户模式

2 命令行模式(不启用NFS)

3 命令行模式

4 保留模式

5 图形界面

6 重启

S 单用户模式

s 单用户模式

/etc/rc.d/rc.sysinit

设置系统的基本环境,完成以下任务:

1.激活udev和selinux。

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

执行sysctl -p。

3.设定系统时钟。

4.装载键盘映射。

5.启用swap分区。

执行swapon -a -e。

6.设置主机名,从/etc/sysconfig/network中读取HOSTNAME参数。

7.文件系统检测,根据/etc/fstab,检查并挂载其他文件系统。并且在无错误以后,将根以读写方式重新挂载。

8.初始围硬件设备。

定义在/etc/modprobe.conf中的模块

ISA、PnP的设备

USB设备

9.启动RAID和LVM

10.如有必要,卸载initrd

11.初始化串行设备。根据/etc/rc.serial进行初始化。默认无此脚本,需要自行建立。

12.清理过期的锁文件(/var/lock/subsys/*)和IPC文件。

13.重新设置磁盘参数,根据/etc/sysconfig/harddisk DEVICE。

/etc/rc.d/init.d/*

服务类脚本,SysV风格,存放在/etc/rc.d/init.d下。有一个链接文件/etc/init.d --> /etc/rc.d/init.d。

配置文件:

/etc/sysconfig/服务脚本同名

脚本至少接受以下参数:

start|stop|restart|status|reload|condrestart(有条件重启,已启动的重启,未启动的不重启。)

脚本共有特性:

#chkconfig: RUNLEVELS SS KK

RUNLEVELS 启动级别

RUNLEVELS可以用-表示没有级别默认为SNUM开头的链接,即全部都是KNUM开头的链接。

SS 启动的优先级

KK 关闭的优先级

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/16692.html