Linux程序管理与SELinux(鸟哥)

    科技2025-11-27  21

    为方便查阅和记忆

    1.进程

    执行一个程序或命令时,产生一个进程,PID标识不同进程 不同的用户身份执行程序时,系统给予的权限是不同的,每个进程有三组人的权限,每组人具有r/w/x权限,由这个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限。程序:二进制程序放置在存储媒介中,以物理文件的形式存在进程:程序被触发后,执行者的权限与属性、程序的程序代码与所需要的数据等都会被加载到内存中,操作系统并给予这个内存内的单元一个标识符PID,进程是一个正在运行中的程序子进程与父进程:PID PPIDfork and exec:过程调用的流程 系统以fork的方式复制一个与父进程相同的暂存进程,新的PID,新增PPID参数是父进程的PID,然后被复制出来的暂存进程以exec的方式来加载实际要执行的程序,最终成为一个子进程的存在

    cp file1 file2 & &表示置于后台执行,在终端中仍然可以做其他的工作

    2.工作管理

    工作管理中,每个工作其实是bash的子进程,bash只能管理自己的工作,不能管理其他bash的工作 假设只有一个终端,出现提示符操作的环境称为前台foreground,对应的工作还可以放入后台background去暂停或运行,放入后台的工作必须不能与用户互动,后台工作不能ctrl+c终止前台:可以控制与执行命令的这个环境称为前台工作后台:可以自行运行的工作,无法使用ctrl+c终止,可使用fg/bg调用该工作后台中执行的进程不能等待terminal/shell的输入直接将命令丢到后台执行的&:分配一个job number,利用数据重定向,将命令的stdout和stderr重定向到文件,以免影响前台工作将目前的工作丢到后台中暂停:ctrl+z

    例如vim,在一般模式下ctrl+z将vim丢到后台当中并等待即可,+号表示最近一个被丢进后台的工作,且fg命令默认取用这个工作,stopped表示目前工作状态,暂停状态,-号表示最近最后第二个被放置到后台的工作,fg -可以取用,其他没有+-号标识

    jobs  [lnprs]命令查看目前后台工作状态

    将后台工作拿到前台来处理:fg

    fg %jobnumber,如fg %2,fg %1

    将工作在后台下的状态变成运行中:bg

    管理后台当中的工作:kill

    kill -l查看能够使用的信号signal,kill -signal $jobnumber

    kill -9 %jobnumber or kill -SIGKILL %jobnumber

    -9强制删除一个不正常的工作时使用,-15以正常步骤结束一项工作,-1重新读取一次参数配置

    kill 默认加PID,用于工作管理时加%jobnumber

    脱机管理:此处的后台被并不是放到系统后台去,工作管理的后台与终端机有关,终端退出,后台工作也会结束,使用at和nohub命令可以让你脱机或注销系统后,还能够让工作继续进行

    3.进程管理

    3.1进程查看

    静态ps和动态top,ps将某个时间点的进程运行情况选取下来

    仅查看自己bash相关进程:ps -l

    F表示进程标志,说明进程权限,常见号码4表示此进程的权限是root

    S表示进程状态,S=sleep睡眠状态,可以被唤醒,R=running运行中,T=stop停止状态,Z=zombie僵尸状态,进程已经终止但是无法从内存中删除,D不可被唤醒的睡眠状态,可能在等待I/O

    UID/PID/PPID该进程被该UID所拥有/PID号码/PPID号码

    C,CPU使用率,百分比

    PRI/NI,priority/nice缩写,优先级,越小越快执行

    ADDR/SZ/WCHAN,都与内存有关,SZ此进程有调多少内存,WCHAN此进程是否运行中,-表示正在运行

    TTY登陆者的终端机位置,pts/n

    TIME使用掉的CPU时间,此进程实际花费CPU运行时间

    CMD即command,造成此程序触发进程的命令

    查看系统所有进程:ps aux

    USER该进程属于哪个用户账号,%CPU使用掉的CPU资源百分比,%MEM占用的物理内存百分比,VSZ使用掉的虚拟内存量,RSS占用的固定内存量,TTY该进程在哪个终端机上运行,?表示与终端机无关,STAT该进程目前的状态,与ps -l的S标识相同(R/S/T/Z),START该进程被触发启动的时间,TIME该进程实际使用CPU运行时间,COMMAND该进程的实际命令

    以ps -l的格式显示所有的进程:ps -lA

    进程树的程序显示:ps axjf

    ps aux | grep egrep '(cron|syslog)'

    僵尸进程表示该进程已经执行完毕,或因故应该要终止了,但是父进程却无法完整将该进程结束掉,而造成那个进程一直存在内存中,如果某个进程的CMD后有<defunct>字样时,表示是僵尸进程

    top动态产看进程的变化:top -d 秒数,默认5s

    top主要分为两个界面,上面是整个系统的资源使用情况,按行显示的内容如下:第一行依次是目前的时间,开机所经过的时间,已经登陆的用户数量,系统在1,5,15分钟的平均工作负载,平均运行几个进程(工作),越小越空闲,若高于1需要注意

    第二行依次是进程总数,R,S,T,Z的进程数量,注意Z数量;第三行依次是CPU整体负载,其中%wa表示I/O wait,第四行和第五行表示物理内存和虚拟内存使用情况,若swap占用多,表示物理内存不足

    top的后半部分是每个进程使用资源情况,PID,USER,PR是priority的缩写,进程的优先执行顺序,NI是nice的缩写,与PR有关,%CPU,%MEM,TIME+是CPU使用时间的累加,top默认使用%cpu排序

    在top执行过程中,可以使用的按键命令有

    ?(shift+?)显示在top当中可以输入的按键命令

    P(shift+p大写P)以%CPU排序,M以%MEM排序,N以PID排序,T以TIME+排序

    k(小写)给予某个PID一个信号,r给予某个PID重新一个nice值,q离开top

    重定向:top -b -n 2 > test.txt

    echo $$打印当前bash PID

    pstree找出进程间的相关性

    所有的进程都是依附在init这个进程下面,PID为1,linux内核主动调用的第一个进程,发生僵尸进程需要重新启动init,启动init的是reboot

    3.2进程的管理

    给进程一个信号signal去告知该进程你想要它做什么,常用信号:

    1 SIGHUP 启动被终止的进程,重新读取配置文件,类似重新启动

    2 SIGINT 相当于ctrl-c来中断一个进程的进行

    9 SIGKILL 强制中断一个进程的进行,可能有半产品产生

    15 SIGTERM 以正常的结束进程来终止该进程,已经有问题的进程无法正常终止

    17 SIGSTOP 相当于ctrl-z暂停一个进程的执行

    kill -signal PID kill传送信号给PID或jobnumber

    killall -signal 命令名称  直接跟启动该进程的命令名称

    3.3进程执行顺序

    大部分进程处于休眠状态,进程优先级和CPU调度

    Priority和Nice值

    Priotity(PRI)值越低表示越优先,但是PRI值是由内核动态调整的,用户无法直接调整,用户可以通过调整nice(NI)值:

    PRI(new)= PRI(old) + nice

    上面只能说明nice值能够影响PRI,最终的PRI还是由系统分析决定,当nice值为负时,进程会变得较为优先处理:

    nice值范围时-20——19

    root可随意调整nice,范围时-20_19

    一般用户只能调整自己进程的nice,范围是0——19

    一般用户只能越调越高nice

    也就是说要调整某个进程的优先级,就是调整nice值

    nice:新执行的命令给予新的nice值

    如nice -n -5 vi & 一般可以将备份工作调大nice值

    renice:已存在进程的nice重新调整

    renice [number] PID,如renice 10 897

    renice可以使nice值在父子进程间传递,令为top也可以调整nice值

    3.4系统资源的查看

    free:查看内存使用情况

    free [-b|-k|-m|-g] [-t]

    buffers,cached表示缓冲/缓存,一般来说,swap最好不要使用,如果swap使用超过20%,物理内存严重不足,Linux系统为了加入系统性能,会将常用的或最近使用的文件数据缓存下来,因此物理内存被用光是正常的。

    uname:查看系统与内核相关信息

    uptime:查看系统启动时间与工作负载

    netstat:跟踪网络

    dmesg:分析内核产生的信息

    所有内核检测信息,不管时开机还是系统运行中,只要时内核产生的信息都会被记录到内存中的某个保护区段,dmesg负责读取该区段

    vmstat:检测系统资源变化

    4.特殊文件与程序

    1.特殊文件与权限SUID SGID SBIT

    其中s和t,与系统的账号和系统的进程相关

    SetUID

    SUID仅对二进制程序有效,执行者对该程序需要有X权限,本权限在执行过程中有效,执行者将具有该程序所有者的权限,如/etc/shadow密码只有root可读可写,但是一般用户可以使用passwd修改自己的密码,因为passwd命令的SUID权限,一般用户在执行passwd命令期间会暂时获得root权限,写入新密码,SUID仅可用在二进制程序上,不能用在shell script上,对目录也无效

    SetGID

    当s标志出现在用户组时,成为SGID,SGIC可以针对文件和目录来设置,SGID对二进制程序有用,执行者需要有x权限,在执行过程中,将会获得该程序用户组的支持

    SGID用在目录上时,用户需要对目录有rx权限,并进入此目录,用户在此目录下的有效用户组将会变成该目录的用户组,若在此目录下有w权限,新建的文件的用户组和此目录用户组相同,SGID对项目开发非常重要

    Sticky Bit

    如上面t权限,SBIT仅对目录有效,当用户对于此目录有wx权限,用户在此目录下创建的文件或目录时,仅有自己与root才有权力删除该文件

    SUID SGID SBIT的设置

    SUID = 4, SGID=2,SBIT=1

    如chmod 4775 filename会改为-rwsrwxr-x

    s和t都是替代x这个权限的,如果user, group, others没有x权限,会出现S和T,表示是空的

    /proc/*代表的意义

    进程在内存中,内存中的数据写入了/proc/目录下,各个进程的PID以目录的类型存在于/proc中,如/proc/1/,如果针对整个Linux系统相关的参数,在/proc目录下,如/proc/cpuinfo等

    4.3查询已打开文件或已执行程序打开的文件

    fuser:通过文件(或文件系统)找出正在使用该文件的程序

    如遇到device is busy可以利用fuser跟踪,找到进程有利用到该文件系统

    如fuser -uv .

    fuser -uv /proc

    fuser -muv /proc

    lsof:列出被进程所打开的文件名

    fuser是由文件或者设备找出使用它的进程,lsof查出某个进程打开或使用的文件设备

    如lsof +d /dev找出某个目录下已经被打开的文件

    lsof -u root | grep bash显示输入root的bash这个进程打开的文件

    pidof:找出某个正在执行进程的PID

    如pidof init syslogd

    5.SELinux初探(了解什么作用)

    SELinux是Security enhanced Linux缩写,安全强化的Linux,设计之初,避免资源的误用,selinux是进行程序、文件等权限设置依据的一个内核模块,由于启动网络服务的也是程序,刚好也能控制网络服务能否访问系统资源的一道关卡

    传统文件权限与账号关系,自主访问控制DAC,依据进程的所有者与文件资源的rwx权限来决定有无访问的能力

    以策略规则制定特定程序读取特定文件:委托访问控制,MAC,针对特定的进程和文件资源来进行权限控制,即使你是root,在不同进程时,你所取得的权限不一定是root,根据规则选择是否启用控制

    selinux通过MAC来空管进程,控制的主体是进程,目标则是该进程能否读取的文件资源

    策略:由于进程和文件数量庞大,因此selinux会依据某些服务来制定基本的访问安全性策略

    安全上下文:主体能否访问目标除了策略指定之外,主体与目标的安全上下文必须一致,最后根据rwx权限来最终确定是否能够访问目标

    selinux三种模式:

    enforcing强制模式,正在运行

    permissive宽容模式,调试用

    disabled关闭,selinux没有运行

    getenforce命令查看模式

    Processed: 0.019, SQL: 9