Mark blog

知行合一 划水归档

Linux 中进程的管理

进程管理工具 kill

kill命令:

向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头 (可省略),不区分大小写 

显示当前系统可用信号: kill –l,trap -l 

​ 常用信号:man 7 signal

​ 1) SIGHUP: 无须关闭进程而让其重读配置文件

​ 2) SIGINT: 中止正在运行的进程;相当于Ctrl+c

​ 3) SIGQUIT:相当于ctrl+\

9) SIGKILL: 强制杀死正在运行的进程 

​ 15) SIGTERM:终止正在运行的进程

​ 18) SIGCONT:继续运行

​ 19) SIGSTOP:后台休眠

指定信号的方法: 

(1) 信号的数字标识:1, 2, 9 

(2) 信号完整名称:SIGHUP 

(3) 信号的简写名称:HUP 

按PID:kill [-SIGNAL] pid …

kill –n SIGNAL pid;kill –s SIGNAL pid 

按名称:killall [-SIGNAL] comm…

按模式:pkill [options] pattern

-SIGNAL 

​ -u uid: effective user,生效者

-U uid: real user,真正发起运行命令者 

​ -t terminal: 与指定终端相关的进程

-l: 显示进程名(pgrep可用) 

-a: 显示完整格式的进程名(pgrep可用) 

​ -P pid: 显示指定进程的子进程

作业管理

Linux的作业控制

前台作业:通过终端启动,且启动后一直占据终端 

后台作业:可通过终端启动,但启动后即转入后台运行(释放终端) 

让作业运行于后台

(1) 运行中的作业: Ctrl+z 

(2) 尚未启动的作业: COMMAND & 

后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望 送往后台后,剥离与终端的关系

nohup COMMAND &>/dev/null & 

screen;COMMAND 

查看当前终端所有作业:jobs

作业控制:

fg [[%]JOB_NUM]:把指定的后台作业调回前台 

bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行 

kill [%JOB_NUM]: 终止指定的作业 

并行运行

同时运行多个进程,提高效率

方法1

vi all.sh 

f1.sh& 

f2.sh& 

f3.sh& 

方法2

(f1.sh&);(f2.sh&);(f3.sh&) 

方法3

{ f1.sh& f2.sh& f3.sh& } 

计划任务

Linux任务计划、周期性任务执行

• 未来的某时间点执行一次任务 

    at 

    batch:系统自行选择空闲时间去执行此处指定的任务 

• 周期性运行某任务 

    cron 

at任务

包:at

at命令:at [option] TIME

常用选项:

-V 显示版本信息: 

-l 列出指定队列中等待运行的作业;相当于atq 

-d 删除指定的作业;相当于atrm 

-c 查看具体作业任务 

-f /path/file 指定的文件中读取任务 

-m 当任务被完成之后,将给用户发送邮件,即使没有标准输出 

注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

TIME:定义出什么时候进行 at 这项任务的时间

HH:MM [YYYY-mm-dd] 

noon, midnight, teatime(4pm) 

tomorrow 

now+#{minutes,hours,days, OR weeks} 

at时间格式

HH:MM 02:00

在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务 

HH:MM YYYY-MM-DD 02:00 2016-09-20

规定在某年某月的某一天的特殊时刻进行该项任务 HH:MM[am|pm]/[Month]/[Date] 0

4pm March 17 

17:20 tomorrow 

HH:MM[am|pm] + number [minutes|hours|days|weeks]

在某个时间点再加几个时间后才进行该项任务 

now + 5 min 

02pm + 3 days 

at任务

执行方式:

1)交互式 2)输入重定向 3)at –f 文件 

依赖与atd服务,需要启动才能实现at任务

at队列存放在/var/spool/at目录中

/etc/at.{allow,deny}控制用户是否能执行at任务

白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令 

黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在 at.deny 文件中的使用者则可执行 

如果两个文件都不存在,只有 root 可以执行 at 命令 

周期性任务计划 cron

相关的程序包:

cronie: 主程序包,提供crond守护进程及相关辅助工具 

cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如 cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次 此任务 

crontabs:包含CentOS提供系统维护任务 

计划任务

确保crond守护处于运行状态:

CentOS 7: 

    systemctl status crond 

CentOS 6: 

    service crond status 

计划周期性执行的任务提交给crond,到指定时间会自动运行

系统cron任务:系统维护作业 

    /etc/crontab 

用户cron任务: 

    crontab命令 

日志:/var/log/cron

系统cron任务:/etc/crontab
注释行以 # 开头
详情参见 man 5 crontab

#Example of job definition:

#.—————- minute (0 - 59)

#| .————- hour (0 - 23)

#| | .———- day of month (1 - 31)

#| | | .——- month (1 - 12) OR jan,feb,mar,apr …

#| | | | .—- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

#| | | | |

#* * * * * user-name command to be executed

例如:晚上9点10分运行echo命令
10 21 * * * wang /bin/echo “Howdy!”

时间表示法:

(1) 特定值 给定时间点有效取值范围内的值 

(2) 给定时间点上有效取值范围内的所有值 表示“每...” 

(3) 离散取值 

   #,#,# 

(4) 连续取值 

   #-# 

(5) 在指定时间范围上,定义步长 

   /#: #即为步长 

时间格式

@reboot Run once after reboot

@yearly 0 0 1 1 *

@annually 0 0 1 1 *

@monthly 0 0 1 * *

@weekly 0 0 * * 0

@daily 0 0 * * *

@hourly 0 * * * *

示例:每3小时echo和wall命令

0 */3 * * * centos /bin/echo “howdy”;/usr/bin/wall “show time!” 

系统的计划任务

/etc/crontab 配置文件

/etc/cron.d/ 配置文件

/etc/cron.hourly/ 脚本

/etc/cron.daily/ 脚本

/etc/cron.weekly/ 脚本

/etc/cron.monthly/ 脚本

anacron 系统

运行计算机关机时cron不运行的任务,CentOS6以后版本取消anacron服务,由 crond服务管理

对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其它不一直开机的系统 很重要对很有用

配置文件:/etc/anacrontab,负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务

• 字段1:如果在这些日子里没有运行这些任务…… 

• 字段2:在重新引导后等待这么多分钟后运行它 

• 字段3:任务识别器,在日志文件中标识 

• 字段4:要执行的任务 

由/etc/cron.hourly/0anacron执行

当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳

管理临时文件

CentOS6使用

/etc/cron.daily/tmpwatch定时清除临时文件 

CentOS7使用

systemd-tmpfiles-setup服务实现 

配置文件:

/etc/tmpfiles.d/*.conf *

/run/tmpfiles.d/*.conf *

/usr/lib/tmpfiles/*.conf 

/usr/lib/tmpfiles.d/tmp.conf

d /tmp 1777 root root 10d 

d /var/tmp 1777 root root 30d 

命令:

systemd-tmpfiles –clean|remove|create configfile 

用户计划任务

crontab命令定义

每个用户都有专用的cron任务文件: 

    /var/spool/cron/USERNAME 

crontab命令:

crontab [-u user]/[-l | -r | -e]/[-i] 

-l: 列出所有任务 

-e: 编辑任务 

-r: 移除所有任务 

-i:同-r一同使用,以交互式模式移除指定任务 

-u user: 仅root可运行,指定用户管理cron任务 

控制用户执行计划任务:

/etc/cron.{allow,deny} 

at和crontab

一次性作业使用 at

重复性作业使用crontab

Create at time crontab -e

List at -l crontab -l

Details at -c jobnum N/A

Remove at -d jobnum crontab -r

Edit N/A crontab -e

没有被重定向的输出会被邮寄给用户

root能够修改其它用户的作业

注意:运行结果的标准输出和错误以邮件通知给相关用户

(1) COMMAND > /dev/null 

(2) COMMAND &> /dev/null 

对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将% 放置于单引号中,则可不用转义

Linux 中系统资源的管理

进程管理工具

top 命令

top:有许多内置命令

​ 排序:

​ P:以占据的CPU百分比,%CPU

​ M:占据内存百分比,%MEM

​ T:累积占据CPU时长,TIME+

​ 首部信息显示:

​ uptime信息:l命令

​ tasks及cpu信息:t命令

​ cpu分别显示:1 (数字)

​ memory信息:m命令

​ 退出命令:q

​ 修改刷新时间间隔:s

​ 终止指定进程:k

​ 保存文件:W

top 命令栏位简介

​ us:用户空间

​ sy:内核空间

​ ni:调整nice时间

​ id:空闲

​ wa:等待IO时间

​ hi:硬中断

​ si:软中断(模式切换)

​ st:虚拟机偷走的时间

top命令扩展

选项:

​ -d # 指定刷新时间间隔,默认为3秒

​ -b 全部显示所有进程

​ -n # 刷新多少次后退出

​ -H 线程模式,示例:top -H -p `pidof mysqld`

htop命令:EPEL源

​ 选项:

​ -d #: 指定延迟时间;

​ -u UserName: 仅显示指定用户的进程

​ -s COLUME: 以指定字段进行排序

​ 子命令:

​ s:跟踪选定进程的系统调用

​ l:显示选定进程打开的文件列表

​ a:将选定的进程绑定至某指定CPU核心

​ t:显示进程树


内存空间管理

查看内存空间的使用状态:

free [OPTION]

​ -b 以字节为单位

​ -m 以MB为单位

​ -g 以GB为单位

​ -h 易读格式

​ -o 不显示-/+buffers/cache行

​ -t 显示RAM + swap的总和

​ -s n 刷新间隔为n秒

​ -c n 刷新n次后即退出

free命令中参数的意义:


内存工具

vmstat命令

vmstat命令:

​ 查看虚拟内存信息

​ vmstat [options]/[delay [count]]

​ vmstat 2 5

vmstat参数:

procs:

​ r:可运行(正运行或等待运行)进程的个数,和核心数有关

​ b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)

memory:

​ swpd: 交换内存的使用总量

​ free:空闲物理内存总量

​ buffer:用于buffer的内存总量

​ cache:用于cache的内存总量

swap:

​ si:从磁盘交换进内存的数据速率(kb/s)

​ so:从内存交换至磁盘的数据速率(kb/s) 内存工具

io:

​ bi:从块设备读入数据到系统的速率(kb/s)

​ bo: 保存数据至块设备的速率

system:

​ in: interrupts 中断速率,包括时钟

​ cs: context switch 进程切换速率

cpu:

​ us:Time spent running non-kernel code

​ sy: Time spent running kernel code

​ id: Time spent idle. Linux 2.5.41前,包括IO-wait time.

​ wa: Time spent waiting for IO. 2.5.41前,包括in idle.

​ st: Time stolen from a virtual machine. 2.6.11前, unknown.

选项:

​ -s: 显示内存的统计数据

其他内存工具

iostat:统计CPU和设备IO信息

​ 示例:iostat 1 10

pmap命令:进程对应的内存映射

pmap [options] pid […]

​ -x: 显示详细格式的信息

​ 示例:pmap 1

另外一种实现:

​ cat /proc/PID/maps


系统监控工具

glances 命令

glances属于第三方EPEL源中的工具

glances [-bdehmnrsvyz1]/[-B bind]/[-c server]/[-C conffile]/[-p port]/[-P password]/[– password]/[-t refresh]/[-f file]/[-o output]

内建命令:

a Sort processes automatically l Show/hide logs

c Sort processes by CPU% b Bytes or bits for network I/O

m Sort processes by MEM% w Delete warning logs

p Sort processes by name x Delete warning and critical logs

i Sort processes by I/O rate 1 Global CPU or per-CPU stats

d Show/hide disk I/O stats h Show/hide this help screen

f Show/hide file system stats t View network I/O as combination

n Show/hide network stats u View cumulative network I/O

s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)

y Show/hide hddtemp stats

部分选项解释:

​ -b: 以Byte为单位显示网卡数据速率

​ -d: 关闭磁盘I/O模块

​ -f /path/to/somefile: 设定输入文件位置

​ -o {HTML|CSV}:输出格式

​ -m: 禁用mount模块

​ -n: 禁用网络模块

​ -t #: 延迟时间间隔

​ -1:每个CPU的相关数据单独显示

*C/S模式下运行glances命令 *

服务器模式:

​ glances -s -B IPADDR

​ IPADDR: 指明监听的本机哪个地址

客户端模式:

​ glances -c IPADDR

​ IPADDR:要连入的服务器端地址

dstat 命令

dstat命令:系统资源统计,代替vmstat,iostat,需要使用yum安装

dstat [-afv]/[options..]/[delay [count]]

​ -c 显示cpu相关信息

​ -C #,#,…,total

​ -d 显示disk相关信息

​ -D total,sda,sdb,…

​ -g 显示page相关统计数据

​ -m 显示memory相关统计数据

​ -n 显示network相关统计数据

​ -p 显示process相关统计数据

​ -r 显示io请求相关的统计数据

​ -s 显示swapped相关的统计数据

​ –tcp

​ –udp

​ –unix

​ –raw

​ –socket

​ –ipc

​ –top-cpu:显示最占用CPU的进程

​ –top-io: 显示最占用io的进程

​ –top-mem: 显示最占用内存的进程

​ –top-latency: 显示延迟最大的进程

iotop

iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括 PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO

iotop输出

​ 第一行:Read和Write速率总计

​ 第二行:实际的Read和Write速率

​ 第三行:

​ 参数如下:

​ 线程ID(按p切换为进程ID)

​ 优先级

​ 用户

​ 磁盘读速率

​ 磁盘写速率

​ swap交换百分比

​ IO等待所占的百分比

​ 线程/进程命令

iotop 常用参数

​ -o, –only只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o 生效

​ -b, –batch非交互模式,一般用来记录日志

​ -n NUM, –iter=NUM设置监测的次数,默认无限。在非交互模式下很有用

​ -d SEC, –delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1

​ -p PID, –pid=PID指定监测的进程/线程

​ -u USER, –user=USER指定监测某个用户产生的I/O

​ -P, –processes仅显示进程,默认iotop显示所有线程

​ -a, –accumulated显示累积的I/O,而不是带宽

​ -k, –kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本 编程有用

​ -t, –time 加上时间戳,非交互非模式

​ -q, –quiet 禁止头几行,非交互模式,有三种指定方式

​ -q 只在第一次监测时显示列名

​ -qq 永远不显示列名

​ -qqq 永远不显示I/O汇总

iotop 交互按键

​ left和right方向键:改变排序

​ r:反向排序

​ o:切换至选项–only

​ p:切换至–processes选项

​ a:切换至–accumulated选项

​ q:退出

​ i:改变线程的优先级

lsof

Lsof:list open files查看当前系统文件的工具。在linux环境下,一切皆文件,用户通 过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议 (TCP) 和 用户数据报协议 (UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符

命令参数

​ -a:列出打开文件存在的进程

​ -c<进程名>:列出指定进程所打开的文件

​ -g:列出GID号进程详情

​ -d<文件号>:列出占用该文件号的进程

​ +d<目录>:列出目录下被打开的文件

​ +D<目录>:递归列出目录下被打开的文件

​ -n<目录>:列出使用NFS的文件

​ -i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip )

​ -p<进程号>:列出指定进程号所打开的文件

​ -u:列出UID号进程详情

​ -h:显示帮助信息

​ -v:显示版本信息。

​ -n: 不反向解析网络名字

进程管理

查看由登陆用户启动而非系统启动的进程

​ lsof /dev/pts1

指定进程号,可以查看该进程打开的文件

​ lsof -p 9527

文件管理

查看指定程序打开的文件

​ lsof -c httpd

查看指定用户打开的文件

​ lsof -u root | more

查看指定目录下被打开的文件

​ lsof +D /var/log/

​ lsof +d /var/log/

​ 参数+D为递归列出目录下被打开的文件,参数+d为列出目录下被打开的文件

网络管理

查看所有网络连接

​ lsof -i –n lsof -i@127.0.0.1

​ 通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如: sshd等。也可以通过指定ip查看该ip的网络连接情况

查看端口连接情况

​ lsof -i :80 -n

​ 通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等

查看指定进程打开的网络连接

​ lsof -i –n -a -p 9527

​ 参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程

查看指定状态的网络连接

​ lsof -n -P -i TCP -s TCP:ESTABLISHED

​ -n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个参数可以 清晰的查看网络连接情况、协议连接情况等

恢复删除文件

​ lsof |grep /var/log/messages

​ rm -f /var/log/messages

​ lsof |grep /var/log/messages

​ cat /proc/653/fd/6

​ cat /proc/653/fd/6 > /var/log/messages

Linux 中进程的查看

进程的相关概念

内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等

Process: 运行中的程序的一个副本,是被载入内存的一个指令集合

​ 进程ID(Process ID,PID)号码被用来标记各个进程UID、GID、和SELinux语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承存在生命周期

task struct:Linux内核存储进程信息的数据结构格式

task list:多个任务的的task struct组成的链表

进程创建:

​ init:第一个进程

​ 进程:都由其父进程创建,父子关系,CoW fork(), clone()

进程的基本状态和转换

创建状态:

​ 进程在创建时需要申请一个空白PCB(process control block进程控 制块),向其中填写控制和管理进程的信息,完成资源分配.如果创建工作无法完 成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

就绪状态:

​ 进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行

执行状态:

​ 进程处于就绪状态被调度后,进程进入执行状态

阻塞状态:

​ 正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时 无法运行,进程受到阻塞.在满足请求时进入就绪状态等待系统调用

终止状态:

​ 进程结束,或出现错误,或被系统终止,进入终止状态.无法再执行

进程之间转换六种情况

运行——>就绪:

​ 1,主要是进程占用CPU的时间过长,而系统分配给该进程占 用CPU的时间是有限的:

​ 2,在采用抢先式优先级调度算法的系统中,当有更高 优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为 就绪状态

就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适 的进程分配CPU

运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执 行状态变为阻塞状态,如发生了I/O请求

阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列

以下两种状态是不可能发生的:

​ 阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调 度时不会从阻塞队列进行挑选,而是从就绪队列中选取

​ 就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态

进程优先级

进程优先级:

​ 系统优先级:数字越小,优先级越高

​ 0-139(CentOS4,5)

​ 各有140个运行队列和过期队列

​ 0-98,99(CentOS6)

​ 实时优先级: 99-0 值最大优先级最高

​ nice值:-20到19,对应系统优先级100-139或99

Big O:时间复杂度,用时和规模的关系

​ O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)

进程相关概念

进程内存:

​ Page Frame: 页框,用存储页面数据,存储Page 4k

​ LRU:Least Recently Used 近期最少使用算法,释放内存物理地址空间和线性地址空间

​ MMU:Memory Management Unit负责转换线性和物理地址

​ TLB:Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存

IPC: Inter Process Communication

​ 同一主机:

​ signal:信号

​ shm: shared memory

​ semaphore:信号量,一种计数器

​ 不同主机:

​ socket: IP和端口号

​ RPC: remote procedure call

​ MQ:消息队列,Kafka,ActiveMQ

进程状态

Linux内核:抢占式多任务

进程类型:

​ 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程

​ 前台进程:跟终端相关,通过终端启动的进程

​ 注意:两者可相互转化

进程状态:

​ 运行态:running

​ 就绪态:ready

​ 睡眠态:

​ 可中断:interruptable

​ 不可中断:uninterruptable

​ 停止态:stopped,暂停于内存,但不会被调度,除非手动启动

​ 僵死态:zombie,结束进程,父进程结束前,子进程不关闭


系统管理工具

进程的分类:

​ CPU-Bound:CPU密集型,非交互

​ IO-Bound:IO密集型,交互

Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup

pstree命令:

​ pstree - display a tree of processes

ps: process state

​ ps - report a snapshot of the current processes

​ Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

查看系统进程 ps

ps [OPTION]…

支持三种选项:

​ UNIX选项 如-A -e

​ BSD选项 如a

​ GNU选项 如–help

• 选项:默认显示当前终端中的进程

• a 选项包括所有终端中的进程

• x 选项包括不链接终端的进程

• u 选项显示进程所有者的信息

• f 选项显示进程树,相当于 –forest

• k|–sort 属性 对属性排序,属性前加- 表示倒序

• o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem

• L 显示支持的属性列表

ps常见选项

-C cmdlist 指定命令,多个命令用,分隔

-L 显示线程

-e: 显示所有进程,相当于-A

-f: 显示完整格式程序信息

-F: 显示更完整格式的进程信息

-H: 以进程层级格式显示进程相关信息

-u userlist 指定有效的用户ID或名称

-U userlist 指定真正的用户ID或名称

-g gid或groupname 指定有效的gid或组名称

-G gid或groupname 指定真正的gid或组名称

-p pid 显示指pid的进程

–ppid pid 显示属于pid的子进程

-M 显示SELinux信息,相当于Z

ps输出属性

VSZ: Virtual memory SiZe,虚拟内存集,线性内存

RSS: ReSident Size, 常驻内存集

STAT:进程状态

​ R:running

​ S: interruptable sleeping

​ D: uninterruptable sleeping

​ T: stopped

​ Z: zombie

​ +: 前台进程

​ l: 多线程进程

​ L:内存分页并带锁

​ N:低优先级进程

​ <: 高优先级进程

​ s: session leader,会话(子进程)发起者

ps 输出及常见示例

ni: nice值

pri: priority 优先级

psr: processor CPU编号

rtprio: 实时优先级

示例:

​ ps axo pid,cmd,psr,ni,pri,rtprio

常用组合:

​ aux

​ -ef

​ -eFH

​ -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm

​ axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps示例

查询你拥有的所有进程:

​ ps -x

显示指定用户名(RUID)或用户ID的进程:

​ ps -fU apache

​ ps -fu 48

显示指定用户名(EUID)或用户ID的进程:

​ ps -fu mark

​ ps -fu 1000

查看以root用户权限(实际和有效ID)运行的每个进程:

​ ps -U root -u root

列出某个组拥有的所有进程(实际组ID,RGID或名称):

​ ps -fG nginx

列出有效组名称(或会话)所拥有的所有进程:

​ ps -fg mysql

​ ps -fG 27

通过进程ID来显示所属的进程:

​ ps -fp 1234

以父进程ID来显示其下所有的进程,如显示父进程为1154的所有进程:

​ ps -f –ppid 1234

显示指定PID的多个进程:

​ ps -fp 1204,1239,1263

要按tty显示所属进程:

​ ps -ft pst/0

以进程树显示系统中的进程如何相互链接:

​ ps -e –forest

以进程树显示指定的进程

​ ps -f –forest -C sshd

​ ps -ef –forest | grep -v grep | grep sshd

要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进 程数)列:

​ ps -fL -C nginx

要列出所有格式说明符:

​ ps L

查看进程的PID,PPID,用户名和命令:

​ ps -eo pid,ppid,user,cmd

自定义格式显示文件系统组,ni值开始时间和进程的时间:

​ ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime

使用其PID查找进程名称:

​ ps -p 1244 -o comm=

要以其名称选择特定进程,显示其所有子进程

​ ps -C sshd,bash

查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时 这个参数很有用:

​ ps -C httpd,sshd -o pid=

检查一个进程的执行时间

​ ps -eo comm,etime,user | grep nginx

查找占用最多内存和CPU的进程:

​ ps -eo pid,ppid,cmd,%mem,%cpu –sort=-%mem | head

​ ps -eo pid,ppid,cmd,%mem,%cpu –sort=-%cpu | head

显示安全信息:

​ ps -eM

​ ps –context

使用以下命令以用户定义的格式显示安全信息.

​ ps -eo euser,ruser,suser,fuser,f,comm,label

使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命 令显示每秒钟的监视:

​ watch -n 1 ‘ps -eo pid,ppid,cmd,%mem,%cpu –sort=-%mem | head’


进程优先级

进程优先级调整:

​ 静态优先级:100-139

​ 进程默认启动时的nice值为0,优先级为120

​ 只有根用户才能降低nice值(提高优先性)

nice命令:

​ nice [OPTION]/[COMMAND /[ARG]…]

renice命令:

​ renice [-n] priority pid…

查看:

​ ps axo pid,comm,ni

搜索进程

最灵活:

​ ps 选项 | 其它命令

按预定义的模式:pgrep

​ pgrep [options] pattern

​ -u uid: effective user,生效者

​ -U uid: real user,真正发起运行命令者

​ -t terminal: 与指定终端相关的进程

​ -l: 显示进程名

​ -a: 显示完整格式的进程名

​ -P pid: 显示指定进程的子进程

按确切的程序名称:/sbin/pidof

​ pidof bash

系统工具

uptime

显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10 分钟的平均负载,一般不会超过1)

系统平均负载:

指在特定时间间隔内运行队列中的平均进程数

通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好.如果每 个CPU内核的任务数大于5,那么此主机的性能有严重问题

如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被 充分使用

LVM

允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小

允许在多个物理设备间重新组织文件系统

​ • 将设备指定为物理卷

​ • 用一个或者多个物理卷来创建一个卷组

​ • 物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的

​ • 在物理卷上创建的逻辑卷 是由物理区域(PE)组成

​ • 可以在逻辑卷上创建文件系统

LVM介绍

LVM: Logical Volume Manager, Version: 2

dm: device mapper:将一个或多个底层块设备组织成一个逻辑设备的模块

设备名:/dev/dm-#

软链接:

​ /dev/mapper/VG_NAME-LV_NAME

​ /dev/mapper/vol0-root

​ /dev/VG_NAME/LV_NAME

​ /dev/vol0/root

pv管理工具

显示pv信息

​ pvs:简要pv信息显示

​ pvdisplay

创建pv

​ pvcreate

​ /dev/DEVICE

vg管理工具

显示卷组

​ vgs

​ vgdisplay

创建卷组

​ vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName

​ PhysicalDevicePath [PhysicalDevicePath…]

管理卷组

​ vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath…]

​ vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath…]

删除卷组

​ 先做pvmove,

​ 再做vgremove

lv管理工具

显示逻辑卷

​ lvs

​ Lvdisplay

创建逻辑卷

​ lvcreate -L #[mMgGtT] -n NAME VolumeGroup

​ lvcreate -l 60%VG -n mylv testvg

​ lvcreate -l 100%FREE -n yourlv testvg

删除逻辑卷

​ lvremove /dev/VG_NAME/LV_NAME

重设文件系统大小

​ fsadm [options] resize device [new_size[BKMGTEP]]

​ resize2fs [-f]/[-F]/[-M]/[-P]/[-p] device [new_size]

扩展和缩减逻辑卷

扩展逻辑卷:

​ lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME

​ resize2fs /dev/VG_NAME/LV_NAME

​ lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME

缩减逻辑卷:

​ umount /dev/VG_NAME/LV_NAME

​ e2fsck -f /dev/VG_NAME/LV_NAME

​ resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]

​ lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME

​ mount

跨主机迁移卷组

源计算机上

​ 1 在旧系统中,umount所有卷组上的逻辑卷

​ 2 vgchange –a n vg0 lvdisplay

​ 3 vgexport vg0

​ pvscan

​ vgdisplay

​ 拆下旧硬盘

在目标计算机上

​ 4 在新系统中安装旧硬盘,并vgimport vg0.

​ 5 vgchange –ay vg0

​ 6 mount所有卷组上的逻辑卷

创建逻辑卷示例

创建物理卷

​ pvcreate /dev/sda3

为卷组分配物理卷

​ vgcreate vg0 /dev/sda3

从卷组创建逻辑卷

​ lvcreate -L 256M -n data vg0

​ mke2fs -j /dev/vg0/data

mount /dev/vg0/data /mnt/data

逻辑卷管理器快照

快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝

对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适 的选择

快照只有在它们和原来的逻辑卷不同时才会消耗空间

​ 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所 改变才会使用这些空间

​ 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中。

​ 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的 数据

​ 建立快照的卷大小只需要原始逻辑卷的15%~20%就够了,也可以使用 lvextend放大快照

逻辑卷管理器快照

快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据 改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件 系统共享

由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同 一个VG中.系统恢复的时候的文件数量不能高于快照区的实际容量

使用LVM快照

为现有逻辑卷创建快照

​ lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data

挂载快照

​ mkdir -p /mnt/snap

​ mount -o ro /dev/vg0/data-snapshot /mnt/snap

恢复快照

​ umount /dev/vg0/data-snapshot

​ umount /dev/vg0/data

​ lvconvert –merge /dev/vg0/data-snapshot

删除快照

​ umount /mnt/databackup

​ lvremove /dev/vg0/databackup

挂载 mount

挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此 目录做为其它文件访问入口的行为

卸载:为解除此关联关系的过程

把设备关联挂载点:mount Point

​ mount

卸载时:可使用设备,也可以使用挂载点

​ umount

挂载点下原有文件在挂载完成后会被临时隐藏

挂载点目录一般为空

用mount命令挂载文件系统

挂载方法:mount DEVICE MOUNT_POINT

mount:通过查看/etc/mtab文件显示当前已挂载的所有设备

mount [-fnrsvw]/[-t vfstype]/[-o options] device dir

​ device:指明要挂载的设备;

​ (1) 设备文件:例如/dev/sda5

​ (2) 卷标:-L ‘LABEL’, 例如 -L ‘MYDATA’

​ (3) UUID, -U ‘UUID’:例如 -U ‘0c50523c-43f1-45e7- 85c0-a126711d406e’

​ (4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs

​ dir:挂载点

​ 事先存在;建议使用空目录

​ 进程正在使用中的设备无法被卸载

mount 常用命令选项

-t vsftype:指定要挂载的设备上的文件系统类型

-r: readonly,只读挂载

-w: read and write, 读写挂载

-n: 不更新/etc/mtab,mount不可见

-a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选 项中有auto功能)

-L ‘LABEL’: 以卷标指定挂载设备

-U ‘UUID’: 以UUID指定要挂载的设备

-B, –bind: 绑定目录到另一个目录上

查看内核追踪到的已挂载的所有设备

​ cat /proc/mounts

-o options:(挂载文件系统的选项),多个选项使用逗号分隔

​ async:异步模式 sync:同步模式,内存更改时,同时写磁盘

​ atime/noatime:包含目录和文件

​ diratime/nodiratime:目录的访问时间戳

​ auto/noauto:是否支持自动挂载,是否支持-a选项

​ exec/noexec:是否支持将文件系统上运行应用程序

​ dev/nodev:是否支持在此文件系统上使用设备文件

​ suid/nosuid:是否支持suid和sgid权限

​ remount:重新挂载

​ ro:只读 rw:读写

​ user/nouser:是否允许普通用户挂载此设备,/etc/fstab使用

​ acl:启用此文件系统上的acl功能

​ loop: 使用loop设备

defaults:相当于rw, suid, dev, exec, auto, nouser, async

卸载命令

查看挂载情况

​ findmnt MOUNT_POINT|device

查看正在访问指定文件系统的进程

​ lsof MOUNT_POINT

​ fuser -v MOUNT_POINT

终止所有在正访问指定的文件系统的进程

​ fuser -km MOUNT_POINT

卸载

​ umount DEVICE

​ umount MOUNT_POINT

挂载点和/etc/fstab

配置文件系统体系

被mount、fsck和其它程序使用

系统重启时保留文件系统体系

可以在设备栏使用文件系统卷标

使用mount -a 命令挂载/etc/fstab中的所有文件系统

文件挂载配置文件

/etc/fstab每行定义一个要挂载的文件系统

1、要挂载的设备或伪文件系统

​ 设备文件

​ LABEL:LABEL=””

​ UUID:UUID=””

​ 伪文件系统名称:proc, sysfs

2、挂载点

3、文件系统类型:ext4,xfs,nfs,none

4、挂载选项:defaults ,acl,bind

5、转储频率:

​ 0:不做备份

​ 1:每天转储

​ 2:每隔一天转储

6、fsck检查的文件系统的顺序:允许的数字是0, 1, 和2

​ 0:不自检

​ 1:首先自检;一般只有rootfs才用

​ 2:非rootfs使用

处理交换文件和分区

交换分区是系统RAM的补充

基本设置包括:

​ • 创建交换分区或者文件

​ • 使用mkswap写入特殊签名

​ • 在/etc/fstab文件中添加适当的条目

​ • 使用swapon -a 激活交换空间

挂载交换分区

启用:swapon

​ swapon [OPTION]… [DEVICE]

​ -a:激活所有的交换分区

​ -p PRIORITY:指定优先级

​ /etc/fstab:pri=value

禁用:swapoff [OPTION]… [DEVICE]

SWAP的优先级

可以指定swap分区0到32767的优先级,值越大优先级越高

如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从 -1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一

先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户 指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)

优化性能:分布存放,高性能磁盘存放

移动介质

挂载意味着使外来的文件系统看起来如同是主目录树的一部分

访问前、介质必须被挂载

摘除时,介质必须被卸载

按照默认设置,非根用户只能挂载某些设备(光盘、DVD、软 盘、USB等等)

挂载点通常在/media 或/mnt下

使用光盘

在图形环境下自动启动挂载/run/media/[lable]/[lable]

否则就必须被手工挂载

​ mount /dev/cdrom /mnt/

eject命令卸载或弹出磁盘

创建ISO文件

​ cp /dev/cdrom /root/centos7.iso

​ mkisofs -r -o /root/etc.iso /etc

刻录光盘

​ wodim –v –eject centos.iso

挂载USB介质

查看USB设备是否识别

​ • lsusb

被内核探测为SCSI设备

​ • /dev/sdaX、/dev/sdbX、或类似的设备文件

在图形环境中自动挂载

​ • 图标在[计算机]窗口中创建

​ • 挂载在/run/media//

手动挂载 • mount /dev/sdb1 /mn

常见工具

文件系统空间占用等信息的查看工具:

​ df [OPTION]… [FILE]…

​ -H 以1000为单位

​ -T 文件系统类型

​ -h: human-readable

​ -i:inodes instead of blocks

​ -P: 以Posix兼容的格式输出

查看某目录总体空间占用状态:

​ du [OPTION]… DIR

​ -h: human-readable

​ -s: summary –max-depth

工具dd

dd命令:convert and copy a file

用法:

​ dd if=/PATH/FROM/SRC of=/PATH/TO/DEST

​ bs=#:block size, 复制单元大小

​ count=#:复制多少个bs

​ of=file 写到所命名的文件而不是到标准输出

​ if=file 从所命名文件读取而不是从标准输入

​ bs=size 指定块大小(既是是ibs也是obs)

​ ibs=size 一次读size个byte

​ obs=size 一次写size个byte

​ cbs=size 一次转化size个byte

​ skip=blocks 从开头忽略blocks个ibs大小的块

​ seek=blocks 从开头忽略blocks个obs大小的块

​ count=n 只拷贝n个记录

conv=conversion[,conversion…] 用指定的参数转换文件

转换参数:

ascii 转换 EBCDIC 为 ASCII

ebcdic 转换 ASCII 为 EBCDIC

lcase 把大写字符转换为小写字符

ucase 把小写字符转换为大写字符

nocreat 不创建输出文件

noerror 出错时不停止

notrunc 不截短输出文件

sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐

备份MBR:

​ dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

破坏MBR中的bootloader:

​ dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读 取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开 始的位置,替换128Bytes,实现如下:

​ dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

备份:

​ dd if=/dev/sdx of=/dev/sdy

​ 将本地的/dev/sdx整盘备份到/dev/sdy

​ dd if=/dev/sdx of=/path/to/image

​ 将/dev/sdx全盘数据备份到指定路径的image文件

​ dd if=/dev/sdx | gzip >/path/to/image.gz

​ 备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径

恢复:

​ dd if=/path/to/image of=/dev/sdx

​ 将备份文件恢复到指定盘

​ gzip -dc /path/to/image.gz | dd of=/dev/sdx

​ 将压缩的备份文件恢复到指定盘

拷贝内存资料到硬盘

​ dd if=/dev/mem of=/root/mem.bin bs=1024

将内存里的数据拷贝到root目录下的mem.bin文件

从光盘拷贝iso镜像

​ dd if=/dev/cdrom of=/root/cd.iso

拷贝光盘数据到root文件夹下,并保存为cd.iso文件

销毁磁盘数据

​ dd if=/dev/urandom of=/dev/sda1

利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作以后, /dev/sda1将无法挂载,创建和拷贝操作无法执行

得到最恰当的block size

​ dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

​ dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file

​ dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file

通过比较dd指令输出中命令的执行时间,即可确定系统最佳的block size大小

测试硬盘写速度

​ dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

测试硬盘读速度

​ dd if=/root/1Gb.file bs=64k | dd of=/dev/null

修复硬盘

​ dd if=/dev/sda of=/dev/sda

当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读 到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一 个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生,且这个 过程是安全高效的

设备文件

I/O Ports: I/O设备地址

一切皆文件:open(), read(), write(), close()

设备类型:

块设备:block,存取单位“块”,磁盘 

字符设备:char,存取单位“字符”,键盘 

设备文件:

关联至一个设备驱动程序,进而能够跟与之对应硬件设备进行通信 

设备号码:

主设备号:major number, 标识设备类型 

次设备号:minor number, 标识同一类型下的不同设备 

磁盘设备的设备文件命名:/dev/DEV_FILE

SCSI, SATA, SAS, IDE,USB: /dev/sd

虚拟磁盘:/dev/vd

不同磁盘标识:a-z,aa,ab…

/dev/sda, /dev/sdb, ... 

同一设备上的不同分区:1,2, …

/dev/sda1, /dev/sda5 

硬盘存储术语

head:磁头 

track:磁道 

cylinder: 柱面 

sector: 扇区,512bytes 

CHS和LBA

CHS

采用24bit位寻址 

其中前10位表示cylinder,中间8位表示head,后面6位表示sector 

最大寻址空间8GB 

LBA(logical block addressing)

​ LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址

LBA采用48个bit位寻址 

最大寻址空间128PB 

由于CHS寻址方式的寻址空间在大概8GB以内,所以在磁盘容量小于大概8GB 时,可以使用CHS寻址方式或是LBA寻址方式;在磁盘容量大于大概8GB时,则 只能使用LBA寻址方式

使用分区空间

设备识别

设备分区

创建文件系统

标记文件系统

在/etc/fstab文件中创建条目

挂载新的文件系统

磁盘分区

分区

两种分区方式:MBR,GPT

MBR: Master Boot Record,1982年,使用32位表示扇区数,分区不超过2T

如何分区:按柱面

0磁道0扇区:512bytes

446bytes: boot loader 

64bytes:分区表 

    16bytes: 标识一个分区 

2bytes: 55AA 

4个主分区;3主分区+1扩展(N个逻辑分区)

MBR分区结构

硬盘主引导记录MBR由4个部分组成

主引导程序(偏移地址0000H–0088H),它负责从活动分区中装载,并运行 系统引导程序

出错信息数据区,偏移地址0089H–00E1H为出错信息,00E2H–01BDH全为 0字节

分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH–01FDH, 每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4

结束标志字,偏移地址01FE–01FF的2个字节值为结束标志55AA

GPT分区

GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区, 使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)

使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表 自动备份在头和尾两份,并有CRC校验位

UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动

管理分区

列出块设备

• lsblk 

创建分区使用:

• fdisk 创建MBR分区 

• gdisk 创建GPT分区 

​ • parted 高级分区操作

partprobe-重新设置内存中的内核分区表版本

parted命令

parted的操作都是实时生效的,小心使用

用法:parted [选项]… [设备 [命令 [参数]…]…]

parted /dev/sdb mklabel gpt|msdos 

parted /dev/sdb print 

parted /dev/sdb mkpart primary 1 200 (默认M) 

parted /dev/sdb rm 1 

parted –l 列出分区信息 

分区工具fdisk和gdisk

gdisk /dev/sdb 类fdisk 的GPT分区工具

fdisk -l [ -u]/[device...] 查看分区 

fdisk /dev/sdb 管理分区 

子命令: 

    p 分区列表 

    t 更改分区类型 

    n 创建新分区 

    d 删除分区 

    v 校验分区 

    u 转换单位 

    w 保存并退出 

    q 不保存并退出 

同步分区表

查看内核是否已经识别新的分区:

cat /proc/partations 

centos6通知内核重新读取硬盘分区表

新增分区用 

partx -a /dev/DEVICE 

kpartx -a /dev/DEVICE -f: force 

删除分区用 

partx -d --nr M-N /dev/DEVICE 

CentOS 5,7: 使用partprobe

​ partprobe [/dev/DEVICE]

同步分区表的时候注意系统的版本,centOS 5,7 是相同的,但是6和以上两个版本都不一样

文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即 在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结 构称为文件管理系统,简称文件系统

从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文 件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立 文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压 缩,加密等

支持的文件系统:

/lib/modules/\`uname –r`/kernel/fs 

各种文件系统:

https://en.wikipedia.org/wiki/Comparison_of_file_systems 

文件系统类型

Linux文件系统:

ext2(Extended file system) :适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区。 

ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中 恢复。它通常被用作通用的文件系统 

ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使 用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升 

xfs:SGI,支持最大8EB的文件系统 

btrfs(Oracle), reiserfs, jfs(AIX), swap 

光盘:iso9660

Windows:FAT32, exFAT,NTFS

Unix: FFS(fast), UFS(unix), JFS2

网络文件系统:NFS, CIFS

集群文件系统:GFS2, OCFS2(oracle)

分布式文件系统: fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre

RAW:未经处理或者未经格式化产生的文件系统

文件系统分类

根据其是否支持”journal”功能:

日志型文件系统: ext3, ext4, xfs, ... 

非日志型文件系统: ext2, vfat 

文件系统的组成部分:

内核中的模块:ext4, xfs, vfat 

用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat 

Linux的虚拟文件系统:VFS

查前支持的文件系统:cat /proc/filesystems

创建文件系统

mkfs命令:

(1) mkfs.FS_TYPE /dev/DEVICE

ext4 

xfs 

btrfs 

vfat 

(2) mkfs -t FS_TYPE /dev/DEVICE

-L 'LABEL': 设定卷标 

创建ext文件系统

mke2fs:ext系列文件系统专用管理工具

-t {ext2|ext3|ext4} 

-b {1024|2048|4096} 

-L 'LABEL' 

-j: 相当于 -t ext3 

    mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3 

-i #: 为数据空间中每多少个字节创建一个inode;此大小不应该小于 block的大小 

-N #:指定分区中创建多少个inode 

-I 一个inode记录占用的磁盘空间大小,128---4096 

-m #: 默认5%,为管理人员预留空间占总空间的百分比 

-O FEATURE[,...]:启用指定特性 

-O ^FEATURE:关闭指定特性 

文件系统标签

指向设备的另一种方法

与设备无关

blkid:块设备属性信息查看

blkid [OPTION]… [DEVICE]

-U UUID: 根据指定的UUID来查找对应的设备 

-L LABEL:根据指定的LABEL来查找对应的设备 

e2label:管理ext系列文件系统的LABEL

e2label DEVICE [LABEL] 

findfs :查找分区

findfs [options] LABEL= /</label/>/

findfs [options] UUID= /</uuid/>/

tune2fs

tune2fs:重新设定ext系列文件系统可调整参数的值

-l:查看指定文件系统超级块信息;super block 

-L 'LABEL':修改卷标 

-m #:修预留给管理员的空间百分比 

-j: 将ext2升级为ext3 

-O: 文件系统属性启用或禁用, –O ^has_journal 

-o: 调整文件系统的默认挂载选项,–o ^acl 

-U UUID: 修改UUID号 

dumpe2fs:

块分组管理,32768块 

-h:查看超级块信息,不显示分组信息 

文件系统检测和修复

常发生于死机或者非正常关机之后

挂载为文件系统标记为“no clean”

注意:一定不要在挂载状态下修复

fsck: File System Check

fsck.FS_TYPE 

fsck -t FS_TYPE 

-p: 自动修复错误 

-r: 交互式修复错误 

FS_TYPE一定要与分区上已经文件类型相同 

e2fsck:ext系列文件专用的检测修复工具

-y:自动回答为yes 

-f:强制修复 

软件运行和编译

ABI:Application Binary Interface

​ Windows与Linux不兼容

​ ELF(Executable and Linkable Format)

​ PE(Portable Executable)

​ 库级别的虚拟化:

​ Linux: WINE

​ Windows: Cygwin

API:Application Programming Interface

​ POSIX:Portable OS

程序源代码 –> 预处理 –> 编译 –> 汇编 –> 链接

​ 静态编译:.a

​ 动态编译:.so

静态和动态链接

链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能 够正确地衔接,分为静态链接和动态链接

静态链接

​ 把程序对应的依赖库复制一份到包

​ libxxx.a

​ 嵌入程序包

​ 升级难,需重新编译

​ 占用较多空间,迁移容易

动态链接

​ 只把依赖加做一个动态链接

​ libxxx.so

​ 连接指向

​ 占用较少空间,升级方便

包管理器

二进制应用程序的组成部分:

​ 二进制文件、库文件、配置文件、帮助文件

程序包管理器:

​ debian:deb文件,dpkg包管理器

​ redhat: rpm文件,rpm包管理器

​ rpm: Redhat Package Manager

​ RPM Package Manager

包命名

源代码:name-VERSION.tar.gz|bz2|xz

​ VERSION: major.minor.release

rpm包命名方式:

​ name-VERSION-release.arch.rpm

​ 例:bash-4.2.46-19.el7.x86_64.rpm

​ VERSION: major.minor.release

​ release:release.OS

​ 常见的arch:

​ x86: i386,i486,i586,i686

​ x86_64: x64,x86_64,amd64

​ powerpc: ppc

​ 跟平台无关:noarch

包命名和工具

包:分类和拆包

​ Application-VERSION-ARCH.rpm: 主包

​ Application-devel-VERSION-ARCH.rpm 开发子包

​ Application-utils-VERSION-ARHC.rpm 其它子包

​ Application-libs-VERSION-ARHC.rpm 其它子包

包之间:可能存在依赖关系,甚至循环依赖

解决依赖包管理工具:

​ yum:rpm包管理器的前端工具

​ apt-get:deb包管理器前端工具

​ zypper: suse上的rpm前端管理工具

​ dnf: Fedora 18+ rpm包管理器前端管理工具

库文件

查看二进制程序所依赖的库文件

​ ldd /PATH/TO/BINARY_FILE

管理及查看本机装载的库文件

​ ldconfig 加载库文件

​ /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径 映射关系

​ 配置文件:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf

​ 缓存文件:/etc/ld.so.cache

包管理器

程序包管理器:

​ 功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而 方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作

包文件组成 (每个包独有)

​ RPM包内的文件

​ RPM的元数据,如名称,版本,依赖性,描述等

​ 安装或卸载时运行的脚本

数据库(公共):/var/lib/rpm

​ 程序包名称及版本

​ 依赖关系

​ 功能说明

​ 包安装后生成的各文件路径及校验码信息

程序包的来源

管理程序包的方式:

​ 使用包管理器:rpm

​ 使用前端工具:yum,dnf

获取程序包的途径:

​ (1) 系统发版的光盘或官方的服务器

​ CentOS镜像:

https://www.centos.org/download/

http://mirrors.aliyun.com

http://mirrors.sohu.com

http://mirrors.163.com

​ (2) 项目官方站点

​ (3) 第三方组织:

​ Fedora-EPEL:

​ Extra Packages for Enterprise Linux

​ Rpmforge:RHEL推荐,包很全

​ 搜索引擎:

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

https://sourceforge.net/

​ (4) 自己制作

​ 注意:第三方包建议要检查其合法性 来源合法性,程序包的完整性

RPM

rpm包管理

CentOS系统上使用rpm命令管理程序包:

​ 安装、卸载、升级、查询、校验、数据库维护

​ 安装:

​ rpm {-i|–install} [install-options] PACKAGE_FILE…

​ -v: verbose

​ -vv:

​ -h: 以#显示程序包管理执行进度

​ rpm -ivh PACKAGE_FILE

rpm包安装

[install-options]

​ –test: 测试安装,但不真正执行安装,即dry run模式

​ –nodeps:忽略依赖关系

​ –replacepkgs | replacefiles

​ –nosignature: 不检查来源合法性

​ –nodigest:不检查包完整性

​ –noscripts:不执行程序包脚本

​ %pre: 安装前脚本 –nopre

​ %post: 安装后脚本 –nopost

​ %preun: 卸载前脚本 –nopreun

​ %postun: 卸载后脚本 –nopostun

rpm包升级

rpm {-U|–upgrade} [install-options] PACKAGE_FILE…

rpm {-F|–freshen} [install-options] PACKAGE_FILE…

​ upgrade:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则“安装”

​ freshen:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则不执行升级操作

​ rpm -Uvh PACKAGE_FILE …

​ rpm -Fvh PACKAGE_FILE …

​ –oldpackage:降级

​ –force: 强制安装

升级注意事项

(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核

(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配 置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名 (FILENAME.rpmnew)后保留

包查询

rpm {-q|–query} [select-options]/[query-options]

[select-options]

​ -a: 所有包

​ -f: 查看指定的文件由哪个程序包安装生成

​ -p rpmfile:针对尚未安装的程序包文件做查询操作

​ –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供

​ –whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖

rpm2cpio 包文件|cpio –itv 预览包内文件

rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件

[query-options]

​ –changelog:查询rpm包的changelog

​ -c: 查询程序的配置文件

​ -d: 查询程序的文档

​ -i: information

​ -l: 查看指定的程序包安装后生成的所有文件

​ –scripts:程序包自带的脚本

​ –provides: 列出指定程序包所提供的CAPABILITY

​ -R: 查询指定的程序包所依赖的CAPABILITY

常用查询用法:

​ -qi PACKAGE,

​ -qf FILE,

​ -qc PACKAGE,

​ -ql PACKAGE,

​ -qd PACKAGE

​ -qpi PACKAGE_FILE,

​ -qpl PACKAGE_FILE,…

​ -qa

包卸载: rpm {-e|–erase} [–allmatches]/[–nodeps]/[–noscripts]/[–notriggers]/[–test] PACKAGE_NAME …

包校验

rpm {-V|–verify} [select-options]/[verify-options]

​ S file Size differs

​ M Mode differs (includes permissions and file type)

​ 5 digest (formerly MD5 sum) differs

​ D Device major/minor number mismatch

​ L readLink(2) path mismatch

​ U User ownership differs

​ G Group ownership differs

​ T mTime differs

​ P capabilities differ

包来源合法性验正及完整性验正

​ 完整性验正:SHA256

​ 来源合法性验正:RSA

公钥加密

​ 对称加密:加密、解密使用同一密钥

​ 非对称加密:密钥是成对儿的

​ public key: 公钥,公开所有人

​ secret key: 私钥,不能公开

导入所需要公钥

​ rpm -K|checksig rpmfile 检查包的完整性和签名

​ rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

​ CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7

​ rpm -qa “gpg-pubkey*”

rpm数据库

数据库重建:

​ /var/lib/rpm

rpm {–initdb|–rebuilddb}

​ initdb: 初始化

​ 如果事先不存在数据库,则新建之

​ 否则,不执行任何操作

​ rebuilddb:重建已安装的包头的数据库索引目录

yum

yum包管理

CentOS: yum,dnf

YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依 赖性,可在多个库之间定位软件包,up2date的替代工具

​ yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)

​ 文件服务器:

​ http://

​ https://

​ ftp://

​ file://

yum配置文件

yum客户端配置文件:

​ /etc/yum.conf:为所有仓库提供公共配置

​ /etc/yum.repos.d/*.repo:为仓库的指向提供配置

​ 仓库指向的定义:

​ [repositoryID]

​ name=Some name for this repository

​ baseurl=url://path/to/repository/ enabled={1|0}

​ gpgcheck={1|0} gpgkey=URL enablegroups={1|0}

​ failovermethod={roundrobin|priority}

​ roundrobin:意为随机挑选,默认值

​ priority:按顺序访问

​ cost= 默认为1000

yum仓库

yum的repo配置文件中可用的变量:

​ $releasever: 当前OS的发行版的主版本号

​ $arch: 平台,i386,i486,i586,x86_64等

​ $basearch:基础平台;i386,x86_64

​ $YUM0-$YUM9:自定义变量

实例:

http://server/centos/$releasever/$basearch/

http://server/centos/7/x86_64

http://server/centos/6/i384

yum源

阿里云repo文件:

http://mirrors.aliyun.com/repo/

CentOS系统的yum源

​ 阿里云:

https://mirrors.aliyun.com/centos/$releasever/os/x86_64/ 清华大学:

https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/

EPEL的yum源:

​ 阿里云:

https://mirrors.aliyun.com/epel/$releasever/x86_64

yum-config-manager

生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo

yum-config-manager –add-repo= http://172.16.0.1/cobbler/ks_mirror/7/

yum-config-manager –disable “仓库名” 禁用仓库

yum-config-manager –enable “仓库名” 启用仓库

yum命令

yum命令的用法:

​ yum [options]/[command]/[package …]

显示仓库列表:

​ yum repolist [all|enabled|disabled]

显示程序包:

​ yum list

​ yum list [all | glob_exp1]/[glob_exp2]/[…]

​ yum list {available|installed|updates} [glob_exp1]/[…]

安装程序包:

​ yum install package1 [package2]/[…]

​ yum reinstall package1 [package2]/[…] (重新安装)

升级程序包:

​ yum update [package1]/[package2] /[…]

​ yum downgrade package1 [package2]/[…] (降级)

检查可用升级:

​ yum check-update

卸载程序包:

​ yum remove | erase package1 [package2]/[…]

查看程序包information:

​ yum info […]

查看指定的特性(可以是某文件)是由哪个程序包所提供:

​ yum provides | whatprovides feature1 [feature2]/[…]

清理本地缓存:

​ 清除/var/cache/yum/$basearch/$releasever缓存

​ yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

构建缓存:

​ yum makecache

搜索:yum search string1 [string2]/[…]

​ 以指定的关键字搜索程序包名及summary信息

查看指定包所依赖的capabilities: yum deplist package1 [package2][…]

查看yum事务历史:

​ yum history [info|list|packages-list|packages-info|

​ summary|addon-info|redo|undo|

​ rollback|new|sync|stats]

​ yum history

​ yum history info 6

​ yum history undo 6

日志 :/var/log/yum.log

安装及升级本地程序包:

​ yum localinstall rpmfile1 [rpmfile2]/[…]

​ (用install替代)

​ yum localupdate rpmfile1 rpmfile2]/[…]

​ (用update替代)

包组管理的相关命令:

​ yum groupinstall group1 [group2]/[…]

​ yum groupupdate group1 [group2]/[…]

​ yum grouplist [hidden]/[groupwildcard]/[…]

​ yum groupremove group1 [group2]/[…]

​ yum groupinfo group1 […]

yum的命令行选项:

​ –nogpgcheck:禁止进行gpg check

​ -y: 自动回答为“yes”

​ -q:静默模式

​ –disablerepo=repoidglob:临时禁用此处指定的repo

​ –enablerepo=repoidglob:临时启用此处指定的repo

​ –noplugins:禁用所有插件

系统光盘的yum仓库

系统安装光盘作为本地yum仓库:

​ (1) 挂载光盘至某目录,例如/mnt/cdrom

​ mount /dev/cdrom /mnt/cdrom

​ (2) 创建配置文件

​ [CentOS7]

​ name=

​ baseurl=

​ gpgcheck=

​ enabled=

创建yum仓库:

​ createrepo [options]

程序包编译

程序包编译安装:

Application-VERSION-release.src.rpm –> 安装后,使用rpmbuild命令制作 成二进制格式的rpm包,而后再安装

源代码–>预处理–>编译–>汇编–>链接–>执行

源代码组织格式:

​ 多文件:文件中的代码之间,很可能存在跨文件依赖关系

​ C、C++:make 项目管理器

​ configure脚本 –> Makefile.in –> Makefile

​ java: maven

编译安装

C语言源代码编译安装三步骤:

​ 1、./configure

​ (1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的 指定以及Makefile.in文件生成Makefile

​ (2) 检查依赖到的外部环境,如依赖的软件包

​ 2、make 根据Makefile文件,构建应用程序

​ 3、make install 复制文件到相应路径

开发工具:

​ autoconf: 生成configure脚本

​ automake:生成Makefile.in

注意:安装前查看INSTALL,README

开源程序源代码的获取:

​ 官方自建站点:

​ apache.org (ASF:Apache Software Foundation)

​ mariadb.org

​ …

​ 代码托管:

​ SourceForge.net

​ Github.com

​ code.google.com

c/c++编译器: gcc (GNU C Complier)

编译C源代码:

​ 准备:提供开发工具及开发环境

​ 开发工具:make,gcc等

​ 开发环境:开发库,头文件

​ glibc:标准库

​ 实现:通过“包组”提供开发组件

​ Development Tools

​ Server Platform Development

第一步:configure脚本

​ 选项:指定安装位置、指定启用的特性

​ –help: 获取其支持使用的选项

​ 选项分类:

​ 安装路径设定:

​ –prefix=/PATH: 指定默认安装位置,默认为/usr/local/

​ –sysconfdir=/PATH:配置文件安装位置

​ System types:支持交叉编译

​ Optional Features: 可选特性

​ –disable-FEATURE

​ –enable-FEATURE[=ARG]

​ Optional Packages: 可选包

​ –with-PACKAGE[=ARG],依赖包

​ –without-PACKAGE,禁用依赖关系

​ 注意:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件,其包名 一般类似于name-devel-VERSION

第二步:make

第三步:make install

安装后的配置:

​ (1) 二进制程序目录导入至PATH环境变量中

​ 编辑文件/etc/profile.d/NAME.sh

​ export PATH=/PATH/TO/BIN:$PATH

​ (2) 导入库文件路径

​ 编辑/etc/ld.so.conf.d/NAME.conf

​ 添加新的库文件所在目录至此文件中

​ 让系统重新生成缓存:

​ ldconfig [-v]

​ (3) 导入头文件

​ 基于链接的方式实现:

​ ln -sv

​ (4) 导入帮助手册

​ 编辑/etc/man.config|man_db.conf文件

​ 添加一个MANPATH