linux启动流程及自定义gurb
linux 启动流程
POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 ------->加载选定的Kernel,initrd(内存模拟的磁盘设备需要缓存),initramfs(缓存) ---->获取到根文件系统并挂载,运行init
bootloadler开始以后的挂载流程
1、当系统读取bootloader,挂载内核分区的时候,不识别更高级的磁盘分区上,只能放在基本磁盘分区,而且只支持read1,所以内核和根不在同一个磁盘分区上,我们通常把内核所在的基本磁盘分区挂载到boot分区上。

2、最终bootloader在启动的时候是在临时挂载的 / 下找 vminuz

3、为了节约磁盘空间vmlinuz是被压缩的,节约空间和保证IO速度。在使用的时候内核需要解压,此时vmlinuz被分为2段,一段是没有压缩(解压算法),另一端是压缩的。
解压后 bootloader读取initramfs,的控制权完全交给kernel,内核完成自身初始化,加载磁盘完成后启动init
问题1:/lib/modules在跟文件系统中,kernel如何挂载?不挂载又怎么能找到这个硬盘的驱动程序?
/lib/modules/中是linux所需要的所有模块存放位置,但是kernel现在不知道我们的设备硬件是什么,kernel不可能将所有的模块都放在内核中,因为硬件设备以及功能模块太多了。所以就放到了/lib/modules。但是/lib/modules又是在跟文件系统中。那此时kernel如何能找到硬盘的驱动模块完成并加载呢?因为此时的模块就是在根文件系统上,我们需要先挂载他才能找到所有的模块。这个情况就是为什么要在boot分区中还要放置一个initrd文件的原因了。这个就是启动时加载Kernel后挂载的临时根文件系统。
问题2:又是谁探测到了你的硬盘的型号,并把对应的驱动模块放置在initramfs文件中提供给bootloader呢?
是安装操作系统时,安装程序在安装操作系统时可以探测到你的硬盘是什么设备,需要什么启动程序,做成initramfs文件放到了 bootloader可以读取到的根文件系统中,这样kernel就可以通过这个文件加载根文件系统,而后就可以读取/lib/modules/ 加载所有的其他需要的模块了

就是这个文件,所以有可能都安装了同样的操作系统,但是硬盘的驱动不同。导致了硬盘互换也不能启动的原因。
initrd是个文件系统,帮助kernel完成初始化。内核要将其挂载,以这个为根,挂载后在这里加载真正根文件系统的驱动模块,加载后initrd中有个程序运行后可以替换跟文件系统,将真正的根文件系统替换initrd,替换完以后这个应用程序由谁终止,自身终止就是系统启动的第0个进程。之后就是要访问/sbin/init
/sbin/init: 功能
/etc/inittab
/etc/rc.d/rc.sysinit脚本
操作:
设置主机名
打印文本欢迎信息
激活selinux 与 udev探测额外的硬件设备并为其装在模块
激活swap
挂载etc/fstab中定义的本地文件系统
实现检测根文件系统,并对其以读写方式重新挂在
设置系统时钟,从硬件读取时钟,维护系统软时钟
装在键盘映射
根据 etc/sysctl.conf 设置内核参数
激活软raid与lvm设备
清理var等等目录的操作
设定默认运行级别
启动各种服务
init特性:
id 操作的id
runlevels 在那些级别下运行次操作
action 动作
initdefault 默认执行
process 操作
Centos 5 init: SystemV格式:启动顺序是串行化,初始化程序一个一个执行
Centos 6 init: Upstart:程序依然有依赖,但是不用等待所依赖的程序完成初始化完成(启动初始化程序通过dbus相互通信),和System V兼容性不太好。
Centos 7 : SystemD,和SysV兼容。并且参考OS X 中并行初始化的过程
启动应用程序:将应用程序定义到启动级别中
0:关机
1:单用户模式
2:多用户模式,不支持NFS文进系统
3:完全多用户模式
4:预留级别
5:完全多用户模式:图形模式
6:重启
/etc/init/rcS.conf upstart 支持的脚本
start on startup stop on runlevel task # Note: there can be no previous runlevel here, if we have one it's bad
# information (we enter rc1 not rcS for maintenance). Run /etc/rc.d/rc
# without information so that it defaults to previous=N runlevel=S.
console output
pre-start script
#启动前脚本
for t in $(cat /proc/cmdline); do
case $t in
emergency)
start rcS-emergency
break
;;
esac
done
end script
exec /etc/rc.d/rc.sysinit #中间会执行这个脚本
post-stop script #upstat特有的格式,会定义什么时候执行
#停止后脚本
if [ "$UPSTART_EVENTS" = "startup" ]; then
if [ "$UPSTART_EVENTS" = "startup" ]; then
[ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)
[ -z "$runlevel" ] && runlevel="3"
for t in $(cat /proc/cmdline); do
case $t in
-s|single|S|s) runlevel="S" ;;
[1-9]) runlevel="$t" ;;
esac
done
exec telinit $runlevel
fi
end script
直到最后打印登录界面
/proc/cmdline 启动内核时传递给内核的参数 or /proc/process/cmdline 启动程序时的启动命令。
MBR:
bootloader:引导加载器,装操作系统时又不同的操作系统设定安装的。
引导程序:
win:ntloder
linux:LILO:
LInux LOader,不能引导位于1024柱面(Cylinder以后的分区)的操作系统
GRUB: GRand Unified Bootloader
把系统引导过程划分了3端:
1st stage:位于 MBR bootloader--为了引导snd stage
1.5 stage:位于boot分区上,为识别内核文件所在的文件系统,系统文件系统扩展(为什么linux可以识别更多的文件系统)
2ndstage:位于boot分区上,GRUB引导程序
[root@vm2 keepalived]# ls /boot/grub/
device.map ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 xfs_stage1_5
e2fs_stage1_5 grub.conf menu.lst splash.xpm.gz ufs2_stage1_5
fat_stage1_5 iso9660_stage1_5(docker) minix_stage1_5 stage1 vstafs_stage1_5
menu.lst -> ./grub.conf 这个就是grob主配置文件,stage2 读取这个配置文件
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,)
# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=
timeout=
splashimage=(hd0,)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.-.el6.x86_64)
root (hd0,)
kernel /vmlinuz-2.6.-.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF- rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.-.el6.x86_64.img
grob 功能;
1,选择启动的内核或系统
内核:linux
系统,win or linux
隐藏
2.提供交互式接口
e:可以编辑修改grob.conf 中的内容
1:单用户模式,给予密码的保护(1,启用内核,2,传递参数及进入编辑模式)

