# 5.Linux 系统的日常运维

# 1.RPM 软件包管理

1.1 RPM 软件包介绍
RPM 是 RPM Package Manager(RPM 软件包管理器)的缩写,这一文件格式名称虽然打上了 RedHat 的标志,但是其原始设计理念是开放式的,现在包括 OpenLinux、SuSE 以及 Turbo Linux 等 Linux 的分发版本都有采用,可以算是公认的行业标准了。
RPM 软件包的文件名:
bash-3.0-19.2.i386.rpm
名称 - 版本号 - 运行硬件平台 - 扩展名

RPM 命令可以完成对软件包的所有管理功能:
查询已安装在 Linux 系统中的 RPM 软件包的信息
查询 RPM 软件包安装文件的信息
安装 RPM 软件包到当前 Linux 系统
从当前 Linux 系统中卸载已安装的 RPM 软件包
升级当前 Linux 系统中已安装的 RPM 软件包

1.2 RPM 软件包查询

命令功能
rpm -qa查询 Linux 系统中的所有软件包
rpm -q 包名称查询指定名称的软件包是否安装
rpm -qi 包名称查询指定名称软件包的详细信息
rpm -ql 包名称查询指定名称软件包中所包括的文件列表
rpm -qf 文件名称查询指定文件所属的软件包
rpm -qpi 包文件名查询指定 RPM 包文件的详细信息
rpm -qpl 包文件名查询指定 RPM 包中包含的文件列表

挂载:
在 Linux 操作系统中,安装光盘中存在许多软件包,但是如何查看光盘中的内容呢? Linux 中有一个特殊的行为叫做挂载,挂载是指将一个设备 (通常是存储设备) 挂接到一个已存在的目录上。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。
挂载光盘使用 mount 命令:
mount -t 光盘内容类型 设备文件路径 挂载点路径
# mount -t iso9660 /dev/cdrom /media
注意:挂载完成后可以使用 mount 命令查看挂载情况
umount /dev/cdrom 或者 umount 挂载点路径 可以卸载光盘

查询系统中已安装的软件包信息:
查询 vim 软件包有没有安装 $ rpm –qa|grep vim
查询所有安装的软件包中以 htt 开头的软件包: $ rpm –qa|grep ‘^htt’

1.3 RPM 软件包安装
rpm 命令配合 “-i” 选项用于安装 RPM 软件包
rpm -i bind-9.8.2-0.17.rc1.el6_4.6.i686.rpm
命令名 |-i 选项表示安装软件包 | 要安装的软件包文件名作为命令参数
rpm 命令配合 “-ivh” 在安装 RPM 软件包时会显示更多的提示信息:
-i (install)安装
- v (verbose)显示详细信息
- h (hash) 显示进度

依赖:
RPM 软件包在进行安装的时候容易出问题,主要是包与包之间有依赖关系。依赖包的产生,是因为 linux 软件采用共享资源库的方式,可以减少软件编程的开发量,类似于 windows 下的各种库,高手可自行使用相关命令或方式查看软件包依赖。

1.4 RPM 软件包卸载与升级
rpm 命令配合 “-e” 选项用于卸载 RPM 软件包
rpm -e bind-chroot
命令名 |-e 选项表示卸载软件包 | 要卸载的软件包名称作为命令参数
rpm 软件包的卸载同样存在依赖关系,被依赖的软件包应该最后被卸载

rpm 命令配合 “-U” 选项用于升级 RPM 软件包
rpm -U vim-enhanced-7.4.160-2.el7.i386.rpm
命令名 |-U 选项表示升级软件包 | 升级的软件包文件名称作为命令参数
当系统中未安装需要升级的软件包时,升级的过程等同于安装软件包的过程.

# 2.YUM 软件仓库

2.1 YUM 软件仓库介绍
Yum 是一个 shell 前端软件包管理器,基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包。要成功的使用 YUM 工具安装更新软件或系统,就需要有一个包含各种 rpm 软件包的 repository(软件仓库),这个软件仓库我们习惯称为 yum 源。
网络上有大量的 yum 源,但由于受到网络环境的限制,导致软件安装耗时过长甚至失败。因此我们在优化系统时,都会更换国内的源。本地 YUM 源服务器最大优点是局域网的快速网络连接和稳定性。有了局域网中的 YUM 源服务器,即便在 Internet 连接中断的情况下,也不会影响其他 YUM 客户端的软件安装和升级

