【Linux学习笔记】十二、linux软件包管理1 您所在的位置:网站首页 Linux管理软件包常用的模块 【Linux学习笔记】十二、linux软件包管理1

【Linux学习笔记】十二、linux软件包管理1

2023-12-07 19:32| 来源: 网络整理| 查看: 265

八、linux软件包管理 (一)搞清基本概念

1、首先先清理一下你的机器环境 因为本次要安装软件,而且安装有多种方式,为避免在安装过程中出现很多奇怪的报错,建议先清理一下你的机器环境。

yum remove nginx httpd -y 这种清理方法会有配置文件残留。所以建议你用系统快照的方式清理系统。

2、什么是代码、程序 电脑程序program,就是用某种编程语言编写的一堆代码,里面包含了该语言特有的指令、关键字和符号等。

linux自带的shell脚本: 

3、什么是软件 就是程序员通过编程语言写好的一堆程序文件。通俗的说,就是一堆文件夹,里面有一堆代码文件。这些文件叫源代码、源码。然后通过一些方式把这些源码运行起来,就是软件程序。

源代码运行的方式有2种,一种是用编译性语言写的源代码,要先全部编译完再运行;另外一种是用解释性语言写的源代码,边解释边运行。比如下面的场景:

(1)比如,我们桌面的xshell、网易云音乐、qq、微信等软件工具。就是程序员用某种语言写好的一堆源代码,然后把这些源代码进行编译(就是应用程序),再和配置文件、数据一起打包,生成一个个单个的qq.exe、wechat.exe等的可执行文件。这个可执行文件也叫安装包、也叫安装软件。

(2)再比如,我们linux中的/usr/bin/ls或者/usr/bin/touch等命令,也是程序员先写的源代码,然后编译生成一个个可执行的二进制命令。

这些都是源码编译后,生成的应用程序,我们称为软件。只不过一个更像软件一个只是个单个命令,但都是软件。

(3)再比如,我们平时访问的网站,就是nginx软件(当然也可以是其他的web软件),就是程序员写的程序文件,但是是通过这样的运行方式,以网站后端源代码举例: (3-1)比如程序员用golang这样的编译性语言进行网站后端开发。他写了200行代码(这200行代码是可执行命令,就是还没编译);还写了一堆配置文件和数据文件。然后运维人员把这200行代码编译生成比如start_go的可执行命令,此时,编译后是看不到那200行的源代码的。然后只要在linux下./start_go 这个可执行命令,这200行代码+配置文件+数据文件,就在运维机器上运行起来了。这就是linux的一个后端程序了,我们就可以用ps命令看到这个程序的进程了。

(3-2)再比如,如果程序员是用python这样的解释性语言进行网站后端开发的,那他发给运维人员的就是一个压缩包,压缩包里面是一堆python源码,就是一堆文件夹,里面一堆.py文件。在这个压缩包中我们是能看到源码的。运维人员就是把这个压缩包解压缩,生成一堆源码文件,然后+配置文件+数据文件,放到linu服务器上运行,就是一个python的后端网站。

这是编译性和解释性语言写的程序,部署的方式不同。

4、软件包 软件包,指程序安装所需要的一个文件,用于安装某个程序、某个软件。 在可视化系统下,一般双击安装即可。下面以win中的QQ为例:

 看一下都安装了什么:

所以:软件包,就是将源代码(也就是程序员写的应用程序,编译后是二进制命令)、配置文件、数据已经打包的一个单个文件。 以nginx软件为例,就是将 /usr/sbin/nginx这个软件的二进制命令(是程序员开发的源码编译生成成的)、 /etc/nginx/nginx.conf这个软件的配置文件,里面写了用于控制该软件不同功能的参数、 以及相关数据, 三者进行打包生成的一个单一的nginx_v.10.rpm文件,这个文件就是nginx的安装包,也叫nginx软件包。 用户下载nginx_v.10.rpm这个软件包然后去安装。安装的命令是yum install nginx -y。所以yum install nginx -y这个安装命令其实就是,先下载nginx_v.10.rpm这个软件包,然后yum自动帮我们安装这个软件。

所有linux发行版都采用了某种形式的软件包系统,这使得linux软件管理和在win下一样方便,usse、red hat、defora、centos等发行版都是用rpm包,Debian和Ubuntu则使用.deb格式的软件包。

win系统下,软件安装包一般是.exe格式的软件包。 macos系统下的软件安装和win是相同的步骤;苹果系统的安装包一般是.dmg格式的 linux系统下,安装包一般是.rpm的软件包。但是不是双击点点,而是通过命令去安装

