Linux基础篇-第十六章-进程管理与 SELinux 初探

指令

工作管理

jobs [-lrs] :观察目前的背景工作状态
      -l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
      -r :仅列出正在背景 run 的工作;
      -s :仅列出正在背景当中暂停 (stop) 的工作。

fg %jobnumber :将背景工作拿到前景来处理
      %jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!

bg %jobnumber:让工作在背景下的状态变成运作中 
      %jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!

kill -signal %jobnumber  或  kill -l :终止进程
      -l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
      signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
      -1 :重新读取一次参数的配置文件 (类似 reload);
      -2 :代表与由键盘输入 [ctrl]-c 同样的动作;
      -9 :立刻强制删除一个工作;
      -15:以正常的进程方式终止一项工作。与 -9 是不一样的。

[指令与参数] & :在后台运行

nohup [指令与参数]  :不挂断地运行命令,在终端机前景中工作
nohup [指令与参数] & :不挂断地运行命令,在终端机背景中工作

进程的观察

ps aux :观察系统所有的进程数据
ps -lA  :也是能够观察所有系统的数据
ps axjf :连同部分进程树状态
      -A :所有的 process 均显示出来,与 -e 具有同样的效用;
      -a :不与 terminal 有关的所有 process ;
      -u :有效使用者 (effective user) 相关的 process ;
      x :通常与 a 这个参数一起使用,可列出较完整信息。
      输出格式规划:
      l :较长、较详细的将该 PID 的的信息列出;
      j :工作的格式 (jobs format)
      -f :做一个更为完整的输出

top [-d 数字] | top [-bnp :动态观察进程的变化
      -d :后面可以接秒数,就是整个进程画面更新的秒数。预设是 5 秒;
      -b :以批次的方式执行 top ,还有更多的参数可以使用!通常会搭配数据流重导向来将批次的结果输出成为文件。
      -n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
      -p :指定某些个 PID 来进行观察监测而已。
      在 top 执行过程当中可以使用的按键指令:
            ? :显示在 top 当中可以输入的按键指令;
            P :以 CPU 的使用资源排序显示;
            M :以 Memory 的使用资源排序显示;
            N :以 PID 来排序!
            T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
            k :给予某个 PID 一个讯号 (signal)
            r :给予某个 PID 重新制订一个 nice 值。
            q :离开 top 软件的按键。

pstree [-A|U] [-up] :显示进程树
      -A :各进程树之间的连接以 ASCII 字符来连接;
      -U :各进程树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
      -p :并同时列出每个 process 的 PID;
      -u :并同时列出每个 process 的所属账号名称

进程的管理

killall [-iIe] [command name]  :以名字方式来杀死进程
      -i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给用户;
      -e :exact 的意思,表示『后面接的 command name 要一致,要求准确匹配』,但整个完整的指令不能超过 15 个字符。
      -l :列出所有已知的信号名

nice [-n 数字] command :改变执行程序的优先级,新执行的指令即给予新的 nice 值
      -n :后面接一个数值,数值的范围 -20 ~ 19。

renice [number] PID :更改正在运行的进程的优先级
      PID :某个进程的 ID

系统资源的观察

free [-b|-k|-m|-g|-h] [-t] [-s N -c N] :观察内存使用情况
      -b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes),m(Mbytes) ,k(Kbytes), 及 g(Gbytes) 来显示单位!也可以直接让系统自己指定单位 (-h)
      -t :在输出的最终结果,显示物理内存与 swap 的总量。
      -s :可以让系统每几秒钟输出一次,不间断的一直输出的意思!对于系统观察挺有效!
      -c :与 -s 同时处理~让 free 列出几次的意思~

uname:查阅系统与核心相关信息
      -a :所有系统相关的信息,包括底下的数据都会被列出来;
      -s :系统核心名称
      -r :核心的版本
      -m :本系统的硬件名称,例如 i686 或 x86_64 等;
      -p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
      -i :硬件的平台 (ix86)

uptime:观察系统启动时间与工作负载

dmesg :分析核心产生的讯息

vimstat :侦测系统资源变化
vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等信息
vmstat [-fs] <==内存相关
vmstat [-S 单位] <==设定显示数据的单位
vmstat [-d] <==与磁盘有关
vmstat [-p 分区槽] <==与磁盘有关
      -a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息;
      -f :开机到目前为止,系统复制 (fork) 的进程数;
      -s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
      -S :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量;
      -d :列出磁盘的读写总量统计表
      -p :后面列出分区槽,可显示该分区槽的读写总量统计表

SELinux

ls -Z :观察安全性本文

getenforce :目前的 SELinux 模式

sestatus [-vb] :SELinux 的政策(Policy)
      -v :检查列于 /etc/sestatus.conf 内的文件与进程的安全性本文内容;
      -b :将目前政策的规则布尔值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意;

setenforce [0|1] :切换 SELinux 模式(setenforce 无法在 Disabled 的模式底下进行模式的切换)
      0 :转成 permissive 宽容模式;
      1 :转成 Enforcing 强制模式

