第一步、POST加电自检
POST(Power On Self Test)首先对每一个设备进行检查。完成后会寻找存有引导记录的设备,找到后读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。
第二步、MBR引导
MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。
第三步、GRUB(GRand Unified Bootloader)加载内核
就是MBR中的前 446 个字节,是BooTLoader的一种,它的作用是要选择要启动的内核。
[root@Linux_1 grub]# ll
总用量 274
-rw-r--r--. 1 root root 6311月 15 00:12 device.map
-rw-r--r--. 1 root root 1339211月 15 00:12e2fs_stage1_5
-rw-r--r--. 1 root root 1263211月 15 00:12fat_stage1_5
-rw-r--r--. 1 root root 1176011月 15 00:12ffs_stage1_5
-rw-------. 1 root root 73711月 15 00:12 grub.conf
-rw-r--r--. 1 root root 1176811月 15 00:12 iso9660_stage1_5
-rw-r--r--. 1 root root 1328011月 15 00:12jfs_stage1_5
lrwxrwxrwx. 1 root root 1111月 15 00:12 menu.lst-> ./grub.conf
-rw-r--r--. 1 root root 1196811月 15 00:12minix_stage1_5
-rw-r--r--. 1 root root 1442411月 15 00:12reiserfs_stage1_5
-rw-r--r--. 1 root root 134111月 15 2010splash.xpm.gz
-rw-r--r--. 1 root root 51211月 15 00:12 stage1
-rw-r--r--. 1 root root 126108 11月 15 00:12 stage2
-rw-r--r--. 1 root root 1203611月 15 00:12ufs2_stage1_5
-rw-r--r--. 1 root root 1137611月 15 00:12vstafs_stage1_5
-rw-r--r--. 1 root root 1397611月 15 00:12xfs_stage1_5
stage:用于grub引导程序过大,所以分2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成后可以找到第二段。但是,第二段是存放于内核文件系统中的,此时还没有格式化文件系统,如何可以访问到第二段的 menu.lst 呢??就需要借助于中间层stage1_5,有它来协助 stage1段来访问 stage2 段。stage1_5通常位于 stage1 字段后的 63 个扇区。 由于stage2 在内存中存放可以使用的文件系统不确定,所以这就是有多个 stage1_5 的原因了。
1、grub.conf 文件参数意义
default=1 # 默认启动的内核title, 0 表示是第一个
timeout=5 # 默认等待时间
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz # 指定菜单的背景图片的路径。为xpm格式,采用gzip压缩,只能为14bits色
hiddenmenu # 隐藏菜单
title CentOS (2.6.32-358.el6.x86_64) # 标题名,用户可自定义
root (hd0,0) # 指定 grub 的根位置
#指定 kernel 文件的位置,还要指出 root(系统启动后)的位置,挂载方式 ro,这项很关键。
#加载后会启动 init 进程。
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg0-rootrd_NO_LUKS rd_NO_DM.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MDSYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=autoquiet rhgb quiet
#在内核启动过程中装载根文件系统时有用
initrd /initramfs-2.6.32-358.el6.x86_64.img
initramfs-2.6.32-358.el6.x86_64.img的本质
#initramfs 是以 gzip 压缩的 cpio 格式的文件。内核启动时将他作为一个临时的根文件系统
# grub的 stage2 将initrd加载到内存里,让后将其中的内容释放到内存中
# 内核便去执行init脚本,这时内核将控制权交给了init文件处理
#init 它也主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后
# 会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载
# 这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序
# 执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了
四、启动 init 进程
init 进程是系统启动的第一个进程。其他进程都是有此进程控制fork出来的,也就是说,init是其他进程的“祖先”,PID=1。当然,PID=0进程我们称为空闲进程是属于内核的。
init启动后所做的事情:
1、读取/etc/inittab来读取默认级别 假设:读取到的默认级别是3
/etc/init/*.conf
0:关机shutdown init 0
1:单用户模式(single user)无须认证,维护模式,直接登录不需密码
2:多用户模式(multi user)会启动网络功能,但不会启动NFS,维护模式
3:多用户模式(multi user)完全功能模式,只是文本界面,不会启动图形界面
4:预留级别:目前无特别使用目的,但习惯以同3级别功能使用
5:多用户模式(multi user)完全功能模式,图形界面
6:重启reboot
2、执行初始化系统脚本 /etc/rc.d/rc.sysinit
获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。
欢迎信息。
挂载/etc/fstab文件中定义的其它文件系统。
激活swap
检测根文件系统,并以读写方式重新挂载
决定是否启动SELinux和udev。
接口设备的检测与即插即用(pnp)参数的测试。
用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。
加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能。
设置系统时间(clock)。
设置终端的控制台的字形。
设置raid及LVM等硬盘功能。
以方式查看检验磁盘文件系统。
进行磁盘配额quota的转换。
重新以读取模式载入系统磁盘。
启动quota功能。
启动系统随机数设备(产生随机数功能)。
清楚启动过程中的临时文件。
将启动信息加载到"/var/log/dmesg"文件中
3、然后执行 /etc/rc.d/rc 脚本
此脚本运行的时候此脚本的时候,会读取/etc/rc.d/rc3.d/下的所有脚本,来控制系统启动的时候启动或者关闭那些服务
[root@Linux_1 rc3.d]# pwd
/etc/rc.d/rc3.d
[root@Linux_1 rc3.d]# ll
总用量 0
lrwxrwxrwx. 1 root root 15 11月 15 00:57 K80kdump -> ../init.d/kdump
lrwxrwxrwx. 1 root root 24 11月 15 00:57 K84wpa_supplicant -> ../init.d/wpa_supplicant
lrwxrwxrwx. 1 root root 21 11月 14 23:57 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 14 11月 15 00:57 K88sssd -> ../init.d/sssd
lrwxrwxrwx. 1 root root 15 11月 14 23:57 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 19 11月 15 00:57 K95firstboot -> ../init.d/firstboot
lrwxrwxrwx. 1 root root 14 11月 15 00:10 K99rngd -> ../init.d/rngd
lrwxrwxrwx. 1 root root 17 11月 15 00:09 S01sysstat -> ../init.d/sysstat
lrwxrwxrwx. 1 root root 22 11月 15 00:09 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 22 11月 15 01:01 S03vmware-tools -> ../init.d/vmware-tools
lrwxrwxrwx. 1 root root 19 11月 15 00:00 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 11月 14 23:57 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 11月 14 23:57 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 11月 15 00:11 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 21 11月 14 23:53 S11portreserve -> ../init.d/portreserve
lrwxrwxrwx. 1 root root 17 11月 14 23:59 S12rsyslog -> ../init.d/rsyslog
#这里面的脚本大致分为 2 类,以 S 开头的和以 K 开头的脚本。
# S 代表开机时启动的,K 表示开机时不启动。
# 启动的定义是在每个脚本中定义的:例如
# # chkconfig: - 85 15
# 默认级别 启动次序 不启动次序
4、执行/etc/rc.d/rc.local脚本,此脚本是启动过程中最后启动的一个脚本。
最后会执行 /bin/login 登录用户。至此系统启动过程完成。