RHCE:启动过程控制及故障排除


开机->bios->MBR->boot loader 加载kernel->加载驱动->加载systemd->通过default.target流程开机



systemd执行:
sysinit.target
multiuser.target 本机服和服务器服务
multiuser.target 下的/etc/rc.d/rc.local  chmod 755 /etc/rc.d/rc.local
[root@foundation0 ~]# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 477 Apr  2  2014 /etc/rc.d/rc.local
RHEL7启动过程-1
1.通电源,开机自检(POST),并开始初始化部分硬件。
2.系统固件搜索可启动设备,按照UEFI或BIOS中配置的顺序搜索所
有磁盘上的主启动记录(MBR)
3.系统固件会从磁盘读取启动加载器,将系统控制权交给启动加载
器(RHEL7中为grub2)。
通过grub2-install进行配置
4.启动加载器从磁盘加载其配置、然后向用户显示用于启动的可能
配置的菜单(也就是启动时候看到的两个条目) 






RHEL7启动过程-2
5.在用户做出选择(或发生自动超时)后,启动加载器会从磁盘加载配置的内核
及initramfs,并将它们置于内核中。initramfs是经过gzip的cpio归档,其中包
含启动时所有必要硬件的内核模块、初始化脚本等等。在RHEL7中,initramfs
包含自身可用的整个系统。
可通过/etc/dracut.conf进行配置
6.启动加载器将系统控制权交给内核,从而传递启动加载器的内核命令行中指定
的任何选项,以及initramfs在内存中的位置。
通过以下方式进行配置:/etc/grub.d/、/etc/default/grub和(非手动)
/boot/grub2/grub.cfg
7.对于内核可在initramfs中找到驱动程序的所有硬件,内核会初始化这些硬件,
然后作为PID 1从initramfs执行/sbin/init.在RHEL7中,initramfs包含systemd
的工作副本作为/sbin/init,并包含udev守护进程。
通过以下方式进行配置:init=命令行参数 




RHEL7启动过程-3
8.initramfs中的systemd实例会执行initrd.target目标的所有单元。这包括在
/sysroot上挂载实际的root文件系统。
通过以下方式进行配置:/etc/fstab
9.内核root文件系统从initramfs root文件系统切换(回转)为之前挂载于/sysroot
上的系统root文件系统。随后,systemd会使用系统中安装的systemd副本来自行
重新执行
10.systemd会查找从内核命令行传递或系统中配置的默认目标,然后启动(或停
止)单元,以符合该目标的配置,从而自动解决单元间的依赖关系。本质上,
systemd目标是一组应在激活后达到所需系统状态的单元。这些目标通常至少包含
一个生成的基本文件的登陆或图形登陆屏幕
通过以下方式进行配置:/etc/systemd/systemd/default.target、
/etc/systemd/system/ 








>>target 与runlevel对应关系:
init 0 systemctl poweroff
init 1 systemctl rescue
init [234] systemctl isolate multi-user.target 
init 5 systemctl isolate graphical.target
init 6 systemctl reboot


systemctl poweroff:会停止所有运行的服务,卸载所有文件系
统(或者在文件系统无法卸载时以只读形式将其重新挂载),然
后关闭系统
systemctl reboot:会停止所有运行的服务,卸载所有文件系统,
然后重新启动系统
 systemctl halt和halt:可用于停止系统,但与其poweroff同等
命令不同,这些命令不会关闭系统,而是让系统进入能安全地手
动关闭的状态 








>>系统启动流程:

BIOS 初始化硬件






MBR   查找可启动设备,从这个设备上的引导扇区引导系统, 第一个扇区:512k=446(bootloader)+64*4(分区表) MBR里面也有一份启动文件





bootloader 系统固件会读取系统加载器,将控制权交给加载器,grub2,
出现菜单后,grub会加载配置以及initramfs文件系统,initramfs的配置文件/etc/dracut.conf
之后将系统控制权交给kernel,传递内核参数,以及initramfs在内存中的位置





通过grub2-install 可安装grub2加载器


修改/boot/grub2/grub.cfg的方法:
1.通过/etc/grub.d/    /etc/default/grub  修改内容后
  再通过命令grub2-mkconfig -o /boot/grub2/grub.cfg 重新生成grub.cfg文件


2.也可手动修改grub.cfg文件 vim /boot/grub2/grub.cfg






446字节
读取内核文件来执行的软件
先安装windows,再安装linux


initramfs  为kernel查找当前硬件的所有驱动,内核会初始化这些硬件,initramfs中的systemd实例会执行initrd.target目标的所有单元,包括/sysroot上挂