getsebool [-a] [规则的名称] :SELinux 各个规则的布尔值查询
      -a :列出目前系统上面的所有 SELinux 规则的布尔值为开启或关闭值

chcon [-R] [-t type] [-u user] [-r role] :文件使用 chcon 手动修改文件的 SELinux type
      -R :连同该目录下的次目录也同时修改;
      -t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;
      -u :后面接身份识别,例如 system_u; (不重要)
      -r :后面街角色,例如 system_r; (不重要)
      -v :若有变化成功,请将变动的结果列出来
chcon [-R] --reference=范例文件 文件
      --reference=范例文件:拿某个文件当范例来修改后续接的文件的类型!

restorecon [-Rv] 文件或目录 :使用 restorecon 让文件恢复正确的 SELinux type(让 SELinux 自己解决默认目录下的 SELinux type)

semanage {login|user|port|interface|fcontext|translation} -l  :默认目录的安全性本文查询与修改
semanage fcontext -{a|d|m} [-frst] file_spec
      fcontext :主要用在安全性本文方面的用途, -l 为查询的意思;
      -a :增加的意思,你可以增加一些目录的默认安全性本文类型设定;
      -m :修改的意思;
      -d :删除的意思

在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定』 从此以后,这个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关

进程与程序 (process & program)

『执行一个程序或指令』就可以触发一个事件而取得一个 PID !我们说过,系统应该是仅认识binary file 的,那么当我们要让系统工作的时候,当然就是需要启动一个 binary file,那个 binary file 就是程序 (program) !

程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;

进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。

子进程与父进程:

当我们登入系统后,会取得一个 bash 的 shell ,然后,我们用这个 bash 提供的接口去执行另一个指令,例如 /usr/bin/passwd 或者是 touch 等等,那些另外执行的指令也会被触发成为 PID!那个后来执行指令才产生的 PID 就是『子进程』了,而在我们原本的 bash 环境下,就称为『父进程』了

image.png

fork and exec:进程呼叫的流程

其实子进程与父进程之间的关系还挺复杂的,最大的复杂点在于进程互相之间的呼叫。在 Linux 的进程呼叫通常称为 fork-and-exec 的流程 !进程都会藉由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。 整个流程有点像底下这张图

image.png

Linux 的多人多任务环境

其实在 Linux 底下执行一个指令时,系统会将相关的权限、属性、程序代码与数据等均加载内存,并给予这个单元一个进程标识符 (PID),最终该指令可以进行的任务则与这个 PID 的权限有关。根据这个说明,我们就可以简单的了解,为什么 Linux 这么多用户,但是却每个人都可以拥有自己的环境了!

多人环境:

在 Linux 系统上面具有多种不同的账号, 每种账号都有都有其特殊的权限,只有一个人具有至高无上的权力,那就是root (系统管理员)。除了 root 之外,其他人都必须要受一些限制的!而每个人进入 Linux 的环境设定都可以随着每个人的喜好来设定!

多任务行为:

CPU 切换进程的工作,与这些工作进入到 CPU 运作的排程 (CPU 排程,非 crontab 排程) 会影响到系统的整体效能! 目前 Linux 使用的多任务切换行为是非常棒的一个机制,几乎可以将 PC 的性能整个压榨出来! 由于效能非常好

特殊的进程管理行为:

Linux 几乎可以说绝对不会当机的!因为他可以在任何时候,将某个被困住的进程杀掉,然后再重新执行该进程而不用重新启动,每个进程之间可能是独立的,也可能有相依性, 只要到独立的进程当中,删除有问题的那个进程,当然他就可以被系统移除掉

bash 环境下的工作管理 (job control)

我们有提到所谓的『父进程、子进程』的关系,那我们登入 bash 之后, 就是取得一个名为 bash 的 PID 了,而在这个环境底下所执行的其他指令,就几乎都是所谓的子进程了。那么,在这个单一的 bash 接口下,我可不可以进行多个工作? 当然可以!可以『同时』进行!举例来说,我可以这样做:

image.png

在这一串指令中,重点在那个 & 的功能,他表示将 file1 这个文件复制为 file2 ,且放置于背景中执行, 也就是说执行这一个命令之后,在这一个终端接口仍然可以做其他的工作!而当这一个指令(cp file1 file2) 执行完毕之后,系统将会在你的终端接口显示完成的消息!

工作管理 (job control)

这个工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登入系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理』。举例来说,我们在登入 bash 后, 想要一边复制文件、一边进行资料搜寻、一边进行编译,还可以一边进行 vim 程序撰写! 当然我们可以重复登入那六个文字接口的终端机环境中,不过,能不能在一个 bash 内达成? 当然可以!就是使用 job control

什么是工作管理?

从上面的说明当中,你应该要了解的是:『进行工作管理的行为中, 其实每个工作都是目前bash 的子进程,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的bash !』 这个概念请你得先建立起来

