# 简介
# 软件包分类
- 源码包(含脚本安装包):大部分都是 c 语言编写,安装比较慢,容易报错。
- 二进制包(含 rpm 包、系统默认包):目前 linux 主要安装方式,源代码包经过编译后的二进制机器语言包(0101),好处是安装时间比较慢,节约时间,一般厂家预先编译,无法阅读源代码
- redhat 系列和 debian 系列最大的不同就是软件包管理不同:redhat-rpm,debian-deb
- 脚本安装包:不多见,类似 windows 中的安装程序,有窗口界面,点击下一步下一步,其实就是给源码包写入一个安装程序
# 源码包优点
- 开源,linux 比 windows 晚但是能够成为服务器主流的一个原因
- 可以自由选择所需功能,windows 就比较少
- 软件是编译安装,更适合系统,更稳定,效率更高,通常源码包安装,有统计,相同版本相同系统使用源码安装通常比 rpm 安装提高 5% 左右效率
- 卸载方便,可以直接删源码包安装目录,windows 不行(会遗留大部分垃圾文件,导致 c 盘臃肿)
# 源码包缺点
- 安装步骤多,尤其大型软件集合(如 lamp 环境,邮件服务器)
- 编译时间长,比二进制安装时间长(比如源码包安装 linux 系统要大概几天时间)
- 编译过程容易报错,对新手不友好
# rpm 包优点
- 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
- 安装速度比源码包安装快的多,和 windows 的安装速度差不多
# rpm 包缺点
- 预先编译,看不到源代码
- 功能选择不如源码包灵活
- 依赖性,先装 a 在装 b 在装 c,卸载先卸载 c 在卸载 b 在卸载 a
# rpm 命令管理
# 命名规则
以 httpd-2.2.15-15.el6.centos.1.i686.rpm
为例
- httpd - 软件包名
- 2.2.15 - 软件版本
- 15 - 软件发布的次数
- el6.centos - 适合的 linux 平台,rhel6 和 centos 两个平台
- i686 - 适合的硬件平台,x64 指 64 位软件包
- rpm - rpm 包扩展名,其实 linux 没有扩展名这个概念的,但是 rpm 包必须要标注
# 依赖性
如执行 rpm -ivh mysql-connector-odbc-5.1.5r1144-7.el6.i686.rpm
报依赖错误
- 树形依赖: a -> b -> c
- 环形结构: a -> b -> c -> a, 可以把软件包 a,b,c 一块装
- 模块依赖: 模块依赖查询网站 - www.rpmfind.net (碰到库文件依赖可以使用该网站,如搜索 libodbcinst.so.2 这个库文件)
# 包全名与包名
- 包全名:操作的包是没有安装的软件包时,使用包全名。而且要注意路径
- 包名:操作已经安装的软件包时,使用包名。是搜索 /var/lib/rpm/ 中的数据库
# 安装
命令 rpm -ivh 包全名
,选项:
- -i: install,安装
- -v: verbose,显示详细信息
- -h: hash,显示进度
- --nodeps:不检测依赖性,有可能造成底层功能缺失,导致软件不能使用,少用,多为实验用
# 升级
命令 rpm -Uvh 包全名
,选项:
- -U:upgrade,升级
# 卸载
命令 rpm -e 包名
,选项:
- -e:erase,卸载
- --nodeps,不检查依赖性
# 查询是否安装
命令 rpm -qa 包名
或 rpm -qa|grep httpd
,选项:
- -q:query,查询,查询包是否安装
- -a:all,所有,查询所有已经安装的 rpm 包
# 查询软件包详细信息
命令 rpm -qi 包名
,选项:
- -i:information,查询软件信息
- -p:package,查询未安装包信息(-p 后面跟包全名,$ rpm -qip 包全名)
# 查询包中文件安装位置
我们推荐使用默认安装位置,不要手工改动 rpm 默认安装位置,命令 rpm -ql 包名
,选项:
- -l:list,i 二标
- -p:package,查询未安装包信息($ rpm -qlp 包全名)
# 查询系统文件属于哪个 rpm 包
命令 rpm -qf 系统文件名
, 选项:
- -f:file,查询系统文件属于哪个软件包
# 查询软件包的依赖性
命令 rpm -qR 包名
,选项:
- -R:requires,查询软件包的依赖性
- -p:package,查询未安装包信息($ rpm -qRp 包全名)
# RPM 包校验
判断文件丢包或篡改,命令 rpm -V 已安装的包名
,选项:
- -V:verify,校验指定的 RPM 包中的文件
验证内容中的 8 个信息的具体内容如下:
标志 | 说明 |
---|---|
S | 文件大小是否改变 |
M | 文件的类型或文件的权限 rwx 是否被改变 |
5 | 文件 MD5 校验和是否改变(可以看成文件内容是否改变) |
D | 设备的中,从代码是否改变 |
L | 文件路径是否改变 |
U | 文件的所有者是否改变 |
G | 文件的属组是否改变 |
T | 文件的修改时间是否改变 |
文件类型:
标志 | 说明 |
---|---|
c | 配置文件(config file) |
d | 普通文档(doumentation) |
g | “鬼” 文件(ghost file)。很少见,就是该文件不应该被这个 RPM 包包含 |
l | 授权文件(license file) |
r | 描述文件(read me) |
# RPM 包中文件提取
只提取 RPM 包中某个指定文件,比如安装了某个 RPM 包后,因操作误删除了该包下面某个配置文件,此时我们不想重新安装这个 rpm 包,只需要提取一下这个配置文件覆盖,主要用来修复误操作,命令 rpm2cpio 包全名 | cpio -idv .文件绝对路径
,rpm2cpio 是将 rpm 包转换为 cpio 格式的命令,cpio 是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件,cpio 单独使用命令 cpio 选项 < [文件|设备]
(< 是输入重定向),选项:
- -i:copy-in 模式,还原
- -d:还原时自动新建目录
- -v:显示还原过程
练习:
[root@core-pods-3 ~]# rpm -qf /bin/ls # 查询 ls 命令属于哪个软件包 | |
coreutils-8.22-24.el7_9.2.x86_64 | |
[root@core-pods-3 ~]# mv /bin/ls/tmp/ # 造成 ls 命令误删除假象 | |
[root@core-pods-3 ~]# rpm -qa|grep coreutils # 查询 rpm 包版本 | |
policycoreutils-2.5-34.el7.x86_64 | |
coreutils-8.22-24.el7_9.2.x86_64 | |
[root@core-pods-3 ~]# locate coreutils-8.22-24.el7_9.2.x86_64 # yum install -y mlocate | |
[root@core-pods-3 ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls # 提取 rpm 包中 ls 命令到当前目录的 /bin/ls 下 | |
[root@core-pods-3 ~]# cp ./bin/ls/bin/ # 把 ls 命令复制回 /bin 目录,修复文件丢失 |
# yum 在线管理
这里的 “在线” 并不是说 yum 一定要联网,也可以用光盘,redhat 需要付费才能使用 yum,yum 命令管理的是 rpm 包,yum 最好的地方是解决依赖性。
# ip 地址配置
ifconfig eth0 192.168.1.156
[root@core-pods-3 ~]# setup # 使用setup工具
[root@core-pods-3 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 # 把ONBOOT='no'改为'yes',启动网卡
[root@core-pods-3 ~]# service network restart
# 网络 yum 源
[root@core-pods-3 ~]# vi /etc/yum.repos.d/CentOS-Base.repo # 注意 dvd yum 源配置:CentOS-Media.repo
- [base]:容器名称,一定要放在 [] 中,一般不改,想改也可以改
- name:容器说明,可以自己随便写
- mirrorlist:镜像站点,这个可以注释掉,和 baseurl 性质差不多
- baseurl:我们的 yum 源服务器的地址。默认是 centos 官方的 yum 源服务器,是可以使用的,如果你觉得慢可以改成你喜欢的 yum 源地址
- enabled:此容器是否生效,如果不写或写成 enable=1 都是生效,写成 enable=0 就是不生效
- gpgcheck:如果是 1 是指 rpm 的数字证书生效,如果是 0 则不生效
- gpgkey:数字证书的公钥文件保存位置。不用修改
# yum 命令
[root@core-pods-3 yum.repos.d]# yum list # 查询远程服务器上所有可用软件包列表(联网) | |
[root@core-pods-3 yum.repos.d]# yum search nginx # 搜索服务器上所有和 nginx 有关的包 | |
[root@core-pods-3 yum.repos.d]# yum -y install nginx # install,-y 自动回答 yes | |
[root@core-pods-3 yum.repos.d]# rpm -q nginx | |
[root@core-pods-3 yum.repos.d]# yum -y update nginx # update, -y 自动回答 yes | |
[root@core-pods-3 yum.repos.d]# yum -y update # 谨慎执行该操作,这个会更新 linux 内核 | |
[root@core-pods-3 yum.repos.d]# yum -y remove nginx # remove, -y 自动回答 yes,尽量少用该命令,有可能因为依赖导致一些问题 | |
# yum 软件组管理命令 | |
[root@core-pods-3 yum.repos.d]# yum grouplist # 列出所有可用的软件组列表 | |
[root@core-pods-3 yum.repos.d]# yum groupinstall 软件组名 # 安装指定软件组,组名可以由 grouplist 查询出来 | |
[root@core-pods-3 yum.repos.d]# yum groupremove 软件组名 # 卸载指定软件组 |
# 光盘 yum 源搭建
主要针对一些无法访问互联网的环境,使用本地光盘作为 yum 源,缺点是光盘中的软件不一定是最新的。
#(1)挂载光盘 | |
[root@core-pods-3 ~]# mount /dev/cdrom /mnt/cdrom/ | |
[root@core-pods-3 ~]# mount # 查看挂载 | |
#(2)让网络 yum 源文件失效(删除或修改文件后缀,或者将文件里每个源的 enable 配置项改为 0) | |
[root@core-pods-3 ~]# cd /etc/yum.repos.d/ | |
[root@core-pods-3 yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak | |
[root@core-pods-3 yum.repos.d]# mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak | |
[root@core-pods-3 yum.repos.d]# mv CentOS-Vault.repo CentOS-Vault.repo.bak | |
#(3)修改光盘 yum 源文件 | |
[root@core-pods-3 yum.repos.d]# vim CentOS-Media.repo | |
[c7-media] | |
name=CentOS-$releasever - Media | |
baseurl=file:///mnt/cdrom # 地址为你自己的光盘挂载地址 | |
gpgcheck=1 | |
enabled=1 # 这里改为 1 使之生效 | |
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 | |
[root@core-pods-3 yum.repos.d]# yum list # 保存上面内容后重新检查 yum 源 |
# 源码包管理
# 源码包与 rpm 包的区别
- 安装之前的区别:概念上的区别,比如源码包安装慢,有可能报错,儿 rpm 包相反
- 安装之后的区别:安装位置不同,所以后续管理不同
rpm 包默认安装路径
目录 | 说明 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
[root@core-pods-3 ~]# rpm -ql nginx # 查看 rpm 安装后各个文件位置
源码包安装位置
源码包可以安装在指定位置中,一般是 /usr/local/ 软件名 /
管理上的不同 rpm 包安装的服务可以使用系统服务管理命令(service)来管理,例如 rpm 包安装的 apache 的启动方法是: /etc/rc.d/init.d/httpd start
或者 service httpd start
。service 会自动去 rpm 包安装路径下找 httpd 这个命令。而源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认路径中。所以只能以绝对路径进行服务的管理,如: /usr/local/apache2/bin/apachectl start
。
# 源码包安装过程
- 安装 c 语言编译器 gcc
[root@core-pods-3 init.d]# yum install -y gcc | |
[root@core-pods-3 init.d]# rpm -q gcc | |
[root@core-pods-3 httpd-2.4.54]# gcc --version # 我的是安装系统时自带的 4.8.5 |
- 下载源码包 httpd
[root@core-pods-3 httpd]# wget https://dlcdn.apache.org/httpd/httpd-2.4.54.tar.gz --no-check-certificate |
注意事项
- 源码包保存位置:/usr/local/src/
- 软件安装位置:/usr/local/
- 如何确定安装过程报错:
- 安装过程停止
- 并出现 error、warning 或 no 的提示
解压缩下载的源码包
[root@core-pods-3 httpd]# tar -zxvf httpd-2.4.54.tar.gz | |
[root@core-pods-3 httpd]# du -sh httpd-2.4.54 # 看一下解压后多大 | |
[root@core-pods-3 httpd]# cd httpd-2.4.54 |
- 进入解压包内,可以先查看 INSTALL 安装说明和 README 说明(可以直接照里面写的操作做),如果遇到一些问题也可以点这里,注意:如果你的生产环境用户量达到百万甚至千万级别,通常使用源码包安装相比于 rpm 包安装可以提高大概 5% 左右效率,这种情况下可以试着使用源码包安装方式。否则还是使用 rpm 包安装。
- ./configure 软件配置与检查
- 定义需要的功能选项
- 检测系统环境是否符合安装要求
- 把定义好的功能选项和检测系统环境的信息都写入 Makefile 文件,用于后续的编辑
- ./configure 软件配置与检查
[root@core-pods-3 httpd-2.4.54]# ./configure --help | |
[root@core-pods-3 httpd-2.4.54]# ./configure --prefix=/usr/local/apache2 # 这一步可能会报 APR 错误,检查 INSTALL 文档,发现我们要先安装 APR | |
# 安装 APR(如果上一步没 APR 报错,则省略下述步骤) | |
[root@core-pods-3 httpd-2.4.54]# cd srclib/ | |
[root@core-pods-3 srclib]# wget https://dlcdn.apache.org//apr/apr-1.7.0.tar.gz --no-check-certificate | |
[root@core-pods-3 srclib]# wget https://dlcdn.apache.org//apr/apr-util-1.6.1.tar.gz --no-check-certificate | |
[root@core-pods-3 srclib]# tar -zxvf apr-1.7.0.tar.gz | |
[root@core-pods-3 srclib]# tar -zxvf apr-util-1.6.1.tar.gz | |
[root@core-pods-3 srclib]# mv apr-1.7.0 apr | |
[root@core-pods-3 srclib]# mv apr-util-1.6.1 apr-util | |
[root@core-pods-3 srclib]# cd ../ | |
# 继续安装 httpd | |
[root@core-pods-3 httpd-2.4.54]# ./configure --prefix=/usr/local/apache2 # 等吧,等待重新写入 Makefile | |
[root@core-pods-3 httpd-2.4.54]# ./configure --with-apr=/usr/local/httpd/httpd-2.4.54/srclib/apr --with-apr-util=/usr/local/httpd/httpd-2.4.54/srclib/apr-util --prefix=/usr/local/apache2 # 和上面命令功能一样 | |
[root@core-pods-3 httpd-2.4.54]# ls # 可以看到生成了 Makefile | |
[root@core-pods-3 httpd-2.4.54]# make # 编译,调用 gcc,然后等 | |
# 解决上一步编译报错:xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory | |
[root@core-pods-3 httpd-2.4.54]# yum -y install expat-devel | |
[root@core-pods-3 httpd-2.4.54]# make # 重新编译 | |
# 继续报错,apr-util 缺少 xml 相关库:undefined reference to `XML_GetErrorCode' ... | |
[root@core-pods-3 httpd-2.4.54]# yum install -y libxml2-devel # 安装 xml 相关库 | |
[root@core-pods-3 httpd-2.4.54]# ./configure --prefix=/usr/local/apache2 # 重新写入配置 | |
[root@core-pods-3 httpd-2.4.54]# make # 如果报错可以执行 make clean 清理 | |
[root@core-pods-3 httpd-2.4.54]# make install # 编译安装,真正向 /usr/local/apache2 目录写文件 | |
[root@core-pods-3 httpd-2.4.54]# /usr/local/apache2/bin/apachectl start # 启动,测试:浏览器输入你的 ip 后显示 It works! | |
[root@core-pods-3 apache2]# vi /usr/local/apache2/htdocs/index.html # 随便改一下刷新页面,可以看到内容变化 | |
[root@core-pods-3 apache2]# rm -rf /usr/local/apache2/ # 源码包卸载直接删目录即可,不会有多余垃圾 |
# 脚本安装包
# 特点
- 脚本安装包并不是独立的软件包类型,常见安装的是源码包
- 是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装
- 非常类似于 windows 下软件的安装方式
# 以安装 Webmin 为例,什么是 Webmin?
- Webmin 是一个基于 web 的 linux 系统管理界面。您可以通过图形化的方式设置用户账号、Apache、DNS 文件共享等服务。
# Webmin 安装过程
- 下载软件,
wget https://sourceforge.net/projects/webadmin/files/webmin/1.997/webmin-1.997.tar.gz --no-check-certificate
- 解压缩,并进入压缩目录
- 执行安装脚本
[root@core-pods-3 webmin-1.997]# ./setup.sh