admin管理员组文章数量:1625803
Linux开机流程&Systemd&grub
fromNet,感谢网络 带来有趣/专业
总结:
1、Boot : 'pull oneself up by one's bootstraps',计算机启动是一个很矛盾的过程,必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!
2、分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径
参考文献:
深入理解计算机启动的过程
http://www.360doc/content/17/0107/03/18268484_620651307.shtml
Linux 开机引导和启动过程详解
https://mp.weixin.qq/s/zl1djvkq681Q6gkeo6zk3Q##
linux系统的启动过程简要分析
https://wwwblogs/activecode/p/9454472.html
Boot的来历:
我们每天使用计算机必须要经过的一个步骤就是启动了,但是,你是否知道计算机到底是怎样启动的呢?如果不知道它是怎样启动的,似乎总感觉有些别扭。
先问一个问题,”启动”用英语怎么说?
回答是boot。可是,boot原来的意思是靴子,”启动”与靴子有什么关系呢? 原来,这里的boot是bootstrap(鞋带)的缩写,它来自一句谚语:
'pull oneself up by one's bootstraps'
字面意思是”拽着鞋带把自己拉起来”,这当然是不可能的事情。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!
早期真的是这样,必须想尽各种办法,把一小段程序装进内存,然后计算机才能正常运行。所以,工程师们把这个过程叫做”拉鞋带”,久而久之就简称为boot了。
Linux开机流程:
第一步: BIOS自检
服务器开机后BIOS检查内存(640k常规内存)、显卡、CPU、内存,标准硬件(磁盘、cdrom,并口等等)的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性。
第二步: 读取MBR(Master boot Record)
MBR是位于一扇区,零磁道,零柱面,512字节,里面有446是引导区(PRE-BOOT) ,用来找到66字节的活动分区(active)并将活动区读入0×7c00内存,其实被复制到内存的就是我们说的BOOT Loader,suse默认就是GRUB。
第三步:加载Boot Loader
Boot Loader的种类有很多, 其实是一段小程序,初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状 态,以便为最终调用操作系统内核做好一切准备。其中grub、lilo和spfdisk是常见的Loader。
第四步:加载内核
系统将解压后的内核放置在内存中开始调用start_kernel()函数, 来初始化各种设备,到这里内核环境已经建立起来了。
第五步: 加载init system
Linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化。内核初始化的最后一步就是启动 pid 为 1 的 init /systemd进程。这个进程是系统的第一个进程。它负责产生其他所有用户进程。
Init 系统能够定义、管理和控制 init 进程的行为。它负责组织和运行许多独立的或相关的始化工作(因此被称为 init 系统),从而让计算机系统进入某种用户预订的运行模式。仅仅将内核运行起来是毫无实际用途的,必须由 init 系统将系统代入可操作状态。比如启动外壳 shell 后,便有了人机交互,这样就可以让计算机执行一些预订程序完成有实际意义的任务。或者启动 X 图形系统以便提供更佳的人机界面,更加高效的完成任务。这里,字符界面的 shell 或者 X 系统都是一种预设的运行模式。
SysVinit 运行非常良好,概念简单清晰。它主要依赖于 Shell 脚本,这就决定了它的最大弱点:启动太慢。在很少重新启动的 Server 上,这个缺点并不重要。而当 Linux 被应用到移动终端设备的时候,启动慢就成了一个大问题。为了更快地启动,人们开始改进 sysvinit,先后出现了 upstart 和 systemd 这两个主要的新一代 init 系统
常见init系统包括sysvinit,UpStart 和 systemd
rhel5 init 系统使用sysvinit
rhel6 init 系统使用UpStart
rhel7 init 系统使用systemd
sles11 init 系统使用sysvinit
sles12 init 系统使用systemd
systemd介绍
Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。systemd 和 ubuntu 的 upstart 是竞争对手,目前主流操作系统均使用systemd 作为init系统。
systemd 的目标是:
尽可能启动更少的进程
尽可能将更多进程并行启动
UpStart 对 SysVinit 的改进
systemd 的并发启动
systemd 比 UpStart 更进一步提高了并行启动能力,极大地加速了系统启动时间
systemd 提供按需启动能力
当 sysvinit 系统初始化的时候,它会将所有可能用到的后台服务进程全部启动运行。并且系统必须等待所有的服务都启动就绪之后,才允许用户登录。这种做法有两个缺点:首先是启动时间过长;其次是系统资源浪费。
Systemd 可以提供按需启动的能力,只有在某个服务被真正请求的时候才启动它。当该服务结束,systemd 可以关闭它,等待下次需要时再次启动它。
日志服务
systemd 自带日志服务 journald,该日志服务的设计初衷是克服现有的 syslog 服务的缺点
Systemd Journal 用二进制格式保存所有日志信息,用户使用 journalctl 命令来查看日志信息。无需自己编写复杂脆弱的字符串分析处理程序
Systemd 的基本概念
单元配置文件会对有关以下项目的信息进行编码:服务、套接字、设备、安装点、自动安装点、交换文件或分区、启动目标、监控的文件系统路径、受 systemd 控制和监管的计时器、临时系统状态快照、资源管理部分或一组外部创建的进程。“单元文件”是 systemd 用于描述下列各项的通用术语:
service: 进程相关信息(例如运行守护程序),文件以 .service 结尾
target :此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已。这样便可以对配置单元做一个统一的控制。这样就可以实现大家都已经非常熟悉的运行级别概念,文件以 .target 结尾
socket :此类配置单元封装系统和互联网中的一个 套接字 ,文件以 .socket 结尾
mount:通常由 fstab 生成器自动生成;文件以 .mount 结尾
swap:内存分页的交换设备或文件相关信息;文件以 .swap 结尾
device:sysfs/udev(7) 设备树中公开的设备相关信息;文件以 .device 结尾
automount :此类配置单元封装系统结构层次中的一个自挂载点。每一个自挂载配置单元对应一个挂载配置单元 ,当该自动挂载点被访问时,systemd 执行挂载点中定义的挂载行为。
snapshot :与 target 配置单元相似,快照是一组配置单元。它保存
Target 和运行级别
systemd 用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其它服务,来创建自己的目标。下表列举了 systemd 下的目标和常见 runlevel 的对应关系
Sysvinit 运行级别 | Systemd 目标 | 备注 |
0 | runlevel0.target, poweroff.target | 关闭系统 |
1, s, single | runlevel1.target, rescue.target | 单用户模式 |
3 | runlevel3.target, multi-user.target | 多用户,非图形化。用户可以通过多个控制台或网络登录。 |
5 | runlevel5.target, graphical.target | 多用户,图形化。通常为所有运行级别 3 的服务外加图形化登录。 |
6 | runlevel6.target, reboot.target | 重启 |
emergency | emergency.target | 紧急 Shell |
**服务管理
任务 | Systemd 命令 | System V init 命令 |
启动服务 | systemctl start cron.service | service crond start |
停止服务 | systemctl stop cron.service | service crond stop |
查看服务状态和重新加载 | systemctl status cron.service | service crond status |
列出服务 | systemctl list-unit-files --type=service | ls /etc/rc.d/init.d/ |
下次开机启动、关闭服务 | systemctl enable cron.service | chkconfig cron on |
输出在各个运行级别下服务的启用和禁用情况 | systemctl list-unit-files --type=service | chkconfig –list |
用来列出该服务在哪些运行级别下启用和禁用 | ls /etc/systemd/system/*.wants/cron.service | chkconfig cron –list |
添加服务 | systemctl daemon-reload | chkconfig cron –add |
服务运行状态查看 | systemctl -t service --state=active | service --status-all |
列出启动失败服务 | systemctl list-unit-files --failed |
|
sles11 rcXX && sles12 rcXX
sles11和sles12都使用rcXX {start|stop|reload|restart|try-restart|force-reload|status}管理服务
sles11系统rcXX是/etc/init.d/XX软链接
sles11:/usr/sbin # ls rc* -al
lrwxrwxrwx 1 root root 17 Aug 2 2012 rcacpid -> /etc/init.d/acpid
lrwxrwxrwx 1 root root 21 Jun 23 2012 rcalsasound -> /etc/init.d/alsasound
lrwxrwxrwx 1 root root 19 Oct 9 2013 rcapache2 -> /etc/init.d/apache2
lrwxrwxrwx 1 root root 16 Jun 23 2012 rcarpd -> /etc/init.d/arpd
lrwxrwxrwx 1 root root 15 Jun 23 2012 rcatd -> /etc/init.d/atd
sles12系统rcXX是/sbin/service软链接
linux-rsx4:~ # ls -al /usr/sbin/rc*
lrwxrwxrwx 1 root root 7 Aug 6 18:30 /usr/sbin/rcSuSEfirewall2 -> service
lrwxrwxrwx 1 root root 7 Aug 6 18:29 /usr/sbin/rcatd -> service
lrwxrwxrwx 1 root root 7 Aug 6 18:29 /usr/sbin/rcauditd -> service
lrwxrwxrwx 1 root root 7 Aug 6 18:29 /usr/sbin/rcautofs -> service
/sbin/service脚本底层也是调用systemctl命令,rcnetwork status==systemctl status network
系统和服务启动时间
列出系统启动时间
# systemd-analyze
Startup finished in 1.632s (kernel) + 2.942s (initrd) + 36.704s (userspace) = 41.278s
列出服务启动时间
# systemd-analyze blame
18.318s kdump.service
15.155s wicked.service
6.015s purge-kernels.service
5.920s postfix.service
1.650s dev-mapper-system\x2droot.device
1.622s dev-mapper-system\x2dusr.device
1.099s plymouth-quit-wait.service
742ms kdump-early.service
598ms display-manager.service
查看启动日志
dmesg -T | less
service 自定义 日常操作注册为服务,并编写规则
使用systemd方式将nginx的日常操作注册为服务,设置开机自启动等
例子:
1.*.*.78
/etc/systemd/system
nginx.service
/etc/systemd/system/nginx.service.d
nginx.sh
1、上传文件:
mkdir /etc/systemd/system/nginx.service.d
路径1:/etc/systemd/system/nginx.service
路径2:/etc/systemd/system/nginx.service.d/nginx.sh
chmod +x /etc/systemd/system/nginx.service.d/nginx.sh
2、加载服务,配置自启动
systemctl daemon-reload
systemctl enable nginx.service
3、服务维护:
#启:
systemctl start nginx.service
#停:
systemctl stop nginx.service
#查看
systemctl status nginx.service
Linux开机过程(详细说明)
接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:
一般来说,所有的操作系统的启动流程基本就是:
总的来说,linux系统启动流程可以简单总结为以下几步:
1)开机BIOS自检,加载硬盘。
2)读取MBR,进行MBR引导。
3)grub引导菜单(Boot Loader)。
4)加载内核kernel。
5)启动init进程,依据inittab文件设定运行级别
6)init进程,执行rc.sysinit文件。
7)启动内核模块,执行不同级别的脚本程序。
8)执行/etc/rc.d/rc.local
9)启动mingetty,进入系统登陆界面。
开机自检
在BIOS将系统的控制权交给硬盘第一个扇区之后,就开始由Linux来控制系统了。
由硬盘启动时,BIOS通常是转向第一块硬盘的第一个扇区,即主引导记录(MBR)。
系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。
BootLoader:是严重地依赖于硬件而实现的,不同体系结构的系统存在着不同的Boot Loader。 Linux的引导扇区内容是采用汇编语言编写的程序,其源代码在arch/i386/boot中(不同体系的CPU有其各自的boot目录),有4个程序文件。
内核加载 根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。
开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程。分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径。
启动第一步--加载BIOS
当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。在BIOS将系统的控制权交给硬盘第一个扇区之后,就开始由Linux来控制系统了。
启动第二步--读取MBR
硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,可里面却存放了预启动信息、分区表信息。可分为两部分:第一部分为引导(PRE-BOOT)区,占了446个字节;第二部分为分区表(PARTITION PABLE),共有66个字节,记录硬盘的分区信息。预引导区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。
系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。
启动第三步--Boot Loader
Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。通常,BootL oade:是严重地依赖于硬件而实现的,不同体系结构的系统存在着不同的Boot Loader。
Linux的引导扇区内容是采用汇编语言编写的程序,其源代码在arch/i386/boot中(不同体系的CPU有其各自的boot目录),有4个程序文件:
◎bootsect.S,引导扇区的主程序,汇编后的代码不超过512字节,即一个扇区的 大 小
◎setup.S, 引导辅助程序
◎edd.S,辅助程序的一部分,用于支持BIOS增强磁盘设备服务
◎video.S,辅助程序的另一部分,用于引导时的屏幕显示
Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader,这里以Grub为例来讲解吧。
系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。
启动第四步--加载内核
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。
start_kenrel()定义在init/main.c中,它就类似于一般可执行程序中的main()函数,系统在此之前所做的仅仅是一些能让内核程序最低限度执行的初始化操作,真正的内核初始化过程是从这里才开始。函数start_kerenl()将会调用一系列的初始化函数,用来完成内核本身的各方面设置,目的是最终建立起基本完整的Linux核心环境。
start_kernel()中主要执行了以下操作:
(1) 在屏幕上打印出当前的内核版本信息。
(2) 执行setup_arch(),对系统结构进行设置。
(3)执行sched_init(),对系统的调度机制进行初始化。先是对每个可用CPU上的runqueque进行初始化;然后初始化0号进程(其task struct和系统空M堆栈在startup_32()中己经被分配)为系统idle进程,即系统空闲时占据CPU的进程。
(4)执行parse_early_param()和parsees_args()解析系统启动参数。
(5)执行trap_in itQ,先设置了系统中断向量表。0-19号的陷阱门用于CPU异常处理;然后初始化系统调用向量;最后调用cpu_init()完善对CPU的初始化,用于支持进程调度机制,包括设定标志位寄存器、任务寄存器、初始化程序调试相关寄存器等等。
(6)执行rcu_init(),初始化系统中的Read-Copy Update互斥机制。
(7)执行init_IRQ()函数,初始化用于外设的中断,完成对IDT的最终初始化过程。
(8)执行init_timers(), softirq_init()和time_init()函数,分别初始系统的定时器机制,软中断机制以及系统日期和时间。
(9)执行mem_init()函数,初始化物理内存页面的page数据结构描述符,完成对物理内存管理机制的创建。
(10)执行kmem_cache_init(),完成对通用slab缓冲区管理机制的初始化工作。
(11)执行fork_init(),计算出当前系统的物理内存容量能够允许创建的进程(线程)数量。
(12)执行proc_caches_init() , bufer_init(), unnamed_dev_init() ,vfs_caches_init(), signals_init()等函数对各种管理机制建立起专用的slab缓冲区队列。
(13 )执行proc_root_init()Wl数,对虚拟文件系统/proc进行初始化。
在 start_kenrel()的结尾,内核通过kenrel_thread()创建出第一个系统内核线程(即1号进程),该线程执行的是内核中的init()函数,负责的是下一阶段的启动任务。最后调用cpues_idle()函数:进入了系统主循环体口默认将一直执行default_idle()函数中的指令,即CPU的halt指令,直到就绪队列中存在其他进程需要被调度时才会转向执行其他函数。此时,系统中唯一存在就绪状态的进程就是由kerne_hread()创建的init进程(内核线程),所以内核并不进入default_idle()函数,而是转向init()函数继续启动过程。
启动第五步--用户层init依据inittab文件来设定运行等级
内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
启动第六步--init进程执行rc.sysinit
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件。
线程init的最终完成状态是能够使得一般的用户程序可以正常地被执行,从而真正完成可供应用程序运行的系统环境。它主要进行的操作有:
(1) 执行函数do_basic_setup(),它会对外部设备进行全面地初始化。
(2) 构建系统的虚拟文件系统目录树,挂接系统中作为根目录的设备(其具体的文 件系统已经在上一步骤中注册)。
(3) 打开设备/dev/console,并通过函数sys_dup()打开的连接复制两次,使得文件号0,1 ,2 全部指向控制台。这三个文件连接就是通常所说的“标准输入”stdin,“标准输出”stdout和“标准出错信息”stderr这三个标准I/O通道。
(4) 准备好以上一切之后,系统开始进入用户层的初始化阶段。内核通过系统调用execve()加载执T子相应的用户层初始化程序,依次尝试加载程序"/sbin/initl"," /etc/init"," /bin/init',和“/bin/sh。只要其中有一个程序加载获得成功,那么系统就将开始用户层的初始化,而不会再回到init()函数段中。至此,init()函数结束,Linux内核的引导 部分也到此结束。
启动第七步--启动内核模块
具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
启动第八步--执行不同运行级别的脚本程序
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
启动第九步--执行/etc/rc.d/rc.local
你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。
启动第十步--执行/bin/login程序,进入登录状态
此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。
一般来说,用户的登录方式有三种:命令行登录、ssh登录、图形界面登录。这三种情况,都有自己的方式对用户进行认证。
1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
2)ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。
3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。
进入 login shell
所谓shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用户登录时打开的shell,就叫做login shell。
Linuix默认的shell是Bash,它会读入一系列的配置文件。上一步的三种情况,在这一步的处理,也存在差异。
1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。
~/.bash_profile
~/.bash_login
~/.profile
需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。
2)ssh登录:与第一种情况完全相同。
3)图形界面登录:只加载 /etc/profile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。
打开 non-login shell
老实说,上一步完成以后,Linux的启动过程就算结束了,用户已经可以看到命令行提示符或者图形界面了。但是,为了内容的完整,必须再介绍一下这一步。
用户进入操作系统以后,常常会再手动开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的那个shell,不读取/etc/profile和.profile等配置文件。
汇总:
1: 启动电源后,主机第一步先做的就是查询BIOS(全称:basic input/output system 基本输入输出系统)信息。了解整个系统的硬件状态,如CPU,内存,显卡,网卡等。嗯,这一步windows算和它是一家。不分彼此。
2: 接下来,就是主机读取MBR(硬盘的第一个扇区)里的boot loader了。这个可是重点哦,据说troubleshooting里就会考这点,给个坏了的loader,叫你修正。windows不支持linux的分区格式。所以,用windows的boot。ini是查不到linux的系统的。一般我装系统都是先装 windows再装linux,然后用grub来做boot loader。两个字:省心!因为linux不像windows那么小气。grub可是支持windows分区格式的哦。
3: 接上一步,主机读取boot loader后,会读取里面的信息,知道谁跟谁是待在哪,假如主机想进入linux系统,读取到linux核心是在/boot文件目录中后,将此核心加载到内存中。开始了接下来的分析启动之旅。
4: OK,第一个运行程序是谁?就是/sbin/init程序。不信,就用top程序看下,是不是PID为1的就是这个东东,它,可是万物之祖啊,我简称它是女娲娘娘(不喜欢亚当夏娃)。
· 5: init首先查找启动等级(run-level)。因为启动等级不同,其运行脚本(也就是服务)会不同。默认的等级有以下几项:
0 - halt (系统直接关机)
1 - single user mode (单人模式,用于系统维护时使用)
2 - Multi-user, without NFS (类似3模式,不过少了NFS服务)
3 - Full multi-user mode (完整模式,不过,是文本模式)
4 - unused (系统保留功能)
5 - X11 (与3模式类似,不过,是X终端显示)
6 - reboot (重新开机)
(不要选择0或4,6 否则,进步了系统的)
· 6: OK。系统知道自己的启动等级后,接下来,不是去启动服务,而是,先设置好主机运行环境。读取的文件是/etc/rc。d/rc。sysinit文件。那究竟要设置哪些环境呢?
· 设置网络环境/etc/sysconfig/network,如主机名,网关,IP,DNS等。
· 挂载/proc。此文件是个特殊文件,大小为0,因为它是在内存当中。里面东东最好别删。
· 根据内核在开机时的结果/proc/sys/kernel/modprobe。开始进行周边设备的侦测。
· 载入用户自定义的模块/etc/sysconfig/modules/*。modules
· 读取/etc/sysctl。conf文件对内核进行设定。
· 设定时间,终端字体,硬盘LVM或RAID功能,以fsck进行磁盘检测。
· 将开机状况记录到/var/log/dmesg中。(可以用命令dmesg查看结果)
· 7: OK,接下来,就是启动系统服务了,不同的run-level会有不同的服务启动。到/etc/rc。d目录中,不同的level会有不同的目录。如启动 3模式,会有个rc3。d目录,里面就保存着服务。其中,S(start)开头的表明开机启动,K(kill)开头的表明开机不启动。数字表示启动顺序。数字越小,启动越早。
注意,他们都是连接到etc/rc。d/init。d/目录中的相关文件。所以,想手工启动某一服务,可以用"/etc/rc。d/init。 d/某个服务 start"启动哦。相反,我们也可以把某个服务ln(链接命令)到不同run-level的目录中。记得打上S或者K+数字哦。
· 8: 读取服务后,主机会读取/etc/rc。d/rc。local文件。所以,如果需要什么开机启动的话,可以写个脚本或命令到这里面来。就不用像上面那么麻烦。以后删除也方便。
OK,经过一番长途跋涉后,系统终于可以安心的开启shell了。
补充:Bios详细过程
计算机初始化启动过程(从打开电源到操作系统启动之前)
a) 按下电源开关,电源就开始向主板和其它设备供电;当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号);CPU马上就从地址FFFF:0000H 处开始执行指令,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。
b) 系统BIOS的启动代码首先进行POST(Power-On Self Test,加电后自检)。POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型;在正常情况下,POST过程进行得非常快,几乎无法感觉到它的存在。POST结束之后就会调用其它代码来进行更完整的硬件检测。
c) 接下来系统BIOS将查找显卡的BIOS。前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡。此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。
d) 查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容。
e) 接着系统BIOS将检测和显示CPU的类型和工作频率,测试所有的RAM,并同时在屏幕上显示内存测试的进度。可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式。
f) 内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CD-ROM、串口、并口和软驱等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。
g) 标准设备检测完毕后,系统BIOS内部支持即插即用的代码将开始检测和配置系统中安装的即插即用设备。每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。
h) 到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。
i) 接下来系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。通常ESCD数据只在系统硬件配置发生改变后才会更新,所以不是每次启动机器时都能够看到“Update ESCD… Success”这样的信息。不过,某些主板的系统BIOS在保存ESCD数据时使用了与Windows 9x不相同的数据格式,于是Windows 9x在它自己的启动过程中会把ESCD数据修改成自己的格式。但在下一次启动机器时,即使硬件配置没有发生改变,系统BIOS也会把ESCD的数据格式改回来。如此循环,将会导致在每次启动机器时,系统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因。
j) ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作:即根据用户指定的启动顺序从软盘、硬盘或光驱启动MBR。在这个过程中会按照启动顺序顺序比较其放置MBR的位置的结尾两位是否为0xAA55,通过这种方式判断从哪个引导设备进行引导。在确定之后,将该引导设备的MBR内容读入到0x7C00[1]的位置,并再次判断其最后两位,当检测正确之后,进行阶段1的引导。
至此,操作系统启动之前的所有启动步骤都完成了,如果从硬盘启动的话,接着就是操作系统的启动过程了。
GRUB from百度百科
GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
基本功能
编辑
GNU GRUB 和GRUB是GRand Unified Bootloader的缩写,它是一个多重操作系统启动管理器。用来引导不同系统,如windows,linux。
在X86架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流。
Windows也有类似的工具NTLOADER;比如我们在机器中安装了Windows 98后,我们再安装一个Windows XP ,在机器启动的会有一个菜单让我们选择进入是进入Windows 98 还是进入Windows XP。NTLOADER就是一个多系统启动引导管理器,NTLOADER 同样也能引导Linux,只是极为麻烦罢了。
引导过程
编辑
由硬盘启动时,BIOS通常是转向第一块硬盘的第一个扇区,即主引导记录(MBR)。
装载GRUB和操作系统的过程,包括以下几个操作步骤:
装载记录
基本引导装载程序所做的唯一的事情就是装载第二引导装载程序。
装载Grub
这第二引导装载程序实际上是引出更高级的功能,以允许用户装载一个特定的操作系统。
装载系统
如linux内核。GRUB把机器的控制权移交给操作系统。
不同的是,微软操作系统都是使用一种称为链式装载的引导方法来启动的,主引导记录仅仅是简单地指向操作系统所在分区的第一个扇区。
设备名称
IDE硬盘用hd开始,SCSI硬盘用sd开头。软盘用fd开头。命名和linux不大一样。是从0算起。
(hd0,0)。表示C盘。
(hd0,4)。表示D盘。当然这里指的是(第一个逻辑分区,如果D盘也是主分区,应该写成hd0,1)
系统的第一个硬盘驱动器表示成(hd0),其上的第一个分区表示为(hd0,0),也就是说对于硬盘,采用(hdx,y)的形式来表示,x、y都是从0开始计数的,x表示硬盘号,y表示分区号。
由于主分区只能有四个,所以第一硬盘的四个主分区分别用(hd0,0)~(hd0,3)来表示;逻辑分区则从(hd0,4)开始算,即第一逻辑分区用(hd0,4),第二逻辑分区用(hd0,5)来表示,依次类推。
一般机子的硬盘都是一个主分区,其余是逻辑分区。因此C盘用(hd0,0),D盘用(hd0,4)来表示。 光盘用(cd)表示,第一软驱用(fd0)表示。
文件的表示:( , ) /path/to/file
在Linux系统中,如ubuntu,(hdx,y)中的y是从1开始计数的。第一逻辑分区用(hd0,5),第二逻辑分区用(hd0,6)来表示
装置 | Lilo | Grub |
IDE1 master | hda, hda1, hda2 | (hd0), (hd0,0), (hd0,1) |
IDE1 slave | hdb, hdb1, hdb2 | (hd1), (hd1,0), (hd1,1) |
IDE2 master | hdc, hdc1, hdc2 | (hd2), (hd2,0), (hd2,1) |
IDE2 slave | hdd, hdd1, hdd2 | (hd3), (hd3,0), (hd3,1) |
文件系统
编辑
一些用户常困惑于GRUB中根文件系统(root filesystem)这一术语的用法。GRUB的根文件系统与Linux的根文件系统是没有关系的!
接口
编辑
当GRUB环境开始载入第二步引导装载程序时,它寻找自己的配置文件(menu.lst)。当找到配置文件后,它使用这个配置文件建立一个要载入的操作系统的菜单列表, 然后显示引导菜单接口。 如果配置文件没有被找到,或者如果配置文件不能读取,那么GRUB将载入命令行接口。
版权声明:本文标题:Linux开机流程&Systemd&grub 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728935406a1180598.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论