5、源码包、二进制包 linux系统下的软件安装包其实是细分为:源码包和二进制包。其中,

源码包: 就是一大堆源代码程序,是由程序员用某种编程语言写出来的,有特定的格式和语法的一大堆文件。这种安装包叫源码包。就是不帮你编译,用户自己编译后再安装。编译这步是必须的,因为源码都是用编程语言写的,但计算机只认识0101,所以必须要编译成机器语言,也就是二进制语言才能安装。

二进制包: 也是一大堆源代码程序,是由程序员用某种编程语言写出来的,有特定的格式和语法的一大堆文件。但是,这种安装包帮你把源码已经进行编译了。(就是编译成一个单个可执行命令,也就是一个二进制命令,然后再+配置文件+数据文件,三者打包成一个单个文件。就是我们前面讲的.rpm安装包。所以一个rpm包其实就是一个二进制包)。软件所有者之所以帮你编译,一是由于编译过程耗时较长,二是编译过程中如果出错,用户很难解决,所以,为了防止用户在编译过程中出错,人家直接帮用户编译完毕,用户直接拿二进制包进行安装就不会出现太大问题了。

所以,软件包有多种形式,比如源代码包、二进制软件包、centos平台提供的RPM安装包和RPM管理命令等。 所以,安装nginx有三个方式:RPM包安装管理命令、源码包安装管理、yum自动化软件管理命令 所以,如果我们下载的是源码包,我们就还得make install 编译安装。其中编译就是先将源代码生成机器可执行的二进制命令

6、理解源代码的编译过程 程序员写的代码,比如print('hello world!'),这些是计算机看不懂的,计算机只认识0101,所以源代码要经过编译器compiler,编译成机器语言,才能被执行。 就是源代码,经过编译后,才成为可以使用、可以执行的软件。我们电脑上很多软件都是编译后的产物。 c语言用gcc编译器 golang语言用golang编译器 python语言用Pyhton解释器

但是,c和golang是编译性语言,如果你是用c和golang写程序,如果你想执行你的程序,你就要手动的进行build,将源码一次性的编译成一个二进制的命令,二进制命令就是机器可以识别的符号了,机器就可以执行了。

而pyhon语言是解释性语言,如果你是用python写的程序,你想执行这个程序,你就得安装python解释器,python解释器帮你一边解释你的代码一边编译成可执行命令(就是解释一部分编译一部分就执行一部分,直到全部代码解释编译执行完毕),你的程序也就被计算机执行完毕。

编译性语言是将所有的代码检测完毕后,再一下子全部生成另一个正确的二进制命令。 解释性语言是先翻译、再编译、再执行第一行代码,然后再翻译、编译、执行第二行代码,是一行一行翻译编译执行的。 所以即使你代码最后一行出错了,前面的还可以被执行,只是走到最后一行出错,然后程序崩溃。而编译性语言则是一下子全部检测全部编译,即使最后一行代码出错了,全部的代码就都无法编译了,也就更无法执行了。

7、程序编译过程示例 不同编程语言没有孰优孰劣之分,在不同的场景下选择最佳的语言即可。 解释性语言,比如python,也称脚本语言,多用在快速开发上,比如一些工具型的软件,比如网站开发等场景。 编译性语言,比如c,c++,golang,对底层操控比较精确,所以适用于开发系统工具,比如docker、k8s、linux操作系统的开发等。 系统级开发:   C/C++ : httpd, nginx   golang : docker 应用级开发:   java: hadoop, hbase   python: openstack 还有perl, ruby, php等解释型语言,这里就不举例了。

示例1:下载编译器,用golang写一句hello world,展示编译的过程。

 

编译的好处在于,该二进制命令,现在可以任意的丢到一个64位架构的linux机器上,可以直接运行。所以是一次编译,到处运行。这也是docker的理念,docker就是用golang写的。如果你不编译的话,别人要用你的程序,别人的机器上首先得有golang的编译器,它才能go run hello.go这个文件。但如果别人机器上没有golang编译器,但他是能够运行二进制命令的,所以他是可以运行hello.go文件编译后的二进制文件的。所以当程序员用编译型语言写程序时,写完程序员再编译一下,这样别人啥也不用安装就能用你的程序了。但是如果程序员用的是解释型语言写的程序,那就编译不了,就必须得安装该语言对应的解释器才能解释编译执行,这样别人要使用你的程序,别人也必须得先安装该语言对应的解释器,他才能使用你的程序。 

 那我把这两个文件发到别人的机器上看看效果:

别的机器由于没有安装golang编译器,就无法运行hello.go文件,但是可以正常运行编译后的二进制文件hello

示例2:下载解释器,用python3语言写一句hello world,展示解释的过程。

由于linux系统内置了bash解释器,所以我们只要下载安装python3的解释器即可、

这个hello.py程序不管是在本机还是在别人机器上都必须按照python3解释器才能编译执行。

小结:

你在linux中,99%的情况下,我们能遇见的软件包只有两种,一种是源码包,另一种是二进制包。

源码包是程序员用各种编程语言写的代码文件,比如.c、.py、.go文件等。 由于编程语言分编译型语言和解释型语言,所以你从网上下载的源码包,就有可能是编译型语言源码包,也可能是解释型语言源码包。

  (1)如果你下载的源码包中的文件是用c、golang等这种编译性语言写的,那你需要在你的电脑里安装该语言对应的编译器,然后把下载的文件编译成二进制命令文件,然后你直接运行二进制命令文件即可。而且你把这个二进制命令文件随便拷贝到其他机器上,其他机器啥也不用安装,就可以执行二进制命令文件了。

  (2)如果你下载的源码文件是用python、php、bash等这种解释性语言写的,那就不能直接把源码文件一次性编译成二进制文件然后所有的机器都可以使用了。你就必须得安装该语言对应的解释器,就是搭建语言环境,你才能在解释器的帮助下,边解释和编译源码文件边执行。

二进制包就是先用编译型语言写完的,比如.c、.go等文件,但是作者已经把这些.c、.go等文件编译成了二进制文件了的,这些二进制文件就是二进制包。当我们从网上下载的是二进制包,我们就不需要在自己电脑上搭建该语言的环境,而是可以直接执行这些二进制文件了。因为前面不是讲过,一次编译到处运行嘛。二进制包的形式有2种:

  (1)比如centos平台使用的rpm包,比如nginx-1.10.rpm文件,就是二进制文件,我们用vim打开nginx-1.10.rpm这个文件是什么也看不懂的。或者说能用cat命令读出的文件就是源码文件,不能用cat命令读出的文件就是二进制文件。因为cat是读不出二进制文件内容的。

  (2)还有一种特殊的、很方便的二进制包形式,就是tar包,比如xxx.tar.gz格式的文件。这种文件就类似已经把源码文件编译完成后生成的二进制文件,再把这个二进制文件压缩,生成一个tar包。别人下载了这个tar包,只要解压缩后就拿到二进制文件,也不需求搭建语言环境,直接执行该二进制文件即可。这种就类似我们上面的案例中,把hello.go文件编译完毕后生成的hello二进制可执行文件,再把hello二进制文件打包压缩,生成一个比如hello.tar.gz文件。然后客户下载了hello.tar.gz直接解压缩、运行hello文件即可。

在1%的情况下,除了源码包、二进制包外,我们还会遇见一种二进制源码包! 他会给你提供一个也是rpm的包,但是这个rpm包是个半成品,安装后不能直接使用。你先下载到本地,然后再用rpm,rpmbuild命令自己再构建一个真正的rpm包,或者重建成源码包后再安装使用。这种包的命名中一般都有el7、src等字样。现在这种方式已经很少了,知道即可。

以nginx软件包为例,我们可以到nginx官网上看到很多很复杂的格式,比如下面4种:   (1)编译好的rpm包:nginx-1.10.rpm,也是一个二进制包,vim打开是看不懂的,cat是打不开的。主要是centos平台用的安装包。   (2)nginx源代码包:nginx-2.3.3.tar.gz ,这种什么都不加的,只有版本号的,就是纯C语言的源代码文件包   (3)解压即用的二进制包:nginx-2.3.3-x86-64.tar.gz ,这种加x86-64就是告诉你可以在64位机器上直接运行的ningx命令。   (4)rpm源码二进制包:nginx-el7-src.rpm, el7表示适用于centos7平台的、src是源的意思。这种包需要再次构建,用的极少了,知道即可。 二进制软件包格式,以系统平台区分: 区别: 二进制包:不需要对源代码进行编译了,拿来即用,安装简单,但是程序安装路径受限、可定制性差。 源代码包:需要编译后使用,安装难度较高,但定制化很强。 比如nginx.rpm安装包,软件的可执行命令自动的就安装在/usr/sbin/nginx这里,软件的配置文件会自动安装在/etc/nginx.conf这里,日志文件会自动安装在/var/log/nginx.log路径下。安装者不能自己选择路径,安装的路径是固定的。此外,可定制性也差,比如如果安装者想对nginx软件进行扩展,打开一些额外的功能,但是nginx.rpm包的安装比如就只默认有8个功能,那你就不能开启更多功能。假如安装者用的是源代码包安装,安装者就可以在编译过程中,自定义开启比如20个功能,也可以自己指定日志、配置文件、二进制命令等文件的安装路径。 (二)rpm包下载、安装、查询、升级、删除、手动处理依赖关系

