Linux系统排错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统排错相关的知识,希望对你有一定的参考价值。

1 系统引导过程概述
技术分享图片
开机管理程序使用的软件
Linux的主流是 grub,早期的Linux预设使用LILO,台湾地区使用spfdisk

开机流程
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 加载Bios 的硬件信息与进行自我检测,并依据设定取得第一个开机的装置

在个人计算机结构下,你想要启动整部系统首先得要让系统去加载BIOS(basic input output system),并透过BIOS程序去加载COMS信息,并借由CMOS内的设定值取得主机的各项硬件配置,如CPU遇接口的沟通频率,开机装置的搜索顺序,硬盘的大小与类型,系统时间,个周边总线是否启动,个借口设备的I/O地址,预计CPU沟通的IRQ岔断等信息,取得这些信息后,BIOS 还会进行开机自我测试 (Power-on Self Test, POST),然后开始执行硬件侦测的初始化,并设定pnp装置,之后再定义出开机的装置顺序,就下来就会进行开始装置的数据读取了(MBR)

由于我们的系统软件大多放置在硬盘中,所以BIOS会指定开机的装置好让我们可以读取磁盘中的操作系统核心档案,因为不同操作系统的文件格式不同,我们需要一个开机管理程序来处理核心档案加载(load)的问题,因此这个开机管理程序就被成为boot(防护) loader(装载),boot loader程序安装放置在第一个扇区(sector)内,也就是MBR(主要启动记录区)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 读取并执行第一个开机装置内MBR的 boot loader(即可是grub2,spfdisk等程序)
BIOS 通过硬件的INT 13 中断功能来读取MBR
boot loader 的功能:
loader 功能是认识操作系统的文件格式并依据加载核心到主存储器中去执行,每种操作系统都有自己的boot loader,用自己的boot loader 才有办法进入核心档案,如何将多个boot loader放入一个MBR呢?
此时需要(boot sector)(启动扇区)提供操作系统安装boot loader,而通常操作系统默认都会安装一份loader 到他根目录所在的文件系统的boot sector上,如果安装Windows和Linux,则该boot loader boot sector 与MBR的关系

技术分享图片
每个操作系统默认是会安装一套boot loader 到自己的文件息壤中,而在Linux系统安装时,可以选择将boot loader安装到MBR上,也可以选择不安装,如果安装到MBR上,则理论上在MBR与boot loader 都会保有一份boot loader程序,至于Windows 安装时,他预设会主动的将MBR与boot sector 都装上一份,所以可能会有MBR被不同操作系统的boot loader覆盖

boot loader 主要的功能:
1 提供选单,用户可以选择不同的开机项目,多重引导功能
2 载入核心档案:直接指向可开机的程序区段来开始操作系统
3 转交其他 loader:将开机管理功能转交给其他loader负责

具有选单功能,因此可以选择不同的核心来开机,由于具有控制权转交功能,因此可以加载其他boot sector内的loader,不过Windows的loader 预设不具有控制权转交共鞥,因此不能使用Windows的loader来加载Linux的loader,因此需要先装Windows,然后Linux覆盖Windows,然后使用Linux来转交Windows
技术分享图片

MBR : 虽然分区表中有传统MBR以及新式CPT,不过GPT 也有保留一块兼容MBR 的区块
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 依据boot loader 的设定加载kernel,kernel会开始侦测硬件与加载驱动程序

使用boot loader来开始读取核心档案,Linux会将核心解压到主存储器当中,并且利用核心的功能,开始测试与驱动各个周边装置,包括存储装置,CPU、网络卡、声卡等,此时Linux核心会以自己的功能重新侦测一次硬件,而不一定会使用BIOS侦测到的硬件信息,也就是说,核心此时才开始接管BIOS后的工作了,并取名为/boot/vmlinux
技术分享图片

