程序管理与 SELinux 初探
- 1. 程序和进程
- 2.程序调用流程
- 3. 一个bash中的多任务工作管理
- 4.进程管理
- 4.1 查询进程
- 4.2 进程的执行顺序
- 5.系统资源的观察
- 6. /proc/* 代表的意义
- 7.SELinux
1. 程序和进程
2.程序调用流程
程序与进程之间的关系:
从上图可以看出,程序在存储在磁盘中,程序会载入到内存,形成进程,进程就包括PID、权限参数等。
当我们登陆并执行 bash 时, 系统已经给我们一个 PID 了, 这个 PID 就是依据登陆者的 UID/GID ( /etc/passwd) 来的。我们用这个 bash 提供的接口去执行另一个指令, 例如 /usr/bin/passwd 或者是 touch 等等, 那些另外执行的指令也会被触发成为 PID, 呵呵! 那个后来执行指令才产生的 PID 就是“子程序”了, 而在我们原本的 bash 环境下, 就称为“父程序”了!
[fle@CentOS7 ~]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 34633 2847 0 80 0 - 29256 do_wai pts/1 00:00:00 bash
0 R 1000 34683 34633 0 80 0 - 38331 - pts/1 00:00:00 ps
[fle@CentOS7 ~]$ bash
[fle@CentOS7 ~]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 34633 2847 0 80 0 - 29256 do_wai pts/1 00:00:00 bash
0 S 1000 34698 34633 0 80 0 - 29258 do_wai pts/1 00:00:00 bash
0 R 1000 34743 34698 0 80 0 - 38331 - pts/1 00:00:00 ps
从上面可以看出,使用bash新建一个子程序之后,多出来了一个进程,其PID为34743,其PPID(也就是父程序的PID)为34698,而这个PID就是原本bash的PID。
其实子程序与父程序之间的关系还挺复杂的, 最大的复杂点在于程序互相之间的调用。 在Linux 的程序调用通常称为 fork-and-exec 的流程 [1]! 程序都会借由父程序以复制 ( fork)的方式产生一个一模一样的子程序, 然后被复制出来的子程序再以 exec 的方式来执行实际要进行的程序, 最终就成为一个子程序的存在:
3. 一个bash中的多任务工作管理
我们在上一个小节有提到所谓的“父程序、 子程序”的关系, 那我们登陆 bash 之后, 就是取得一个名为 bash 的 PID 了, 而在这个环境下面所执行的其他指令, 就几乎都是所谓的子程序了。 那么, 在这个单一的 bash 接口下, 我可不可以进行多个工作啊? 当然可以啦。在一个bash中同时进行多个工作,需要用到工作管理(job control):
①将指令丢到背景中“执行”的 &
[root@CentOS7 ~]# rm -rf /tmp/*
[root@CentOS7 ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 35079
[root@CentOS7 ~]# tar: 从成员名中删除开头的“/”
^C
[1]+ 完成 tar -zpcf /tmp/etc.tar.gz /etc
执行tar -zpcf /tmp/etc.tar.gz /etc &
后,这个进程就被放到了bash的背景中,其工作号码为1,PID为35079。此外, 使用&最大的好处是: 不怕被 [ctrl]+c 中断的啦!
另外,如果放到背景的进程有许多输出,为了避免后续工作不被这个进程打扰(屏幕不要一直有打印信息),可以将输出的内容定向到文件:tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
。
②将“目前”的工作丢到背景中“暂停”: [ctrl]-z;将背景工作拿到前景来处理: fg
这对vim编辑非常有用,比如你在进行文件编辑的时候,突然忘记了某些前面指令的结果,就可以暂停编辑,这样就不用保存退出再编辑:
[root@CentOS7 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 34984 34698 0 80 0 - 58642 do_wai pts/1 00:00:00 su
4 S 0 34990 34984 0 80 0 - 29279 do_wai pts/1 00:00:00 bash
0 R 0 35693 34990 3 80 0 - 38331 - pts/1 00:00:00 ps
[root@CentOS7 ~]# touch /tmp/PIDfile && vim /tmp/PIDfile[1]+ 已停止 vim /tmp/PIDfile
[root@CentOS7 ~]# jobs
[1]+ 已停止 vim /tmp/PIDfile
[root@CentOS7 ~]# fg %1
vim /tmp/PIDfile
[root@CentOS7 ~]#
在vim编辑界面按下ctrl+z就可以暂停,之后可以使用jobs
查看后台的工作的编号,这里的编号是1,想要重新编辑的话就可以使用fg %编号
来将背景的工作提到bash前景中。
③让工作在背景下的状态变成运行中: bg
④管理背景当中的工作: kill
如果想要将该工作直接移除呢? 或者是将该工作重新启动呢? 这个时候就得需要给予该工作一个讯号 ( signal) , 让他知道该怎么作才好啊! 此时, kill 这个指令就派上用场啦。
常用的 signal 您至少需要了解 1, 9, 15 这三个 signal 的意义才好。
[root@CentOS7 ~]# rm -rf /tmp/*
[root@CentOS7 ~]# touch /tmp/file && vim /tmp/file[1]+ 已停止 vim /tmp/file
[root@CentOS7 ~]# ps -l | grep 'vim'
0 T 0 35817 9470 0 80 0 - 37449 do_sig pts/0 00:00:00 vim
[root@CentOS7 ~]# kill -9 35817
[root@CentOS7 ~]# ls -a /tmp/*
/tmp/file
[1]+ 已杀死 vim /tmp/file
[root@CentOS7 ~]# ps -l | grep 'vim'
[root@CentOS7 ~]#
Tips:进行工作管理的行为中, 其实每个工作都是目前bash 的子程序, 亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash .
4.进程管理
4.1 查询进程
①ps -l
仅观察这个bash的进程。
[root@CentOS7 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 35870 35820 0 80 0 - 58642 do_wai pts/1 00:00:00 su
4 S 0 35876 35870 0 80 0 - 29248 do_wai pts/1 00:00:00 bash
0 R 0 36023 35876 0 80 0 - 38331 - pts/1 00:00:00 ps
②ps aux
查看所有bash的进程。
[root@CentOS7 ~]# ps aux | head -n 5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 191408 3100 ? Ss 11月16 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 11月16 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 11月16 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 11月16 0:03 [ksoftirqd/0]
③pstree
以目录树的方式查看。
4.2 进程的执行顺序
如果所有的程序同时被唤醒, 那么 CPU 应该要先处理那个程序呢? 也就是说, 那个程序被执行的优先序比较高? 这就得要考虑到程序的优先执行序 ( Priority) 与 CPU 调度啰。在Linux中是通过进程的Priority 与 Nice 值来进行确定的,其中PRI( new) = PRI( old) + nice
。
上图中假设 pro1, pro2 是紧急的程序, pro3, pro4 是一般的程序。具高优先权的 pro1, pro2 可以被取用两次, 而较不重要的 pro3, pro4 则运行次数较少。 如此一来 pro1, pro2 就可以较快被完成啦! 要注意, 上图仅是示意图, 并非较优先者一定会被运行两次啦! 为了要达到上述的功能, 我们 Linux 给予程序一个所谓的“优先执行序 ( priority, PRI) ”, 这个PRI 值越低代表越优先的意思。 不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的。使用ps -l
查询优先级:
[root@CentOS7 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 35870 35820 0 80 0 - 58642 do_wai pts/1 00:00:00 su
4 S 0 35876 35870 0 80 0 - 29248 do_wai pts/1 00:00:00 bash
0 R 0 37441 35876 0 80 0 - 38331 - pts/1 00:00:00 ps
5.系统资源的观察
①free
观察内存使用情况
[root@CentOS7 ~]# free -mtotal used free shared buff/cache available
Mem: 972 500 114 17 356 309
Swap: 1023 405 618
从上面可以看出,系统当中有 972MB 左右的实体内存, 我的 swap 有 1GB 左右。
②uname
查看系统与核心相关信息
[root@CentOS7 ~]# uname -a
Linux CentOS7 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
- Linux
表示正在运行的操作系统的名称。 - CentOS7
系统主机名(Hostname),即当前机器的网络名称。这里是 CentOS7。 - 3.10.0-1160.el7.x86_64
内核版本(Kernel Version):
3.10.0:Linux 内核的主版本号、次版本号和修订版本号。
1160:发行版内核的补丁号或构建号。
el7:表示这是 Red Hat 系列(包括 CentOS 和 RHEL)发行版的内核,el7 表示是 CentOS/RHEL 7 系列。
x86_64:表示内核的架构,这里是 64 位架构。 - #1
表示这是该内核的第一个构建版本。 - SMP
表示该内核支持对称多处理(Symmetric Multi-Processing),即支持多核处理器。 - Mon Oct 19 16:18:59 UTC 2020
内核编译时间: - x86_64
CPU 的架构类型,这里是 64 位架构。 - x86_64 x86_64
CPU 的硬件平台和运行平台,重复两次是正常的:
第一部分:硬件架构。
第二部分:内核使用的硬件平台。 - GNU/Linux
表示操作系统的全名是 GNU/Linux,说明这是基于 GNU 工具链的 Linux 系统。
③uptime
观察系统启动时间与工作负载
[root@CentOS7 ~]# uptime14:56:14 up 1 day, 23:47, 2 users, load average: 0.00, 0.02, 0.05
④netstat
比较常被用在网络的监控方面
⑤dmesg
分析核心产生的讯息
[root@CentOS7 ~]# dmesg | more
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.0-1160.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc v
ersion 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos
-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF
-8
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000003fedffff] usable
[ 0.000000] BIOS-e820: [mem 0x000000003fee0000-0x000000003fefefff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x000000003feff000-0x000000003fefffff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x000000003ff00000-0x000000003fffffff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000f0000000-0x00000000f7ffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec0ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] SMBIOS 2.7 present.
[ 0.000000] DMI: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS
--More--
Tips:对于输出非常多的命令,可以使用管线加more的方式实现翻页,这样就不会一次性全部输出
6. /proc/* 代表的意义
我们之前提到的所谓的程序都是在内存当中嘛! 而内存当中的数据又都是写入到/proc/* 这个目录下的, 所以啰, 我们当然可以直接观察 /proc 这个目录当中的文件。目前主机上面的各个程序的 PID 都是以目录的型态存在于 /proc 当中。 举例来说,我们开机所执行的第一支程序 systemd 他的 PID 是 1 , 这个 PID 的所有相关信息都写入在/proc/1/当中:
[root@CentOS7 ~]# ll /proc/1 | more
总用量 0
dr-xr-xr-x 2 root root 0 11月 18 15:06 attr
-rw-r--r-- 1 root root 0 11月 18 15:06 autogroup
-r-------- 1 root root 0 11月 18 15:06 auxv
-r--r--r-- 1 root root 0 11月 17 03:26 cgroup
--w------- 1 root root 0 11月 18 15:06 clear_refs
-r--r--r-- 1 root root 0 11月 17 03:26 cmdline
-rw-r--r-- 1 root root 0 11月 17 03:26 comm
-rw-r--r-- 1 root root 0 11月 18 15:06 coredump_filter
-r--r--r-- 1 root root 0 11月 18 15:06 cpuset
lrwxrwxrwx 1 root root 0 11月 18 15:06 cwd -> /
-r-------- 1 root root 0 11月 17 03:26 environ
lrwxrwxrwx 1 root root 0 11月 17 03:26 exe -> /usr/lib/systemd/systemd
dr-x------ 2 root root 0 11月 18 15:06 fd
dr-x------ 2 root root 0 11月 18 15:06 fdinfo
-rw-r--r-- 1 root root 0 11月 18 15:06 gid_map
-r-------- 1 root root 0 11月 18 15:06 io
-r--r--r-- 1 root root 0 11月 18 15:06 limits
-rw-r--r-- 1 root root 0 11月 17 03:26 loginuid
dr-x------ 2 root root 0 11月 18 15:06 map_files
-r--r--r-- 1 root root 0 11月 18 15:06 maps
-rw------- 1 root root 0 11月 18 15:06 mem
-r--r--r-- 1 root root 0 11月 16 15:09 mountinfo
比较有趣的其实是两个文件, 分别是:
下面是一些/proc目录下的文件及其含义:
7.SELinux
SELinux(Security-Enhanced Linux) 是一种基于强制访问控制(MAC, Mandatory Access Control)的安全机制,由美国国家安全局(NSA)最初开发,现已成为 Linux 操作系统中一项重要的安全子系统。它通过对系统中所有资源的访问权限进行细粒度的控制,提升了系统的整体安全性。