载的实际root文件系统,通过/etc/fstab配置要挂载的文件系统
系统所有根文件在initramfs上是挂载在/sysroot目录下,内核会从initramfs root文件系统切换回挂载在/sysroot目录下的文件系统




kernel
执行操作系统的功能,进程,内存,网络,文件,安全,驱动程序 
systemd会查找从内核命令行参数传递的默认目标,然后启动或停止单元,最后进入系统


=================================================




>>启动相关
每个分区都有自己的启动扇区,只会加载自己的内核
实际开机的启动内核文件是存放在各个分区内




>>boot loader的主要任务:
提供菜单
载入内核
转交其它loader




加载内核检测硬件与initramfs功能


kernel文件 /boot/vmlinux  通过/lib/modules目录来加载驱动程序,要先加载根目录 
 


虚拟文件系统 /boot/initramfs  是一个完整的系统 , /boot/initrd 或/boot/initramfs解压为根目录
里面有所有硬件的驱动,
运行systemd
并以default.target流程开机


 


查看boot目录下的文件:
[root@foundation0 ~]# ls /boot
config-3.10.0-123.el7.x86_64
extlinux
grub2
initramfs-0-rescue-6cf32a0633fb4227a9fe7310ad79dfc3.img  #linux救援模式虚拟文件系统
initramfs-3.10.0-123.el7.x86_64.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-6cf32a0633fb4227a9fe7310ad79dfc3 linux救援模式内核
vmlinuz-3.10.0-123.el7.x86_64 #linux 正常启动内核
  
查看initramfs虚拟的系统所有的文件:
[root@foundation0 ~]# lsinitrd /boot/initramfs-3.10.0-123.el7.x86_64.img 






====================================================




选择systemd目标
 
目标  用途
graphical.target  系统支持多用户、图形和基本文本的登陆
multi-user.target  系统仅支持多用户、基于文本的登陆
rescue.target  sulogin提示,表示基本系统初始化已完成
emergency.target  sulogin提示,表示initramfs回转完成,且系统
root以只读形式挂载于/上 


设置默认目标
在系统启动且将控制权从initramfs交给systemd后,
systemd会尝试激活default.target目标。通常,default.target
目标是(/etc/systemd/system/中)指向graphical.target或
multi-user.target的符号链接。
systemctl工具随附两个命令(get -default和set -default)
用于管理该符号链接,而不是手动编辑该连接
systemctl get -default
systemctl set -default graphical.target




实例:
>>在字符和图形之间切换:
default.target
[root@foundation0 default.target.wants]# ll /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 41 Aug 13  2015 /etc/systemd/system/default.target -> 
/usr/lib/systemd/system/multi-user.target  #字符模式




/usr/lib/systemd/system/graphical.target #图形模式


systemctl get-default


systemctl set-default  graphical.target|multi-user.target


graphical.target


启动图形界面要启动的程序:
使用者加载unit
[root@foundation0 default.target.wants]# cd /etc/systemd/system/graphical.target.wants/
[root@foundation0 graphical.target.wants]# ls
accounts-daemon.service  rtkit-daemon.service


系统默认加载目录 :
[root@foundation0 graphical.target.wants]# cd /usr/lib/systemd/system/graphical.target.wants/






启动字符界面要启动的程序:
multi-user.target


使用者加载unit
[root@foundation0 ~]# cd /etc/systemd/system/multi-user.target.wants/
[root@foundation0 multi-user.target.wants]# ls
abrt-ccpp.service     crond.service           named.service              rpcbind.service
abrtd.service         dhcpd.service           netcf-transaction.service  rsyslog.service
abrt-oops.service     httpd.service           NetworkManager.service     smartd.service
abrt-vmcore.service   irqbalance.service      nfs.target                 sshd.service
abrt-xorg.service     ksm.service             oddjobd.service            sssd.service
atd.service           ksmtuned.service        postfix.service            sysstat.service
auditd.service        libstoragemgmt.service  remote-fs.target           tuned.service
avahi-daemon.service  libvirtd.service        rhsmcertd.service          xinetd.service
chronyd.service       mdmonitor.service       rngd.service


默认系统加载
[root@foundation0 ~]# cd /usr/lib/systemd/system/multi-user.target.wants/
[root@foundation0 multi-user.target.wants]# ls
brandbot.path  plymouth-quit.service           systemd-logind.service
dbus.service   plymouth-quit-wait.service      systemd-user-sessions.service
getty.target   systemd-ask-password-wall.path




通过以下命令来修改上面两个目录的service文件:
systemctl enable httpd.service
systemctl disable httpd.service






