linux 的启动流程分析
2012-06-23 12:48
239 查看
说起linux的启动流程,让我想起一个成语:牵一发而动全身,随着你按下开关的那一刻,屏幕上虽然黑乎乎的没有什么界面,但背后却引来了犹如千军万马的程序。呵呵,这就叫不看不知道,一看吓一跳,下面的两幅图我感觉很好,借来用一用,让大家具体了解一下,你那一个简单的动作所引发的“血案”
图一:
图2:
下面我们一起具体的把每一步分析一下:
第一阶段:硬件引发启动:
1、 POST(power on system test) 加电自检
主板通电后,通过固化在主板上的芯片(BIOS)自检,而BIOS的设置信息保存在 COMS(互补金属氧化物 是记录各种硬件参数且嵌入到主板上面)中,检查计算机启动需要用到的最基本的硬件(cpu,memory,磁盘,鼠标,键盘等),同时也查找启动磁盘,找到启动磁盘的第一个扇区,boot squence(找到MBR)。
2、MBR:Master Boot Record,即主引导记录
共有512个字节,前446个字节记录的是bootloader,grub的安装程序就在bootloader。
bootloader是引导装载程序,使用的软件主要有:LILO,grub。现在主流是grub。我们这里只说grub ,grub出场 ,进入下一阶段。
第二个阶段:grub启动引导
grub分为两个阶段来执行:
stage1:执行boot loader主程序
被安装在启动区,即MBR的前446个字节,作用是启动stage2.
stage2:主程序加载配置文件
是grub的核心映像,加载所有的配置文件与相关的环境参数文件(包括文件系统的定义域主要的配置文件 menu.lst)
配置文件在/boot/grub/
我们来看一下menu.lst
grub加载要启动的内核到内存,并展开。找到内核了,进入下一个阶段
第三阶段:内核引导阶段
1、内核初始化
kernel 启动时完成的任务 :
硬件探测
硬件驱动初始化 (initrd :RAMDISK)
挂载根文件系统(根切换initrd-->rootfs)
启动init进程
内核在/boot 目录下
内核自己初始化,装载基本的硬件驱动,把内核的基本功能初始化。
2、引导initrd解压载入,
initrd其实就是一个小型的linux系统它的作用是将在lvm或raid上根文件系统进行只读性挂载。让内核识别根文件系统所在的磁盘。启动真正的根文件系统的/sbin/init进程
第四个阶段:init初始
1、/sbin/init 的配置文件是/etc/inittab
根据/etc/inittab 的设置启动终端或图形界面
2、/etc/rc.d/rc.sysinit :设置整个系统的环境
实现的功能有 :
n 激活udev和selinux;
n 通过读取/etc/sysctl.conf设置内核参数
n 设置系统时间
n 加载键盘映射
n 启用swap分区
n 设置主机名
n 检查根文件系统,并以读写方式重新挂载根文件系统
n 激活LVM和RAID设备
n 启动磁盘限额
n 挂载其他文件系统
n 清理过期文件锁和PID文件
/etc/rc.d/rc.sysinit这个脚本运行完毕,继续按照/etc/inittab中继续开启对应运行级别中的服务,这些服务有inittab中:
级别不同,只是启动的服务不同 ,
3、/etc/rc.d/rc#.d 决定对应级别下 启动不同的脚本 即不同的服务
对应的rc0~6目录中是各需要开启服务的链接文件,S开头表示开启,K开 头表示关闭。
4、/sbin/mingetty 用户名+密码 决定哪些用户可以登录,哪些不可以。
/etc/login 登陆界面
与三个文件有关
/etc/password /etc/shadow /etc/gshadow
用户登录后,执行对应的 shell
第五个阶段:启动完成
下面 就可以进行自己的工作了 ,暴风雨平静了。
最后总结一下,我们用到的目录和脚本;
由于能力有限,时间有限,写出来的东西也就更有限,先到此结束,路过的大虾有什么意见或建议请直接留言,我会及时改进。
图一:
图2:
下面我们一起具体的把每一步分析一下:
第一阶段:硬件引发启动:
1、 POST(power on system test) 加电自检
主板通电后,通过固化在主板上的芯片(BIOS)自检,而BIOS的设置信息保存在 COMS(互补金属氧化物 是记录各种硬件参数且嵌入到主板上面)中,检查计算机启动需要用到的最基本的硬件(cpu,memory,磁盘,鼠标,键盘等),同时也查找启动磁盘,找到启动磁盘的第一个扇区,boot squence(找到MBR)。
2、MBR:Master Boot Record,即主引导记录
共有512个字节,前446个字节记录的是bootloader,grub的安装程序就在bootloader。
bootloader是引导装载程序,使用的软件主要有:LILO,grub。现在主流是grub。我们这里只说grub ,grub出场 ,进入下一阶段。
第二个阶段:grub启动引导
grub分为两个阶段来执行:
stage1:执行boot loader主程序
被安装在启动区,即MBR的前446个字节,作用是启动stage2.
stage2:主程序加载配置文件
是grub的核心映像,加载所有的配置文件与相关的环境参数文件(包括文件系统的定义域主要的配置文件 menu.lst)
配置文件在/boot/grub/
[root@localhost grub]# ls -l /boot/grub total 233 -rw-r--r-- 1 root root 63 May 29 18:55 device.map -rw-r--r-- 1 root root 7584 May 29 18:55 e2fs_stage1_5 -rw-r--r-- 1 root root 7456 May 29 18:55 fat_stage1_5 -rw-r--r-- 1 root root 6720 May 29 18:55 ffs_stage1_5 -rw------- 1 root root 1003 Jun 11 03:08 grub.conf -rw-r--r-- 1 root root 6720 May 29 18:55 iso9660_stage1_5 -rw-r--r-- 1 root root 8192 May 29 18:55 jfs_stage1_5 lrwxrwxrwx 1 root root 11 May 29 18:55 menu.lst -> ./gr ub.conf -rw-r--r-- 1 root root 6880 May 29 18:55 minix_stage1_5 -rw-r--r-- 1 root root 9248 May 29 18:55 reiserfs_stage1_5 -rw-r--r-- 1 root root 32428 Jan 5 2007 splash.xpm.gz -rw-r--r-- 1 root root 512 May 29 18:55 stage1 -rw-r--r-- 1 root root 104988 May 29 18:55 stage2 -rw-r--r-- 1 root root 7072 May 29 18:55 ufs2_stage1_5 -rw-r--r-- 1 root root 6272 May 29 18:55 vstafs_stage1_5 -rw-r--r-- 1 root root 8904 May 29 18:55 xfs_stage1_5
我们来看一下menu.lst
default=0 #默认启动选项 使用第一个启动菜单(title) timeout=5 #默认时间 splashimage=(hd0,0)/grub/splash.xpm.gz 背景图片 hiddenmenu 隐藏启动菜单 title Red Hat Enterprise Linux Server (2.6.18-308.el5) root (hd0,0) #内核文件的分区 kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet 内核 initrd /initrd-2.6.18-308.el5.img #RAM DISK的文件名 title Install Red Hat Enterprise Linux 5 root (hd0,0) kernel /vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6 initrd /initrd-5 password --md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.
grub加载要启动的内核到内存,并展开。找到内核了,进入下一个阶段
第三阶段:内核引导阶段
1、内核初始化
kernel 启动时完成的任务 :
硬件探测
硬件驱动初始化 (initrd :RAMDISK)
挂载根文件系统(根切换initrd-->rootfs)
启动init进程
内核在/boot 目录下
[root@localhost boot]# ls -l total 26074 -rw-r--r-- 1 root root 70121 Jan 28 06:35 config-2.6.18-308.el5 drwxr-xr-x 2 root root 1024 Jun 21 11:13 grub -rw------- 1 root root 3493005 May 29 18:40 initrd-2.6.18-308.el5.img -rw-r--r-- 1 root root 11406054 May 13 20:00 initrd-5 drwx------ 2 root root 12288 May 29 18:21 lost+found -rw-r--r-- 1 root root 115211 Jan 28 06:35 symvers-2.6.18-308.el5.gz lrwxrwxrwx 1 root root 39 Jun 11 03:08 System.map -> /boot/System.map-2.6.28.10-zhanghui.com -rw-r--r-- 1 root root 990113 Jan 28 06:35 System.map-2.6.18-308.el5 -rw-r--r-- 1 root root 1901940 Jan 28 06:35 vmlinuz-2.6.18-308.el5 -rw-r--r-- 1 root root 1901940 May 13 20:00 vmlinuz-5
内核自己初始化,装载基本的硬件驱动,把内核的基本功能初始化。
2、引导initrd解压载入,
initrd其实就是一个小型的linux系统它的作用是将在lvm或raid上根文件系统进行只读性挂载。让内核识别根文件系统所在的磁盘。启动真正的根文件系统的/sbin/init进程
第四个阶段:init初始
1、/sbin/init 的配置文件是/etc/inittab
根据/etc/inittab 的设置启动终端或图形界面
id:3:initdefault: 默认启动级别 si::sysinit:/etc/rc.d/rc.sysinit 进行系统初始化 l0:0:wait:/etc/rc.d/rc 0 关机 l1:1:wait:/etc/rc.d/rc 1 #单用户模式 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 #多用户模式 l4:4:wait:/etc/rc.d/rc 4 #保留 l5:5:wait:/etc/rc.d/rc 5 #图形界面 l6:6:wait:/etc/rc.d/rc 6 #重启 ca::ctrlaltdel:/sbin/shutdown -t3 -r now pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 x:5:respawn:/etc/X11/prefdm -nodaemon
2、/etc/rc.d/rc.sysinit :设置整个系统的环境
实现的功能有 :
n 激活udev和selinux;
n 通过读取/etc/sysctl.conf设置内核参数
n 设置系统时间
n 加载键盘映射
n 启用swap分区
n 设置主机名
n 检查根文件系统,并以读写方式重新挂载根文件系统
n 激活LVM和RAID设备
n 启动磁盘限额
n 挂载其他文件系统
n 清理过期文件锁和PID文件
/etc/rc.d/rc.sysinit这个脚本运行完毕,继续按照/etc/inittab中继续开启对应运行级别中的服务,这些服务有inittab中:
级别不同,只是启动的服务不同 ,
3、/etc/rc.d/rc#.d 决定对应级别下 启动不同的脚本 即不同的服务
[root@localhost ~]# ls -l /etc/rc.d/ total 112 drwxr-xr-x 2 root root 4096 Jun 14 11:56 init.d -rwxr-xr-x 1 root root 2255 Dec 20 2011 rc drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc0.d drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc1.d drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc2.d drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc3.d drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc4.d drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc5.d drwxr-xr-x 2 root root 4096 Jun 14 11:58 rc6.d -rwxr-xr-x 1 root root 220 Dec 20 2011 rc.local -rwxr-xr-x 1 root root 26815 Dec 20 2011 rc.sysinit
对应的rc0~6目录中是各需要开启服务的链接文件,S开头表示开启,K开 头表示关闭。
[root@localhost ~]# ls /etc/rc.d/rc1.d K01dnsmasq K05conman K24irda K73ypbind K85mdmpd K88auditd K89rdisc S13cpuspeed K01smartd K05saslauthd K25sshd K74acpid K85messagebus K88pcscd K90bluetooth S26lvm2-monitor K02avahi-daemon K05wdaemon K30sendmail K74apmd K85rpcgssd K88syslog K90network S99single K02avahi-dnsconfd K10cups K35vncserver K74haldaemon K85rpcidmapd K88wpa_supplicant K92ip6tables K02NetworkManager K10hplip K35winbind K74ipmi K86nfslock K89dund K92iptables K02rhsmcertd K10psacct K44rawdevices K74named K87irqbalance K89hidd K95firstboot K03rhnsd K10xfs K50netconsole K74nscd K87mcstrans K89iscsi K95kudzu K03yum-updatesd K15gpm K60crond K74ntpd K87multipathd K89iscsid K99microcode_ctl K05anacron K15svnserve K69rpcsvcgssd K75netfs K87portmap K89netplugd K99readahead_early K05atd K20nfs K72autofs K85mdmonitor K87restorecond K89pand K99readahead_later
4、/sbin/mingetty 用户名+密码 决定哪些用户可以登录,哪些不可以。
/etc/login 登陆界面
与三个文件有关
/etc/password /etc/shadow /etc/gshadow
用户登录后,执行对应的 shell
第五个阶段:启动完成
下面 就可以进行自己的工作了 ,暴风雨平静了。
最后总结一下,我们用到的目录和脚本;
配置文件 : /etc/inittab /boot/grub/grub.conf 脚本 : /etc/rc.d/rc.sysinit 二进制程序 : /sbin/init /bin/bash /bin/sh -->/bin/bash 目录 /boot /grub
由于能力有限,时间有限,写出来的东西也就更有限,先到此结束,路过的大虾有什么意见或建议请直接留言,我会及时改进。
相关文章推荐
- 【鸟哥私房菜】第二十章 Linux启动流程分析
- Linux系统启动流程分析
- linux启动流程分析
- [Linux] 启动流程分析
- Linux 启动流程即init程序分析--1
- ARM-Linux移植之(三)——init进程启动流程分析
- ARM-Linux移植之(一)——内核启动流程分析
- linux启动流程分析
- linux启动流程分析
- linux启动流程分析
- 【嵌入式Linux学习七步曲之第四篇 Linux内核移植】PPC Linux启动流程分析
- linux系统启动流程分析
- ARM-Linux移植之(一)——内核启动流程分析
- Linux 解压后的启动流程分析
- linux的启动流程分析-研读
- ARM Linux启动流程分析——start_kernel前启动阶段(汇编部分)
- ARM-linux 启动代码流程分析
- ARM-Linux内核移植之(一)——内核启动流程分析
- linux 2.6 启动流程分析
- linux 2.6 启动流程分析