linux系统启动流程及常见问题的解决
一、前言
计算机开机是一个神秘的过程。我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面。然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或者错误信息。了解计算机开机过程有助于我们修复开机可能出现的问题。
二、Linux启动流程
linux启动时我们会看到许多启动信息,大致可分为:BIOS > MBR > 引导加载程序 > 内核 > init process > login
init程序的类型:
SysV: init, CentOS 5之前, 配置文件: /etc/inittab。
Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。
Systemd:systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。
1、加电自检
当我们打开计算机电源,计算机会自动从主板的BIOS读取其中所存储的程序。这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并口)。现在大部分的BIOS允许从软盘、光盘或者硬盘中选择一个来启动计算机。
2、计算机从所选择的存储设备中读取起始的512 bytes
前512 bytes叫做主引导记录MBR (master boot record)。MBR会告诉电脑从该设备的某一个分区(partition)来装载引导加载程序(boot loader)。加载程序储存有操作系统(OS)的相关信息,比如操作系统名称,操作系统内核所在位置等。常用的boot loader有GRUB和LILO。
GRUB有几个重要的文件,引导顺序: stage 1 > stage 1.5 > stage 2
stage 1:它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。
stage 2:GRUB的核心,所有的功能都是由它实现。
stage 1.5:介于 stage 1和 stage 2之间,是它们的桥梁,因为 stage 2较大,通常都是放在一个文件系统当中的,但是 stage 1并不能识别文件系统格式,所以才需要 stage 1.5来引导位于某个文件系统当中的 stage 2。
根据文件系统格式的不同, stage 1.5也需要相应的文件,如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式。它存放于1-63的柱面之间。
主要的配置文件为 grub.conf
里面选项含义:
title : 一个操作系统引动的标头,可以使多个
root : 指明所需文件存在于哪个磁盘哪个分区上 (hd0,0)表示第一个硬盘,第一个分区,可参考/boot/grub/device.map
kernel : 内核文件的名字,并且会有一些加载内核时的参数 or代表以只读方式加载
initrd : 包含一些附加的驱动程序
3、boot loader加载内核(kernel)
内核实际上是一个用来操作计算机的程序,它是计算机操作系统的内核,主要的任务是管理计算机的硬件资源,充当软件和硬件的接口。操作系统上的任何操作都要通过内核传达给硬件。Windows和Linux各自有自己内核。狭义的操作系统就是指内核,广义的操作系统包括内核以及内核之上的各种应用。我们可以在多个分区安装boot loader,每个引导加载程序对应不同的操作系统,在读取MBR的时候选择我们想要启动的引导加载程序。这就是多操作系统的原理。
4、若加载的是Linux内核,Linux内核开始工作
内核会首先预留自己运行所需的内存空间,然后通过驱动程序(driver)检测计算机硬件。这样,操作系统就可以知道自己有哪些硬件可用。随后,内核会启动一个init进程。它是Linux系统中的1号进程(Linux系统没有0号进程)。到此,内核就完成了在计算机启动阶段的工作,交接给init来管理。
Linux系统有7个运行级别(runlevel):
运行级别0:系统关机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆,可以破译密码
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:有图形化的完全多用户模式,X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
通常使用较多的默认级别为 3 或 5 ,服务器基本上默认使用 3 级别,即文本界面。不同级别之间可以进行切换。
查看init运行级别:runlevel
切换级别:init 5
5、根据boot loader的选项,Linux此时可以进入单用户模式(single user mode)
在此模式下,初始脚本还没有开始执行,我们可以检测并修复计算机可能存在的错误;随后,init会运行一系列的初始脚本(startup scripts),这些脚本是Linux中常见的shell scripts。这些脚本执行如下功能:
设置计算机名称,时区,检测文件系统,挂载硬盘,清空临时文件,设置网络等;
当执行完这些初始脚本,操作系统已经完全准备好了。
6、在此后的过程中,你将以用户(user)的身份操作电脑。此外,根据创建用户时的设定,Linux还会将其用户归到某个组(group)中。
三、常见问题及其解决方法
实验一、 删除/boot/grub/下除了grub.conf外的其他文件
cd /boot 进入boot,除了grub,删除所有文件 ls cd /grub 进入grub,除了grub.conf ,删除所有文件 ls
删除/boot下所有,除了grub.conf
重启;
结果 : 正常启动
实验二、dd if=/dev/zero of=/dev/sda bs=1 count=446 清空stage1
if=/dev/zero 从文件/dev/zero读取 (全部写零的意思)
of=/dev/sda 输出到文件/dev/sda
bs=1 同时设置读写块的大小为1bytes
count=446 仅读取446个数据块数
结果 : 无法启动,直接进入了光盘引导
处理方法 : 进入Rescue救援模式
根据下图的指示,几乎全部默认选项来进行操作;
在此处可以救援模式中的shell进行操作;
df 显示目前在系统上的文件系统的磁盘使用情况统计
chroot /mnt/sysimage 用来在指定的根目录下运行指令,把根目录换成指定的根目录 grub-install /dev/sda 把grub安装到/dev/sda
实验三、dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512 破坏stage1.5
if=/dev/zero 从文件/dev/zero读取 (全部写零的意思)
of=/dev/sda 输出到文件/dev/sda
bs=1 同时设置读写块的大小为1bytes
count=10240 仅读取10240个数据块数
seek=512 从输出文件/dev/sda 开头跳过512个块后再开始复制
处理方法 : 进入Rescue救援模式
重启 reboot
实验四、删除 /etc/fstab /boot /etc/inittab(centos6 /etc/init/rcS.conf) /etc/rc.d/rc.sysinit
结果 : 无法启动,直接进入了光盘引导
处理方法 : 进入Rescue救援模式
因为fstab文件已删除,fstab文件:存放档案系统与目录结构对应资料的档案
mount /dev/sda2 /mnt/sysimage
进入/boot目录中,首先恢复丢失的/etc/fstab文件,从假根环境中通过blkid命令将结果输出重定向到真根环境中/etc/fstab中
blkid >> /mnt/sysimage/etc/fstab blkid命令将结果输出重定向到真根环境中/etc/fstab
chroot /mnt/sysimage 把根目录换成指定的根目录
vim /etc/fstab 编译 /etc/fstab 文件
blkid >> /mnt/sysimage/etc/fstab blkid命令将结果输出重定向到真根环境中/etc/fstab chroot /mnt/sysimage 把根目录换成指定的根目录
重启 init 0
再次进入Rescue救援模式
chroot /mnt/sysimage 把根目录换成指定的根目录 grub-install /dev/sda 把grub安装到/dev/sda
mount /dev/cdrom /media 将光盘挂载到/media rpm -ivh /media/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force 强力安装内核
vim /boot/grub/grub.conf
default=0
timeout=5
hiddenmenu
title CentOS 6 一个操作系统引动的标头,可以使多个
root (hd0,0) 指明所需文件存在于哪个磁盘哪个分区上 (hd0,0)表示第一个硬盘,第一个分区
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=b2b27503-0a08-4a84-95fc-97c9eb769b1a rhgb quiet 内核文件的名字,并且会有一些加载内核时的参数 ro 代表以只读方式加载
initrd /initramfs-2.6.32-696.el6.x86_64.img 包含一些附加的驱动程序
rpm -qf /etc/init/rcS.conf 查询指定文件rcS.conf来自于哪一个已安装的rpm包rpm -qf /etc/rc.d/rc.sysinit 查询指定文件rc.sysinit 来自于哪一个已安装的rpm包
cd /app 进入/app目录 (该目录可任意选择) cp /media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app/ 将依赖包下载,复制到/app/ rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id 将rpm格式的文件转换为cpio格式的文件cp etc/init/rcS.conf /etc/initcp etc/rc.d/rc.sysinit /etc/rc.d
重启 reboot
四、小总结
最后总结一下,不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中。
sync 将数据由内存同步到硬盘中。 关机指令: shutdown –h 10 计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。 shutdown –h now 立马关机
shutdown –h 20:25 系统会在今天20:25关机
shutdown –h +10 十分钟后关机 halt 关闭系统 poweroff 关机
init 0 关机 重启指令:
shutdown –r now 系统立马重启
shutdown –r +10 系统十分钟后重启 reboot 就是重启,等同于 shutdown –r now
init 6 重启
转载于:https://blog.51cto.com/13869720/2164266
linux系统启动流程及常见问题的解决相关推荐
- Linux下启动程序常见问题,linux系统启动流程及常见故障解决方式
Linux系统中启动的流程: 1.加载bios的硬件信息以及进行自我检测 并根据设置取得第一个启动的设备 2.若以硬盘方式引导 读取并执行引导扇区 MBR 3.加载grub(引导程序)启动菜单(/ ...
- Linux 系统启动流程及其介绍
熟悉Linux系统启动流程可以更好的排除Linux系统在启动的过程中所遇到的错误,下面介绍Linux系统在启动过程. 开机,BIOS自检:检测外置设备,目的是为了把外围设备的信息提供给操作系统使用 寻 ...
- Linux系统启动流程(4)制作自定义linux之一
Linux系统启动流程(4)制作自定义linux之一 平时使用的服务器类型的linux系统一般都会装载各种软件与服务,而在某些情况下,并不能一直直接使用公司管理的系统,一是可能会出现故障,二是在处理一 ...
- arm linux系统启动流程
===================================================== arm linux系统启动相关文章列表: arm linux系统启动流程 http://bl ...
- linux 系统重启过程,linux 系统启动流程
linux系统启动流程可以简单总结为以下几步 1)开机BIOS自检 2)读取MBR,进行MBR引导 3)启动bootloader 4)加载内核kernel 5)启动init进程,依据inittab文件 ...
- linux 打开设备 流程,Linux系统启动流程
1.linux系统启动流程 1.加载BIOS的硬件信息,获取第一个启动设备 Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分.负责完成对CPU.主板.内存.硬盘子系统.显示 ...
- Arm linux系统启动流程简介
文章目录 介绍 一.Bootloader 1.总体流程 二.Linux内核 1.总体流程 2.具体流程 总结 介绍 Arm Linux 系统启动流程可分为四个部分: 1.引导加载程序(bootload ...
- 图解Linux系统启动流程
废话不多说,先上图 说明1:上图是Linux系统启动时的详细流程,其中黑色部分为主流程分支,蓝色部分为详细流程分支,绿色部分是注释部分.大家可点击查看大图. 说明2:增加了kernel和initrd间 ...
- ac3165 linux驱动_一文读懂Linux系统启动流程
Linux启动管理 11.1 CentOS 6.x系统启动过程详解 CentOS 6.x系统启动过程发生了较大的变化,使用Upstart启动服务取代了原先的System V init启动服务.Upst ...
最新文章
- 扩展springmvc组件——当页面跳转时,需要在Controller里面创建一个空方法去跳转或者是创建一个配置类 ||日期格式化说明||自定义格式化器||消息转化器扩展fastjson
- 结构对齐--__packed与#pragma pack
- 依次提取二进制1位置的数字,
- 关闭window端口445
- ios取两个数之间的随机小数_如果取到小数区间内的任一数字?
- java复制的函数会报错,2 面试题之面向对象
- python用户交互、基本数据类型、运算符
- LeetCode之Two Sum
- preg_match_all中的标记
- 使用freemarker模板生成word文档
- nodejs的koa中cookie和session的使用,cookie和session的区别
- JS函数assign
- php阴历阳历互转类(1900~2100年)
- Mapbox 绘制区域边界线 鼠标悬停效果 vue
- multiprocessing.pool详解
- GAMES101 Windows作业环境配置 【Visual Studio】
- Ubuntu 12.04 Eclipse 3.7 紧凑布局样式美化
- 解决win10升级补丁后共享打印机0x0000011b报错问题最简单解决方法,不需要卸载补丁
- C++之getch(),getche(),getchar()的区别
- SAP BADI增强点初学分享
热门文章
- java hibernate的使用_《Hibernate快速开始 – 4 – 使用JAVA持久层 API (JPA)教程》
- vba交付图表设计_您是在为交付目的而“设计”吗?
- java 商品评价计算算法
- Objective-C中的@property
- Windows 10下,如何使用PowerShell批量重启局域网电脑
- mysql添加普通用户用于管理单一数据库
- Acitivty生命周期
- [tp3.2.1]数据模型 - 简单的模型连接
- SAP BW系统日常维护日常工作及常见的Infopackage错误
- Oracle分区表常用命令