开机->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系统安全模式