例子:
[root@foundation0 ~]# systemctl enable autofs
ln -s '/usr/lib/systemd/system/autofs.service' '/etc/systemd/system/multi-user.target.wants/autofs.service'
[root@foundation0 ~]# 
[root@foundation0 ~]# systemctl disable autofs
rm '/etc/systemd/system/multi-user.target.wants/autofs.service'


==========================================================
c6要配置随系统记录的脚本,要在/etc/rc.local里添加就可以了,但到了c7后,这个配置文件不起作用,可通过以下方式来实现相关的功能
兼容的rc-local.service


方法一:建议创建systemd脚本,放在/etc/systemd/system目录下


方法二:
也可以通过下面的方式执行:
之前的脚本写在/etc/rc/d/rc.local里面
chmod a+x /etc/rc/d/rc.local


systemctl daemon-reload


[root@foundation0 rc.d]# systemctl list-dependencies multi-user.target | grep rc-local


通过rc-local.service服务来监控/etc/rc.d/rc.local
[root@foundation0 rc.d]# systemctl start rc-local.service
[root@foundation0 rc.d]# systemctl status rc-local.service
rc-local.service - /etc/rc.d/rc.local Compatibility
   Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static)
   Active: active (exited) since Wed 2017-12-06 20:15:08 CST; 13s ago
  Process: 37972 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)


Dec 06 20:15:08 foundation0.ilt.example.com systemd[1]: Starting /etc/rc.d/rc.local Com....
Dec 06 20:15:08 foundation0.ilt.example.com systemd[1]: Started /etc/rc.d/rc.local Comp....
Hint: Some lines were ellipsized, use -l to show in full.


=====================================================


>>linux boot-loader:
grub2:
/boot/grub2/grub.cfg #配置文件


以下两个文件用于重新生成grub.cfg配置文件:
/etc/default/grub 主要环境配置文件
/etc/grub.d/ 这个目录的配置文件
如果修改了以上两个目录里面的文件要执行以下命令重新生成grub.cfg
[root@foundation0 default]# grub2-mkconfig -o /boot/grub2/grub.cfg 




[root@foundation0 rc.d]# cat /etc/default/grub 
GRUB_TIMEOUT=5 #启动菜单等待5秒后进入saved指定的菜单
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"


修改内核启动参数:
GRUB_CMDLINE_LINUX="vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet net.ifnames=0,biosdevname=0"
GRUB_DISABLE_RECOVERY="true" #系统恢复菜单是否显示


说明:
按eth0的显示方式来显示网卡:
net.ifnames=0,biosdevname=0




>>例子:
修改网卡名称以ethx方式来显示:
[root@foundation0 default]# cat /etc/default/grub 
GRUB_TIMEOUT=40
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=us crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet net.ifnames=0 biosdevname=0"
GRUB_DISABLE_RECOVERY="true"




重新生成grub.cfg配置文件


[root@foundation0 default]# grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-6cf32a0633fb4227a9fe7310ad79dfc3
Found initrd image: /boot/initramfs-0-rescue-6cf32a0633fb4227a9fe7310ad79dfc3.img
done


重启系统后查看启动菜单是否生效
#systemctl reboot
======================================


[root@foundation0 ~]# cd /etc/grub.d/
[root@foundation0 grub.d]# ls
00_header  20_linux_xen     30_os-prober  41_custom
10_linux   20_ppc_terminfo  40_custom     README


00_header 配置grub默认参数
10_linux 定义开机菜单
40_custom 添加自定义菜单


修改完成后通过以下命令,重新生成grub.cfg配置文件


[root@foundation0 default]# grub2-mkconfig -o /boot/grub2/grub.cfg 




在启动时选择其他目标
要在启动时选择其他目标,可从启动加载器将特殊选项附加到内
核命令行:systemd.unit=
要使用这种选择其他目标的方法,请针对RHEL7系统执行以下步骤:
1.(重新)启动系统
2.按任意键终端启动加载器菜单倒计时
3.将光标移至要启动的条目
4.按e编辑当前条目
5.将光标移至以linux16开头的行。此为内核命令行
6.附加systemd.unit=desired.target
7.按ctrl+x使用这些更改进行启动


==========================================


修复常见启动问题
恢复root密码步骤:
1.重新启动系统
2.按任意键终端启动加载器倒计时
3.将光标移到需要启动的条目
4.按e编辑选定的条目
5.将光标移到内核命令行(以linux16开头的行)
6.附加rd.break(就在从initramfs向实际系统移交控制权前,该操作会中断)
注意:initramfs提示会显示在内核命令行中指定为最后的任何控制台中。
7.按ctrl+x使用这些更改进行启动
注意:预建的映像可能会在内核中放置多个console=参数,以便支持各种各样
的实施场景。尽管许多内核消息将会发送到所有控制台,但提示符最终都将使用
最后一个控制台。如果未看到提示符,你可能要临时调整console=参数的顺序。