假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前景(foreground),至于其他工作就可以让你放入背景 (background) 去暂停或运作。要注意的是,放入背景的工作想要运作时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行 (running) 的!因为你没有输入数据他就不会跑! 而且放入背景的工作是不可以使用 [ctrl]+c 来终止的!

总之,要进行 bash 的 job control 必须要注意到的限制是:

  1. 这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);
  2. 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
  3. 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
  4. 背景中『执行』的进程不能等待 terminal/shell 的输入(input)

job control 的管理

bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能够将别人的 bash 底下的 job 给他拿过来执行。此外,又分前景与背景,然后在背景里面的工作状态又可以分为『暂停 (stop)』与『运作中 (running)』。

直接将指令丢到背景中『执行』的 &

我们在只有一个 bash 的环境下,如果想要同时进行多个工作, 那么可以将某些工作直接丢到背景环境当中,让我们可以继续操作前景的工作!那么如何将工作丢到背景中? 最简单的方法就是利用『 & 』这个玩意儿了!举个简单的例子,我们要将 /etc/ 整个备份成为 /tmp/etc.tar.gz 且不想要等待,那么可以这样做:

image.png

将『目前』的工作丢到背景中『暂停』:[ctrl]-z

image.png

在 vim 的一般模式下,按下 [ctrl] 及 z 这两个按键,屏幕上会出现 [1] ,表示这是第一个工作,而那个 + 代表最近一个被丢进背景的工作,且目前在背景下预设会被取用的那个工作 (与 fg 这个指令有关 )!而那个 Stopped 则代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当中的工作都是『暂停』的状态

观察目前的背景工作状态: jobs

image.png

如果想要知道目前有多少的工作在背景当中,就用 jobs 这个指令吧!一般来说,直接下达 jobs 即可! 不过,如果你还想要知道该 job number 的 PID 号码,可以加上 -l 这个参数! 在输出的信息当中,例如上表,仔细看到那个 + - 号!那个 + 代表预设的取用工作。 所以说:『目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [2] 会被拿到前景当中来处理』!

其实 + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了

将背景工作拿到前景来处理:fg

image.png

比较有趣的是最后一个显示的结果,我们会发现 + 出现在第一个工作后! 怎么会这样?这是因为刚刚利用 fg %1 将第一号工作捉到前景后又放回背景,此时最后一个被放入背景的将变成 vi 那个指令动作,所以当然 [1] 后面就会出现 +了!另外,如果输入『 fg - 』 则代表将 - 号的那个工作号码拿出来,上面就是 [2]- 那个工作号码

让工作在背景下的状态变成运作中: bg

管理背景当中的工作: kill

如果想要将该工作直接移除呢?或者是将该工作重新启动呢?这个时候就得需要给予该工作一个讯号 (signal) ,让他知道该怎么作才好!此时, kill 这个指令就派上用场

image.png

特别留意一下,-9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的, -15 则是以正常步骤结束一项工作(15 也是默认值),两者之间并不相同!举上面的例子来说,我用 vim 的时候,不是会产生一个 .filename.swp 的文件吗? 那么,当使用 -15 这个 signal 时,vim 会尝试以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个 signal 时,由于该 vim 工作会被强制移除掉,因此, .filename.swp 就会继续存在文件系统当中

kill 的妙用是很无穷!搭配 signal 所详列的信息 (用 man 7 signal 去查阅相关资料) 可以有效的管理工作与进程 (Process),此外,那个 killall 也是同样的用法! 至于常用的 signal 您至少需要了解 1, 9, 15 这三个 signal 的意义才好。 此外, signal 除了以数值来表示之外,也可以使用讯号名称

kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字了,这点也得特别留意才行!

脱机管理问题

要注意的是,我们在工作管理当中提到的『背景』指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境, 你可以说那个是 bash 的背景,并不是放到系统的背景去!所以,工作管理的背景依旧与终端机有关! 在这样的情况下,如果你是以远程联机方式连接到你的 Linux 主机,并且将工作以 & 的方式放到背景去, 请问,在工作尚未结束的情况下你脱机了,该工作还会继续进行吗?答案是『否』!不会继续进行,而是会被中断掉。

如果我的工作需要进行一大段时间,我又不能放置在背景底下,那该如何处理呢? 首先,你可以参考前一章的 at 来处理即可!因为 at 是将工作放置到系统背景, 而与终端机无关。如果不想要使用 at 的话,那你也可以尝试使用 nohup 这个指令来处理!这个 nohup 可以让你在脱机或注销系统后,还能够让工作继续进行。他的语法有点像这样:

image.png

上述指令需要注意的是, nohup 并不支持 bash 内建的指令,因此你的指令必须要是外部指令才行。

如果你想要让在背景的工作在你注销后还能够继续的执行,那么使用 nohup 搭配 & 是不错的运作情境.

进程管理