[[email protected] ~]# ls --format=single-column -F /boot
config-3.10.0-123.el7.x86_64 此版本核心被编译时选择的功能与模块配置文件
extlinux/
grub2/ 就是开机管理程序grub2 相关数据目录
initramfs-0-rescue-cda64e5aa2074c6eaf8a805f40620fcd.img 底下几个为虚拟文件系统档,这一个使用来救援的
initramfs-3.10.0-123.el7.x86_64.img 正常开机会用到的虚拟文件系统
initramfs-3.10.0-123.el7.x86_64kdump.img 核心出问题时会用到的虚拟文件系统
initrd-plymouth.img
symvers-3.10.0-123.el7.x86_64.gz
System.map-3.10.0-123.el7.x86_64 核心功能放置到内存地址的对应表
vmlinuz-0-rescue-cda64e5aa2074c6eaf8a805f40620fcd 救援用的核心文件
vmlinuz-3.10.0-123.el7.x86_64
核心档案
为了硬件开发商与其他核心功能开发者的便利,Linux核心是可以透过动态加载核心模块,这些模块就放置在/lib/modules/ 目录内
技术分享图片
由于模块放置到磁盘根目录内,因此开机的过程中核心必须要挂载根目录,这样才能读取核心模块提供加载驱动程序的功能,而且为了担心影响到磁盘内的文件系统,因此开机过程中根目录是以只读方式挂载的。

核心要认识硬件磁盘,需要加载SATA磁盘驱动程序,否则无法挂载根目录,但SATA的驱动程序在/usr/lib/modules内,这就需要虚拟文件系统(initial RAM Disk)一般会使用的档名为/boot/initrd 或/boot/initramfs 。
技术分享图片
这个档案的特殊是,能透过boot loader 来加载到内存中,然后这个档案会被解压缩并且在内存中仿真成一个目录,且此仿真内存中的文件系统能够提供一支可执行程序,通过该程序来加载开机过程中所需要的核心模块,通常这些模块就是USB,RAID,LVM,SCSI等文件系统与磁盘接口的驱动程序,等载入完成后,会帮助核心重新呼叫/sbin/init来开始正常开机的流程

技术分享图片

boot loader 可以加载kernel 与 initramfs,然后再内存中让initramfs解压缩成根目录,kernel就能够加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统,就能够开始后去的正常开机流程。

initramfs 就是一个小型的根目录,这个小型根目录里面也是透过 systemd 来进行管理,同时观察 default.target 的链接,会发现其实这个小型系统就是透过 initrd.target 来开机,而 initrd.target 也是需要读入一堆例如basic.target, sysinit.target 等等的硬件侦测、核心功能启用的流程, 然后开始让系统顺利运作。最终才又卸除 initramfs 的小型文件系统,实际挂载系统的根目录!
initramfs 并没有包山包海,它仅是带入开机过程会用到的核心模块而已。所以如果你在initramfs 里面去找 modules 这个关键词的话, 就可以发现主要的核心模块大概就是 SCSI、virtio、RAID 等等跟磁盘相关性比较高的模块就是了!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 在硬件驱动成功后,kernel会主动呼叫systemd程序,并以default.target流程开机
systemd 执行 sysinit.target 初始化系统及basic.target 准备操作系统
systemd 启动 multi-user.target 下的本机与服务器服务
systemd 执行multi-user.target 下的/tec/rc.d/rc.locl 文件
systemd 执行multi-user.target 下的getty.target 及登入服务
systemd执行 graphical 需要的服务
第一支程序以及使用default.target进入开机程序的分析
systemd 最主要的功能就是准备软件执行的环境,包括系统的主机名,网络设定,语系处理,文件系统格式以及其他服务的启动
技术分享图片
常见的操作环境target与兼容于runlevel 的等级
可以作为预设操作环境的主要项目有:
multi-user.target以及graphical.target这两个,过去的system V使用的是一个runlevel (执行等级)的概念来启动系统的,systemd为了兼容于旧式的system V操作行为,所以也将runlevel 与操作环境相结合
技术分享图片

与之前的systemV 的方式的对比
技术分享图片

systemd 的处理流程
当取得/etc/systemd/system/default.target 这一个预设操作界面的设定之后,接下来会连接到/usr/lib/systemd/system/这个目录下去取得multi_user.target 或 graphical.target 这两个其中之一,假如选择了graphical.target 接下来会去找
 /etc/systemd/system/graphical.target.wants/   使用者设定加载的unit
 /usr/lib/systemd/system/poweroff.target.wants/  系统默认加载的unit

 然后再由/usr/lib/systemd/system/graphical.target 配置文件内发现如下资料