恢复root密码步骤:
8.以读写形式重新挂载/sysroot
switch_root:/# mount -oremount,rw /sysroot
9.切换为chroot存放位置,其中/sysroot被视为文件系统树的root
switch_root:/# chroot /sysroot
10.设置新root密码
sh-4.2#passwd root
11.确保所有未标记的文件在启动过程中都会重新获得标记
sh-4.2#touch  /.autorelabel
12.键入exit两次。第一次将退出chroot存放位置,第二次将退出initramfs调
试shell。此时,系统将继续进行启动,执行完整的SELinux重新标记,然后再
次重新启动





>>启动时添加内核参数:


临时添加


在菜单上按e
按end
在linux16开头的行的最后面加参数:
按ctrl+x使用这些更改进行启动


>>破解root密码:


在菜单上按e
按end
在linux16开头的行的最后面加参数:
在内核参数中传这个参数:rd.break   console=tty0
ctrl+x




switch_root:/#mount
/dev/sda1 on /sysroot type xfs (ro.) #系统现在是以只读的访问被挂载
switch_root:/#mount -o remount,rw /sysroot #修改挂载系统根目录为读写的方式
switch_root:/#mount
/dev/sda1 on /sysroot type xfs (rw.) #现在系统以读写的方式挂载


switch_root:/#chroot /sysroot #将/sysroot做为根目录挂载


sh-4.2# echo "redhat" | passwd --stdin root
touch /.autorelabel


sh-4.2#exit
switch_root:exit


系统将重新启动




===============================


修复启动加载器问题


RHEL7中默认使用的启动加载器是grub2
? grub2可以用来在BIOS和UEFI系统中进行启动,并且支持启动现代硬件
上运行的几乎所有的操作系统。
? grub2的主要配置文件是/boot/grub2/grub.cfg,但是管理员不应直接
编辑该文件。而是应使用一组不同的配置文件和安装的内核列表,并借
助名为grub2-mkconfig的工具来生成配置
? grub2-mkconfig会查看/etc/default/grub的选项(例如要使用的默认
菜单超时及内核命令行),然后在/etc/grub.d中使用一组脚本来生成配
置文件。
? 要永久更改启动加载器配置,管理员需要编辑前面列出的配置文件,然
后运行以下命令。grub2-mkconfig > /boot/grub2/grub.cfg
? 在进行较大更改的情况下,管理员可能更喜欢不经过重定向即运行该命
令,这样可以首先检查结果。


重要指令
要为损坏的grub2配置排除故障,管理员需要先了解
/boot/grub2/grub.cfg的语法。实际可启动条目是在menuentry块
中编码的。这些块中,linux16和initrd16行指向(随内核命令行)从
磁盘加载的内核以及要加载的initramfs。在启动时进行交互式编辑的
过程中,tab补全可用于查找这些文件。
? 这些块中的set root行不指向RHEL7系统的root文件系统,而是指向
grub2应从中加载内核及initramfs文件的文件系统。语法为
harddrive,partition,其中hd0是系统的第一个硬盘驱动器,hd1
是第二个硬盘驱动器,以此类推。指定为msdos1的分区是该驱动器
上的第一个MBR分区,指定为gpt1的分区是第一个GPT分区。




重新安装启动加载器
在启动加载器自身已损坏的情况下,可以使用grub2-install
命令重新安装。在BIOS系统中,应提供MBR中应安装grub2
的磁盘作为参数。在UEFI系统中,当EFI系统分区挂载于
/boot/efi上时,无需提供任何参数。






问题:
/boot/grub2/grub.cfg
修复grub
#grub2-install /dev/sda1




>将/boot目录或分区删除,造成系统无法启动:
救援模式
rescue a red hat enterprive 
选项continue 加载到/mnt/sysimage
变更root目录 chroot /mnt/sysimage
挂载cdrom 到/media
配置本地仓库
重新安装内核:#yum -y reinstall kernel
重新安装grub2  #grub2-install /dev/sda
重新生成grub2配置文件grub.cfg  #grub2-mkconfig > /boot/grub2/grub.cfg
两次exit后重新启动,系统已成功恢复






/etc/fstab文件错误:
本地文件系统或网络文件系统无法启动


损坏文件系统;


损坏文件系统:


挂载点错误


如果有以上错误会进入shell模式,
输入root密码后进入类似windows系统安全模式





































分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS