我们平常所说Linux服务器高性能,高可用,高稳定性都是对内核的说法,大部分运维工程师都比较关注Linux每一个发行版本对内核优化的问题;一个完整的Linux内核基本上由5个部分组成,内存管理,进程管理,进程通信,虚拟文件系统,网络接口;
1.1 内核管理
内存管理的作用:合理有效的管理整个系统的物理内存,当内核与子系统发出内存请求时进行快速响应处理;支持虚拟内存,系统上运行的所有程序占用内存总量可以大于实际物理内存,多余的部分通过磁盘进行申请,日常系统只会把当前运行的程序保留在内存中,其他程序运行所消耗的内存保留在磁盘,内存紧缺,内存管理会进行磁盘与内存之间的交换程序块,也就是Swap【交换分区】;例如说:Virtualization程序进程申请需要34 Gib内存,而服务器的实际内存只有32GB,当内存不足时,内存管理将会分配Swap分区中的虚拟内存给Virtualization程序进程;
1.2 进程管理
主要作用是控制系统进程对CPU的访问,当需要某个进程运行的时候,由进程调度器根据优先级的调度算法启动新进程,Linux支持多任务运行,**在单个CPU上运行多任务,由进程调度器完成,**在系统运行时,每个进程都会有一个时间片,进程调度器根据不同的时间片,选择每个进程的依次运行,例如说:Acronis的时间片用完之后,调度器会选择一个新的进程继续运行,由于切换的频率和时间比较快,给用户的感觉是多个进程在同时运行,实际上CPU在同一时间只有一个进程在运行,这是进程调度管理所带来的优势与好处;
1.3 进程间通信
进程通信用于控制不同进程之间在用户空间的同步,数据交换与交换,不同的用户进程拥有不同的进程空间,进程之间的通信需要借助内核的中转进行实现,对于一般的情况来说当一个进程等待硬件操作完成的时候,它会被临时的暂停,简称“挂起”操作,当硬件完成操作时,进程被恢复执行,协调的这个过程叫做进程与进程之间的通信;
1.4 虚拟文件系统
内核中的虚拟文件系统用一个通用的文件模型表示各种不同的文件系统,这个文件模型基本上屏蔽了很多具体文件系统之间的差异,从而使linux内核支持很多不同的文件系统,虚拟文件系统可以分为逻辑文件和设备驱动程序,逻辑文件系统一般是指Linux所支持的文件系统,比如说ext2,ext3,ext4,fat,xfs,等等,设备驱动程序基本上是指为每一种硬件控制器所编写的设备驱动程序模块;
1.5 网络接口
网络接口基本上提供了对各种网络标准的实现和各种网络硬件的支持,网络接口一般分为网络协议,网络设备驱动程序,比如说我们的NAS,SAN存储,说简单一点,通过TCP/IP发现链接打印机,并安装驱动;
网络协议部分负责实现每一种网络传输协议,网络设备驱动程序负责硬件设备进行通信,每一种网络硬件设备,都有自己的设备驱动程序;
Linux 系统的 init 进程经历了两次重大的演进,传统的 Sysvinit 已经随着历史的演变退出舞台,新的 init 系统 UpStart 和 Systemd 各有特点,而越来越多的发行版采纳了 Systemd。
2.1 Sysvinit
操作系统启动首先从 BIOS 进行,引导程序将内核映像加载到内存进行内核初始化,内核初始化最后一个过程是启动 PID 为 1 的 init 进程,它是系统的第一个进程,它负责创建其他所有用户进程,例如说我们普遍的在Linux上搭建一个apache,需要安装http,当我们把httpd加到服务时,init会把httpd作为进程创建;
init 进程的存在主要是为了守护进程,是所有其他进程的老大,init 进程非常独特,能够完成其他进程无法完成的任务,Init 系统能够定义、管理和控制 init 进程的行为。它负责组织和运行许多独立的进程,或某些特定进程的始化工作,让计算机系统进入用户预订运行模式;大多数 发行版 init 可以与 System V 兼容,也就是我们常说的 Sysvinit,可以说是最熟悉的 init 系统;
SysVinit 运行非常的良好,概念比较简单,清晰,不过也有着最大的弱点:启动太慢,在我们的服务器上这个缺点可能不太明显,比较服务器的处理器都是超线程,只有在被应用到移动设备的时候,启动慢就成了一个大问题,比如说运行在黑莓手机,或者是配置较低的笔记本电脑上,为了更快地启动,基本上都开始改进 Sysvinit,先后出现了 Upstart 和 Systemd 两个新一代 init 系统。
2.2 Runlevel到Target的改变----运行级别
大家都知道Windows系统有支持运行模式和安全运行模式两种,这是两个不同运行级别,同样的,Linux也有系统运行级别,不过区别在于Linux 运行级别更加多样化,更加灵活;
Runlevel
Sysvinit 用术语 runlevel 来定义”系统运行级别”,在Red Hat 7.x和Centos 7.x版本之前的版本,基本上有7中运行级别,级别分别均在/etc/inittab文件里面进行指定,Sysvinit通过检查inittab文件有没有initdefault项进行启动一个默认的运行级别,如果没有默认的运行模式,那么将进入系统控制台,让系统管理员手动决定进入哪个运行模式:
另外4个运行级别,在RHEL和Centos的含义
以上系统运行级别和init程序相互对应,例如说执行init 1命令进入单用户,执行init 6系统进行重启,执行init 5进入图形化界面等等;
Target
在RHED 7.x和Centos 7.x版本,采用systemd管理体系,以前的运行级别runlevel概念被新运行目标target代取,target命令类似”multi-user.target“形式,例如说原来的运行级别是3(runlevel3),对应新多用户目标”multi-user.target“,运行级别5(runlevel5)对应“graphical.target”,Systemd机制不会再使用runlevle,/etc/inittab不会被再次引用;
Target的五种模式与Runlevel对比
shutdown可以将Linux系统安全的关闭,大部分运维工程师或者刚刚入门的个人爱好者基本上是通过简单粗暴的拔电源方式关机,这是非常危险的操作,毕竟主板,磁盘烧坏的几率很高;Linux与windows不同,Linux后台有着许许多多的PID进程,这些进程控制着Linux的各式操作,如果强制关机,基本上都会都会造成进程混乱,丢书数据,如果在工作负载很高的情况下断电,丢的就不是数据了,而是硬件设备的损坏;
shutdown命令基于shell编写的程序,只能超级用户Root或者管理者用户才能执行,shutdown命令执行后,会广播通知正在系统中工作的所有用户,系统将在制定的时间点进行关机动作,请保存文件,停止作业,注销用户;这个时候,login命令会被冻结,新的用户将无法登陆,当所有用户从系统注销或者已经到了关机时间,shutdown会给init一个信号,要求init程序改变系统运行级别,接下来init会根据shutdown的指令来传递参数,改变相应的运行级别,例如说:shutdown指定的参数是关机,init程序就会执行init 0关机,如果shutdown指定参数是重启,init将执行init 6进行重新启动操作系统;
命令语法:shutdown 【参数】 【-t 秒数】 【时间 (警告信息)】
参数含义:
【fsck是linux下一个检查和修复文件系统的程序,后期会讲解】
–h:将系统进行关机,在某种程度与halt命令相同
–k:只发送信息给所有用户,不会真正的关机
–n:不会调用init程序关机,由shutdown 自己进行(一般关机是shutdown调用init进行关机动作),加快关机速度,但不建议使用
–r:shutdown 关机之后对系统进行重新启动
–c:取消前面执行的shutdown命令,例如说:之前已经执行了shutdown -h 15:30 命令,在15:30进行关机,只要按ctrl+c组合键可以中断关机命令,那如果当时执行的是shutdown -h 15:30&,将shutdown在后台执行,需要用到shutdown -c来取消上一个shutdown命令的执行;
-t:秒数,发送警告信息和关机信号过程时间需要延迟多少秒执行,警告信息将提醒用户保存当前所进行的工作;
时间:设置多久之后执行shutdown命令,
时间参数:hh:mm或者是+m两种模式
hh:mm:表示在几点几分执行shutdown命令,例如说:shutdown 18:15 表示将在18点15分执行shutdown命令
+m:表示m分钟之后执行shutdown命令,例如:+45 ,不过比较特别的用法可以用now立刻执行shutdown命令
警告信息:传递给所有登陆用户的信息
shutdown应用示例:
立刻关闭Linux系统,now 相当于时间为 0
[root@acronis-server ~]# shutdown -h now
Broadcast message from root (pts/1) (Sat Jan 10 18:51:34 2015):
The system is going down for system halt NOW!
系统将在2分钟后重新启动,其中+m表示几分钟后关机或开机。
[root@acronis ~]# shutdown -r +2
Broadcast message from root (pts/2) (Sat Jan 10 19:56:00 2015):
The system is going DOWN for reboot in 2 minutes!
设置系统在18:30进行关机
[root@acronis-server ~]# shutdown -h 18:30
另外一种方法:
[root@acronis-server ~]# shutdown -h 18:30 &
[1] 4588
【最好是使用命令&,把关机命令放到后台进行,不影响当前其它任务的进行】
设置多久时间后执行shutdown命令,刚刚上面也说了时间参数有hh:mm或+m两种模式;
hh:mm格式表示在几点几分执行shutdown命令。
例如:在18:30执行shutdown
shutdown 18:30
+m表示m分钟后执行shutdown,比较特别的用法是以now表示立即执行shutdown。 注意部分参数不能省略,另外,需要注意,如果现在已经22:30,之前执行过shutdown -h 22:00 & 到第二天才会关机。
将前一个shutdown命令取消息
如下,执行了下面命令让Linux在18:30关机,但是如果发现这个时间点不合适,那么可以使用CTRL+C取消
[root@acronis-server ~]# shutdown -h 18:30
Shutdown cancelled.
[root@acronis-server ~]#
也可以在另一个命令窗口执行
[root@acronis-server ~]# shutdown -c
向所有登录的用户发出信息
[root@acronis-server ~]# shutdown -k "now"
Broadcast message from root (pts/2) (Sat Jan 10 20:09:14 2015):
The system is going down to maintenance mode NOW!
Shutdown cancelled.
另外登录的会话窗口会收到信息
Broadcast message from root (pts/2) (Sat Jan 10 20:11:34 2015):
The system is going down to maintenance mode NOW!
使用下面语法,如下所示
[root@acronis-server ~]# shutdown -k now "The Server will shutdown now"
Broadcast message from root (pts/1) (Sat Jan 18 30:18:30 2019):
The Server will shutdown now
The system is going down to maintenance mode NOW!
Shutdown cancelled.
重新启动时不进行磁盘检测
[root@acronis-server ~]# shutdown -fr now
Broadcast message from root (pts/1) (Sat Jan 10 20:23:59 2015):
The system is going down for reboot NOW!
在多少秒后关闭系统并给用户发送提示信息
[root@acronis-server ~]# shutdown -t 10 -h now "System will shutdown 10 sencond later"
Broadcast message from root (pts/1) (Sat Jan 10 20:33:36 2015):
System will shutdown 10 sencond later
The system is going down for system halt NOW!
halt是最简单的关机命令,相当于”shutdown-h“,执行halt的时候,将终止所有应用程序,调用系统指令sync,sync将所有内存信息通过文件系统写入磁盘,再停止内核进行关机;
命令语法:halt 【finp】
halt在执行的时候,最开始会检测系统的运行级别,如果运行级别是0或者是6,会立刻关闭系统,如果是在其他运行级别,将调用shutdown进行关闭系统;
参数详细介绍:
reboot执行过程与halt基本上类似,不同的区别在于halt的作用是将系统关闭,reboot的作用是将系统重启;
init程序主要用于系统不同运行级别之间的切换,切换的工作几乎是瞬间完成的,例如说:init 0将系统运行级别切换到 0,也就是关机操作,init 6命令用于将运行级别切换到6,也就是系统重启,关于init命令的详细描述上一篇博客《Linux内核详解,运行机制init系统详解,运行级别Runlevel到Target的改变》有写到,这里忽略;