; linux程序包管理 | Linux运维部落

linux程序包管理

对第五周学习的内容进行总结

简述rpm与yum命令的常见选项,并举例

rpm命令

rpm命令用来手动安装rpm格式的程序包,使用格式为

  • rpm [option] path/to/rpmfile
  1. -i安装选项
  • 使用格式rpm -i[installopition] path/to/rpmfile
  • -h选项 : 使用#来显示安装进度
  • -v选项 : 显示安装过程
  • -vv选项 : 显示更详细的安装过程比-v更详细,按需求使用
  • –test选项 : 不进行实际安装操作,而是进行安装环境的测试,可以查看安装是否可以成功
  • –nodeps选项 : 忽略依赖关系,这样即使安装成功,也可能由于依赖关系造成运行问题
  • –replacepkgs选项 : 覆盖安装
  • –force选项 : 强制安装
  • 对于新安装程序包,常用的操作是rpm -ivh path/to/rpmfile
  1. 升级选项
  • -U : 升级安装或全新安装
  • -F : 升级安装
  • 同安装选项一样,常用组合有-Uvh -Fvh
  • 同安装选项一样,也可以使用–test –nodeps选项
  • –oldpackage选项 : 降级安装旧版本程序包 rpm -U –oldpackage path/to/rpmfile
  1. 卸载
  • -e : 卸载已安装的rpm程序,使用 rpm -e packagename
  • 使用-e进行卸载时也可以使用–test –nodeps选项
  • –allmatches选项 : 卸载所有匹配的安装,例如一个rpm程序的多个版本
  • 对于卸载,需要注意的是如果程序包的配置文件在安装后被修改过,则卸载时并不会删除这些文件,而是将它们重命名(加后缀 .rpmsave)
  1. 查询
  • 使用格式rpm -q[queryoption] [packagename] [file]
  • 直接使用rpm -q packagename… : 查询某程序包是否安装,包名可以是多个
  • -i选项 : info显示程序包简要信息 rpm -qi packagename
  • -a选项 : 显示已安装的程序包列表 rpm -qa
  • -f选项 : 后跟一个文件,查询此文件是由哪个程序包生成的 rpm -qf filename
  • -p选项 : 查询某个未安装的程序包,可与i选项连用 rpm -qpi packagename 查询rpm仓库中指定的未安装程序包的简要信息
  • -l选项 : 显示某个程序包生成的文件列表 rpm -ql packagename
  • -c选项 : 显示某程序包生成的配置文件 rpm -qc packagename
  • -d选项 : 显示某程序包生成的帮助文件 rpm -qd packagename
  • –provides选项 : 显示程序包提供的capabilities
  • –requires选项 : 显示程序包所依赖的capabilities
  • –scripts选项 : 查询程序包安装或卸载时执行的脚本,这些脚本可以分为以下4类:
    • preinstall : 程序包安装之前执行的脚本
    • postinstall : 程序包安装完成之后执行的脚本
    • preuninstall : 程序包卸载之前执行的脚本
    • postuninstall : 程序包卸载之后执行的脚本
  1. 校验
  • rpm -V packagename : 验证程序包安装之后生成的文件是否发生了改变
  • 程序包合法性验证
    • 先导入验证密匙文件 rpm –import path/to/key-file
    • 再使用命令验证程序包 rpm -K path/to/packagefile
  1. 创建rpm包管理数据库,创建的数据库文件保存路径为/var/lib/rpm下
  • –initdb : 初始化数据库,当rpm包管理数据库不存在时新建它
  • –rebuilddb : 重建数据库,无论之前数据库是否存在
  • –dbpath DIRECTORY : 可以指明建立的数据库文件保存路径,即改变默认的/var/lib/rpm,例如 rpm –rebuilddb –dbpath /var/rpmdb

yum命令

yum命令可以更智能的管理和安装rpm程序包,它可以自动处理程序包之前的依赖关系,使用起来更加方便。

  1. yum的配置文件
  • 全局配置文件/etc/yum.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[main]
cachedir=/<span class="hljs-keyword">var</span>/cache/yum/$basearch/$releasever
  <span class="hljs-comment">// yum 缓存的目录,yum 在此存储下载的rpm 包和数据库,定义配置文件中出现的$basearch表示系统的平台(如i386,</span>
  x86_64这种),$releasever表示OS发行版的主版本号(例如CentOS7<span class="hljs-number">.4</span>的主版本号就是<span class="hljs-number">7</span>)
keepcache=<span class="hljs-number">0</span>
  <span class="hljs-comment">// 安装完成后是否保留软件包,0为不保留(默认为0),1为保留</span>