我们在操作系统时的各项工作其实都是经过某个 PID 来达成的 (包括你的 bash 环境), 因此,能不能进行某项工作,就与该进程的权限有关了。

  1. 再来,如果您的 Linux 系统是个很忙碌的系统,那么当整个系统资源快要被使用光时, 您是否能够找出最耗系统的那个进程,然后删除该进程,让系统恢复正常呢?

  2. 此外,如果由于某个程序写的不好,导致产生一个有问题的进程在内存当中,您又该如何找出他,然后将他移除呢?

  3. 如果同时有五六项工作在您的系统当中运作,但其中有一项工作才是最重要的, 该如何让那一项重要的工作被最优先执行呢?

进程的观察

可以利用静态的 ps 或者是动态的 top 查阅系统上面正在运作当中的进程,还能以 pstree 来查阅进程树之间的关系

ps :将某个时间点的进程运作情况撷取下来

ps 这个指令的 man page 不是很好查阅,因为很多不同的 Unix 都使用这个 ps 来查阅进程状态, 为了要符合不同版本的需求,所以这个 man page 写的非常的庞大!因此,通常都会建议你,直接背两个比较不同的选项, 一个是只能查阅自己 bash 进程的『 ps -l 』一个则是可以查阅所有系统运作的进程『 ps aux 』!注意,你没看错,『 ps aux 』没有那个减号 (-) !先来看看关于自己 bash 进程状态的观察:

除此之外,我们必须要知道的是『僵尸 (zombie) 』进程是什么? 通常,造成僵尸进程的成因是因为该进程应该已经执行完毕,或者是因故应该要终止了, 但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中。 如果你发现在某个进程的 CMD 后面接上 <defunct> 时,就代表该进程是僵尸进程:

image.png

当系统不稳定的时候就容易造成所谓的僵尸进程,可能是因为程序写的不好,或者是使用者的操作习惯不良等等所造成。如果你发现系统中很多僵尸进程时,记得!要找出该进程的父进程,然后好好的做个追踪,好好的进行主机的环境优化! 看看有什么地方需要改善的,不要只是直接将他 kill 掉而已

仅观察自己的 bash 相关进程: ps -l

image.png
  1. F:代表这个进程旗标 (process flags),说明这个进程的总结权限,常见号码有:
    若为 4 表示此进程的权限为 root ;
    若为 1 则表示此子进程仅进行复制(fork)而没有实际执行(exec)

  2. S:代表这个进程的状态 (STAT),主要的状态有:
    R (Running):该程序正在运作中;
    S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
    D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
    T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
    Z (Zombie):僵尸状态,进程已经终止但却无法被移除至内存外

  3. UID/PID/PPID:代表『此进程被该 UID 所拥有/进程的 PID 号码/此进程的父进程 PID 号码』

  4. C:代表 CPU 使用率,单位为百分比

  5. PRI/NI:Priority/Nice 的缩写,代表此进程被 CPU 所执行的优先级,数值越小代表该进程越快被 CPU 执行

  6. ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是个 running 的进程,一般就会显示『 - 』 / SZ 代表此进程用掉多少内存 / WCHAN 表示目前进程是否运作中,同样的, 若为 - 表示正在运作中。

  7. TTY:登入者的终端机位置,若为远程登录则使用动态终端接口 (pts/n)

  8. TIME:使用掉的 CPU 时间,注意,是此进程实际花费 CPU 运作的时间,而不是系统时间;

  9. CMD:就是 command 的缩写,造成此进程的触发程序之指令为何。

所以你看到的 ps -l 输出讯息中,他说明的是:『bash 的程序属于 UID 为 0 的使用者,状态为睡眠 (sleep), 之所以为睡眠因为他触发了 ps (状态为 run) 之故。此进程的 PID 为 14836,优先执行顺序为 80 , 下达 bash 所取得的终端接口为 pts/0 ,运作状态为等待 (wait)。』

观察系统所有进程: ps aux

image.png

ps -l 与 ps aux 显示的项目并不相同!在 ps aux 显示的项目中,各字段的意义为:

  1. USER:该 process 属于那个使用者账号的?
  2. PID :该 process 的进程标识符。
  3. %CPU:该 process 使用掉的 CPU 资源百分比;
  4. %MEM:该 process 所占用的物理内存百分比;
  5. VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
  6. RSS :该 process 占用的固定的内存量 (Kbytes)
  7. TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登入者进程,若为 pts/0 等等的,则表示为由网络连接进主机的进程。
  8. STAT:该进程目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
  9. START:该 process 被触发启动的时间;
  10. TIME :该 process 实际使用 CPU 运作的时间。
  11. COMMAND:该进程的实际指令为何?

top:动态观察进程的变化

相对于 ps 是撷取一个时间点的进程状态, top 则可以持续侦测进程运作的状态!

image.png

