Linux系统文件与启动流程
Linux系统文件与启动流程
/etc初始化系统重要文件
- /etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件
- /etc/resolv.conf:Linux系统DNS客户端配置文件
- /etc/hostname (CentOS7) /etc/sysconfig/network:(CentOS 6)主机名配置文件
- /etc/hosts:系统本地的DNS解析文件
- /etc/fstab:配置开机设备自动挂载的文件
- /etc/rc.local:存放开机自启动程序命令的文件
- /etc/inittab:系统启动设定运行级别等配置的文件
- /etc/profile及/etc/bashrc:配置系统的环境变量/别名等的文件
- /etc/profile.d:用户登录后执行的脚本所在的目录
- /etc/issue和/etc/issue.net:配置在用户登录终端前显示信息的文件
- /etc/init.d:软件启动程序所在的目录(centos 6)
- /usr/lib/systemd/system/ 软件启动程序所在的目录(centos 7)
- /etc/motd:配置用户登录系统之后显示提示内容的文件
- /etc/redhat-release:声明RedHat版本号和名称信息的文件
- /etc/sysctl.conf:Linux内核参数设置文件
/proc重要路径
/proc/meminfo:系统内存信息
/proc/cpuinfo:关于处理器的信息,如类型,厂家,型号,性能等
/proc/loadavg:系统负载信息,uptime 的结果
/proc/mounts:已加载的文件系统的列表
/var目录下文件
/var/log:记录系统及软件运行信息文件所在的目录
/var/log/messages:系统级别日志文件
/var/log/secure:用户登录信息日志文件
/var/log/dmesg:记录硬件信息加载情况的日志文件
Linux开机启动流程
作为一个运维人,必须得保障服务器正确工作,机器宕机了,也得明确是什么问题,从何查起,那么了解启动流程就能够对症下药,排查问题。
- BIOS自检
检查硬件是否健康。如 cpu 风扇是否正常,内存是否正常,时钟是否正常,这个过程是读取 ROM 上的指令执行的。
- 微控制器
系统想要启动必须先加载 BIOS,按下电源键时,给微控制器下达一条复位指令,各寄存器复位,最 后下达一条跳转指令,跳转到 BIOS 的 ROM,使得硬件去读取主板上的 BIOS 程序,在这之前都是 由硬件来完成,之后硬件就会把控制权交给 BIOS。
- BIOS->POST
随后 BIOS 程序加载 CMOS(可读写的 RAM 芯片,保存 BIOS 设置硬件参数的数据)的信息,借 CMOS 取得主机的各项硬件配置。取得硬件配置的信息之后,BIOS 进行加电自检(Power-on self Test,POST)过程,检测计算机各种硬件信息,如果发现硬件错误则会报错(发出声音警告)。之后 BIOS 对硬件进行初始化。BIOS 将自己复制到物理内存中继续执行,开始按顺序搜寻可引导存储设 备,决定存储设备的顺序(即定义第一个可引导的磁盘,当然是在有两个磁盘的前提),接下来就 会读取磁盘的内容,但是要读取磁盘文件必须要有文件系统,这对 BIOS 挂载文件系统来说是不可 能,因此需要一个不依赖文件系统的方法使得 BIOS 读取磁盘内容,这种方法就是引入 MBR。最后 BIOS 通过 INT13 硬件中断功能读取第一个可引导的存储设备的 MBR(0 磁道 0 扇区)中的 boot loader。将 MBR 加载到物理内存中执行。MBR 载入内存后,BIOS 将控制权转交给 MBR(准确的 说应该是 MBR 中的 boot loader),然后 MBR 接管任务开始执行。
- MBR引导
载入了第一个可引导的存储设备的 MBR 后,MBR 中的 boot loader 就要读取所在磁盘的操作系统核 心文件(即后面所说的内核)了。 但是不同操作系统的文件系统格式不同,还有一个磁盘可以安装多个操作系统,如何让 boot loader 做到引导的就是用户想要的操作系统,这么多不同的功能单靠一个 446 字节的 boot loader 是远远不 够的。必须有一个相对应的程序来处理各自对应的操作系统核心文件,这个程序就是操作系统的 loader(注意不是 MBR 中的 boot loader),这样一来 boot loader 只需要将控制权交给对应操作系统 的 loader,让它负责去启动操作系统就行了。 一个硬盘的每个分区的第一个扇区叫做 boot sector,这个扇区存放的就是操作系统的 loader,所以常 说一个分区只能安装一个操作系统。MBR 的 boot loader 有三个功能:提供选单,读取内核文件,转 交给其它 loader。 提供选单就是给用户提供一张选项单,让用户选择进入哪个操作系统;读取内核文件的意思是,系 统会有一个默认启动的操作系统,这个操作系统的 loader 在所在分区的 boot sector 有一份,除此之 外,也会将这个默认启动的操作系统的 loader 复制一份到 MBR 的 boot loader 中,这样一来 MBR 就 会直接读取 boot loader 中的 loader 了,然后就是启动默认的操作系统;转交给其它的 loader,当用 户选择其它操作系统启动的时候,boot loader 会将控制权转交给对应的 loader,让它负责操作系统的 启动。
- GRUB引导
grub 是 boot loader 中的一种,就 grub 来说,为了打破在 MBR 中只有 446Bytes 用于存放 boot loader这一限制,所以这一步的实现是这样的:grub 是通过分成三个阶段来实现加载内核这一功能的,这三个阶段分别是:stage1, stage1.5 以及 stage2。 stage1:存放于 MBR 的前 446Bytes,用于加载 stage1.5 阶段,目的是为了识别并驱动 stage2(或者 /boot)所在分区的文件系统。 stage1.5:存放于 MBR 之后的扇区,加载 stage2 所在分区的文件系统驱动,让 stage1 中的 boot loader 能识别 stage2 所在分区的文件系统。 stage2:存放于磁盘分区之上,具体存放于/boot/grub 目录之下,主要用于加载内核文件(vmlinuz- VERSION-RELEASE)以及 ramdisk 这个临时根文件系统(initrd-VERSION-RELEASE.img 或 initramfs- VERSION-RELEASE.img)。 概述:假如要启动的是硬盘设备,首先硬件平台主板 BIOS 必须能够识别硬盘,然后 BIOS 才能加载 硬盘中的 boot loader,而 boot loader 自身加载后就能够直接识别当前主机上的硬盘设备了;不过, 能够识别硬盘设备不代表能够识别硬盘设备中的文件系统,因为文件系统是额外附加的一层软件组 织的文件结构,所以要对接一种文件系统,就必须要有对应的能够识别和理解这种文件系统的驱 动,这种驱动就称为文件系统驱动。而 stage1.5 就是向 grub 提供文件系统驱动的,这样 stage1 就能 访问 stage2 及内核所在的分区(/boot)了。
- 加载内核
内核(Kerenl)在得到系统控制权之后,首先要进行自身初始化,而初始化的主要作用是: 探测可识别到的所有硬件设备; 加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序(有可能会借助于 ramdisk 加载 驱动); 以只读方式挂载根文件系统(如果有借助于 ramdisk 这个临时文件系统(虚根),则在这一步之后 会执行根切换;否则不执行根切换); 运行用户空间的第一个应用程序:/sbin/init。 到这里内核空间的启动流程就结束了,而接下来是用户空间完成后续的系统启动流程。 注意:ramdisk 和内核是由 boot loader 一同加载到内存当中的,ramdisk 是用于实现系统初始化的、 基于内存的磁盘设备,即加载至内存(的某一段空间)后把内存当磁盘使用,并在内存中作为临时 根文件系统提供给内核使用,帮助内核挂载真正的根文件系统。而之所以能够帮助内核挂载根文件 系统是因为在 ramdisk 这个临时文件系统的/lib/modules 目录下有真正的根文件系统所在设备的驱动 程序;除此之外,这个临时文件系统也遵循 FHS,例如有这些固定目录结构:/bin, /sbin, /lib, /lib64, /etc, /mnt, /media, ... 因为 Linux 内核有一个特性就是通过使用缓冲/缓存来达到加速对磁盘上文件的访问的目的,而 ramdisk 是加载到内存并模拟成磁盘来使用的,所以 Linux 就会为内存中的“磁盘”再使用一层缓冲 /缓存,但是 ramdisk 本来就是内存,它只不过被当成硬盘来使用罢了,这就造成双缓冲/缓存了,而 且不会起到提速效果,甚至影响了访问性能;CentOS 5 系列以及之前版本的 ramdisk 文件为 initrd- VERSION-RELEASE.img,就会出现上述所说到的问题;而为了解决一问题,CentOS 6/7 系列版本就将其改为 initramfs-VERSION-RELEASE.img,使用文件系统的方式就可以避免双缓冲/缓存了,可 以说这是一种提速机制。
- 启动init进程
grub 中默认指定 init=/sbin/init 程序,可以在 grub.conf 中 kernel 行自定义执行程序 init=/bin/bash,此时 可以绕过下面步骤直接进入 bash 界面。 内核源代码文件中显示 996 行左右,规定了 init 启动的顺序,/sbin/init->/etc/init->/bin/init->/bin/sh。
- 读取/etc/inittab 文件
inittab 文件里面定义了系统默认运行级别,这一步做了一些工作如下: 初始运行级别(RUN LEVEL); 系统初始化脚本; 对应运行级别的脚本目录; 定义 UPS 电源终端/恢复脚本; 在虚拟控制台生成 getty,以生成终端; 在运行级别 5 初始化 X。
- 执行/etc/rc.d/rc.sysinit 程序
系统初始化一些脚本,主要完成以下工作。 设置主机名; 设置欢迎信息;
激活 udev 和 selinux 可以在 grub.conf 中,kernel 行添加 selinux=0 以关闭 selinux; 挂载/etc/fstab 文件中定义的文件系统; 检测根文件系统,并以读写方式重新挂载根文件系统; 设置系统时钟;
激活 swap 设备; 根据/etc/sysctl.conf 文件设置内核参数; 激活 lvm 及 software raid 设备; 加载额外设备的驱动程序; 清理操作。 /etc/rc*.d/文件(各种服务) 里面定义的是各种服务的启动脚本,可以 ls 查看,S 开头代表开机启动的服务,K 开头的是关机要 执行的任务。#代表数字,一个数字代表一个运行级别,共 7 个运行级别。 /etc/rc.d/rc.local 文件 这里面可以自定义开机启动的命令。
- 执行/bin/login
执行/bin/login 程序,等待用户登录。
centos7启动流程
CentOS7 和 CentOS6 启动流程差不多,只不过到 init 程序时候,改为了 systemd,因此详细解释一下 systemd 后的启动流程。
- uefi或BIOS初始化,开始post开机自检;
- 加载mbr到内存
- 加载内核和inintamfs模块
- 内核开始初始化,使用systemd代替centos6的init程序
1.执行initrd.target,包括挂载/etc/fstab文件中的系统,此时挂载后,就可以切换到根目录了
2.从initramfs根文件系统切换到磁盘根目录
3.systemd执行默认target配置
CentOS7 系表面是有“运行级别”这个概念,实际上是为了兼容以前的系统,每个所谓的“运行级 别”都有对应的软连接指向,默认的启动级别是/etc/systemd/system/default.target,根据它的指向可 以找到系统要进入哪个模式。
centos7的7个启动模式是:
- 0 ==> runlevel0.target, poweroff.target
- 1 ==> runlevel1.target, rescue.target
- 2 ==> runlevel2.target, multi-user.target
- 3 ==> runlevel3.target, multi-user.target
- 4 ==> runlevel4.target, multi-user.target
- 5 ==> runlevel5.target, graphical.target
- 6 ==> runlevel6.target, reboot.target
- systemd执行sysinit.target;
- systemd启动multi-user.target下的本机与服务器服务;
- systemd执行multi-user.target下的/etc/rc.d/rc.local。
- Systemd 执行 multi-user.target 下的 getty.target 及登录服务;
- systemd 执行 graphical 需要的服务。