2.2 配置 YUM 软件仓库
配置本地 YUM 软件仓库,主要通过光盘镜像中的软件包作为本地的源,主要步骤有:
步骤一:挂载光盘镜像
步骤二:配置本地 YUM 软件仓库
步骤三:测试 YUM 软件仓库

步骤一:挂载光盘镜像
挂载光盘使用 mount 命令
mount -t 光盘内容类型 设备文件路径 挂载点路径
# mount -t iso9660 /dev/cdrom /media

步骤二:配置本地 YUM 软件仓库
在 /etc/yum.repos.d/ 目录中存放的是 yum 的配置文件,可以在此目录下使用 vi 创建一个配置文件设置本地 YUM 软件仓库。
仓库配置文件:/etc/yum.repos.d/name.repo
[name]:仓库 id name :仓库名字
baseurl:为仓库的地址,本地文件 file://,ftp 文件地址 ftp://
gpgcheck:是否使用密钥验证
enable:是否开启当前仓库
gpgkey:公钥地址,若是需要检查完整性的话可以添加密钥地址

步骤三:测试 YUM 软件仓库
yum repolist : 显示软件仓库列表
yum list : 显示软件包列表

2.3 YUM 软件仓库的使用
Yum 软件仓库的使用主要依靠 yum 相关命令,使用 yum 命令可以进行软件包的安装和管理。
安装:yum install package1 package2...
重新安装:yum reinstall package
卸载:yum remove package
更新:yum update package
已安装的软件包:yum list installed
查看软件包信息:yum info 软件包名称
例子:
安装 zip 软件包: yum –y install zip (-y 可以自动回答 yes)
卸载 zip 软件包: Yum remove zip
在已安装的软件包中查找 vim 相关软件包: Yum list installed |grep “vim”

# 3. 服务和运行目标管理

3.1 Linux 的启动过程
Linux 操作系统的开机过程是这样的,即从 BIOS 开始,然后进入 Boot Loader,再加载系统内核,然后内核进行初始化,最后启动初始化进程。初始化进程作为 Linux 系统的第一个进程,它需要完成 Linux 系统中相关的初始化工作,为用户提供合适的工作环境。Centos 7 系统已经替换掉了熟悉的初始化进程服务 System V init,正式采用全新的 systemd 初始化进程服务。
Systemd 是一个系统管理守护进程、工具和库的集合,用于取代 System V 初始进程。 Systemd 的功能是用于集中管理和配置类 UNIX 系统。

1.uefi 或 BIOS 初始化,开始 post 开机自检
2. 加载 mbr 到内存
3.GRUB 阶段
4. 加载内核和 inintamfs 模块
5. 内核开始初始化,使用 systemd 来代替 centos6 以前的 init 程序
(1) 执行 initrd.target
(2) 从 initramfs 根文件系统切换到磁盘根目录
(3) systemd 执行默认 target 配置
(4) systemd 执行 sysinit.target
(5) systemd 启动 multi-user.target 下的本机与服务器服务
(6) systemd 执行 multi-user.target 下的 /etc/rc.d/rc.local
6.Systemd 执行 multi-user.target 下的 getty.target 及登录服务
7.systemd 执行 graphical 需要的服务

通过 pstree 命令可以查看进程树,能够看到现在的 centos 7 版本的 Linux 是由 systemd 进行启动管理的。

3.2 Linux 的运行目标
Linux 功能强大,为了适应不同用户对服务的启动配置要求,早期版本的 Linux 提供了运行级别,centos 7 版本加入了 systemd 进行启动的管理,systemd 用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其它服务,来创建自己的目标。

Sysvinit 运行级别Systemd 目标备注
0poweroff.target关闭系统
1rescue.target单用户模式
2multi-user.target用户定义 / 域特定运行级别。默认等同于 3
3multi-user.target多用户,非图形化。用户可以通过多个控制台或网络登录
4multi-user.target用户定义 / 域特定运行级别。默认等同于 3
5graphical.target多用户,图形化。通常为所有运行级别 3 的服务外加图形化登录
6reboot.targe重启

