第十六章、程序管理与 SE Linux 初探
在 Linux 系统当中:“触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置。” 从此以后,这个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了!
1.1)、进程与程序
l 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
l 进程 (process):程序被触发后,执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,进程就是一个正在运行中的程序。(鸟哥的书里把这两个都叫做程序)
1.2)、子进程有一个PPID(parent PID)
在 Linux 的程序调用通常称为 fork-and-exec 的流程!程序都会借由父程序以复制 (fork) 的方式产生一个一模一样的子程序, 然后被复制出来的子程序再以 exec 的方式来执行实际要进行的程序,最终就成为一个子程序的存在。
常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务使用者各项任务,因此这些常驻进程就会被我们称为:服务(daemon)。
1.3)、job control:工作管理
当我们登陆系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理。
在进行工作管理的行为中, 其实每个工作都是目前 bash 的子程序,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash
假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前景 (foreground),至于其他工作就可以让你放入背景 (background) 去暂停或运行。
放入背景的工作是不可以使用 [ctrl]+c 来终止的,可使用 bg/fg 调用该工作;
背景中“执行”的进程不能等待 terminal/shell 的输入(input);
在背景里面的工作状态又可以分为“暂停 (stop)”与“运行中 (running)”;
- 直接将指令丢到背景中“执行”的 & ;
将输出的信息都给他传送到 /tmp/log.txt 当中,数据流重导向:
[root@study ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 14547
[root@study ~]#
在vim的一般模式下,按下ctrl和z两个键,屏幕会出现[1]表示这是第一个工作,在默认的情况下,使用[ctrl]-z 丢到背景当中的工作都是“暂停”的状态:
guojiamin@root:~/gimtest/vimtest$ jobs
[1]- Stopped vim create3files.sh
[2]+ Stopped sh what_to_eat-3.sh
+ 代表最近被放到背景的工作号码,- 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有+/- 符号存在了!
- 将背景工作拿到前景来处理:fg(foreground)
[root@study ~]# fg %jobnumber
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!
范例一:先以 jobs 观察工作,再将工作取出:
[root@study ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2]+ 14567 Stopped find / -print
[root@study ~]# fg <==默认取出那个 + 的工作,亦即 [2]。立即按下[ctrl]-z
[root@study ~]# fg %1 <==直接规定取出的那个工作号码!再按下[ctrl]-z
[root@study ~]# jobs -l
[1]+ 14566 Stopped vim ~/.bashrc
[2]- 14567 Stopped find / -print
- 让工作在背景下的状态变成运行中: bg(background)
范例一:一执行 find / -perm /7000 > /tmp/text.txt 后,立刻丢到背景去暂停!
[root@study ~]# find / -perm /7000 > /tmp/text.txt
# 此时,请立刻按下 [ctrl]-z 暂停!
[3]+ Stopped find / -perm /7000 > /tmp/text.txt
范例二:让该工作在背景下进行,并且观察他!!
[root@study ~]# jobs ; bg %3 ; jobs
[1] Stopped vim ~/.bashrc
[2]- Stopped find / -print
[3]+ Stopped find / -perm /7000 > /tmp/text.txt
[3]+ find / -perm /7000 > /tmp/text.txt &
[1]- Stopped vim ~/.bashrc
[2]+ Stopped find / -print
[3] Running find / -perm /7000 > /tmp/text.txt &
- 管理背景当中的工作: kill
需要给予该工作一个讯号 (signal),由于用 vim 的时候,不是会产生一个 .filename.swp 的文件,
-9 这个 signal 通常是用在“强制删除一个不正常的工作”时所使用的, .filename.swp 文件不会被删除;【不建议】
-15 则是以正常步骤结束一项工作,.filename.swp 文件被删除;【推荐】
当用-15kill进程时,若kill不掉,则可以先用fg来取回前景控制权,然后再离开 vim 才对。
kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字 了
- 仅观察自己的 bash 相关程序: ps -l
- 观察系统所有程序: ps aux
- 动态观察程序的变化:top
ps 是静态的结果输出, top 这个程序可以持续的监测整个系统的程序工作状态
如果想要找出最损耗 CPU 资源的那个程序时:
1、top;
2、CPU 使用资源来排序 (在 top 当中按下 P 即可)。
杀掉某进程:kill -9 +PID或killall PName
2.1)、Priority 与 Nice 值
假设 pro1, pro2 是紧急的程序, pro3, pro4 是一般的程序,在这样的环境中,由于不具有优先顺序,如果 pro3, pro4 的工作又臭又长!那么紧急的 pro1, pro2 就得要等待个老半天才能够完成,我们想要将程序分优先顺序啦!如果优先序较高则运行次数可以较多次, 而不需要与较慢优先的程序抢位置!
所以具高优先权的 pro1, pro2 可以被取用两次,而较不重要的 pro3, pro4 则运行次数较少。 如此一来 pro1, pro2 就可以较快被完成啦。这就是“优先执行序(priority, PRI)”,不过PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的。
那么为了调整PRI值,我们可以通过NI(Nice)值,为什么呢?
因为PRI(new) = PRI(old) + nice (nice 值有正负)
- nice 值可调整的范围为 -20 ~ 19 ;
- root 可随意调整自己或他人程序的 Nice 值,且范围为 -20 ~ 19 ;
- 一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
- 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;
那么如何调整nice值呢?有两种方法:
1、一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
范例一:用 root 给一个 nice 值为 -5 ,用于执行 vim ,并观察该程序!
[root@study ~]# nice -n -5 vim &
[1] 19865
[root@study ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 14836 14835 0 90 10 - 29068 wait pts/0 00:00:00 bash
2、调整某个已经存在的 PID 的 nice 值:用 renice 指令。
范例一:找出自己的 bash PID ,并将该 PID 的 nice 调整到 -5
[root@study ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 14836 14835 0 90 10 - 29068 wait pts/0 00:00:00 bash
0 R 0 19900 14836 0 90 10 - 30319 - pts/0 00:00:00 ps
[root@study ~]# renice -5 14836
14836 (process ID) old priority 10, new priority -5
[root@study ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 14836 14835 0 75 -5 - 29068 wait pts/0 00:00:00 bash
0 R 0 19910 14836 0 75 -5 - 30319 - pts/0 00:00:00 ps
2.2)、系统资源的观察
free :观察内存使用情况
uname:查阅系统与核心相关信息
dmesg :分析核心产生的讯息,后面加“|more”可使画面暂停
fuser:通过这个 fuser 我们可以找出使用该文件、目录的程序,借以观察的啦! 他的重点与 ps, pstree 不同。fuser 可以让我们了解到某个文件 (或文件系统) 目前正在被哪些程序所利用。
lsof :列出被程序所打开的文件文件名。
pidof :找出某支正在执行的程序的 PID。
3.1)、SELinux
SELinux是“ Security Enhanced Linux”缩写,字面上的意义就是安全强化的 Linux。
其实 SELinux 是在进行程序、文件等细部权限设置依据的一个核心模块! 由于启动网络服务的也是程序,因此刚好也能够控制网络服务能否存取系统资源的一道关卡!
DAC:“自主式存取控制 (Discretionary Access Control, DAC)”,,就是依据程序的拥有者与文件资源的 rwx 权限来决定有无存取的能力。
MAC:“委任式存取控制”(Mandatory Access Control)针对特定的程序与特定的文件资源来进行权限的控管,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root , 而得要看当时该程序的设置而定。
使用 DAC/MAC 产生的不同结果,以 Apache 为例说明
3.2)、SELinux的运行模式
SELinux 是通过 MAC 的方式来控管程序,他控制的主体是程序, 而目标则是该程序能否读取的“文件资源”!
主体 (Subject):process
目标 (Object):是文件系统
政策 (Policy):三条
targeted:针对网络服务限制较多,针对本机限制较少,是默认的政策;
minimum:由 target 修订而来,仅针对选择的程序来保护!
mls:完整的 SELinux 限制,限制方面较为严
安全性本文 (security context):,安全性本文主要用冒号分为三个字段
Identify:role:type
身份识别:角色:类型
l 三种模式
enforcing:强制模式,代表 SELinux 运行中,且已经正确的开始限制 domain/type 了;
permissive:宽容模式:代表 SELinux 运行中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为SELinux 的 debug 之用;
disabled:关闭,SELinux 并没有实际运行。
SELinux 的三种类型与实际运行流程图示意
【重点回顾】
① 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等),为实体文件的型态存在;
② 进程 (process):程序被触发后,执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,程序就是一个正在运行中的程序。
③ 程序彼此之间是有相关性的,故有父程序与子程序之分。而 Linux 系统所有程序的父程序就是 init 这个 PID 为 1 号的程序。
④ 在 Linux 的程序调用通常称为 fork-and-exec 的流程!程序都会借由父程序以复制 (fork) 的方式产生一个一模一样的子程序, 然后被复制出来的子程序再以 exec 的方式来执行实际要进行的程序,最终就成为一个子程序的存在。
⑤ 常驻在内存当中的程序通常都是负责一些系统所提供的功能以服务使用者各项任务,因此这些常驻程序就会被我们称为:服务(daemon)。
⑥ 在工作管理 (job control) 中,可以出现提示字符让你操作的环境就称为前景 (foreground),至于其他工作就可以让你放入背景(background) 去暂停或运行。
⑦ 与 job control 有关的按键与关键字有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;
⑧ 程序管理的观察指令有: ps, top, pstree 等等;
⑨ 程序之间是可以互相控制的,传递的讯息 (signal) 主要通过 kill 这个指令在处理;
⑩ 程序是有优先顺序的,该项目为 Priority,但 PRI 是核心动态调整的,使用者只能使用 nice 值去微调 PRI;
⑪ nice 的给予可以有: nice, renice, top 等指令;
⑫ vmstat 为相当好用的系统资源使用情况观察指令;
⑬ SELinux 当初的设计是为了避免使用者资源的误用,而 SELinux 使用的是 MAC 委任式存取设置;
⑭ SELinux 的运行中,重点在于主体程序 (Subject) 能否存取目标文件资源 (Object) ,这中间牵涉到政策 (Policy) 内的规则, 以及实际的安全性本文类别 (type);
⑮ 安全性本文的一般设置为:“Identify:role:type”其中又以 type 最重要;
⑯ SELinux 的模式有: enforcing, permissive, disabled 三种,而启动的政策 (Policy) 主要是 targeted;
⑰ SELinux 启动与关闭的配置文件在: /etc/selinux/config
⑱ SELinux 的启动与观察: getenforce, sestatus 等指令
⑲ 重设 SELinux 的安全性本文可使用 restorecon 与 chcon
⑳ 在 SELinux 有启动时,必备的服务至少要启动 auditd 这个!
21 若要管理默认的 SELinux 布林值,可使用 getsebool, setsebool 来管理!
Over......