top 也是个挺不错的进程观察工具!但不同于 ps 是静态的结果输出, top 这个程序可以持续的监测整个系统的进程工作状态。 在预设的情况下,每次更新进程资源的时间为 5 秒,不过,可以使用 -d 来进行修改。 top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:

  1. 第一行(top...):这一行显示的信息分别为:
    o 目前的时间,亦即是 00:53:59 那个项目;
    o 开机到目前为止所经过的时间,亦即是 up 6:07, 那个项目;
    o 已经登入系统的用户人数,亦即是 3 users, 项目;
    o 系统在 1, 5, 15 分钟的平均工作负载。我们在第十五章谈到的 batch 工作方式为负载小于 0.8 就是这个负载!代表的是 1, 5, 15 分钟,系统平均要负责运作几个进程(工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统进程是否太过繁复了

  2. 第二行(Tasks...):显示的是目前进程的总量与个别进程在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值,如果不是 0 !好好看看到底是那个 process 变成僵尸了吧

  3. 第三行(%Cpus...):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 wa 项目,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源! 另外,如果是多核心的设备,可以按下数字键『1』来切换成不同 CPU 的负载率

  4. 第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重申,要注意的是 swap的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理内存实在不足!

  5. 第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。

至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:

  1. PID :每个 process 的 ID !
  2. USER:该 process 所属的使用者;
  3. PR :Priority 的简写,进程的优先执行顺序,越小越早被执行;
  4. NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
  5. %CPU:CPU 的使用率;
  6. %MEM:内存的使用率;
  7. TIME+:CPU 使用时间的累加

进程的管理

进程之间是可以互相控制的!举例来说,你可以关闭、重新启动服务器软件,服务器软件本身是个进程,你既然可以让她关闭或启动,当然就是可以控制该进程!那么进程是如何互相管理的呢?其实是透过给予该进程一个讯号 (signal) 去告知该进程你想要让她作什么!因此这个讯号就很重要!

我们也在本章之前的 bash 工作管理当中提到过,要给予某个已经存在背景中的工作某些动作时,是直接给予一个讯号给该工作号码即可。那么到底有多少 signal 呢? 你可以使用 kill -l (小写的 L ) 或者是 man 7 signal 都可以查询到!主要的讯号代号与名称对应及内容是:

image.png

kill -signal PID

kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)。要再次强调的是: kill 后面直接加数字与加上 %number 的情况是不同的! 这个很重要!因为工作控制中有 1 号工作,但是 PID 1 号则是专指『 systemd 』这支程序!你怎么可以将 systemd 关闭呢? 关闭 systemd ,你的系统就当掉了啊!所以记得那个 % 是专门用在工作控制的

killall -signal 指令名称

由于 kill 后面必须要加上 PID (或者是 job number),所以,通常 kill 都会配合 ps, pstree 等指令,因为我们必须要找到相对应的那个进程的 ID 嘛!但是,如此一来,很麻烦,我们可以直接利用『下达指令的名称』来给予讯号,用 killall 直接将 rsyslogd 这个进程给予一个 SIGHUP 的讯号

总之,要删除某个进程,我们可以使用 PID 或者是启动该进程的指令名称, 而如果要删除某个服务呢?最简单的方法就是利用 killall , 因为他可以将系统当中所有以某个指令名称启动的进程全部删除

关于进程的执行顺序

我们知道 CPU 一秒钟可以运作多达数 G 的微指令次数,透过核心的 CPU 排程可以让各进程被 CPU 所切换运作, 因此每个进程在一秒钟内或多或少都会被 CPU 执行部分的脚本。如果进程都是集中在一个队列中等待 CPU 的运作, 而不具有优先级之分,也就是像我们去游乐场玩热门游戏需要排队一样,每个人都是照顺序来! 你玩过一遍后还想再玩 (没有执行完毕),请到后面继续排队等待。情况有点像底下这样:

image.png

上图中假设 pro1, pro2 是紧急的进程, pro3, pro4 是一般的进程,在这样的环境中,由于不具有优先级!pro1, pro2 还是得要继续等待而没有优待呢!如果 pro3, pro4 的工作又臭又长!那么紧急的 pro1, pro2 就得要等待个老半天才能够完成!所以,我们想要将进程分优先级!如果优先序较高则运作次数可以较多次, 而不需要与较慢优先的进程抢位置!我们可以将进程的优先级与 CPU 排程进行如下图的解释:

image.png

如上图所示,具高优先权的 pro1, pro2 可以被取用两次,而较不重要的 pro3, pro4 则运作次数较少。如此一来 pro1, pro2 就可以较快被完成!要注意,上图仅是示意图,并非较优先者一定会被运作两次! 为了要达到上述的功能,我们 Linux 给予进程一个所谓的『优先执行序 (priority, PRI)』,这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的,用户无法直接调整 PRI值的

由于 PRI 是核心动态调整的,我们用户也无权去干涉 PRI !那如果你想要调整进程的优先执行序时,就得要透过 Nice 值了!Nice 值就是上表的 NI !一般来说, PRI 与 NI 的相关性如下:

PRI(new) = PRI(old) + nice
不过你要特别留意到,如果原本的 PRI 是 50 ,并不是我们给予一个 nice = 5 ,就会让 PRI 变成 55 ! 因为 PRI 是系统『动态』决定的,所以,虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI仍是要经过系统分析后才会决定的。另外, nice 值是有正负的,而既然 PRI 越小越早被执行, 所以,当 nice 值为负值时,那么该进程就会降低 PRI 值,亦即会变的较优先被处理。此外,你必须要留意到:

  1. nice 值可调整的范围为 -20 ~ 19 ;
  2. root 可随意调整自己或他人进程的 Nice 值,且范围为 -20 ~ 19 ;
  3. 一般使用者仅可调整自己进程的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
  4. 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;

这也就是说,要调整某个进程的优先执行序,就是『调整该进程的 nice 值』!那么如何给予某个进程 nice 值呢?有两种方式,分别是:

  1. 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令
  2. 调整某个已经存在的 PID 的 nice 值:用 renice 指令

整个 nice 值是可以在父进程 --> 子进程之间传递的! 另外,除了 renice 之外,其实那个 top 同样的也是可以调整 nice 值的

系统资源的观察

free :观察内存使用情况

image.png
  1. Mem 那一行显示的是物理内存的量
  2. Swap 则是内存置换空间的量
  3. total 是总量
  4. used 是已被使用的量
  5. free 则是剩余可用的量
  6. shared/buffers/cached 是在已被使用的量(用来作为缓冲及快取的量),这些 shared/buffers/cached的用量中,在系统比较忙碌时,可以被释出而继续利用!因此后面就有一个 available (可用的) 数值

我们可以发现这部测试机根本没有什么特别的服务,但是竟然有 706MB 左右的 cache 耶! 因为在测试过程中还是有读/写/执行很多的文件!这些文件就会被系统暂时快取下来,等待下次运作时可以更快速的取出之意! 也就是说,系统是『很有效率的将所有的内存用光光』,目的是为了让系统的存取效能加速

很多朋友都会问到这个问题『我的系统明明很轻松,为何内存会被用光光?』现在知道了吧? 被用光是正常的!而需要注意的反而是 swap 的量。一般来说, swap 最好不要被使用,尤其 swap 最好不要被使用超过 20% 以上, 如果您发现 swap 的用量超过 20% ,那么,最好还是买物理内存来插吧! 因为, Swap 的效能跟物理内存实在差很多,而系统会使用到 swap , 绝对是因为物理内存不足了才会这样做的

特殊文件与进程

具有 SUID/SGID 权限的指令执行状态

略......

SELinux 初探

什么是 SELinux

是『 Security Enhanced Linux 』的缩写,字面上的意义就是安全强化的 Linux 之意!那么所谓的『安全强化』是强化哪个部分? 是网络资安还是权限管理?底下就让我们来谈谈吧!

SELinux 是由美国国家安全局 (NSA) 开发的,当初开发这玩意儿的目的是因为很多企业界发现, 通常系统出现问题的原因大部分都在于『内部员工的资源误用』所导致的,实际由外部发动的攻击反而没有这么严重

其实 SELinux 是在进行进程、文件等细部权限设定依据的一个核心模块! 由于启动网络服务的也是进程,因此刚好也能够控制网络服务能否存取系统资源的一道关卡!

传统的文件权限与账号关系:自主式访问控制 (DAC)

传统的账号主要分为系统管理员 (root) 与一般用户,而这两种身份能否使用系统上面的文件资源则与 rwx 的权限设定有关。 不过你要注意的是,各种权限设定对 root 是无效的。因此,当某个进程想要对文件进行存取时, 系统就会根据该进程的拥有者/群组,并比对文件的权限,若通过权限检查,就可以存取该文件了

这种存取文件系统的方式被称为『自主式访问控制 (Discretionary Access Control, DAC)』,基本上,就是依据进程的拥有者与文件资源的 rwx 权限来决定有无存取的能力。不过这种 DAC 的访问控制有几个困扰,那就是:

  1. root 具有最高的权限:如果不小心某支进程被有心人士取得, 且该进程属于 root 的权限,那么这支进程就可以在系统上进行任何资源的存取

  2. 使用者可以取得进程来变更文件资源的访问权限:如果你不小心将某个目录的权限设定为 777 ,由于对任何人的权限会变成 rwx ,因此该目录就会被任何人所任意存取!

这些问题是非常严重的!尤其是当你的系统是被某些漫不经心的系统管理员所掌控时!她们甚至觉得目录权限调为 777 也没有什么了不起的危险

以政策规则订定特定进程读取特定文件:委任式访问控制(MAC)

委任式访问控制 (MAC) 可以针对特定的进程与特定的文件资源来进行权限的控管! 也就是说,即使你是 root ,那么在使用不同的进程时,你所能取得的权限并不一定是 root , 而得要看当时该进程的设定而定。如此一来,我们针对控制的主体变成了『进程』而不是『使用者』 此外,这个主体进程也不能任意使用系统文件资源,因为每个文件资源也有针对该主体进程设定可取用的权限! 如此一来,控件目就细的多了!但整个系统进程那么多、文件那么多,一项一项控制可就没完没了! 所以 SELinux 也提供一些预设的政策 (Policy) ,并在该政策内提供多个规则 (rule) ,让你可以选择是否启用该控制规则!