技术分享图片

这表示 graphical.target 必须要完成 multi-user.target 之后才能够进行,而进行完 graphical.target 之后,还得要启动 display-manager.service 才行的意思。
技术分享图片
透过此方式一直找下去,最终数据时透过[systemctl list-dependencies graphical.target]这个指令来列出所有相关性的服务

『 systemctl list-dependencies graphical.target 』所输出的相依属性服务,基本上我们
CentOS 7.x 的 systemd 开机流程大约是这样:

  1. local-fs.target + swap.target:这两个 target 主要在挂载本机 /etc/fstab 里面所规范的文件系统与相关的内存置换空间。
  2. sysinit.target:这个 target 主要在侦测硬件,加载所需要的核心模块等动作。
  3. basic.target:加载主要的外围硬件驱动程序与防火墙相关任务
  4. multi-user.target 底下的其它一般系统或网络服务的加载
  5. 图形界面相关服务如 gdm.service 等其他服务的加载

技术分享图片
systemctl list-dependencies sysinit.target 的基本内容

特殊文件系统装置的挂载:包括 dev-hugepages.mount devmqueue.mount 等挂载服务,主要在挂载跟巨量内存分页使用与消息队列的功能。 挂载成功后,会在 /dev 底下建立 /dev/hugepages/, /dev/mqueue/ 等目录;

特殊文件系统的启用:包括磁盘阵列、网络驱动器 (iscsi)、LVM 文件系统、文件系统对照服务 (multipath)等等,也会在这里被侦测与使用到!

开机过程的讯息传递与动画执行:使用 plymouthd 服务搭配 plymouth 指令来传递动画与讯息

日志式登录文件的使用:就是 systemd-journald 这个服务的启用啊!