debuglevel=<span class="hljs-number">2</span>
  <span class="hljs-comment">// Debug 信息输出等级,范围为0-10,默认为2</span>
logfile=/<span class="hljs-keyword">var</span>/log/yum.log
  <span class="hljs-comment">// yum 生成的日志所在</span>
pkgpolicy=newest
 <span class="hljs-comment">// 包的策略。一共有两个选项,newest和last,这个作用是如果你设置了多个repository,而同一软件在不同的</span>
 repository 中同时存在,yum 应该安装哪一个,如果是newest,则yum会安装最新版本。如果是last,则yum 会将服务器
 id 以默认方式排序,并选择最后的那个服务器上的软件安装。一般都是选newest
tolerant=<span class="hljs-number">0</span>
 <span class="hljs-comment">// 有1和0两个选项,表示yum 是否容忍命令行发生与软件包有关的错误,比如你要安装1,2,3三个包,而其中3此前已经</span>
 安装了,如果你设为<span class="hljs-number">1</span>,则yum 不会出现错误信息。默认是<span class="hljs-number">0</span>
exactarch=<span class="hljs-number">1</span>
  <span class="hljs-comment">// 有1和0两个选项,设置为1,则yum 只会安装和系统平台匹配的软件包,例如,yum 不会将x64的软件包安装在适合i386的系统中。默认为1</span>
retries=<span class="hljs-number">6</span>
 <span class="hljs-comment">// 网络连接发生错误后的重试次数,如果设为0,则会无限重试。默认值为6</span>
obsoletes=<span class="hljs-number">1</span>
  <span class="hljs-comment">// 这是一个update 的参数,具体可参阅yum(8),简单的说就是相当于upgrade,允许更新旧的RPM包</span>
gpgcheck=<span class="hljs-number">1</span>
  <span class="hljs-comment">// 是否检查gpgkey,1为检查,0为不检查</span>
plugins=<span class="hljs-number">1</span>
  <span class="hljs-comment">// 是否启用插件,默认1为允许,0表示不允许</span>
installonly_limit=<span class="hljs-number">5</span>
  <span class="hljs-comment">// 允许同时安装的程序包个数,这里设置为5个</span>
exclude=selinux*
  <span class="hljs-comment">// 排除某些软件在升级名单之外,不让它们升级,可以用通配符,列表中各个项目要用空格隔开</span>
