linux服务器系统的详细启动流程 与 难懂的Grub
POST(上电自检,是根据保存在cmos中保存的一些硬件,如内存、CPU、显卡、网卡是否正常)-------》BIOS (BIOS初始化,这里也检查,关键的是有一个启动顺序,找到磁盘位置,如果第一是光盘,就先看光盘在不在,然后看硬盘)------》找到磁盘的MBR(磁盘的0磁道0扇区,里面有一个446字节的bootloader <第一段>,boototloader---->启动<第二段>,我们的linux将这段启动分为2段,在第二段中定义了linux启动时的各种界面,密码,文本输入。但是bootloader会找到默认标示为活动分区的分区,并试图从中加载操作系统的内核,如果能找到,就将其放入内存中,并让其运行起来)------>kernel 初始化(kernel运行成功后,就获得从bootloader而来的控制权,然后开始加载所有能识别外围设备的驱动,但是内核很小能加载的驱动有限,但是最基本要加载磁盘驱动,装载根文件系统)--->init(根文件系统加载后,运行/sbin/init,这时kernel就退到幕后)------>inittab(init靠/etc/initab的设定来初始化系统)
在/etc/initab中的第一行 id:3:initdefault: 定义了默认启动级别3或5
在该运行级别下运行/etc/rc.d/rc/sysinit这个文件
/etc/rc.d/rc/sysinit这个文件就是下面所有启动流程的控制者
激活:selinux 和 udev
根据/etc/sysct1.conf文件设置内核参数
设置系统时钟,系统时钟和主板时钟在开机之后运行方式不一样的
装载键盘映射
启用swap设备
设置主机名称 根据/etc/sysconfig/network
根文件系统检测,完成后一读写的方式重新挂载
激活Raid 和 LVM设备
启用磁盘配额
检查并挂载其他文件系统 根据/etc/fstab
清除过期的锁和pid文件,收尾工作
而我们的内核主要是做
Kernel initialization 都是保存在/var/log/dmesg (binary file) ]#dmesg 查看
主要工作是:
1 硬件设备探测
2 硬件驱动初始化(initrd)我们的内核是不会存有驱动程序的,所有的驱
动文件都是在initrd(假的临时的,中间的根文件系统)中的(如Raid lvm)
initrd这个文件是系统为我们生成的,我们也是可以使用mkinitrd来创建的
3 挂载根文件系统 (ro这时根文件系统只读的,之后会有重新挂载根文件系统的过程)
4 启动/sbin/init (init是初始化系统的主力,其实内核做的工作不多
根据inittab来启动)
当我们的sysinit运行完成后,在系统/etc/rc.d/rc的文件开始运行根据我们选定的运行级别读取/etc/rc.d/rc[0-6].d/*目录下的所有脚本,这些脚本有的定义开启服务有的关闭某种服务,假如我们运行级别为3,就会读取/etc/rc.d/rc3.d/*下的所有文件例如:95atd---->../init.d/atd,但是需要注意的是,该目录下的文件都是链接文件,其实实际脚本在/etc/rc.d/init.d/*下,这些链接中K开头的表示关闭,S开头的表示启动,后面还跟有两位的数字,这些数字表示启动或关闭的优先级,次序 这些数字是根据在/etc/rc.d/init.d/*下对应文件中定义的 例如/etc/rc.d/init.d/atd#checkconfig 345 95 5 345表示在3 4 5运行级别下默认为ON,95 表示Start的次序,5表示关闭次序 ,我们使用
checkconfig命令就是在/etc/rc.d/rc3.d/下创建文件,/etc/rc.d/init.d/*下的文件都运行了之后,最后运行/etc/rc.local文件,这个文件可以让我们的用户在登录提示之前做一些把要做的事情写入,有时候我们通过/etc/rc.d/local 也能访问到,任何命令或脚本都可以
写在这里面,还要定义ctrl+alt+delete组合键,定义ups电源,6个终端----->login,如果我们默认是5级别还要运行一下X11--->xdm(登陆管理器),。
总之这一阶段所作的事情都是在/etc/inittab中定义的,所以只要我们读懂了这些
脚本,我们就能够明白了系统到底做了些什么
详细:流程解剖
BIOS
bootloader:就是系统的引导加载器,用来启动操作系统的,位于MBR中,但不一定是MBR中,有可能在每一个磁盘分区的最开始的扇区中也会有,这个我们叫bootsector,也可以用来安装当前操作系统的bootloader,但是这里的bootloader是不能自己启动的,必须要被MBR中的其他bootloader引导过来。有时候在MBR坏掉的时候我们可以通过U盘,在U盘中装一个MBR,从U盘启动硬盘。在我们当前操作系统中用于引导linux启动的bootloader程序有lilo(不支持大硬盘)、grub(Grant unfied Bootloader)
grub:是一个bootloader,这个可以让我们设定启用什么样的内核,使用什么样的图片,为进入内核之前,提供编辑菜单(如我们的root用户端密码忘了,可以使用1 s single 来进入1级别),并为菜单提供密码保护 这些东西都在/boot/grub/grub.config中定义的
我们讲过我们的grub启动是分段的
1 stage:运行位于MBR中446字节的小程序,这个小程序就是来引导第2段的
2 stage:位于磁盘上某个分区上,这也就是我们的grub绚丽的原因,一般是位于
/boot/grub/中,而我们要看的图片等信息都是在/boot/grub/grub.conf中定义的,而其他的文件都是1.5阶段识别不同的文件系统的
cat /boot/grub/grub.conf
default=0 0表示第1个title用0表示,每个title对应一个系统内核
timeout=5 等用户5秒的选择
splashimage=(hd0,0)/grub/图片名称(640*480 xpm.gz的图片)
hiddemenu 有这一行表示自动隐藏菜单,没有就会显示菜单
title 这后面写的字符串是可以自己定义的
root (hd0,0) 表示我们要加载的操作系统的内核在我们的操作系统的哪个分区上 hd0表示第一块硬盘,0 表示第几个分区。hd是我们grub识别硬盘的方式和/dev/sda不一样 (hd0,0)/grub 就表示为第一块硬盘的第一分区的grub目录,然而我们一般都以/boot作为第 一分区,所以(hd0,0)===/boot 但是在系统启动之前没有根文件系统,就只能以(hd0,0) 表示。系统启动后内核就知道了这是/boot,但是这时候(hd0,0)就相当于根(注意这和启动后 的根不一样,系统启动后的根是在第二个分区上)
kernel /vmlinuz-2.6.18[表示为(hd0,0)/vmlinuz-2.6.18] ro(表示以只读的方式读取内核)
root=/dev/vo10/root(指定在前面内核启动之后真正的根文件系统或操作系统所在的位置)
rhgb 表示一个参数,有没有无所谓
quiet 表示将加载过程隐藏起来
initrd /initrd-2.6.18.image是一个临时的微型的,五脏俱全的包含了大多数驱动的微型linux,主要是用来解决:假如,我们的 root是在逻辑卷上,我们的刚启动的系统内核还没有逻辑卷驱动,这时我们就不能读到在逻辑卷上的根(操作系统)。initrd因为有各样的驱动就来帮助我们读到位于逻辑卷上的根,如果我们的根是放在IDE硬盘上,我们的内核能够识别,那么initrd就没有用了,所以initrd的作用就不言而喻了。就是为了能够保证我们的根文件系统放在高级的磁盘分区上(Raid或LVM),但是我们的内核只能放在基本的磁盘分区上,也就是我们grub所能识别的基本磁盘分区上,这就是为什么我们的boot是在一个基本的分区上,当然我们将boot和根可以同一个分区上,但是根就不能在高级的分区上了。
password:1 放在所有title之上,表示要编辑菜单的时候,要输入密码
2 放在title内的最后一行,表示启动系统要输入密码
我们可以使用 ]#grub-md5-crypt 帮助我们生成加密的密码
不过在我们使用加密的密码时要写成 password --md5 skdjghfkskldfhlk
grub的修复
假如我们的/boot/grub/grub.conf掉了,没了
手动的写,这里是在grub的提示符下 help命令能够帮助我们
grub >find (hd0,0) 看是否我们的vmlinuz在上面
grub >root (hd0,0)
grub >kernel /vmlinuz-2.6.18-164.e15 or root 如果我们不知道根文件系统在什么位置可以不写
grub >initrd /initrd-2.6.18-164.e15 一定要和我们的kerne的版本l一样
grub>boot
这样启动完成之后,我们到要编辑/boot/grub/grub.conf这个文件,将所有的东西写入
安装grub
假如我们整个硬盘grub坏掉了,我们只能将硬盘拔下来,在另个电脑上安装
方法一:
将硬盘挂载上来
]#grub 进入grub提示符
grub>root (hd1,0) 注意这里是hd1
grub>setup (hd1)
grub>quit
]#sync
方法二:
我们的硬盘是有分区的,并且要事先知道grub目录所在的分区
]#mount /dev/sdb1 /mnt/boot 格式这是一定的
]#grub-install --root -directory=/mnt /dev/sdb
命令 grub 设备名
]#sync
这样会在我们的/mnt/boot/下生成一个grub,但是在grub中没有grub.conf
我们要自己写。