在 centOS7 上如何查看运行的目标呢,使用命令 systemctl get-default 可以查看。
Systemctl 是一个 systemd 工具,主要负责控制 systemd 系统和服务管理器。
runlevel 也可以用来查看当前的运行级别。

3.3 修改 Linux 的运行目标
针对 Linux 的运行的目标,我们可以进行设置,设置时候用到了 systemctl 命令。
临时修改运行级别:从 multi-user.target(即字符界面)改为 graphical.target (即图形界面)
systemctl isolate runlevel5.target
修改默认的运行级别:systemd 使用链接来指向默认的运行级别。在创建新的链接前,你可以通过下面命令删除存在的链接,然后创建一个新的链接。
rm /etc/systemd/system/default.target
切换到运行级 3 : ln -sf /lib/systemd/system/multi-user.target etc/systemd/system/default.target

3.4 Linux 的服务
** 服务:是指执行指定系统功能的程序、例程或进程,** 以便支持其他程序,尤其是底层 (接近硬件) 程序。例如:打印服务,ftp 服务,http 服务。
服务就是一个程序(正在执行的程序),是一个用来等待并处理请求的程序。
所有被激活的服务可以用下面这条命令来查看。
systemctl list-units -t service
查看所有启动文件: systemctl list-unit-files

3.5 管理 Linux 服务
Linux 服务的管理包括控制服务的启动、查询、停止。以 httpd.service (web 服务) 为例,说明服务的管理方法。

任务指令
使某服务开机自动启动systemctl enable httpd.service
使某服务开机不自动启动systemctl disable httpd.service
检查服务状态systemctl status httpd.service
启动某服务systemctl start httpd.service
停止某服务systemctl stop httpd.service
重启某服务systemctl restart httpd.service

# 4.Linux 进程管理

4.1 什么是进程
进程:开始执行但是还没有结束的程序的实例
程序:包含可执行代码的文件
进程与程序的关系:
进程由程序产生,是一个运行着的、要占系统资源的程序
进程不等于程序
进程与程序是多对一
进程是占用(消耗)系统资源的

4.2 查看进程
显示进程信息:ps 命令显示某时刻系统进程的状态信息
显示进程状态:top 命令以全屏幕的方式显示系统中的进程状态,并定时刷新显示的内容,可以通过 top 命令查看系统中进程的动态变化.
显示系统进程树:pstree 命令以树的形式显示系统进程间的父子关系

ps 命令:显示某时刻系统进程的状态信息
常用选项:
a 显示现行终端机下的所有进程,包括其他用户的进程。
u  以用户为主的格式来显示进程状况。
x  显示所有进程,不以终端机来区分。

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 进程拥有者
PID: pid
% CPU: 占用的 cpu 使用率
VSZ: 占用的内存使用率
RSS: 占用的虚拟内存大小
TTY: 是否为登入者执行的程序
STAT: 程序的状态:
R: 正在执行中,S:睡眠,T:正在检测或者停止,Z:死亡程序,< 高优先级,N 低优先级,L 有些页被锁进内存,s 包含子进程,+ 位于后台的进程组;l 多线程,克隆线程
START: 程序开始时间
TIME: 程序运行的时间
COMMAND:所执行的指令。

top 命令:动态显示进程状态
top 命令以全屏幕的方式显示系统中的进程状态,并定时刷新显示的内容
第一行:显示系统已启动的时间、目前上线人数、系统整体的负载 (load)。比较需要注意的是系统的负载,三个数据分别代表 1,5,10 分钟的平均负载。一般来说,这个负载值应该不太可能超过 1 才对,除非您的系统很忙碌。如果持续高于 5 的话,那么..... 仔细的看看到底是那个程序在影响整体系统吧!
第二行:显示的是目前的观察程序数量,
第三行:显示的是 CPU 的整体负载,每个项目可使用?查阅。需要观察的是 id (idle) 的数值,一般来说,他应该要接近 100% 才好,表示系统很少资源被使用啊!
第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。
第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。

PID USER PR NI VIRT RES SHR S %CPU SHR S %CPU %MEN TIME+ COMMAND
PID :每个 process 的 ID 啦!
USER:该 process 所属的使用者;
PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;
NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
% CPU:CPU 的使用率;
% MEM:内存的使用率;
TIME+:CPU 使用时间的累加;
SHR: 共享内存大小,单位 kb
RES:进程使用的、未被换出的物理内存大小,单位 kb