grub.conf 中title 就是现实在启动界面的字符

root(hd0,0) 设定内核所在分区为grub的根
kernel 制定内核文件的路径。后面可以传递给内核的启动参数
initrd : 指定为内核提供额外驱动功能的ramdisk(因为kernel认为这是磁盘,所以需要做一个磁盘转换为内存的缓存,所以速度慢) ,单 ramfs(因为是文件系统,不需要再次缓存,所以快)
> c
进入修改模式

help root 获取root命令的帮助

查找vmlinuz内核在哪个磁盘上,如果有可以tab补全
然后就可以输入 grub> root (hd0,0) 回车
grub> kernel /vmlinz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root 这个root值必须要写最好备份一份root的位置。因为这个是找不到的
grub> initrd /initramfs-2.6.32-642.el6.x86_64.img #这个文件版本必须和kernel版本对应
boot 启动
>e
进入编辑模式

>e 针对某一行进行修改

修改grub 的根分区

修改添加kernel参数
添加 : 1 单用户模式:几乎不会启动任何服务,且不要登录,但是会执行/etc/rc.d/rc.sysinit
如果不上执行rc.sysinit 传递 emergency
如果想让用户不能随意进入单用户模式,两种方式
位置不同输入密码的时间就不同

设置加密密码:


重启

需要敲e建输入密码 ,这是需要p进入密码输入
启动输入密码:

