第一步、POST加电自检

POST(Power On Self Test)首先对每一个设备进行检查。完成后会寻找存有引导记录的设备,找到后读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。

 

第二步、MBR引导

MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA

 

第三步、GRUBGRand 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 的原因了。

 

 

1grub.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 

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

  • 决定是否启动SELinuxudev 

  • 接口设备的检测与即插即用(pnp)参数的测试。 

  • 用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。 

  • 加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能。 

  • 设置系统时间(clock)。 

  • 设置终端的控制台的字形。 

  • 设置raidLVM等硬盘功能。 

  • 以方式查看检验磁盘文件系统。 

  • 进行磁盘配额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 登录用户。至此系统启动过程完成。