100个Linux命令(6)-软件管理 rpm 和 yum

2019-01-16 15:50:19 浏览数 (1)

这是100个 Linux 命令中的第59和60个命令,主要是用于管理软件的 rpm 和 yum 命令,以及 Linux 中关于软件的一些你应该知道的基础知识。

命令篇

59.rpm

安装

一般用法:rpm -ivhUe --nodeps --test --force --prefix

解释:

  • -i:安装,install
  • -v:显示安装信息,还可以使用多个“v”,v 提供的越多显示的信息越详细
  • -h:显示安装进度,进度使用"#"表示
  • -U:升级和升级包
  • -F:只升级已安装包
  • -e:卸载包,卸载也有依赖性,"--erase"
  • --nodeps:忽略依赖性强制安装或卸载,
  • --test:测试是否能够成功安装指定的 rpm 包
  • --prefix:新路径,自行指定安装路径而不是使用默认路径,基本都不支持该功能。
  • --force:强制安装
  • --replacepkgs:替换安装,即重新覆盖安装。对于误删文件,直接使用此选项再次安装即可

查询

选项

功能

-q

查询已安装的包

-qp

查询未安装的包

-qa

查询所有已安装的包,也可以指定通配符名称进行查询

-qi

查询指定包的信息(版本、开发商、安装时间等) 从这里可以查看到软件包属于哪个包组

-ql

查询包的列表和目录 (包在生产的时候就指定了文件路径,因此可以查看未安装的包)

-qR

查询包的依赖关系(Required)

-qc

查询安装后生成的配置文件

-qd

查询安装后生成的帮助文档

--scripts

查询包安装相关的脚本文档。 (安装前脚本、安装后脚本、卸载前脚本、卸载后脚本)

(1)查询文件 /etc/yum.conf 是由哪个 rpm 包安装的:

代码语言:javascript复制
~ rpm -qf /etc/yum.conf
yum-3.4.3-161.el7.centos.noarch

(2)查询安装 httpd 时生成了哪些目录和文件,还可以过滤出提供了哪些命令行工具

代码语言:javascript复制
rpm -ql httpd
rpm -ql httpd | grep 'bin/'

(3)查询某个未安装的包的依赖性

代码语言:javascript复制
rpm -qRp zip-3.0-1.el6.x86_64.rpm
repoquery -R zip  #repoquery由 yum-utils 提供

60.yum

yum 子命令

子命令

功能

help

命令的帮助信息 yum help install

clean

清除缓存数据

makecache

生成元数据缓存数据 yum makecache

deplist

列出包的依赖关系

erase

卸载包

fs|fssnapshot

为当前文件系统创建快照,或者列出或删除当前已有快照 快照是非常有用的,升级或打补丁前拍个快照,就能放心升级或打补丁了

groups

操作包组

history

查看 yum 事务信息 yum 是独占模式的进程,所以有时候查看事务信息还是有用的

info

输出包或包组信息 如该包时谁制作的,大概是是干啥用的以及来源于哪个包组等信息

install

包安装命令

list

列出包名,一般会结合 grep 来搜索包 yum list all | grep -i zabbix

provides

搜索给定的内容是由谁提供的

reinstall

重新安装包

repolist

列出可用的仓库列表

search

给定字符串搜索相关包,并给出相关包的信息

update

更新包

yum 选项

  • -R [minutes],--randromwait=[minutes]:最多等待时间
  • -q,--quiet:安静模式
  • -v,--verbose:详细模式
  • -y,--assumeyes:对所有问题回答 yes
  • --assumeno:对所有问题回答 no
  • --enablerepo=[repo]:启用一个或多个仓库,可用通配符通配仓库 ID
  • --disablerepo=[repo]:禁用一个或多个仓库,可以使用通配符
  • -x [package],--exclude=[package]:通配要排除的包
  • --nogpgcheck:禁用 gpgcheck
  • --color=COLOR:带颜色
  • --downloadonly:仅下载包,不安装或升级。默认下载在yum的缓存目录中,默认为/var/cache/yum/$basearch/$releasever。 --downloaddir=DLDIR 指定下载目录

yum 操作包组

类似的命令有:group、groupinstall、groupinfo、groupupdate、groupremove、grouperase

原理篇

Linux 中构建C 程序的过程

  1. 准备 C 程序的源码。包含 c文件和 h 文件;
  2. 编译。使用编译器(如 gcc)将源码(c 文件和 h 文件)编译成目标文件 o 文件;
    1. 在编译过程中,使用 makefile 文件中的配置选项进行编译。makefile 文件可以使用 configure 工具生成。make 命令根据 makefile 文件进行编译,然后在使用 make install 安装。
    2. 对于源程序没有提供 configure 或 config 诸如此类的文件,此时很有可能直接使用 make 命令带上相关编译参数进行编译即可。
  3. 链接。在 Linux 上使用 ld 工具,将 o 文件和所需的库文件链接起来组成一个可正常工作的可执行程序。链接了库文件之后可可以发起一些系统调用。