pstree 命令:显示系统进程树
pstree 命令以树的形式显示系统进程间的父子关系
需要安装 psmisc 软件包

4.3 进程的启动方式
手工启动:
由用户输入命令,直接执行一个程序
前台启动是普通的命令执行方式
后台启动需要在命令尾加入 “&”
# cp /dev/cdrom mycd.iso &
调度启动
使用 at 命令设置某个命令在某个时间,一次性的在系统中执行
crontab 命令设置在系统中需要周期性(如每天、每周等)完成的任务

4.4 进程的控制
把当前终端中运行的进程调入后台:使用 “Ctrl+z” 组合键可以将当前终端的进程调入后台并停止执行
查看后台的进程:
jobs 命令用于查看当前终端中后台的所有进程的状态
$ jobs
[1]+ Stopped top
将后台的进程恢复到前台运行:
fg 命令用于将后台的进程调入终端前台执行
$ fg 1

kill 命令:终止正在执行的命令
使用 “Ctrl + c” 组合键可以强制结束当前终端中运行的命令
使用 kill 命令终止进程
$ kill -9 2501
命令名 |-9 命令选项表示强制终止进程 | 命令参数,需要终止运行的进程的进
程号(可通过 ps 命令查询到)

# 5.Linux 计划任务管理

5.1 cron 服务介绍
cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对周期性任务执行的守护进程。
利用 cron 所提供的功能,可以将需要周期性重复执行的任务设置为 cron 任务,并且设置为在主机较空闲的时间(如夜间)自动完成。

5.2 管理 cron 服务
查询 crond 服务状态: # systemctl status crond.service
停止 crond 服务 # systemctl stop crond.service
启动 crond 服务 # systemctl start crond.service
重新启动 crond 服务 # systemctl restart crond.service
查看 crond 服务的开机启动状态 # systemctl list-units -t service |grep “crond”

5.3 配置 cron 服务
cron 服务的配置主要使用 crontab 命令。cron 服务在配置的时候是基于当前用户的,不同的用户 cron 任务的存储文件也不同。
查看用户的 cron 任务: # crontab -l
调用文本编辑器对 cron 任务进行编辑: # crontab -e
编辑用户的 cron 任务: # crontab -u user名称 - e
删除用户现有的 cron 任务: # crontab -r

50 3 2 1 * run_yearly_cmd
minute|hour|day|month|dayofweek|command

字段说明
minute分钟,取值为从 0 到 59 之间的任意整数
hour小时,取值为从 0 到 23 之间的任意整数
day日期,取值为从 1 到 31 之间的任意整数
month月份,取值为从 1 到 12 之间的任意整数
dayofweek星期,取值为从 0 到 7 之间的任意整数,0 或 7 代表星期日
command要执行的命令或程序脚本

时间的设置上还有一些特殊的符号能够起到灵活的效果
* 代表所有的取值范围内的数字
/ 代表每的意思, */5 表示每 5 个单位
- 代表从某个数字到某个数字
, 分开几个离散的数字

举例:
每两个小时输出 “have a break now” 到 test.txt 文本中
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上 11 点,早上八点 输出 “have a good dream :)” 到命令行终端上
0 23,8 * * * echo "Have a good dream:)" >> /dev/tty1
每个月的 4 号和每个礼拜的礼拜一到礼拜三的早上 11 点执行某段命令
0 11 4 * 1-3 command line

保存 cron 任务的文件
所有用户的 cron 任务(使用 crontab 命令创建的任务)都被保存在目录 “/var/spool/cron/” 中的文件中,文件的名称与用户名相同。
例如 root 用户的 cron 任务列表文件的名称是 “/var/spool/cron/root

5.4 cron 服务的配置文件和目录

系统任务配置文件
“/etc/crontab” 文件中设置的是 Linux 系统维护所需的任务,一般不需要人为去修改任务脚本目录
在 “/etc” 目录中有名为 cron.hourly 、cron.daily 、cron.weekly 和 cron.monthly 的目录,目录中存放的是需要定期执行的系统任务脚本
例如,“/etc/cron.daily/” 目录中存放的是每日执行一次的系统任务脚本

-->