CentOS的启动流程总体顺序如下:
POST -->Boot Sequence -->bootloader(MBR) -->Kernel -->加载rootfs -->switchroot -->/sbin /init -->(配置文件:/etc/inittab, /etc/init/*.conf) -->根据init配置文件设置默认运行级别 -->运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 -->开启或关闭用户选定的对应运行级别下所对应的服务 -->启动终端,打印登录提示符。
注:前面加粗部分代表内核空间的系统启动流程,后面未加粗部分代表用户空间的系统启动流程。
第一步:硬件启动过程
POST加电自检
主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS会检测CPU、Memory以及I/O设备是否能够正常运行,如果是个人计算机的话可能还会检测一下显示器。只要一通电,CPU就会自动去加载ROM芯片上的BIOS程序,是这样来实现的。而检测完成之后就进行硬件设备的初始化。
选择启动设备以加载MBR
主要实现的功能是选择要启动的硬件设备,选择了之后就可以读取这个设备上位于MBR里头的bootloader了。这一步的实现是这样的:根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备,然后第一个被扫描到具有引导程序(bootloader)的设备就被作为要启动的引导设备。
MBR(Main Boot Record),是硬盘的0柱面,0磁道、1扇区(第一个扇区),称为主引导扇区,也称为主引导记录。它由三部分组 成:主引导程序(BootLoader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
注:硬盘默认一个扇区大小为512字节。
第一部分,主引导程序(BootLoader)占446个字节,负责从活动分区中装载,并运行系统引导程序。
第二部分,硬盘分区表DPT占64个字节,有4个分区表项,每个分区表项占16个字节,硬盘中分区有多少以及每一个分区的大小都记 录在其中。
第三部分,硬盘有效标志,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MB
第二步:GRUB引导阶段
不同的系统有不同的主引导程序(BootLoader)。Windows使用的是NTLDR(NT Loader,Windows NT系列 *** 作系统)、Bootmgr(Boot Manager,Windows Vista,7,8,10),Linux一般使用的是grub(也叫grub legacy)和grub2。GRUB程序加载执行并引导kernel(内核)程序,其中有三个阶段,Grub引导阶段的文件都在/boot/grub/目录下。
stage1: 这一阶段执行的就是系统安装时预先写入到MBR的Bootloader程序,即是存放在MBR的前446字节里的程序。它的任务仅是读取(加载)硬盘的0柱面,0磁道,2扇区的内容(/boot/grub/stage1)并执行。
stage1.5: 这一阶段是Stage1阶段和Stage2阶段的桥梁,功能是加载stage2所在分区的文件系统驱动,让stage1中的bootloader能识别stage2所在分区的文件系统,此后grub程序便有能力去访问/boot/grub/stage2。
stage2: 这一阶段读取并解析grub的配置文件/boot/grub/grub.cnf,根据配置文件加载内核镜像到内存中,通过initrd程序建立虚拟根文件系统,最后调用(转交)内核。
第三步:内部引导阶段
加载内核,核心开始解压,启动一些最核心的程序。为了让内核足够的轻小,硬件驱动并没放在内核文件里面。系统仅探测可识别到的所有硬件设备,加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序(有可能会借助于ramdisk加载驱动),以只读方式挂载根文件系统,运行用户空间的第一个应用程序:/sbin/init。
第四步:init初始化阶段(系统初始化阶段)
虽然CentOS 5、CentOS 6以及CentOS 7的/etc/init配置文件内容各不相同,但总体的启动流程相同:/sbin/init -->根据/etc/inittab配置文件设置默认运行级别 -->运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 -->关闭或启动用户选定的默认运行级别所对应的服务 。
对于CentOS 5来说,初始化程序init是SysV init,其配置文件为:/etc/inittab; 对于CentOS 6来说,初始化程序init是upstart,其配置文件为:/etc/inittab, /etc/init/ .conf,也就是upstart将配置文件拆分成多个,在/etc/init/目录下以conf结尾的都是upstart风格的配置文件,而/etc/inittab仅用于设置默认运行级别; 对于CentOS 7来说,初始化程序init是systemd,其配置文件:/usr/lib/system/systemd/, /etc/systemd/system/ ;
具体执行过程:/sbin/init程序会读取/etc/inittab文件确认运行级别,然后执行/etc/rc.d/rc脚本,根据确认的运行级别启动对应/etc/rc.d/rc#.d/目录下的服务(#为0~6),与此同时执行系统初始化脚本/etc/rc.sysinit(软链接,指向/etc/rc.d/rc.sysinit),还会加载/etc/rc.local(软链接,指向/etc/rc.d/rc.local文件)用户自定义服务(脚本)。
CentOS7中初始化进程变为了systemd,systemd即为system daemon,是Linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell系统开销的效果,最终代替现在常用的System V与BSD风格的init程序。与多数发行版使用的System V风格的init相比,systemd采用了以下的新技术:A.采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;B.用Cgroup代替PID来追踪进程,即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
第五步:启动终端
根据前面获取的运行级别来启动终端,mingetty程序是用于启动终端的,它会调用登录程序login,这样就能显示出登录提示符了,类似mingetty这种用于打开终端的程序还有getty等。而如果默认运行级别为5,则会打开图形界面。
第一步:硬件启动过程
这一步和CentOS6差不多,详细请看1.1内容。
第二步:GRUB引导阶段
从这一步开始,CentOS6和CentOS7的启动流程区别开始展现出来了。CentOS7的主引导程序使用的是grub2,执行过程是先加载boot.img、core.img两个镜像,再加载MOD模块文件,把grub2程序加载执行,接着解析配置文件/boot/grub/grub.cfg,根据配置文件加载内核镜像到内存,之后构建虚拟根文件系统,最后转到内核。
CentOS7中使用命令进行配置,而不直接去修改配置文件了。grub.cfg配置文件开头注释部分说明了由/etc/grub.d/目录下文件和/etc/default/grub文件组成。改好配置后都需要使用命令grub2-mkconfig -o /boot/grub2/grub.cfg,将配置文件重新生成。
第三步:内部引导阶段
这一步与CentOS6也差不多,加载驱动,切换到真正的根文件系统,唯一不同的是执行的初始化程序变成了/usr/lib/systemd/systemd。
第四步:init初始化阶段(系统初始化阶段)
CentOS7中我们的初始化进程变为了systemd。执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关)。然后执行sysinit.target来初始化系统和basic.target来准备 *** 作系统。接着启动multi-user.target下的本机与服务器服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动。最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。
注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。
unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的信息。(也就是CentOS6中的服务器启动脚本)
第五步:启动终端
systemd执行sysinit.target
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下面的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登录服务
getty.target是启动终端的systemd对象。如果到此步骤,系统没有指定启动图形桌面,到此就可以结束了,如果需要启动图形界面,要在此基础上启动桌面程序。
从 CentOS 7 版本之后,系统开始用 systemd 实现init进程,系统启动和服务器守护进程管理器功能,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息。
3.2 system unit文件格式
/usr/lib/systemd/system:发行版打包者使用,每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/etc/systemd/system:系统管理员和用户使用,管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行
/lib/systemd/system::ubutun的对应目录
/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
unit 格式说明:
service unit file文件通常由三部分组成:
Unit段的常用选项:
Service段的常用选项:
Install段的常用选项:
注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启。
首先在启动界面按e编辑启动参数,
将ro参数更改为rw init=/sysroot/bin/sh,按ctr + x启动系统
按下图执行命令更改root密码
1.1、服务器注意事项:
远程服务器不允许关机,只能重启
重启时应该先关闭服务
不要在服务器访问高峰运行高负载命令
远程配置防火墙时不要把自己踢出服务器
指定合理的密码规范并定期更新
合理分配权限
定期备份重要的数据和日志
1.2、设置网络桥接命令和(ANT模式):
systemctl restart network------重启网卡service network restart---------重启网络服务
systemctl stop NetworkManager 临时暂停网络管理器systemctl disable NetworkManager 永久关闭网络管理器
systemctl start NetworkManager 拥有root用户的可执行权限
systemctl stop NetworkManager 停止并禁用虚拟机 NetworkManager 服务
systemctl disable NetworkManager
注意:修改网络配置文件后,需要重新加载网络连接,如果是通过network.service则使用命令:systemctl restart network;如果是通过NetworkManager.service则使用nmcli命令:nmcli connection reload。
设置网络主要 *** 作(桥接模式和)
[root@localhost network-scripts]# cd etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vi ifcfg-ens33
systemctl restart network------重启网卡
service network restart---------重启网络服务
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static 设置静态
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=10c17057-e9c9-4831-a8ff-0757ea0abc0b
DEVICE=ens33
ONBOOT=yes #开机重启
#IPADDR=192.168.43.168 #ip地址(需要跟主机同一个网段,不同一个IP)
IPADDR=10.63.73.20
#NETMASK=255.255.255.0 #子网掩码(下面三个都跟主机一样)
NETMASK=255.255.0.0
#GATEWAY=192.168.43.1 #网关
GATEWAK=10.63.255.254
#GATEWAK=10.200.0.3
#DNS1=192.168.43.1 #DNS服务
设置网络主要步骤(Nat模式)
1.打开Vm,点击编辑->虚拟网络编辑
2.选择VMnet8,将VMnet信息改为NAT模式,比如我的本机IP是192.168.138.1,子网掩码为255.255.255.0
所以我将下面的IP配置成192.168.138.0 子网掩码配置成255.255.255
3.再点击NAT设置将网管配置成192.168.138.2(ps:网关不要配置成和自己IP地址一样)
然后再应用确定
4.右键点击虚拟机设置,网络适配器改为自定义(选择Vmnet8 Nat模式)
5.接下来开启虚拟机
cd /etc/sysconfig/network-scripts/
vim ifcfg-eno16777736
然后再执行命令:/etc/init.d/network restart
1.3、设置防火墙
1.3.1、防火墙命令
停止防火墙:
systemctl stop firewalld.service #停止firewall 防火墙
service iptables stop #(centos7版本之前)
永久关闭防火墙:
systemctl disable firewalld.service #禁止firewall开机启动 ( 永久关闭防火墙 )
chkconfig iptables off #永久关闭防火墙
开始防火墙:
systemctl start firewalld #启动防火墙
systemctl restart iptables.service #重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动(重启)
查看防火墙状态:
systemctl status firewalld
service iptables status # (7版本之前)
1.3.2、Linux chkconfig 命令
Linux chkconfig 命令用于检查,设置系统的各种服务。
这是Red Hat公司遵循GPL规则所开发的程序,它可查询 *** 作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。
语法
chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset]
参数 :
--add 增加所指定的系统服务,让 chkconfig 指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
--del 删除所指定的系统服务,不再由 chkconfig 指令管理,并同时在系统启动的叙述文件内删除相关数据。
--level<等级代号> 指定读系统服务要在哪一个执行等级中开启或关毕。
实例
列出chkconfig 所知道的所有命令,可以用chkconfig –list查看所有的服务及其在每个级别的开启状态。
# chkconfig --list
开启服务
# chkconfig telnet on //开启 Telnet 服务
# chkconfig --list //列出 chkconfig 所知道的所有的服务的情况
关闭服务
# chkconfig telnet off // 关闭 Telnet 服务
# chkconfig --list // 列出 chkconfig 所知道的所有的服务的情况
[root@cent01 sbin]# chkconfig --level 3 network off //关闭3级别的network服务
[root@cent01 sbin]# chkconfig --list //3级别已关闭
network 0:关 1:关 2:开 3:关 4:开 5:开 6:关
[root@cent01 sbin]# chkconfig network on //不输入级别,默认打开2,3,4,5级别
[root@cent01 sbin]# chkconfig --list
network 0:关 1:关 2:开 3:开 4:开 5:开 6:关
[root@cent01 sbin]# chkconfig --del network //删除network
[root@cent01 sbin]# chkconfig --list //network已消失
mysqld 0:关 1:关 2:开 3:开 4:开 5:开 6:关
netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
[root@cent01 sbin]# chkconfig --add network //增加network服务
[root@cent01 sbin]# chkconfig --list //network服务又恢复了
mysqld 0:关 1:关 2:开 3:开 4:开 5:开 6:关
netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
network 0:关 1:关 2:开 3:开 4:开 5:开 6:关
[root@cent01 sbin]# chkconfig --list
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。
mysqld 0:关 1:关 2:开 3:开 4:开 5:开 6:关
netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
注意: 但是这里只显示了SysV管理的服务,centos6及之前都是这个管理工具,但是在centos7用的是systemd管理,所以systemd管理的服务在这里没有显示出来。
运行级别为系统启动级别,具体含义如下:
0 shutdown关机
1 单用户模式
2 无NFS支持的多用户模式
3 完全多用户模式,常用的命令行模式
4 保留给用户自定义
5 图形界面登录,比3多了一个图形界面
6 重启
1.3.2、Linux systemd命令
systemd是管理开机启动程序的工具(SysV启动开机进程时一次只能启动一个,而systemd则一次可以启动多个服务,这样就导致systemd的开机速度会更快。)
[root@localhost ~]# systemctl list-units --all --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
UNIT LOAD ACTIVE SUB DESCRIPTION
[root@cent01 sbin]# ls /usr/lib/systemd/system //启动的脚本文件目录
[root@cent01 ~]# systemctl list-units //列出正在运行的unit
[root@cent01 ~]# systemctl list-units --all //列出所有的unit,包括active和inactive
[root@cent01 ~]# systemctl list-units --all --state=inactive //列出inactive的unit
[root@cent01 ~]# systemctl list-units --all --type=service //列出所有状态的service
[root@cent01 ~]# systemctl list-units --type=service //列出active的service
[root@cent01 ~]# systemctl is-active crond.service //查看某个unit是否active
systemctl enable crond.service //开机启动 .service可以省略
systemctl disable crond.service //禁止开机启动
systemctl status crond.service //查看服务状态
systemctl start crond.service //启动服务
systemctl stop crond.service //停止服务
systemctl restart crond.service //重启服务
systemctl is-enabled crond.service //查看某个服务是否开机启动
unit /usr/lib/systemd/system 此目录下列出了很多文件,这些文件都是unit。类别如下:
service 系统服务target 多个unit组成的组device 硬件设备mount 文件系统挂载点automount 自动挂载点path 文件或路径scope 不是由systemd启动的外部进程slice 进程组snapshot systemd快照socket 进程间通信的套接字swap swap文件timer 定时器
target target类似于centos6的启动级别,target内又包含多个unit的组合,当然target内也可以包含target。启动target就是启动多个unit,用target来管理这些unit。
[root@cent01 ~]# systemctl list-units --all --type=target //查看当前所有的target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
bluetooth.target loaded active active Bluetooth
[root@localhost ~]# systemctl list-dependencies multi-user.target
multi-user.target
● ├─abrt-ccpp.service
● ├─abrt-oops.service
● ├─abrt-vmcore.service
● ├─abrt-xorg.service
[root@localhost ~]# systemctl get-default //查看系统默认的target
multi-user.target
systemctl set-default multi-user.target //设置默认的target
multi-user.target等同于centos6的运行级别3。他们的对应关系如下:
SysV运行级别systemd target备注
0poweroff.target关闭系统
1rescure.target单用户模式
2multiuser.target用户自定义级别,通常识别为3
3multiuser.target多用户命令行模式
4multiuser.target用户自定义级别,通常识别为3
5graphical.target多用户图形界面,比级别3只多一个GUI
6reboot.target重启
所以总结起来,一个service属于一种unit,多个unit组成一个target,当然target里面也可以包含target。
1.4、ifconfig命令配置IP网络参数
格式:
[root@localhost /]#ifconfig [网络设备] [ip地址] [MAC地址] [netmask掩码地址] [broadcast广播地址(NDC)] [up/down]
[root@localhost /]#ifconfig eth0 192.168.74.130 netmask 255.255.255.0 up
用ifconfig命令配置eth0别名设备,为eth0绑定多个IP地址。
[root@localhost /]#ifconfig eth0:1 192.168.74.130
[root@localhost /]#ifconfig eth0:2 192.168.73.130
1.5、使用routedel命令添加路由
格式:
[root@localhost /]#routedel [-net|host] [网域或主机] netmask [mask] [gw]
[root@localhost /]#route #查看路由信息
功能:添加路由
-net : 表示后面接的路由为一个网络。
-host : 表示后面接的为连接到单部主机的路由。
netmask : 与网络有关,可以设定netmask决定网路的大小。
gw : gateway (网关)的简写,后面接的是ip地址。
1.6、使用hostname命令修改主机名称
[root@localhost /]#hostname service.jw.com
hostnamectl set-hostname nod1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)