bugtracker_url=http:<span class="hljs-comment">//bugs.centos.org/set_project.php?project_id=23&amp;ref=http://bugs.centos.org/bug_report_page.php?category=yum</span>
distroverpkg=centos-release
  • 各repository的配置文件
    文件为/etc/yum.d/*.repo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[base]
  <span class="hljs-comment">// []中表示此repository的ID,必须唯一不能重复</span>
name=
  <span class="hljs-comment">// repository的名字</span>
baseurl=
  <span class="hljs-comment">// repository的路径,支持ftp:// http:// file://</span>
gpgcheck=<span class="hljs-number">1</span>
  <span class="hljs-comment">// 是否进行gpgkey的检查,1为检查,0为不检查</span>
gpgkey=file:<span class="hljs-comment">///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span>
  <span class="hljs-comment">// gpgkey的路径</span>
enabled=
  <span class="hljs-comment">// 是否启用此repository,1为启用,0为不启用。可省略,省略时表示启用</span>
cost=
  <span class="hljs-comment">// 指明repository的开销,默认为1000,可省略</span>
  1. yum命令的使用
  • yum install package1 [package2]… 从仓库源安装安装程序包
    根据配置文件的默认设置,如果某程序包存在多个版本,可能会默认安装最新的版本,如果需要安装指定版本需要指明package的版本
  • -y选项 安装卸载时可以使用该选项,例如yum install -y packagename 安装时就不需要在交互时手动回答yes了
  • –disablerepo= 安装时禁用某repository
  • –enablerepo= 安装时启用某repository
  • –nogpgcheck 安装时禁止gpgkey校验
  • yum reinstall package1 [package2]… 重新安装程序包(可以覆盖安装)
  • yum update package1 [package2]… 升级安装程序包
  • yum downgrade package1 [package2]… 降级安装程序包
  • yum check-update 检查有哪些升级程序包可用
  • yum {remove | erase} package1 [package2]… 卸载程序包,卸载时会将依赖于指定要卸载的程序包的相关程序包也卸载
  • yum localinstall /path/to/rpmfile … 安装本地的程序包文件,安装时也会智能判断依赖关系
  • yum localupdate /path/to/rpmfile … 升级安装本地的程序包文件
  • yum list [all|available|installed|updates|extras|obsoletes] [glob_exp1]… 查看yum仓库列表,按需求使用选项和glob表达式
  • yum grouplist [hidden] [groupwildcard] 显示包组列表,按需使用选项(如是否显示隐藏和使用组通配符等)
  • yum provides|whatprovides feature1 [feature2]… 查看指定的特性(可以是个文件)是由哪个程序包提供的
  • yum deplist package1 [package2]… 查看指定程序包依赖的capabilities
  • yum info package1 … 显示包简要信息
  • yum groupinfo group1 … 显示包组的简要信息
  • yum groupinstall group1 … 安装包组
  • yum groupupdate group1 … 升级安装包组
  • yum groupremove group1 … 卸载包组
  • yum repolist [all|enabled|disabled] 显示yum仓库列表
  • yum clean [all|packages|metadata|expire-cache|rpmdb|plugins] 清楚yum缓存数据
  • yum makecache 手动创建yum缓存

CentOS下自建yum仓库,分别为网络源和本地源

通过vim命令创建repo文件
网络yum源


1
2
3
4
5
~]<span class="hljs-comment"># vim /etc/yum.repos.d/networks.repo</span>
[networks]
name=networks
baseurl=<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/mirrors.aliyun.com/centos</span><span class="hljs-regexp">/$releasever/os</span><span class="hljs-regexp">/$basearch/</span>
gpgcheck=<span class="hljs-number">0</span>

本地yum源


1
2
3
4
5
6
7
8
9
先将CentOS7光盘挂载至/media/cdrom路径下
~]<span class="hljs-comment"># ls /media/cdrom/</span>
CentOS_BuildTag  EFI  EULA  GPL  images  isolinux  LiveOS  Packages  repodata  RPM-GPG-KEY-CentOS-7  RPM-GPG-KEY-CentOS-Testing-7  TRANS.TBL
创建本地repo文件
~]<span class="hljs-comment"># vim /etc/yum.repos.d/local.repo</span>
[<span class="hljs-built_in">local</span>]
name=<span class="hljs-built_in">local</span>
baseurl=file:///media/cdrom
gpgcheck=0

查看所有yum源验证效果,可以看到上面添加的2个yum源已经成功


1
2
3
4
5
6
7
~]<span class="hljs-comment"># yum repolist</span>
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id                                                                                        repo name                                                                             status
epel/7/x86_64                                                                                  Epel                                                                                  12,184
<span class="hljs-built_in">local</span>                                                                                          <span class="hljs-built_in">local</span>                                                                                  9,591
networks/7/x86_64                                                                              networks                                                                               9,591

简述at和crontab命令

at命令

at命令用于设置一次性的任务计划,其只执行一次就结束。

at命令是由atd服务提供的:

  • CentOS6可以使用 service atd start 来启动该服务
  • CentOS7可以使用 systemctl start atd.service 来启动该服务
  1. 命令使用格式 : at [option] TIME

1
2
3
4
5
例如添加一个at任务
~]$ at <span class="hljs-number">15</span><span class="hljs-symbol">:</span><span class="hljs-number">00</span>    <span class="hljs-comment"># 15点执行该任务</span>
at&gt; ls /etc     <span class="hljs-comment"># 输入需要执行的任务内容</span>
at&gt; &lt;EOT&gt;       <span class="hljs-comment"># 使用'键盘ctrl+D'退出任务编辑</span>
job <span class="hljs-number">4</span> at Sun Dec <span class="hljs-number">31</span> <span class="hljs-number">15</span><span class="hljs-symbol">:</span><span class="hljs-number">00</span><span class="hljs-symbol">:</span><span class="hljs-number">00</span> <span class="hljs-number">2017</span>
  • -l选项 : 也可以使用atq,效果等同,都是显示所有当前用户的at任务列表
  • -d选项 : 也可以使用atrm,效果等同,都是删除一个at任务列表中的at任务
  • -c选项 : 打印任务内容到标准输出
  1. TIME的格式
  • HH:MM [date] : 其中的date可以是具体年月日(例如2017-12-31),也可以是英文表示的日子(例如December 31),甚至时间上也可以简化表示(明天下午2点:2pm tomorrow)
  • HH:MM + #(minutes|hours|days|weeks) : 某时刻加一个相对时间表示法(例如2pm + 3days三天后的下午2点)
  1. 实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
~]$ atq    <span class="hljs-comment"># 显示当前任务列表</span>
4   Sun Dec 31 15:00:00 2017 a sky
5   Sun Dec 31 14:00:00 2017 a sky
6   Mon Jan  1 07:00:00 2018 a sky
~]$ at -d 6   <span class="hljs-comment"># 删除6号任务</span>
~]$ atq
4   Sun Dec 31 15:00:00 2017 a sky
5   Sun Dec 31 14:00:00 2017 a sky
~]$ at -c 4
<span class="hljs-meta">#!/bin/sh</span>
<span class="hljs-comment"># atrun uid=1000 gid=1000</span>
<span class="hljs-comment"># mail sky 0</span>
<span class="hljs-built_in">umask</span> 2
<span class="hljs-comment"># 此处省略冗长的环境变量内容</span>
ls /etc  <span class="hljs-comment"># 任务内容</span>
~]$ at -f scripts/num_sum.sh 2pm + 3 days   <span class="hljs-comment"># 3天后的下午2点执行脚本文件中的内容</span>
job 7 at Wed Jan  3 14:00:00 2018

crontab命令

crontab可以设置周期性任务计划。它是由crond服务来实现的。

  1. 系统cron任务
  • 它是通过编辑配置文件/etc/crontab来实现的

1
2
3
4
5
6
7
8
9
10
11
文件中添加任务的格式
<span class="hljs-comment"># For details see man 4 crontabs</span>

<span class="hljs-comment"># Example of job definition:</span>
<span class="hljs-comment"># .---------------- minute (0 - 59)</span>
<span class="hljs-comment"># |  .------------- hour (0 - 23)</span>
<span class="hljs-comment"># |  |  .---------- day of month (1 - 31)</span>
<span class="hljs-comment"># |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...</span>
<span class="hljs-comment"># |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat</span>
<span class="hljs-comment"># |  |  |  |  |</span>
<span class="hljs-comment"># *  *  *  *  * user-name  command to be executed</span>
  • 时间表示的4个方式
    • 时间位上的*表示每个有效的取值

1
25 * * * *      <span class="hljs-comment"># 这就表示每个整点过25分执行一次任务</span>
    • 时间位上出现*/# 表示相应的位上每#个间隔一次