image.png

左图是没有 SELinux 的 DAC 存取结果,apache 这只 root 所主导的进程,可以在这三个目录内作任何文件的新建与修改。右边则是加上 SELinux 的 MAC 管理的结果,SELinux 仅会针对 Apache 这个『 process 』放行部份的目录, 其他的非正规目录就不会放行给 Apache 使用!因此不管你是谁,就是不能穿透 MAC 的框框

SELinux 的运作模式

再次的重复说明一下,SELinux 是透过 MAC 的方式来控管进程,他控制的主体是进程, 而目标则是该进程能否读取的『文件资源』

主体 (Subject):
SELinux 主要想要管理的就是进程,因此你可以将『主体』跟本章谈到的 process 划上等号;

目标 (Object):
主体进程能否存取的『目标资源』一般就是文件系统。因此这个目标项目可以等文件系统划上等号;

政策 (Policy):
由于进程与文件数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 7.x 里面仅有提供三个
主要的政策,分别是:

  1. targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策;
  2. minimum:由 target 修订而来,仅针对选择的进程来保护!
  3. mls:完整的 SELinux 限制,限制方面较为严格。
    建议使用预设的 targeted 政策即可。

安全性本文 (security context):
我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了政策指定之外,主体与目标的安全性本文必须一致才能够顺利存取。这个安全性本文 (security context) 有点类似文件系统的 rwx !安全性本文的内容与设定是非常重要的! 如果设定错误,你的某些服务(主体进程)就无法存取文件系统(目标资源),当然就会一直出现『权限不符』的错误讯息了!

由于 SELinux 重点在保护进程读取文件系统的权限,因此我们将上述的几个说明搭配起来,绘制成底下的流程图,比较好理解:

image.png

上图的重点在『主体』如何取得『目标』的资源访问权限! 由上图我们可以发现
(1)主体进程必须要通过 SELinux 政策内的规则放行后
(2)与目标资源进行安全性本文的比对
(3)若比对失败则无法存取目标,若比对成功则可以开始存取目标。
(4)最终能否存取目标还是与文件系统的 rwx 权限设定有关
如此一来,加入了 SELinux 之后,出现权限不符的情况时,你就得要一步一步的分析可能的问题了

安全性本文 (Security Context)

举例来说,你不也常常进行文件的 rwx 的重新设定吗?这个安全性本文你就将他想成 SELinux 内必备的 rwx 就是了

安全性本文存在于主体进程中与目标文件资源中。进程在内存内,所以安全性本文可以存入是没问题。那文件的安全性本文是记录在哪里呢?事实上,安全性本文是放置到文件的 inode 内的,因此主体进程想要读取目标文件资源时,同样需要读取 inode , 这 inode 内就可以比对安全性本文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。

安全性本文主要用冒号分为三个字段,这三个字段的意义为:

image.png

身份识别 (Identify):
相当于账号方面的身份识别!主要的身份识别常见有底下几种常见的类型
1. unconfined_u:不受限的用户,也就是说,该文件来自于不受限的进程所产生的!一般来说,我们使用可登入账号来取得 bash 之后, 预设的 bash 环境是不受 SELinux 管制的~因为 bash 并不是什么特别的网络服务!因此,在这个不受 SELinux 所限制的 bash 进程所产生的文件,其身份识别大多就是 unconfined_u 这个『不受限』用户!
2. system_u:系统用户,大部分就是系统自己产生的文件!

角色 (Role):
透过角色字段,我们可以知道这个资料是属于进程、文件资源还是代表使用者。一般的角色有:
1. object_r:代表的是文件或目录等文件资源,这应该是最常见的;
2. system_r:代表的就是进程!不过,一般使用者也会被指定成为 system_r !

类型 (Type) (最重要!):
在预设的 targeted 政策中, Identify 与 Role 字段基本上是不重要的!重要的在于这个类型 (type) 字段! 基本上,一个主体进程能不能读取到这个文件资源,与类型字段有关!而类型字段在文件与进程的定义不太相同,分别是:
1. type:在文件资源 (Object) 上面称为类型 (Type);
2. domain:在主体进程 (Subject) 则称为领域 (domain) 了!

domain 需要与 type 搭配,则该进程才能够顺利的读取文件资源

进程与文件 SELinux type 字段的相关性

进程的 SELinux 相关信息,基本上,这些对应资料在 targeted 政策下的对应如下:

image.png

在预设的 target 政策下,其实最重要的字段是类型字段 (type), 主体与目标之间是否具有可以读写的权限,与进程的 domain 及文件的 type 有关!这两者的关系我们可以使用 crond 以及他的配置文件来说明! 亦即是 /usr/sbin/crond, /etc/crontab, /etc/cron.d 等文件来说明。 首先,看看这几个的安全性本文内容:

image.png

当我们执行 /usr/sbin/crond 之后,这个程序变成的进程的 domain 类型会是 crond_t 这一个~而这个 crond_t 能够读取的配置文件则为 system_cron_spool_t 这种的类型。因此不论 /etc/crontab, /etc/cron.d 以及 /var/spool/cron 都会是相关的 SELinux 类型 (/var/spool/cron 为 user_cron_spool_t)。 文字看起来不太容易了解,我们使用图示来说明这几个东西的关系!

image.png

上图的意义我们可以这样看的:

  1. 首先,我们触发一个可执行的目标文件,那就是具有 crond_exec_t 这个类型的 /usr/sbin/crond 文件;
  2. 该文件的类型会让这个文件所造成的主体进程 (Subject) 具有 crond 这个领域 (domain), 我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读取的目标资源类型;
  3. 由于 crond domain 被设定为可以读取 system_cron_spool_t 这个类型的目标文件 (Object), 因此你的配置文件放到 /etc/cron.d/ 目录下,就能够被 crond 那支进程所读取了;
  4. 但最终能不能读到正确的资料,还得要看 rwx 是否符合 Linux 权限的规范!

SELinux 三种模式的启动、关闭与观察

Linux 核心中! 目前 SELinux 依据启动与否,共有三种模式,分别如下:

  1. enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了
  2. permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用
  3. disabled:关闭,SELinux 并没有实际运作

我们前面不是谈过主体进程需要经过政策规则、安全本文比对之后,加上 rwx 的权限规范, 若一切合理才会让进程顺利的读取文件吗?那么这个 SELinux的三种模式与上面谈到的政策规则、安全本文的关系为何呢?我们还是使用图标加上流程来让大家理解一下:

image.png

SELinux 的配置文件其实就是 /etc/selinux/config 这个文件!我们来看看内容:

image.png

SELinux 的启动与关闭

如果改变了政策则需要重新启动;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他两个,那也必须要重新启动。这是因为 SELinux 是整合到核心里面去的,你只可以在 SELinux 运作下切换成为强制 (enforcing) 或宽容 (permissive) 模式,不能够直接关闭 SELinux 的! 如果刚刚你发现 getenforce 出现 disabled 时,请到上述文件修改成为 enforcing 然后重新启动吧!

不过你要注意的是,如果从 disable 转到启动 SELinux 的模式时, 由于系统必须要针对文件写入安全性本文的信息,因此开机过程会花费不少时间在等待重新写入 SELinux 安全性本文 (有时也称为SELinux Label) ,而且在写完之后还得要再次的重新启动一次!你必须要等待粉长一段时间! 等到下次开机成功后

SELinux 政策内的规则管理

略......

SELinux 安全本文的修改

略......

总结

  1. 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等),为实体文件的型态存在;

  2. 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。

  3. 程序彼此之间是有相关性的,故有父进程与子进程之分。而 Linux 系统所有进程的父进程就是 init 这个
    PID 为 1 号的进程。

  4. 在 Linux 的进程呼叫通常称为 fork-and-exec 的流程!进程都会藉由父进程以复制 (fork) 的方式产生一个
    一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。

  5. 常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为:服务 (daemon)。

  6. 在工作管理 (job control) 中,可以出现提示字符让你操作的环境就称为前景 (foreground),至于其他工作就可以让你放入背景 (background) 去暂停或运作。

  7. 与 job control 有关的按键与关键词有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;

  8. 进程管理的观察指令有: ps, top, pstree 等等;

  9. 进程之间是可以互相控制的,传递的讯息 (signal) 主要透过 kill 这个指令在处理;

  10. 进程是有优先级的,该项目为 Priority,但 PRI 是核心动态调整的,用户只能使用 nice 值去微调 PRI

  11. nice 的给予可以有: nice, renice, top 等指令;

  12. vmstat 为相当好用的系统资源使用情况观察指令;

  13. SELinux 当初的设计是为了避免使用者资源的误用,而 SELinux 使用的是 MAC 委任式存取设定;

  14. SELinux 的运作中,重点在于主体进程 (Subject) 能否存取目标文件资源 (Object) ,这中间牵涉到政策
    (Policy) 内的规则, 以及实际的安全性本文类别 (type);

  15. 安全性本文的一般设定为:『Identify:role:type』其中又以 type 最重要;

  16. SELinux 的模式有: enforcing, permissive, disabled 三种,而启动的政策 (Policy) 主要是 targeted

  17. SELinux 启动与关闭的配置文件在: /etc/selinux/config

  18. SELinux 的启动与观察: getenforce, sestatus 等指令

  19. 重设 SELinux 的安全性本文可使用 restorecon 与 chcon

  20. 在 SELinux 有启动时,必备的服务至少要启动 auditd 这个!

  21. 若要管理预设的 SELinux 布尔值,可使用 getsebool, setsebool 来管理!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容