1、如何找到rpm格式的软件包?

(1)如果你是在线状态,从网络上找到并下载软件包 有很多软件的官网,或者很多第三方软件仓库,都会提供某些软件的rpm包,供用户下载。当然最直接最安全的方式就是通过软件的官网下载。

(2)如果你是在线状态,你还可以通过rpm命令获取 rpm命令是linux内置的一个工具来安装rpm软件包的。 linux中的rpm命令可以类比win中的“控制面板”,win中的控制面板就是管理windows下安装的应用程序,你在控制面板中可以卸载或更改或修复你的应用程序。 注意:如果你的软件不是通过rpm包安装的,也就无法通过rpm工具管理了。

(3)如果你是离线状态,可以通过本地光盘镜像文件获取rpm包 你可以通过centos7.iso镜像文件,这个文件里面内置了绝大多数软件的rpm包。

(4)如果你是离线状态,你还可以自己手动拷贝 需要你提前下载好软件的rpm包,然后拷贝到要安装的服务器上,再安装。这种方式你需要手动解决依赖关系。

2、在win平台找到并下载rpm格式的软件包?

前面讲了我们可以从官网找到rpm软件包,这是mysql软件官网 http://www.mysql.com 的下载页面:

 这是nginx软件的官网Index of /packages/ 的下载页面:

就是根据你的机器的cpu架构、以及系统版本,找到合适的链接下载即可。

你也可以用我推荐的2个网址:rpm.pbone.net 和 www.rpmfind.net 进行全网搜索寻找再下载:

 

当然,这种途径下载的安装包不一定安全。

这些都是在win平台上通过浏览器找到rpm并点击下载的,是下载到你的win上面。如果我们想直接下载到linux中,我们就把在win中找到的文件的链接复制下来,然后在linux中用wget命令下载,就下载到linux中了。这部分知识在前面讲文件的时候详细讲过。

3、rpm 命令 RPM,Redhat Package Manager,redhat软件包管理工具的缩写,是centos系统中,默认的管理应用程序的一个工具。相当于win中的控制面板工具。 (1)安装rpm软件包:rpm -ivh xxx.rpm (2)升级rpm软件:rpm -Uvh 软件名 (3)查询rpm软件包:简单查询rpm -qa 软件名           详细查询rpm -qi 软件名   这2中查询都是软件安装完毕后才能查询出信息。但查询出来的信息类似软件安装包的说明。   如果直接rpm -qa后面不写软件名,就会出现非常多文件信息,就相当于win中的控制面板中显示了所有的应用程序 (4)查询这个安装包安装完毕都生成了哪些文件:           rpm -qf 文件名,根据文件名查询这个文件属于哪个软件包           rpm -ql 软件包名,表示列出该软件包都生成了什么文件。 (5)rpm安装时,软件默认安装在/usr/sbin/目录下面,同时systemctl命令也是可以管理软件 (6)卸载软件:rpm -e 软件名。说明:一是,只有用rpm安装的软件才能用rpm -e卸载。二是,卸载就是删除软件安装完毕后生成的文件,而不是xxx.rpm软件包,是删除像/usr/sbin/目录下的相关文件。

4、以nginx软件为例,展示wget下载、安装、查询、运行、卸载

5、用本地光盘的形式,获取软件的rpm包并安装 前面1-(3)讲了可以通过本地光盘镜像文件获取rpm包。就是你可以通过centos7.iso镜像文件获取rpm包。 

从光盘里的rpm包安装vim过程还是挺复杂,下面先讲个外设的挂载和取消,然后在第6点继续将vim安装。

光盘等外设的挂载和取消挂载

 当然,我们完全可以在自己想在的目录下,mkdir一个文件夹,然后把/dev/sr0挂载到自己创建的文件夹下面。只是linux默认把U盘、光盘等挂载在/mnt目录下。

6、手动处理依赖关系、版本升级 这部分是最难的部分,每个人的机器都不一样,所以在安装过程中会出现各种花式报错,要具体情况具体对待。其中最常见的一种情况就是安装某个软件包的时候需要先安装其依赖包,此时就需要手动安装这些依赖包。

