使用源码包安装
使用源码包安装会比较复杂,需要手动处理一些缺失的依赖,所以我们一般只有在没有其他资源的情况下才会使用源码包进行安装,下面为使用httpd源码包安装httpd服务的过程。
下载并源码包
源码包一般会使用gzip或bzip2进行压缩,所以源码包的后缀名通常为.tar.gz
或.tar.bz2
,我们下载到的安装包为httpd-2.4.49.tar.gz
。
安装包下载完成后,需要进行解压,解压命令为:
tar -xvzf httpd-2.4.49.tar.gz
解压后的目录为httpd-2.4.49
,解压后的目录结构为:
检查配置
在正式安装程序之前,需要对当前系统进行一系列评估工作,以检查系统版本、源码文件、依赖库等是否完善,如果缺少,则会报错,无法进入下一步。默认安装的程序文件会分散在不同的系统目录中,比如可执行文件会存放到/usr/bin
中,库文件会存放到/usr/local/lib
中等等,如果你想指定安装目录,可以用--prefix
参数来指定安装目录。建议每个程序都指定安装目录,方便后续的卸载,但是不方便的地方是可执行文件需要手动加入PATH环境变量。执行检查配置过程比较简单,进入到程序目录,直接执行configure脚本即可
cd httpd-2.4.49
# 默认安装
./configure
# 指定目录安
./configure --prefix=/usr/local/httpd
configure是一个可执行脚本,它是开发者写的检查安装环境的脚本。我的执行结果如下:
因为缺少APR,所以检查安装环境失败,无法安装,所以我们要去安装APR,然后再尝试安装,这也是源码包安装最麻烦的地方,需要手动处理各种依赖。比如你想安装A程序,发现缺少B组件,你安装B组件时,发现缺少C组件,实际安装过程中,我们还会缺少APR-util和pcre-config、 C++ compiler等组件,均需要安装好之后才能通过检查。
检查通过后,会在当前目录生成Makefile
文件。
编译
编译只需在当前程序目录执行
make
命令即可,make
命令会根据Makefile文件中的设置,将源码编译为二进制文件。在执行make
命令时,会输出大量日志,一般不需要关注。
安装
安装也很简单,执行
make install
即可根据Makefile进行安装。编译和安装可以同步执行make && make install
。安装成功后,可以在各个目录找到安装文件。下面是指定安装目录后的目录结构:
清理
根据Makefile中定义的clean操作,清理编译时留下的临时文件。该操作不影响程序安装,也可不执行。当重复编译时,也可用该命令清除上次编译留下的文件,防止两次编译的文件相互影响。
make clean
卸载
源码包的卸载有以下几种方式:
- 如果安装时指定了程序的安装目录,则直接删除整个程序安装目录即可;
- 如果安装时没有指定安装目录,可以尝试在源码包目录执行
make uninstall
命令,如果Makefile中定义了卸载规则,即可卸载; - 如果安装时没有指定安装目录并且Makefile中也没有定义卸载规则,那就只能手动搜索程序文件进行删除
RPM(Red-Hat Package Manager)
RPM是专门为了解决源码包难以安装、升级和卸载等问题而产生的,除了红帽公司的Linux,OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本也都有采用RPM。
原理
RPM要求软件商把他们的软件先编译,然后打包成RPM包,RPM包内需要记录这个软件安装时依赖的其他组件。当在Linux系统中安装RPM软件包时,系统RPM会根据RPM包内的依赖信息校验当前系统是否满足安装条件,如果条件满足,则进行安装,如果条件不满足,则不允许安装。安装成功后,系统RPM会将该软件的信息记录到系统的RPM数据库中,方便后续的查询、更新和卸载。
常用选项
-i
:安装程序-v
:显示指令执行过程-h
:显示安装进度-U
:升级程序,如果升级的程序没有安装过,则直接安装,如果安装过,则进行更新-F
:升级程序,如果升级的程序没有安装过,则不进行安装,如果安装过,则进行更新-q PACKAGE_NAM
:查询是否有安装PACKAGE_NAM-qa
:查询所有安装的程序-qi PACKAGE_NAM
:查询PACKAGE_NAM的详细信息-ql PACKAGE_NAM
:查询PACKAGE_NAM所有文件-qc PACKAGE_NAM
:查询PACKAGE_NAM所有配置文件-qR PACKAGE_NAM
:查询PACKAGE_NAM依赖的档案-qf FILE_NAME
:查询FILE_NAME属于哪个软件包-qp[icdlR] PACKAGE_NAM.rpm
:查询指定安装包的信息,上面的命令是查询已安装的包信息-e PACKAGE_NAM
:卸载PACKAGE_NAM
实践
下面我们使用rpm
来实操一下安装和卸载
安装
# 下载docker的rpm安装包
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
# 安装docker的rpm包
rpm -ivh docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
# 也可以直接指向rpm包的链接
rpm -ivh https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm
执行安装命令后,输出结果如下:
此处要着重说明,rpm检测依赖不通过时,会不予安装,还是要人为手动安装依赖的组件,安装依赖是一件非常麻烦和考验耐心的事,正因为安装依赖的不友好,才有了后面的YUM
。整个安装过程非常辛酸,这里就不细说了。
程序更新
# 更新nginx程序
rpm -Uvh nginx-1.20.1-1.el7.ngx.x86_64.rpm
查询
# 查询已安装的nginx包的信息
rpm -qi nginx
# 查询未安装的nginx-1.20.1-1.el7.ngx.x86_64.rpm包信息
rpm -qpi nginx-1.20.1-1.el7.ngx.x86_64.rpm
# 查询nginx.conf文件属于哪个包
rpm -qf nginx.conf
卸载
rpm的卸载需要从最底层开始卸载,如果rpm检测到你卸载的程序被其他程序依赖,则会提示你先卸载顶层的程序。当然你也可以用--nodeps
进行强制删除,但是会导致所有依赖该程序的高层程序无法执行。
# 卸载nginx
rpm -e nginx
# 查询是否安装nginx,会输出:未安装软件包 nginx
rpm -q nginx
Yum
由于rpm无法解决依赖安装的问题,所以就有了Yum。Yum软件仓库里保存了大量的rpm包,当用户需要安装A软件时,Yum会从软件仓库中获取A软件的rpm包,然后分析出安装A软件需要的依赖程序,接着自动从服务器下载被依赖的软件包并安装,然后再进行A软件的rpm包安装,这样就解决了rpm安装依赖程序的痛点。
使用方式
设置Yum源
Yum源默认在/etc/yum.repos.d
目录中定义,是一个以repo
结尾的配置文件。我们以系统默认的源为例:
# 源名称,不能重复
[base]
# 名称,说明源的意义,不重要
name=CentOS-$releasever
# 启动该源
enabled=1
# 当存在多个源时的选择策略,priority按顺序选择,roundrobin随机选择
failovermethod=priority
# 远程镜像地址
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
# 是否需要查阅RPM的数字签名
gpgcheck=1
# 数字签名的公钥地址
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7
yum支持设置多个源,只要新建一个repo
文件并按上述配置即可。例如,nginx官方提供了自己的yum源地址,需要安装nginx可以增加一个指向nginx官方仓库的源即可。下面是一些查询源信息的命令:
# 列出所有源
yum repolist all
# 清除所有仓库的缓存,当修改源信息后,需要执行该命令
yum clean all
查询
# 列出仓库中所有软件包,会输出非常多的软件包,不要直接使用
yum list all
# 列出仓库中以nginx开头的软件包
yum list 'nginx*'
# 列出可更新的软件包
yum check-update
# 搜索nginx相关的安装包
yum search nginx
# 查看软件包信息,会列出:是否安装、名称、架构、版本、描述等信息
yum info nginx
# 查询这个文件属于哪个程序,类似rpm -qf nginx.conf
yum provides nginx.conf
安装、更新和卸载
# 安装软件
yum install nginx
# 重新安装软件
yum reinstall nginx
# 更新软件
yum update nginx
# 卸载软件
yum remove nginx
离线安装
有时候,服务器是不允许连接外网的,这时候是无法从远程Yum库下载安装包。我们可以先用能上网的机器下载好安装包,然后复制到目标服务器进行离线安装,操作过程如下:
- 下载安装包
# 仅下载安装包,不进行安装,下载的包都在/root/docker目录中
yum install --downloadonly --downloaddir=/root/docker docker
- 把安装包复制到目标服务器上
- 安装,可以直接逐个安装,如果机器上已经安装了Yum程序,也可以建立本地Yum源,用Yum安装
# 本地yum源配置文件
[docker]
name=docker
baseurl=file:///tmp/docker
gpgcheck=0
enabled=1
# 配置好之后清空缓存即可用yum安装
yum clean all
dpkg
“dpkg ”是“Debian Packager ”的简写。为 “Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自“Debian”的“Linux ”发行版都使用 “dpkg”,例如 “Ubuntu”、“Knoppix ”等。dpkg和rpm非常相似,优缺点也一致,它只负责包的安装和管理,不解决软件的依赖安装。
选项
-l
:列出当前已安装的包-l PACKAGE
:输出已安装的PACKAGE的版本等概要信息-L PACKAGE
:输出已安装的PACKAGE的关联文件-s PACKAGE
:查询PACKAGE的详细信息-S KEYWORDS
:搜索包含KEYWORDS的包文件路径-c PACKAGE.deb
:列出安装包的内容-r PACKAGE
:卸载包,但是留下配置文件-P PACKAGE
:卸载包,不保留配置文件
实践
下面我们在Ubuntu上安装docker来实践一下。
安装
# 下载deb安装包
wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_20.10.7~3-0~ubuntu-xenial_amd64.deb
# 安装程序
dpkg -i docker-ce_20.10.7~3-0~ubuntu-xenial_amd64.deb
由于dpkg和rpm一样,并不解决依赖安装问题,所以如果缺少依赖,会报错,提示类似下图:
这种情况下,只能根据提示,依次安装各个依赖程序,才能完成安装。
卸载
# 删除docker
dpkg -P docker
# 输出已安装的docker信息
dpkg -l docker
输出内容为:
apt
apt和Yum类似,解决了dpkg没有解决的依赖程序安装的问题。
apt和apt-get的区别
apt
可以看做是集apt-get
、apt-cache
和apt-config
为一身的命令,所以系统建议大家优先使用apt
命令。但是apt
命令并不完全向下兼容apt-get
命令,所以一些细节操作,还是需要使用apt-get
命令。
apt主要命令
# 安装程序
apt install PACKAGE
# 卸载程序但是不移除配置文件
apt remove PACKAGE
# 卸载程序并移除配置文件
apt purge PACKAGE
# 更新本地索引
apt update
# 更新程序
apt upgrade PACKAGE
# 完全更新,更新前会删除之前的旧软件包
apt full-upgrade PACKAGE
# 搜索应用程序
apt search PACKAGE
# 显示软件包具体信息
apt show PACKAGE
# 列出指定的软件包
apt list
apk
apk类似Yum和get,是Alpine Linux使用的软件包管理工具。Alpine Linux由于其小巧和安全性,替代Ubuntu称为Docker的指定官方镜像,所以我们也要熟悉apk如何使用。
apk主要命令
# 软件包
apk add PACKAGE
# 更新本地索引
apk update
# 删除软件包
apk del PACKAGE
# 升级软件包
apk upgrade PACKAGE
# 查找指定的软件包
apk search PACKAGE
# 列出所有已安装的软件包
apk info
# 输出指定软件包的信息
apk info PACKAGE
# 输出FILENAME所属的软件包
apk info --who-owns FILENAME
执行程序
安装好的程序一般都有一个可执行的二进制文件,我们可以通过输入二进制文件名来执行程序,我们常用的命令都有对应的可执行二进制文件,比如ls
对应的二进制文件就是/bin/ls
。执行二进制文件(或者说执行命令)有以下两种方式,但是无论哪种方式,都需要对应文件有可执行权限:
直接输入文件名称
直接输入二进制文件名(命令),系统会做如下操作:
- 先从alias中查找,看是否为设置的别名,如果是,则执行该别名的实际命令
- 内置命令中查找,内置命令不需要到磁盘中搜索
- 从PATH环境变量的目录中寻找
- 如果上述都无法找到,则提示“找不到该命令”
- 执行程序,系统不仅可以执行二进制文件,还可以执行shell脚本,系统会根据不同的文件类型以不同的方式执行
输入文件的路径
输入文件路径省略了系统去查找可执行文件的工作,直接进入“执行程序”这一步骤,以下两种方式均可以执行nginx文件:
# 执行当前目录中的nginx文件
cd /usr/sbin
./nginx
# 执行指定路径的文件
/usr/sbin/nginx
初学者有一个比较容易混淆的地方,就是把./
和.
(即source
)的作用等同起来,以为./
是执行程序的命令,实际上它只表示了当前目录的意思,告诉系统在当前目录下查找可执行文件。
参考
《Linux就该这么学》
《鸟哥的Linux私房菜》