进程模块管理
PAM模块设定语法
PAM是通过由一个与程序名相同的配置文件来实现认证的。当程序运行时,输入密码后,程序会呼叫PAM模块进行认证,PAM模块会在/etc/pam.d/下找到该程序的配置文件,根据配置文件的设定,引用相关的PAM模块进行逐步分析,然后将分析结果回传给程序,程序根据结果来判断程序的下一步执行方向。
/etc/pam.d/*:每个程序个别的 PAM 配置文件;
/lib64/security/*:PAM 模块文件的实际放置目录;
/etc/security/*:其他 PAM 环境的配置文件;
/usr/share/doc/pam-*/:详细的 PAM 说明文件。
PAM验证流程:依据验证类别 (type) 来看,然后先由 login 的设定值去查阅,如果出现include system-auth就转到 system-auth 文件中的相同类别,去取得额外的验证流程就是了。然后再到下 一个验证类别,最终将所有的验证跑完。
在线与使用者交谈可使用 write, wall,脱机状态下可使用 mail 传送邮件
磁盘配额与进阶文件管理
磁盘配额Quota
例行性工作排程
工作排程的种类: at, cron
at :at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务的支援
crontab :crontab 这个指令所设定的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。
进程管理与SELinux
触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设定。
由一个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限。
工作管理:
进行工作管理的行为中,其实每个工作都是目前 bash的子进程,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2的bash。
进行 bash 的 job control 的限制:
这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);
前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
背景:可以自行运作的工作,无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
背景中执行的进程不能等待 terminal/shell 的输入(input)
直接将指令丢到背景中执行的 &,在命令最后加上&意味着将任务丢到背景中去执行,然后可以在前景去执行其他任务,任务完成后会显示。
将目前的工作丢到背景中暂停:[ctrl]-z
当你在做某项任务时,想要去执行其他操作,可以将现在的任务放到背景中,按[ctrl]-z,工作会被停止。
通过jobs命令可以观察目前的背景工作状态,+ 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。
将背景工作拿到前景中来执行,fg %jobnumber ,先查看当前在背景中的工作,通过fg指令可以将工作提到前景中执行
让工作在背景下的状态变成运作中: bg
管理背景当中的工作:kill -signal %jobnumber
脱机管理问题
nohup [指令与参数] <==在终端机前景中工作
nohup [指令与参数] & <==在终端机背景中工作
nohup 可以让在脱机或注销系统后,还能够让工作继续进行
进程管理
在 Linux 的进程呼叫通常称为 fork-and-exec 的流程。进程都会藉由父进程以复制 (fork) 的方式产生一个 一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
查看进程:top,ps,pstree
主要的signal信号名称和作用:
SIGHUP(1) 启动被终止的进程,可让该 PID 重新读取自己的配置文件,类似重新启动
SIGINT(2) 相当于用键盘输入 [ctrl]-c 来中断一个进程的进行
SIGKILL(9) 代表强制中断一个进程的进行,如果该进程进行到一半,那么尚未完成的部分可能会有半产品产生,类似 vim 会有 .filename.swp 保留下来。
SIGTERM(15)以正常的结束进程来终止该进程。由于是正常的终止,所以后续的动作会将他完成。如果该进程已经发生问题,就是无法使用正常的方法终止时, 输入这signal也是没有用的。
SIGSTOP(19) 相当于用键盘输入 [ctrl]-z 来暂停一个进程的进行
kill 后面直接加数字与加上 %number 的情况是不同,%是代表的工作,数字代表的是进程号
killall [-iIe] [command name] 可以将系统当中所有以某个指令名称启动的进程全部删除
-i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给用户;
-e :exact 的意思,表示后面接的 command name 要一致,但整个完整的指令
不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。
进程的执行顺序:
Linux 给予进程一个优先执行序 (priority, PRI),PRI 值越低代表越优先的意思。PRI 值是由核心动态调整的,用户无法直接调整PRI值。
PRI(new) = PRI(old) + nice
当nice值为负值时,那么该进程就会降低PRI值,亦即会变的较优先被处理
nice值可调整的范围为-20~19;
root可随意调整自己或他人进程的Nice值,且范围为-20~19;
一般使用者仅可调整自己进程的Nice值,且范围仅为0~19(避免一般用户抢占系统资源);
一般使用者仅可将nice值越调越高,例如本来nice为5,则未来仅能调整到大于5
要调整某个进程的优先执行序,就是调整该进程的nice,有两种方式可以调整:
- 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
- 调nice :新执行的指令即给予新的 nice 值
整某个已经存在的 PID 的 nice 值:用 renice 指令。
nice [-n 数字] command 数字范围-20~19
renice :已存在进程的 nice 重新调整
renice [number] PID
观察内存使用情况:free -m
uname:查阅系统与核心相关信息 uname [-asrmpi]
uptime:观察系统启动时间与工作负载
netstat :追踪网络或插槽文件 netstat -[atunlp]
dmesg :分析核心产生的讯息
vmstat :侦测系统资源变化
具有 SUID/SGID 权限的指令执行状态
SUID 的权限其实与进程的相关性非常的大
SUID 权限仅对二进制程序(binary program)有效;
执行者对于该程序需要具有 x 的可执行权限;
本权限仅在执行该程序的过程中有效 (run-time);
执行者将具有该程序拥有者 (owner) 的权限。
当执行者去执行具有SUID权限的文件时,执行者会暂时获得文件owner的权限,权限仅仅在执行文件时有效。当触发进程后,会进入一个新的进程获取一个新的PID,该 PID 产生时透过 SUID 来给予该 PID 特殊的权限设定。
fuser:藉由文件(或文件系统)找出正在使用该文件的进程
fuser [-umv] [-k [i] [-signal]] file/dir
-u :除了进程的 PID 之外,同时列出该进程的拥有者;
-m :后面接的那个档名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效
-v :可以列出每个文件与进程还有指令的完整相关性
-k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿
-signal:预设是 SIGKILL (-9)
lsof :列出被进程所开启的文件档名
lsof [-aUu] [+d]
-a :多项数据需要同时成立才显示出结果时
-U :仅列出 Unix like 系统的 socket 文件类型;
-u :后面接 username,列出该使用者相关进程所开启的文件;
+d :后面接目录,亦即找出某个目录底下已经被开启的文件!
pidof :找出某支正在执行的程序的 PID
pidof [-sx] program_name
-s :仅列出一个 PID 而不列出所有的 PID
-x :同时列出该 program name 可能的 PPID 那个进程的 PID
系统开机的流程:
1. 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置;
2. 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 grub2, spfdisk 等程序);
3. 依据 boot loader 的设定加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;
4. 在硬件驱动成功后,Kernel 会主动呼叫 systemd 程序,并以 default.target 流程开机;
BIOS, boot loader 与 kernel 载入
开机管理程序被称为 Boot Loader。Boot Loader 程序安装在开机装置的第一个扇区 (sector) 内,也就是MBR (Master Boot Record, 主要启动记录区)。
bootloader的功能:
提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能!
载入核心文件:直接指向可开机的程序区段来开始操作系统;
转交其他 loader:将开机管理功能转交给其他 loader 负责。
最终boot loader的功能就是加载 kernel 文件
加载核心侦测硬件与 initramfs 的功能
当我们由bootloader的管理而开始读取核心文件后,接下来,Linux就会将核心解压缩到主存储器当中,并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网络卡、声卡等等。此时Linux核心会以自己的功能重新侦测一次硬件,而不一定会使用BIOS侦测到的硬件信息,核心此时才开始接管BIOS后的工作了。
由于模块放置到磁盘根目录内,因此在开机的过程中核心必须要挂载根目录,这样才能够读取核心模块提供加载驱动程序的功能。非必要的功能且可以编译成为模块的核心功能,目前的Linuxdistributions都会将他编译成为模块。因此USB,SATA,SCSI...等磁盘装置的驱动程序通常都是以模块的方式来存在的。核心根本不认识SATA磁盘,所以需要加载SATA磁盘的驱动程序,否则根本就无法挂载根目录。但是SATA的驱动程序在/lib/modules内,根本无法挂载根目录怎么读取到/lib/modules/内的驱动程序,要通过虚拟文件系统。能够透过bootloader来加载到内存中,然后这个文件会被解压缩并且在内存当中仿真成一个根目录,且此仿真在内存当中的文件系统能够提供一支可执行的程序,透过该程序来加载开机过程中所最需要的核心模块,通常这些模块就是USB,RAID,LVM,SCSI等文件系统与磁盘接口的驱动程序。
核心与核心模块:
核心: /boot/vmlinuz 或 /boot/vmlinuz-version;
核心解压缩所需 RAM Disk: /boot/initramfs (/boot/initramfs-version);
核心模块: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel;
核心原始码: /usr/src/linux 或 /usr/src/kernels/ (要安装才会有,预设不安装)
建立文件:
depmod [-Ane]
-A :不加任何参数时, depmod 会主动的去分析目前核心的模块,并且重新写入
/lib/modules/$(uname -r)/modules.dep 当中。若加入 -A 参数时,则 depmod会去搜寻比 modules.dep 内还要新的模块,如果真找到新模块,才会更新。
-n :不写入 modules.dep ,而是将结果输出到屏幕上(standard out);
-e :显示出目前已加载的不可执行的模块名称
显示当前系统加载了多少模块:lsmod
查阅在核心内的模块,检查某个模块文件:
modinfo [-adln] [module_name|filename]
-a :仅列出作者名称;
-d :仅列出该 modules 的说明 (description);
-l :仅列出授权 (license);
-n :仅列出该模块的详细路径。
核心模块的加载与移除
insmod [/full/path/module_name] [parameters]
rmmod [-fw] module_name
-f :强制将该模块移除掉,不论是否正被使用;
如果无法直接加载或移除该模块,直接使用 modprobe 来处理模块加载
modprobe [-cfr] module_name
-c :列出目前系统所有的模块
-f :强制加载该模块;
-r :类似 rmmod