加载额外的核心模块:透过 /etc/modules-load.d/*.conf 文件的设定,让核心额外加载管理员所需要的核心模块!

加载额外的核心参数设定:包括 /etc/sysctl.conf 以及 /etc/sysctl.d/*.conf 内部设定!

启动系统的随机数生成器:随机数生成器可以帮助系统进行一些密码加密演算的功能设定终端机 (console) 字形
启动动态设备管理器:就是 udevd 这个家伙!用在动态对应实际装置存取与装置文件名对应的一个服务!

当sysinit.target执行完成后,再来的就是basic.target 了。此内容包括

加载 alsa 音效驱动程序:这个 alsa 是个音效相关的驱动程序,会让你的系统有音效产生啰;

载入 firewalld 防火墙:CentOS 7.x 以后使用 firewalld 取代 iptables 的防火墙设定,虽然最终都是使用
iptables 的架构, 不过在设定上面差很多喔!

加载 CPU 的微指令功能;
启动与设定 SELinux 的安全本文:如果由 disable 的状态改成 enable 的状态,或者是管理员设定强制重新设定一次 SELinux 的安全本文, 也在这个阶段处理喔!将目前的开机过程所产生的开机信息写入到 /var/log/dmesg 当中由 /etc/sysconfig/modules/*.modules 及 /etc/rc.modules 加载管理员指定的模块!
加载 systemd 支持的 timer 功能;

在这个阶段完成后,你的系统已经能够顺利启动的运行了,就差一对服务,网络服务,本机认证服务等

服务启动阶段

在加载核心驱动硬件后,经过sysinit.target 的初始化流程让系统可以存取之后,加上basic.target让系统成为操作系统的基础,之后就是服务器要顺利运行的时候,需要的各种主机服务以及提供服务器功能的网络服务的启动,这些服务大多数是附挂在multi-user.target 这个操作环境底下,
技术分享图片

一般来说服务器的启动脚本设定都是放在底下的目录内:
/usr/lib/systemd/system (系统默认的服务启动脚本设定)
/etc/systemd/system (管理员自己开发与设定的脚本设定)

用户针对主机的本地服务与服务器网络服务的各项 unit 若要 enable 的话,就是将它放到/etc/systemd/system/multi-user.target.wants/ 这个目录底下做个链接~ 这样就可以在开机的时候去启动他。
技术分享图片

一般的服务都是同时启动的,除非是有相依性

相容system V 的 rc-local.service
过去的要让系统额外执行某些程序的化,可以将该程序指令或脚本的绝对路径名称写入到/etc/rc.d/rc.local 这个文件去,新的systemd机制中,他建议直接写一个systemd 的启动脚本配置文件到/etc/systemd/system 底下。然后使用systemctl enable 的方式设定启用。

rc-local.service 这个服务的功能不需要启动,它会自己判断/etc/rc.d/rc.local 是否具有可执行的权限来判断要不要启动某个服务

技术分享图片

提供tty界面与登入的服务
在multi-user.target 底下还有一个getty.target的操作界面项目,能不能提供适当的登入服务也是multi-user.target底下的内容

由于服务都是同步运作,不一定哪个服务先启动完毕。如果 getty 服务先启动完毕时,你会发现到有可用的终端机尝试让你登入系统了。 问题是,如果 systemd-logind.service 或systemd-user-sessions.service 服务尚未执行完毕的话,那么你还是无法登入系统的。

systemd 启动 graphical.target 底下的服务

如果你的 default.target 是 multi-user.target 的话,那么这个步骤就不会进行。反之,如果是graphical.target 的话,那么 systemd 就会开始加载用户管理服务与图形界面管理员 (window displaymanager, DM) 等,启动图形界面来让用户以图形界面登入系统
技术分享图片

开机过程主要用到的配置文件
systemd 有自己的配置文件的处理方式,不过为了兼容system V ,很多服务脚本设定还是会读位于/etc/sysconfig/底下的环境配置文件

关于模块:/etc/modprobe.d/.conf 及/etc/modules-load.d/.conf

/etc/modules-load.d/.conf:单纯要核心加载模块的位置;
/etc/modprobe.d/
.conf:可以加上模块参数的位置

/etc/sysconfig/*中的配置文件

authconfig:
这个文件主要在规范使用者的身份认证的机制,包括是否使用本机的 /etc/passwd, /etc/shadow 等, 以及
/etc/shadow 密码记录使用何种加密算法,还有是否使用外部密码服务器提供的账号验证 (NIS, LDAP) 等。
系统默认使用 SHA512 加密算法,并且不使用外部的身份验证机制;另外,不建议手动修改这个文件喔!
你应该使用『 authconfig-tui 』指令来修改较佳!
cpupower:
如果你有启动 cpupower.service 服务时,他就会读取这个配置文件。主要是 Linux 核心如何操作 CPU 的
原则。 一般来说,启动 cpupower.service 之后,系统会让 CPU 以最大效能的方式来运作,否则预设就是用多少算多少的模式来处理的。
firewalld, iptables-config, iptables-config, ebtables-config:
与防火墙服务的启动外带的参数有关
network-scripts/:
至于 network-scripts 里面的文件,则是主要用在设定网络卡
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
自我排错阶段:
1 当忘记超级用户密码时的操作
A 当进入此节点后按下e(小写)
技术分享图片
进入如下阶段
技术分享图片
B按下end键进入底部,输入rd.break,rd.break 是在 Ram Disk 里面的操作系统状态,因此你不能直接取得原本的 linux 系统操作环境。
技术分享图片
C输入ctrl+x 键进入另一个界面,此界面为RAM Disk 环境,你的系统应该会被挂载到 /sysroot 目录下
技术分享图片

chroot 目录:代表将你的根目录[暂时]切换到chroot之后所接的目录。

在 rd.break 的 RAM Disk 环境下,系统是没有 SELinux 的,而你刚刚更改了
/etc/shadow (因为改密码啊!), 所以『这个文件的 SELinux 安全本文的特性将会被取消』喔!如果你没有让系统于开机时自动的回复 SELinux 的安全本文, 你的系统将产生『无法登入』的问题 (在 SELinux 为Enforcing 的模式下!)加上 /.autorelabel 就是要让系统在开机的时候自动的使用预设的 SELinux type 重新写入 SELinux 安全本文到每个文件去!。
挂载相应的实际目录,并进行密码修改
技术分享图片
完成后退出(ctrl+d)两次退出,及密码修改成功

以上是关于Linux系统排错的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统排错

Linux 系统排错

Linux系统启动排错实验集合

Linux命令应用大词典-第37章 Linux系统故障排错

Linux启动和故障排错

SSH远程连接排错