一.系统的初始化和服务
1.Linux系统引导的顺序
MBR在启动盘的第1个块中,大小为512B。其中前446B的代码用来选择boot partition(分区)–由哪个分区来装入开机用的代码;中间64B为分区信息;末尾2B为结束的标志位
在内核部分主要是装机计算机设备的驱动程序以便操作系统可以控制计算机上的设备。并且以只读的方式挂载/(根)文件系统,也就是此时的操作系统只能读到根文件系统(目录)所在的分区
LinuxOS为模块化设计
2.BOIS的初始化和引导加载程序
(1)BIOS(Basic Input/Output System,基本输入/输出系统)的定义:硬件与软件之间的接口,且是非常基本的接口
(2)BIOS的工作:检查计算机的硬件设备,如CPU/内存/风扇速度;决定从哪里启动(启动介质)
(3)设置BIOS密码(否则可修改启动介质,使用救援模式删除grub加密):在BIOS中Set Supervisor Password(BIOS加密)
3.GRUB程序和grub.conf文件
(1)GRUB(Grand Unified Bootloader,多重操作系统启动管理器)的作用:选择操作系统分区的不同内核/向这些内核传递启动参数(控制使用哪个操作系统)
(2)grub的配置文件:grub.conf(在该文件中)
default=0:默认加载第一个kernel
timeout=5:boot loader处读秒时长为5s
solashimage:控制加载时图片
hiddenmenu:读秒后的时候隐藏以下信息(按e显示)
最后为kernel信息
(3)grub加密(否则可更改系统设置,如启动级别):
首先设置grub Md5加密命令:在shell中,grub-MD5-crypt
然后编辑grub.conf的密码:在title之上加password=明文/password --md5 密文(一般用密文)
Title red hat 标题
加载内核系统引导必须的密码:Password=明文/password --md5 密文
4.内核的初始化和init的初始化
(1)init的配置文件:/etc/inittab(可在此文件中修改系统启动级别)
如果出现下图所示情况,选e或d
(2)init程序的工作:
·决定预设(默认)要使用哪个run levels(运行级别)
·执行一些系统初始化的脚本(程序)来初始化操作系统
·根据run level的设置来执行所对应目录中的程序,以决定要启动哪些服务
·设定某些组合键
·定义UPS不间断电源系统,即当电源出现问题时或电源恢复时要执行哪些程序
·产生6个virtual consoles,也就是tty1~tty6
(3)init程序的进程id为1,即Linux操作系统第1个执行的程序
5.run levels(运行级别):查看当前操作系统运行级别
运行级别及每一个运行级别对应的功能:
级别5为默认级别;在boot loader读秒时可以更改启动级别,选择1则登录无需密码
6.关闭系统及重启系统
(1)常用的可以关闭系统的命令:
shutdown -h now
halt
poweroff
init 0
(2)常用的可以重启系统的命令:
shutdown -r now
reboot
init 6
Ctrl+Alt+Delete键
7.单用户模式修改用户的密码
https://blog.csdn.net/wxc_qlu/article/details/82972162
8.救援模式
blog.csdn.net/yangxiaoyan12/article/details/83793684
blog.csdn.net/hdyebd/article/details/83754257
二.系统监控
1.top命令:
(1)top命令的功能:top命令是Linux下常用的性能分析工具,能实时显示各个进程的资源占用状况,类似于Windows的任务管理器
(2)使用top命令列出系统状态时,系统默认每5s刷新一次内容
第1行是任务队列信息
第2,3行为进程和CPU信息
僵尸进程:父进程被杀死的进程;占用内存资源,不占用CPU资源
0.0%st:CPU被偷走(用于虚拟机)的时间百分比
第4,5行为内存信息
swap:交换分区(虚拟内存)
buffer:缓冲区;缓解硬盘与内存速度差;硬盘上数据先写入buffer,增加到一定数量后,再写入CPU使用的那部分内存,让CPU一次性调用运行
cache:高速缓存;缓解CPU与内存速度差;存放CPU常用的数据
进程信息:
cpu利用率:上一天班的时间是8个小时,而码农敲代码的时间为2个小时,2/8=0.25,25%就是码农在一天的时间内的利用率(正常情况,cpu利用率<70%)
cpu负载:公司在一分钟内为某个码农安排了3个任务,而1分钟内该码农能做6个任务,那么该码农一分钟内的负载为0.5
cpu负载<=1:能正常应付
cpu负载>1:超负荷运转
如果有4核,相当于将100个任务交给4个码农去干,如果每个码农的负载都是100%,那么整体的cpu负载达到4.0则是正常现象
多核cpu的load average应该<=cpu核数*0.7
低利用率,高负载的情况:进程被挂起
在两种情况下会导致一个进程在逻辑上不能运行:(1)进程挂起是自身原因,遇到I/O阻塞,便要让出CPU让其他进程去执行,保证CPU一直在工作(2)与进程无关,是操作系统层面,因为一个进程占用时间过多,或优先级等原因,而调用其他的进程使用CPU
因而一个进程有三种状态
2.free命令:
(1)free命令的功能:显示内存的使用状态(下图centos6中查看效果,用二维数组代表FO(free output)第一个数为行数,第二个数为列数)
free:默认以KB
-b,-k,-m,-g show output in bytes, KB, MB, or GB
-h human readable output (automatic unit scaling)
-l show detailed low and high memory statistics
-o use old format (no -/+buffers/cache line)
-t display total for RAM + swap
-s update every [delay] seconds
-c update [count] times
-a show available memory if exported by kernel (>80 characters per line)
-V display version information and exit
- 第2行从操作系统的角度看:
物理内存FO[2][1]=24677460KB
物理内存被使用的内存FO[2][2]=23276064KB
可以用内存F[2][3]=1401396KB
等式:FO[2][1] = FO[2][2] + FO[2][3]
共享内存F[2][4]=0,表示几个进程共享的内存(数据共享)
FO[2][5]=870540表示已经分配但是还未使用的buffers大小
FO[2][6]=12084008表示已经分配但是还未使用的cache大小
buffer和cache的解释:
A buffer is something that has yet to be "written" to disk.
A cache is something that has been "read" from the disk and stored for later use.
也就是说buffer用于存放要输出到disk(块设备)的数据;而cache存放从disk上读出的数据;这二者是为提高IO性能,由OS管理
Linux和其他成熟OS(如windows),为提高IO read性能,总是要多cache一些数据,这就是为什么FO[2][6]较大,而FO[2][3]较小
我们可以做一个简单的测试:
#释放掉被系统cache占用的数据:echo 3>/proc/sys/vm/drop_caches
#读一个大文件,并记录时间
#关闭该文件
#重读这个大文件,并记录时间
#第二次读应该比第一次快很多
- 第3行从应用角度考虑,可理解为真实的内存使用情况
计算已使用内存时减去buffers/cache,计算可使用内存时加上buffers/cache
内存使用率=FO[3][2]/FO[2][2]
对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存
对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存
因为被系统cache/buffer占用的内存可被快速回收,通常FO[3][3]>>FO[2][3]
这里还用两个等式:
FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]
free命令的所有输出值都是从/proc/meminfo中读出的
(2)掌握free命令的功能:显示内存的使用状态(下面均为centos7中查看效果)
http://www.linuxatemyram.com/提到使用free命令查看Linux系统使用内存时,used一项会把当前cache的大小也会加进去,这样会造成free这一栏显示的内存特别少:
$ free -m
total used free shared buff/cache available
Mem: 1504 1491 13 0 855 869
Swap: 2047 6 2041
可是实际上,cache根据应用程序的需要是可以回收利用的,因此free这一栏并不能真实地表现有多少"可以使用"的内存;实际系统可用内存应该以available数据为准
linuxatemyram所提到的也许是较老的版本,RHEL 7.2,Ubuntu 16.04,Arch Linux这3个Linux发行版,均没有出现used包含cache的情况:
$ free -m
total used free shared buff/cache available
Mem: 64325 47437 3150 1860 13737 14373
另外,从man free命令中也可以得到,目前计算used的值是要减掉free和buff/cache的:
used Used memory (calculated as total – free – buffers – cache)
可以使用-w命令行选项得到buff和cache各自使用的数量:
$ free -wm
total used free shared buffers cache available
Mem: 64325 48287 2476 1859 1430 12131 13524
需要注意的是,free表示的是当前完全没有被程序使用的内存;而cache在有需要时,是可以被释放出来以供其它进程使用的(当然,并不是所有cache都可以释放,比如当前被用作ramfs的内存);而available才真正表明系统目前可以提供给应用程序使用的内存;/proc/meminfo从3.14内核版本开始提供MemAvailable的值;在2.6.27~3.14版本之间,是free程序自己计算available的值;早于2.6.27版本,available的值则同free一样
三.进程控制
1.系统中进程的监控—ps
(1)进程:进程是程序的一次动态执行
(2)守护进程:守护进程是在后台运行并提供系统服务的一些进程,详细见 并发编程 部分
(3)父进程/子进程:当一个进程创建另一个进程时,第1个进程被称为新进程的父进程,而新进程被称为子进程
(4)ps命令功能:显示当前进程的状态
-a 显示所有终端机下执行的进程,除了阶段作业领导者之外
a 显示现行终端机下的所有进程,包括其他用户的进程
-A 显示所有进程
-c 显示CLS和PRI栏位
c 列出进程时,显示每个进程真正的指令名称,而不包含路径,参数或常驻服务的标示
-C<指令名称> 指定执行指令的名称,并列出该指令的进程的状况
-d 显示所有进程,但不包括阶段作业领导者的进程
-e 此参数的效果和指定"A"参数相同。
e 列出进程时,显示每个进程所使用的环境变量
-f 显示UID,PPIP,C与STIME栏位
f 用ASCII字符显示树状结构,表达进程间的相互关系
-g<群组名称> 此参数的效果和指定"-G"参数相同,当亦能使用阶段作业领导者的名称来指定
g 显示现行终端机下的所有进程,包括群组领导者的进程
-G<群组识别码> 列出属于该群组的进程的状况,也可使用群组名称来指定
h 不显示标题列
-H 显示树状结构,表示进程间的相互关系
-j或j 采用工作控制的格式显示进程状况
-l或l 采用详细的格式来显示进程状况
L 列出栏位的相关信息
-m或m 显示所有的执行绪
n 以数字来表示USER和WCHAN栏位
-N 显示所有的进程,除了执行ps指令终端机下的进程之外
-p<进程识别码> 指定进程识别码,并列出该进程的状况
p<进程识别码> 效果和指定"-p"参数相同,只在列表格式方面稍有差异
r 只列出现行终端机正在执行中的进程
-s<阶段作业> 指定阶段作业的进程识别码,并列出隶属该阶段作业的进程的状况
s 采用进程信号的格式显示进程状况
S 列出进程时,包括已中断的子进程资料
-t<终端机编号> 指定终端机编号,并列出属于该终端机的进程的状况
t<终端机编号> 效果和指定"-t"参数相同,只在列表格式方面稍有差异
-T 显示现行终端机下的所有进程
-u<用户识别码> 此参数的效果和指定"-U"参数相同
u 以用户为主的格式来显示进程状况
-U<用户识别码> 列出属于该用户的进程的状况,也可使用用户名称来指定
U<用户名称> 列出属于该用户的进程的状况
v 采用虚拟内存的格式显示进程状况
-V或V 显示版本信息
-w或w 采用宽阔的格式来显示进程状况
x 显示所有进程,不以终端机来区分
X 采用旧式的Linux i386登陆格式显示进程状况
-y 配合参数"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位
常用组合:
ps –aux/aux 显示所有进程,其用户id,其所在终端(?代表在后台运行)
ps -ef
ps auxc/-auxc
ps axjf/-axjf
ps axjfc/-axjfc
2.系统中进程的监控pstree、kill
centos7默认没有pstree,需要yum -y install psmisc
(1)pstree命令功能:以树状图显示程序
#列出PID为4729的进程的进程状态树的命令:
pstree 4729
(2)kill命令功能:把信号发送给一/多个进程;默认发送终止信号
有些情况下终止不掉(如自身所在进程),可使用-9强制杀死
#终止PID为3852的进程的命令:
kill 3852
#强制杀死PID为3906的进程的命令:
kill -9 3906
3.pgrep命令功能:通过名称/其他属性查找进程
#查找名为firefox的进程的命令为:
pgrep firefox
4.pkill命令功能:通过名称/其他属性发信号给进程
所有同名/同属性都会被杀死
#杀死名为firefox的进程的命令为:
pkill firefox
#强制杀死名为firefox的进程的命令为:
pkill -9 firefox
5.&:进程在后台运行
#启动名为firefox的进程在后台运行:
firefox &
6.fg %:后台程序调至前台运行
fg %jobnumber:将工作号为jobnumber的程序调至前台运行
#jobnumber由jobs命令获得(结果第一列)
7.Ctrl+Z:将一个正在前台执行的命令放到后台,并暂停
8.jobs:查看当前有多少在后台运行的命令
9.bg:将一个在后台暂停的命令,变成继续执行
bg %jobnumber