1
0 8 * */3 *     <span class="hljs-comment"># 表示每间隔3天的8:00执行一次</span>
    • 时间位上#-# 表示连续时间

1
30 1<span class="hljs-selector-tag">-3</span> * * *     # 表示每天1<span class="hljs-selector-pseudo">:30</span>, 2<span class="hljs-selector-pseudo">:30</span>, 3<span class="hljs-selector-pseudo">:30</span>分别执行
    • 时间位上#,# 表示离散的时间点

1
15 9 * * 3,5     <span class="hljs-comment"># 表示周3和周5的9:15执行</span>
  • command执行的结果,默认会以邮件的形式发送给用户,如果不想接收邮件,可以使用输出重定向command &> /dev/null
  1. 用户cron任务
  • 用户的cron任务配置文件: /var/spool/cron/路径下与用户同名的文件
  • 使用crontab命令来编辑用户cron任务
    • crontab -e : 直接进入编辑文件
    • crontab -l : 列出已经定义的所有任务
    • crontab -r : 清空列表中的所有任务

1
2
3
4
5
制定 每周三凌晨三、五点<span class="hljs-number">10</span>分执行某个脚本,输出当前时间,时间格式为 <span class="hljs-number">2017</span>-<span class="hljs-number">12</span>-<span class="hljs-number">28</span> <span class="hljs-number">10</span><span class="hljs-symbol">:</span><span class="hljs-number">00</span><span class="hljs-symbol">:</span><span class="hljs-number">00</span>
~]$ crontab -e
<span class="hljs-number">10</span> <span class="hljs-number">3</span>,<span class="hljs-number">5</span> * * <span class="hljs-number">3</span> /bin/date +<span class="hljs-string">"\%F \%H:\%M:\%S"</span>
~]$ crontab -l
<span class="hljs-number">10</span> <span class="hljs-number">3</span>,<span class="hljs-number">5</span> * * <span class="hljs-number">3</span> /bin/date +<span class="hljs-string">"\%F \%H:\%M:\%S"</span>

简述sed常用操作命令,并举例

sed是一种行编辑器,它可以使用正则表达式进行模式匹配。它在处理文本时,会逐行进行处理,先将当前处理的行存储在一个临时缓冲区“模式空间”(pattern space)中,接着用sed命令进行处理,处理完成后,默认将结果送至标准输出,然后在继续处理下一行,直至文本的末尾。默认操作下sed不会改变文件的内容,如果想保存sed处理后的结果,可以使用输出重定向。

 