grub.conf 位置文件其他的含义
default=0 . #定义默认启动那个title
timeout=5 #启动倒计时
splashimage=(hd0,)/grub/splash.xpm.gz #显示启动时背景图片
hiddenmenu #隐藏菜单 默认隐藏,只显示倒计时。去掉就直接显示选择的那个os
password --md5 $$PFbU5/$/h/7uhL5LISHvrPyVTBiz0
#password centos
title CentOS (2.6.-.el6.x86_64)
root (hd0,) #hd0 磁盘, 0分区
#磁盘表示方式:在grub中,都已hd开头,并紧跟一个数字做各磁盘设备的标记,第几块硬盘
#分区:0-3 主分区,逻辑分区从5开始,一般boot在磁盘的最外道的分区上
kernel /vmlinuz-2.6.-.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-
rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
# 制定内核文件,及传递给内核的参数
#ro root=/path/to/DEVICE 以只读方式挂载真正的根分区位置,而后在sysinit中还要重新rw挂在一边
#quiet 内核初始化信息模式:静默,不输初始化信息
initrd /initramfs-2.6.-.el6.x86_64.img
#通常为cpio归档,并使用gzip压缩,通常以img作为后缀,因为这个是个磁盘映像文件。
password --md5 $$PFbU5/$/h/7uhL5LISHvrPyVTBiz0
~
linux启动流程及自定义gurb的更多相关文章
- Linux启动流程CentOS6和7的区别
目 录 Linux启动流程 I 第1章 CentOS6启动流程 1 1.1 BIOS 1 1.2 MBR 1 1.3 GRUB 1 1.4 kernel(加载内核) ...
- 浅析Linux启动流程
Linux系统启动流程 Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程.了解 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助 ...
- Linux启动流程和服务管理(init和systemd)
目录 一:Linux启动流程 init和Systemd的区别 二:Linux服务管理(service,systemctl) 一:Linux启动流程 Rhel6启动过程: Rhel7启动过程: GRUB ...
- linux启动流程
看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...
- Linux启动流程详解
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- Linux启动流程详解【转载】
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- 记录Linux启动流程的工具bootchart
/********************************************************************* * Author : Samson * Date ...
- Linux课程---8、Linux启动流程
Linux课程---8.Linux启动流程 一.总结 一句话总结: grub启动引导界面(比如装了多系统,选择系统),找到linux内核 启动init程序,加载各种驱动 1.进入grub界面选择相应的 ...
- 20、linux启动流程和救援模式
1.Linux启动流程 2.Linux运行级别 1.什么是运行级别,运行级别就是操作系统当前正在运行的功能级别 System V init运行级别 systemd目标名称 作用 0 runlevel0 ...
随机推荐
- zstack 离线升级1.1到 1.2 rc
说明 zstack版本1.1是通过离线安装的. 升级过程 1 挂载下一个版本的zstack的社区版本centos镜像 ZStack-Community-x86_64-DVD-1.2.0.iso mkd ...
- MongoDB win安装后无法远程连接访问
mongoDB安装后无法远程连接访问,原因是端口没有开放允许连接的权限 开启允许连接的权限: 管理工具-高级win防火墙
- 转载 wpf使用经验
转载自 胡庆访[ http://zgynhqf.cnblogs.com/ ] WPF 是一个界面层框架技术,要对 WPF 技术达到熟练运用的程度,需要同时拥有开发和设计两方面的知识.而我作为一名开发人 ...
- .net之工作流工程展示及代码分享(预告)
最近在帮公司做一个工作流程序模块,要求是可以嵌入到各种现有的程序中去.我想把自己制作的思路和过程同大家分享. 先上一张结构图: 由于该项目我一个人做,所以系统结构不能太复杂. 用到的技术主要有:DDD ...
- 【原创】Android ExpandableListView使用
ExpandableView的使用可以绑定到SimpleExpandableListAdapter,主要是看这个Adapter怎么用. 这个类默认的构造函数有9个参数, 很好地解释了什么叫做又臭又长. ...
- (二)sql入门 管理数据库对象
在数据库里,有各种各样的对象,除了最常见的表之外,还有诸如视图.索引等数据库对象. 这些对象,在数据库里需要有人来管理,那么谁来管理呢?当然是数据库的使用者了.每个使用者相对于数据库里有一片区域,称为 ...
- 用ajax提交数据到后台以便下载,但是不能下载
在js里面,把一段数据通过post提交给后台,经过后台解析处理,把他以输出流写给浏览器.会发现没得下载提示. 个人觉得是ajax不能解析返回的response里面的流. 如果数据比较大,像post过去 ...
- activiti-5.15备份记录
activiti-5.15用户手册翻译完成 源码下载地址:http://activiti.org/download.html在线浏览地址: http://www.mossle.com/docs/act ...
- Cellebrite UFED 5.1 发布,全面支持三星 S6 S6 Edge Note5 HUAWEI series
世界级取证公司Cellebrite 昨天发布了最新的 UFED 5.1 系统更新,4PC全面支持三星S6,S6EDGE NOTE5 以及HUAWEI,LG系列恢复,锁屏密码XX!下面是部分截图 有需要 ...
- 初始angular框架(2)
看文档看不懂吧 那就应该看看点例子 看什么例子呢 看看视频教程 一般老师会把一些重要的地方着重讲解的 不懂就反复的看