一、前言
计算机开机是一个神秘的过程。我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面。然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或者错误信息。了解计算机开机过程有助于我们修复开机可能出现的问题。
二、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