在 `make` 编译时,可能会需要提供头文件和库文件的路径,如果不提供,则搜索默认路径。当搜索路径下都找不到所需文件时,会报错库文件或头文件不存在。一般情况,只需要安装其对应的 devel 包即可,缺少库文件则可能需要安装主包,也可能需要 devel 包,还可能需要单独的 libs 包。

gcc 编译器的头文件默认搜索路径为(`cpp -v`):

  • /usr/local/include
  • /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include,不同系统有所不同使用 cpp -v 查看
  • /usr/include

库文件的默认搜索路径及优先级:

  • 编译目标代码时指定的动态库搜索路径
  • 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
  • 配置文件/etc/ld.so.conf 中指定的动态库搜索路径
  • 默认的动态库搜索路径/lib
  • 默认的动态库搜索路径/usr/lib

make 编译程序时参数的给定遵循一定的规则:

make编译 C 程序的参数make编译 C 程序的参数

关于更多可能用的编译选项,可以参考源程序包中的 README 或 INSTALL 文件。

关于库名:

(1)前面必须是 lib,中间是库名,后面是后缀,例如 libutil.so,其库名是 utli。

(2)库文件的后缀有3种:静态库 a、动态库 so 或 sl

(3)很多库的后缀后面还会有数字,这些数字与库的版本有关,带有数字版本的库文件是不带数字库文件的链接。例如libutil.so.1它会指向libutil.so。这样就可以实现多版本共存,如果有多个库版本,只要找到libutil.so就可以找到最新版本的库文件。当然,如果想要使用特定版本的库,只需修改下它的软链接指向即可。

软件包中的相关概念

软件包的命名

在 rhel/centos/fedora 上,包的名称以 rpm 结尾,分为二进制包和源码包。源码包以“.src.rpm”结尾,源码包是未经编译的包,可以自行进行编译或者用其制作自己的二进制 RPM 包。非“.src.rpm”结尾的包都是二进制包,他们都是已经编译完成的,安装 rpm 包的过程实际上就是将包中的文件复制到 linux 中,有时可能还需要在复制之前执行一些命令,诸如创建一个必要的用户等。

源码包与源码的区别:

  • 源码一般是打包压缩后的文件,如.tar.gz 结尾的文件
  • 源码包中包含了源码,还包含了一些有助于制作二进制包 rpm 的文件。如源码编译安装的程序都没有系统服务启动脚本,二进制 rpm 包安装就有,因为二进制rpm 包都是通过源码包".src.rpm"定制而来的,在源码包中提供了必要的文件,并且在安装 rpm 的时候复制到指定路径下。

一个 RPM 包的名称分为包全名和包名两种。包全名包含了一个软件包关于包名、版本号、适用架构等信息。

包全名中包含的信息包全名中包含的信息

使用rpm工具管理包:

如果要操作未安装的包,则使用包全名,如安装包,查看未安装包的信息等;如果要操作已安装的rpm包,则只需要给定其包名即可,如查询已装包生成了哪些文件,查看已装包的信息等。

对于yum工具:

只需给定其包名即可,若有需要,再指定版本号,如明确指明要安装1.6.10版本的tree工具,`yum install tree-1.6.10`。

主包与子包

对于一个程序,在制作 RPM 包时,会按照功能将其拆分为多个不同功能的子包,如客户端程序包、服务端程序包等。

对于 mariadb 这个程序来说,它分为一下几个包:

程序包

功能

mariadb.x86_64

客户端主包

mariadb-server.x86_64

提供服务的主包

mariadb-devel.x86_64 mariadb-libs.x86_64

提供给其他需要联合 mariadb 的程序使用

对于编译安装的包会包含所有功能,也就是所编译一个程序后,它的客户端工具、服务端工具、库文件、头文件等都已经安装。

RPM 包管理工具

rpm 包被安装后,会在/var/lib/rpm 下建立已安装 rpm 的数据库,以后的任何 rpm 升级、查询、版本比较等包操作,都是从这个目录下获取信息并完成相应操作。

/var/lib/rpm rpm数据库/var/lib/rpm rpm数据库

RPM 安装程序时会将相关文件复制到系统的相应目录中:

目录

功能

/etc/

配置文件目录

/bin、/sin、/usr/bin、/usr/sbin

可执行文件

/lib、/lib64、/usr/lib、/usr/lib64

库文件

/usr/include

头文件

/usr/share/doc

使用手册和帮助手册

/usr/share/man

man page

关于 rpm 工具最常用的是查询工具,RPM 最大的缺点是无法解决包依赖关系,对于安装、升级和卸载基本都是使用 yum 工具。

注意:不要对内核升级,多版本内核可以共存,因此可以执行安装内核操作。

yum 工具

/etc/yum.conf 是 yum 的默认配置文件,此配置文件是全局默认项