sed.png
  1. 命令格式
    sed [options] ‘command’ file(s)
    sed [options] -f scriptfile file(s)
  2. 参数
  • -e script1 -e script2 : -e选项可以指定多条命令执行
  • -f scriptfile : -f选项可以从文件中读取命令执行操作,同样可以指定多个文件处理
  • -n选项 : 仅显示sed命令处理后的结果
  • -r选项 : 支持扩展的正则表达式
  • -i选项 : 直接修改源文件
  1. sed命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
a\ 在当前行下面插入文本
i\ 在当前行上面插入文本
c\ 把选定的行改为新的文本
= 打印行号
d 删除,删除选择的行
D 删除模板块的第一行
! 表示其后面的命令对所有没有前面的条件匹配的行发生作用
s 替换指定字符
g 表示行内全面替换
h 拷贝模板块的内容到内存中的缓冲区
H 追加模板块的内容到内存中的缓冲区
g 获得内存缓冲区的内容,并替代当前模板块中的文本
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面
x 互换当前模式空间和内存缓冲区的内容
n 读取下一个输入行进入模式空间
N 追加下一个输入行到模式空间现有数据的后面
p 打印模板块的行
P(大写) 打印模板块的第一行
w file 把处理过的结果写入文件
r file 读取文件内容并追加进入模式空间

关于n, N这两个命令的执行方式是容易搞错的地方,可以参考下面的图示

 

sed_n1.png

 

sed_n2.png

 

sedN2.png
  1. sed处理文本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
仅显示以<span class="hljs-string">"#"</span>开头的行
~]$ sed -n <span class="hljs-string">'/^#/p'</span> /etc/fstab
在所有<span class="hljs-string">"#"</span>后添加<span class="hljs-string">"*"</span>
~]$ sed <span class="hljs-string">'s/\(#\)/\1*/g'</span> /etc/fstab
删除第5行及其之后的所有行
~]$ sed <span class="hljs-string">'5,$d'</span> /etc/fstab
删除每一行开头的<span class="hljs-string">"#"</span>并删除文件中的空白行
~]$ sed -e <span class="hljs-string">'s/^#//g'</span> -e <span class="hljs-string">'/^[[:space:]]*$/d'</span> /etc/fstab
-r选项使用扩展正则表达式,<span class="hljs-string">"&amp;"</span>表示每一个匹配到的内容
~]$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"this is a test line"</span> | sed -r <span class="hljs-string">'s/\w+/[&amp;]/g'</span>
[this] [is] [a] [<span class="hljs-built_in">test</span>] [line]
将issue文件的内容添加到fstab文件每一个以<span class="hljs-string">"#"</span>开头的行之后
~]$ sed <span class="hljs-string">'/^#/r /etc/issue'</span> /etc/fstab
将this is a <span class="hljs-built_in">test</span>添加到以<span class="hljs-string">"#"</span>开头的行之后
~]$ sed <span class="hljs-string">'/^#/a\this is a test'</span> /etc/fstab
将this is a <span class="hljs-built_in">test</span>添加到以<span class="hljs-string">"#"</span>开头的行之前
~]$ sed <span class="hljs-string">'/^#/i\this is a test'</span> /etc/fstab
打印以<span class="hljs-string">"#"</span>开头的行的行号
~]$ sed <span class="hljs-string">'/^#/='</span> /etc/fstab
为文件每一行添加行号
~]$ sed = /etc/fstab | sed <span class="hljs-string">'N;s/\n/: /g'</span>
1:
2: <span class="hljs-comment">#</span>
3: <span class="hljs-comment"># /etc/fstab</span>

删除文件的偶数行
~]$ sed <span class="hljs-string">'n;d'</span> /etc/fstab
仅输出文件最后2行
~]$ sed <span class="hljs-string">'N;$!D'</span> /etc/fstab

关于难点N的处理逻辑的实例解析
~]$ cat ./123
1
2
3
4
5
~]$ sed <span class="hljs-string">'N;P'</span> ./123
1
1
2
3
3
4
5
~]$ sed -n <span class="hljs-string">'N;P'</span> ./123
1
3
  / 从上面的多次处理结果可以得出sed从首行开始每次有2行进入模式空间进行处理,
  P命令打印空间中的第1行,当读取到最后一行第5行时,由于没有下一行了所以无法
  执行N命令,于此同时分号后面的P命令也没有被执行

将文件的所有行逆序输出
~]$ sed <span class="hljs-string">'1!G;h;$!d'</span> ./123
5
4
3
2
1

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/90765

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班