所以当一个软件版本升迁太大的时候,就说明底层会有大量的软件包都要跟着更新升级,所以此时不建议手动处理依赖关系,因为需要再装一堆rpm包,工作量太大,直接卸载再安装新版本即可。所以升级都是小版本的升级。

这里继续演示如何安装光盘里的vim的rpm包,展示如何手动处理依赖关系,以及版本问题怎么解决

 我们现在找到的vim-minimal-7.4.16xxx.rpm包是我在虚拟机的光盘中插入的是mini版本的操作系统软件,所以rpm包非常少,这个包我也尝试了几次安装不上。所以现在我们换一个DVD版的linux看看里面的vim包有哪些:

就是说我们想装vim-common7版本,也装不上了,因为现在系统中已经有vim-common8版本了。但是要安装vim-enhanced就得安装vim-common7,8不行。因为vim-enhanced依赖的包是7不是8。 说明:由于我之前的vim是通过yum install vim -y安装的。但我的yum是配置的是去阿里云的rpm仓库找的vim版本,而阿里云的版本比我现在的vim-enhanced版本还高,所以阿里云的vim依赖包版本也高。而我卸载之前的vim,用的是yum remove vim -y,这种卸载方式不是完全卸载,它的配置文件或者依赖,比如vim-common,就没有卸载。所以导致我现在安装DVD里的vim-enhanced就由于安装包版本不对而无法安装。此时vim-common包也不能降级,那我们现在只能先把vim-common8卸载了,然后再安装vim-common7 

rpm依赖冲突一定是要一层层去解决,也就是依赖说少了什么软件,你就得先安装什么软件。

(三)源码编译安装

1、根据需求配置 在配置的时候,你可以加上这些参数,指定一些额外的功能 --prefix=xxxx 软件家目录 --bindir=xxxx 命令的目录 --etcdir=xxxx 配置文件的目录 --mandir=xxxx 文档路径 --locale=xxxx 语言编码 2、编译并安装 make && make install (有的是使用gcc编译器进行编译)

这里还是以安装nginx软件为例,讲解源码编译安装的过程: 第一步:清除机器上已经安装的nginx

第二步:获取源程序软件包

第三步:编译安装前的环境配置 nginx默认是不支持https证书功能的,就是在win上的浏览器地址栏中打开这种不持支https的网址,浏览器会显示“不安全”的,就是没有小锁而是一个小三角标志,这个标志表示数据是非加密的,有数据外泄的可能。而且这种网址发送到手机端,手机也是打不开的,就是手机也不支持这种网址。所以在编译nginx的时候,我们要给nginx添加支持https证书的功能。怎样添加?就是编译安装nginx的时候,打开nginx的一些非默认功能。而要打开nginx的这些非默认功能,你的机器要先安装一些这些非默认功能依赖的环境包,比如你机器要安装linux系统支持的https模块,就是安装openssl模块,然后再安装nginx时,nginx就和openssl模块结合,就可以对数据进行加密了。所以:首先是先搭建nginx的运行环境;然后才是安装nginx的时候开启一些默认功能。 

由于我的机器的linxu是个mini版本的,所以很多依赖的库和模块都没有,所以要安装比较多的模块。如果我们这步我们的环境和依赖没有完全安装,或者没有正确安装,尤其是openssl openssl-devel pcre pcre-devel zlib zlib-devel这几个模块没有正确安装,那第四步中的http_ssl_module模块是无法安装并开启的。

第四步:编译并安装,开启nginx的其他扩展功能 这一步要注意的是nginx的参数配置:比如,参数prefix=/opt/my_nginx0327,就是表示我要把nginx安装到这个目录下;参数with-http_ssl_module表示开启nginx的http_ssl_module模块。

第五步:检查你安装的nginx是否生成 我们编码安装的nginx全部都在/opt/my_nginx0327目录里面了,现在查看一下 

当我们想删除nginx这个软件的时候,由于它是我们编译安装的,所以直接删除/opt/my_nginx0327这个目录即可。用命令:rm -rf /opt/my_nginx0327/即可,就全部删除了。不会像前面我们yum安装和rpm安装生成的各种文件默认的路径很多,删除的时候也是残留很多比如日志、配置文件等文件,而无法全部删除。

说明,本部分可以配合后面的nginx进阶部分一起阅读,尤其是安装完毕后给一些配置啥,本部分没有展开讲,可以参数nginx进阶理解。

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有