/etc/yum.conf 配置项解释/etc/yum.conf 配置项解释

yum 仓库

yum 仓库的配置文件:/etc/yum.conf 和/etc/yum.repos.d/中的“.repo”文件。/etc/yum.conf配置的是仓库的默认项,一般配置yum源都是在/etc/yum.repos.d/*.repo中配置。注意,该目录中任意repo文件都会被读取。

默认/etc/yum.repos.d/下会有以下几个仓库文件,除了CentOS-Base.repo,其他的都可以删掉,基本没用。

repo 文件的配置格式如下:

repo 配置选项repo 配置选项

另外 cost 表示开销,开销越高仓库的优先级越低。

repo 配置文件中可用的宏

解释

$releasever

程序的版本,对于 yum 而言指定是 redhat-release 版本。 只替换为主版本号,如 Redhat7.5,则替换为7

$arch

系统架构

$basearch

系统的基本架构,如 i386等

$YUM0-9

在系统定义的环境变量,可以在 yum 中使用

系统发行商在系统中放置的rpm包一般版本都较老,可能有些包有较大的延后性。而epel是由fedora社区维护的高质量高可靠性的安装源,有很多包是比系统包更新的,且多出很多系统没有的包。

方法一:直接安装 epel-release-noarch

代码语言:javascript复制
yum install epel-release
或
rpm -ivh epel-release-latest-7.noarch.rpm(根据不同操作系统版本选择)

方法二:直接增加 epel 仓库

代码语言:javascript复制
vim /etc/yum.repos.d/epel.repo
[epel]
name=epel
baseurl=http://mirrors.sohu.com/fedora-epel/6Server/$basearch/
enabled=1

源码编译程序的一般过程

拿到源码的压缩包后,首先就是解压,这就不需说了。解压后,进入解压目录,这是必须动作,之后就是源码编译的一般步骤。并非适用所有程序的编译,但知道过程之后也可以举一反三了。

(1)阅读解压目录中的INSTALL/README文件。如果不是对着官方手册或文档,那么在安装前务必读一读INSTALL文件或README文件,只需读其中如何安装的部分即可。

(2)解压后的目录里一般还有configure文件(也可能是config文件)。执行"./configure"或带有编译选项的"./configure",检查系统环境是否符合满足安装要求,并将定义好的安装配置写入和系统环境信息写入Makefile文件中。里面包含了如何编译、启用哪些功能、安装路径等信息。

(3)执行make命令进行编译。make命令会根据Makefile文件进行编译。编译工作主要是调用编译器(如gcc)将源码编译为可执行文件,通常需要一些函数库才能产生一个完整的可执行文件。

(4)make install将上一步所编译的数据复制到指定的目录下。

以上已经完成编译程序的过程了。

configure 脚本的通用功能

功能

解释

--prefix=

指定安装的路径

--sysconfir=

指定配置文件目录

--enable-feature=

启用某个特性

--disable-feature=

禁用某特性

--with-funciton

启用某功能

-without-function

禁用某功能

不同的程序,其configure选项不尽相同,应使用"./configure --help"获取具体的信息。

源码编译的注意事项

(1)上面的每一个步骤都不能出错,否则后一步都不能正常进行。

(2)上面的步骤每一步如果出现警告或错误,如果步骤未停止而是继续,则属于可忽略错误或警告,不影响安装。但是进行的步骤停止了出现警告或错误,则根据步骤考虑对策。可以使用“$?”命令查看上一个命令是否正确执行,如果是返回0则是正确,其他的则是错误。

(3)卸载时,只需删除安装目录即可。因此,若要便于删除,最好将源码程序安装在/usr/local/对应的目录下。例如apache2安装在/usr/local/apache2下。

(4)通过源码编译的软件,需要做一些后续操作,虽非必须,但是都是个性化定制,方便以后的操作。个性化定制大致包括以下几项:

  • 将安装路径下的命令路径加入到环境变量。
代码语言:javascript复制
shell> echo "export PATH=/usr/local/apache/bin:$PATH" > /etc/profile.d/apache.sh
shell> chmod  x /etc/profile.d/apache.sh
shell> source /etc/profile.d/apache.sh
  • 按需求定制服务启动脚本,并考虑是否加入开机启动项。
  • 输出头文件和库文件。头文件库文件很多时候只是为其他程序提供的,所以可能不输出它们的路径也不会影响该程序的运行。
代码语言:javascript复制
# 输出头文件
shell> ln -s /usr/local/apache/include /usr/include/apache

# 输出库文件
shell> echo "/usr/local/apache/lib" >/etc/ld.so.conf.d/apache.conf
shell> ldconfig
  • 导出man路径
代码语言:javascript复制
shell> echo  "MANPATH /usr/local/apache/man" >> /etc/man.conf

参考链接:

http://www.cnblogs.com/f-ck-need-u/p/7049750.html

0 人点赞