这是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 程序的过程
- 准备 C 程序的源码。包含 c文件和 h 文件;
- 编译。使用编译器(如 gcc)将源码(c 文件和 h 文件)编译成目标文件 o 文件;
- 在编译过程中,使用 makefile 文件中的配置选项进行编译。makefile 文件可以使用 configure 工具生成。make 命令根据 makefile 文件进行编译,然后在使用 make install 安装。
- 对于源程序没有提供 configure 或 config 诸如此类的文件,此时很有可能直接使用 make 命令带上相关编译参数进行编译即可。
- 链接。在 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 编译程序时参数的给定遵循一定的规则:
关于更多可能用的编译选项,可以参考源程序包中的 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 升级、查询、版本比较等包操作,都是从这个目录下获取信息并完成相应操作。
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 的默认配置文件,此配置文件是全局默认项
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 文件的配置格式如下:
另外 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)通过源码编译的软件,需要做一些后续操作,虽非必须,但是都是个性化定制,方便以后的操作。个性化定制大致包括以下几项:
- 将安装路径下的命令路径加入到环境变量。
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
- 按需求定制服务启动脚本,并考虑是否加入开机启动项。
- 输出头文件和库文件。头文件库文件很多时候只是为其他程序提供的,所以可能不输出它们的路径也不会影响该程序的运行。
# 输出头文件
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路径
shell> echo "MANPATH /usr/local/apache/man" >> /etc/man.conf
参考链接:
http://www.cnblogs.com/f-ck-need-u/p/7049750.html