软件安装
2023-1-27
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

 

Linux 安装软件

Windows 安装软件大概的过程如下:
  1. 在用户指定的安装目录下建立安装程序目录
  1. 拷贝相关 dll 动态库到安装目录
  1. 拷贝 exe 可执行文件到安装目录
  1. 拷贝配置文件到安装目录,比如 Windows 下的 ini 配置文件
  1. 把启动配置或者程序依赖的配置放入注册表中
  1. 如果是服务程序,注册并且启动该服务
Linux 安装软件大概的过程如下:
  1. 建立安装目录
  1. 拷贝类库
  1. 拷贝可执行程序
  1. 根据需要选择性配置和启动服务
 
WindowsLinux的安装过程几乎是相同的,只是安装方式有些不同。在 Windows下我们经常使用图形界面来安装,双击安装包即可安装软件,而在 Linux下经常通过命令行来安装。对于卸载过程,也是相同的,都是安装的过程逆过程
注意:Linux下的/usr目录相当于Windows下的ProgramFile目录;Linux下的动态库后缀是.soWindows下是.dll
 
Linux系统下安装软件的方式:
  • 通过Tarball 源码安装
    • linux下的软件大都进行了GPL的授权,即开放了源码,因此可以通过下载源码,进行编译的方式来安装软件。这种方式的优点是比较灵活可以根据使用者的需求去更改源码。另外,相比于直接闭源软件,开源软件的安全性更好,因为所有使用者都可以阅览源码,因此可以及早发现软件漏洞以及进行修复。
  • 通过二进制文件安装
    • 目前在Linux界软件安装方式最常见的有两种,分别是:
    • dpkg: 这个机制最早是由Debian Linux 社群所开发出来的,通过dpkg的机制, Debian 提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息,实在非常不错。 只要是衍生于Debian的其他Linux distributions大多使用dpkg这个机制来管理软件的, 包括B2D, Ubuntu 等等。
    • RPM: 这个机制最早是由Red Hat这家公司开发出来的,后来实在很好用,因此很多distributions就使用这个机制来作为软件安装的管理方式,包括 Fedora, CentOS, SuSE 等等。
    •  
      dpkg/rpm这些机制或多或少都会有软件属性相依的问题,目前新的Linux开发商都有提供“线上升级”机制:
      distribution 代表
      软件管理机制
      使用指令
      线上升级机制(指令)
      Red Hat/Fedora
      RPM
      rpm, rpmbuild
      YUM (yum)
      Debian/Ubuntu
      DPKG
      dpkg
      APT (apt-get)
      notion image
      Yum软件仓库可以根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安装到系统。
 

Tarball 源码安装

通过源码形式安装软件,用户通常需要通过网络下载源码文件,而源码文件通常比较大,如果直接下载,则需要占用较大带宽,为了缓解这个问题,源码文件通常首先通过Tar打包,然后进行压缩,形成xxx.tar.gz等压缩文件,用户往往通过互联网下载打包、压缩后的源码文件,然后进行解压后再安装。因此,将这种形式的源码文件称之为Tarball文件。
通常一个Tarball软件安装包中包含以下内容:
  • README或者INSTALL安装说明文件
  • configure文件:检测主机的环境,包括寻找库文件、检测gcc是否存在等,根据这些主机环境信息生成Makefile文件
  • 源码文件
 
Tarball形式安装软件的一般步骤
  • 下载Tarball软件包(最好放在/usr/local/src目录下),并使用tar并解压
  • ./configure --help | more 查看安装参数
  • 采用configure生成Makefile文件(通常需要执行./configure 命令)
  • 为新安装的软件在/usr/local下新建一个目录
  • 采用make install(根据README中的具体命令安装,通常情况下是make install)将软件安装在新建目录下
 
采用补丁包更新软件
例如:v0.1 升级到 v0.2
  • 下载0.1版本到0.2版本的补丁包.patch文件
  • 根据.patch文件更新源码文件
  • 重新编译
 

函数库管理

软件依赖的库有两种类型
  • 静态库:libXXX.a --在编译时会直接整合在源文件中,所以体积较大
  • 动态库:libxxx.so-- 只是在源文件中存放一个指针,使用时才会去读取函数库;虽然无法独立运行,但升级函数库时不用重新编译源文件
比较项
静态库
动态库
扩展名
libxxx.a
libxxx.so
文件大小
软件间不共享,较大
软件间共享,较小
依赖
软件升级
大多数库放置在:/lib64/lib
内核库文件放置在:/lib/modules
 
查看软件依赖的库文件:
ldd命令用于打印程序或者库文件所依赖的共享库列表。语法格式:ldd [参数] [文件]
常用参数:
-v
详细信息模式,打印所有相关信息
-u
打印未使用的直接依赖
-d
执行重定位和报告任何丢失的对象
-r
执行数据对象和函数的重定位,并且报告任何丢失的对象和函数
-- -help
显示帮助信息
 
将动态库加载到cache中
  • /etc/ld.so.conf中追加库文件所在目录
  • 执行ldconfig
 

校验软件源代码的正确性

源代码可能遭遇修改,有风险;可以利用MD5, SHA1 或 SHA256 加密机制来处理,获得一个唯一计算码,比较两次码值,若不一样则表示被修改过;
 

RPM与 SRPM

RPM全名是RedHat Package Manager, 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。
他最大的特点就是将你要安装的软件先编译过, 并且打包成为RPM机制的包装文件,通过包装好的软件里头默认的数据库记录, 记录这个软件要安装的时候必须具备的相依属性软件,当安装在Linux主机时, RPM会先依照软件里头的数据查询Linux主机的相依属性软件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入RPM的数据库中,以便未来的查询、验证与反安装!这样一来的优点是:
  1. 已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译);
  1. 软件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装
但是这也造成些许的困扰。由于RPM文件是已经包装好的数据,也就是说, 里面的数据已经都“编译完成”了!所以,该软件文件几乎只能安装在原本默认的硬件与操作系统版本中。 也就是说,主机系统环境必须要与当初创建这个软件文件的主机环境相同才行! 举例来说,rp-pppoe 这个 ADSL 拨接软件,他必须要在ppp这个软件存在的环境下才能进行安装!如果你的主机并没有 ppp 这个软件,那么除非先安装ppp否则rp-pppoe就是不让你安装的 (也可以强制安装,但是通常都会有点问题)。
所以,通常不同的 distribution所释出的RPM文件,并不能用在其他的distributions上。举例来说,Red Hat释出的 RPM 文件,通常无法直接在SuSE上面进行安装的。更有甚者,相同 distribution 的不同版本之间也无法互通,例如CentOS 6.xRPM文件就无法直接套用在CentOS 7.x !因此,这样可以发现这些软件管理机制的问题是:
  1. 软件文件安装的环境必须与打包时的环境需求一致或相当
  1. 需要满足软件的相依属性需求
  1. 反安装时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题
 
如果真的想要安装其他 distributions提供的好用的 RPM 软件文件时?还好,有SRPM
SRPM,是 Source RPM的意思,也就是这个RPM文件里面含有源代码!通常 SRPM 的扩展名是以 *.src.rpm 这种格式来命名的。不过,既然 SRPM 提供的是源代码,那么为什么不使用 Tarball 直接来安装?这是因为 SRPM 虽然内容是源代码, 但是他仍然含有该软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。同时,他与 RPM 不同的是,他也提供了参数配置文件 (就是 configuremakefile)。所以,如果下载的是SRPM ,那么安装该软件时:
  • 先将该软件以 RPM 管理的方式编译,此时 SRPM会被编译成为 RPM 文件
  • 将编译完成的RPM文件安装到Linux系统当中
文件格式
文件名格式
直接安装与否
内含程序类型
可否修改参数并编译
RPM
xxx.rpm
已编译
不可
SRPM
xxx.src.rpm
不可
未编译之源代码
 
RPM 二进制包命名的一般格式如下:
例如,RPM包httpd-2.2.15-15.el6.centos.1.i686.rpm
  • httped:软件包名。httped是包名,httpd-2.2.15-15.el6.centos.1.i686.rpm通常称为包全名,包名和包全名是不同的,在某些Linux命令中,有些命令(如包的安装和升级)使用的是包全名,而有些命令(包的查询和卸载)使用的是包名。
  • 2.2.15:包的版本号,版本号的格式通常为主版本号.次版本号.修正号
  • 15:二进制包发布的次数,表示此RPM包是第几次编程生成的
  • el*:软件发行商,el6表示此包是由Red Hat公司发布,适合在RHEL 6.x (Red Hat Enterprise Unux)CentOS 6.x上使用。
  • centos:表示此包适用于CentOS系统。
  • i686:表示此包使用的硬件平台,目前的RPM包支持的平台:
    • 平台名称
      适用平台信息
      i386
      386 以上的计算机都可以安装
      i586
      686 以上的计算机都可以安装
      i686
      奔腾 II 以上的计算机都可以安装,目前所有的 CPU 是奔腾 II 以上的,所以这个软件版本居多
      x86_64
      64 位 CPU 可以安装
      noarch
      没有硬件限制
  • rpm:RPM包的扩展名,表明这是编译好的二进制包,使用rpm命令直接安装。此外,还有以src.rpm作为扩展名的RPM包,这表明是源代码包。
 
Linux系统不靠扩展名分区文件类型,那为什么包全名中要包含.rpm扩展名呢?这里的扩展名是为系统管理员准备的,如果我们不对RPM包标注扩展名,管理员很难知道这是一个RPM包,当然也就无法正确使用。
 
默认安装路径
常情况下,RPM包采用系统默认的安装路径,所有安装文件会按照类别分散安装到:
安装路径
含 义
/etc/
配置文件安装目录
/usr/bin/
可执行的命令安装目录
/usr/lib/
程序所使用的函数库保存位置
/usr/share/doc/
基本的软件使用手册保存位置
/usr/share/man/
帮助文件保存位置
除此之外,RPM包也支持手动指定安装路径,但并不推荐。一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需要进行手工配置才能被系统识别)。
RPM包不同,源码包的安装通常采用手动指定安装路径(习惯安装到/usr/local/ 中)的方式。
 
 
  • 安装软件的命令格式:
    • 此命令中各选项参数的含义为:
    • i:安装(install)
    • v:显示更详细的信息(verbose)
    • h:打印#,显示安装进度(hash)
    •  
      如果还有其他安装要求(比如强制安装某软件而不管它是否有依赖性),可以通过以下选项进行调整:
    • nodeps:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
    • replacefiles:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
    • replacepkgs:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
    • force:强制安装。不管是否已经安装,都重新安装。也就是 -replacefiles-replacepkgs 的综合。
    • test:测试安装。不会实际安装,只是检测一下依赖性。
    • prefix:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。
  • 升级软件的命令格式:
    • U选项的含义是:如果该软件没安装过则直接安装;若没安装则升级至最新版本。
      F选项的含义是:如果该软件没有安装,则不会安装,必须安装有较低版本才能升级。
  • 卸载软件的命令格式:
    • RPM 软件包的卸载要考虑包之间的依赖性。例如先安装的httpd软件包,后安装httpd的功能模块mod_ssl包,那么在卸载时,就必须先卸载mod_ssl,然后卸载httpd,否则会报错。
       
      由于RPM文件常常会安装/移除/升级等,某些动作或许可能会导致RPM数据库 /var/lib/rpm/内的文件破损,可以重建一下数据库
  • 查询的命令格式:
    • RPM 验证与数码签章:
       
       
      使用 SRPM 包安装软件(编译 SRPM 包)的方式有以下 2 种:
      1. 利用rpmbuild命令可以直接使用SRPM包安装软件,也可以先将 SRPM 包编译成 RPM 包,再使用 RPM 包安装软件。
        1. rpmbuild命令也是一个程序,但是这个程序不会默认安装。这里使用rpm命令来安装rpmbuild 命令:
          rpmbuild目录下有几个子目录:
          /root/rpmbuild/SPECS
          放置的是该软件的配置文件,例如这个软件的信息参数、设置项目等等
          /root/rpmbuild/SOURCES
          放置的是该软件的原始文件 (*.tar.gz 的文件) 以及 config 这个配置文件
          /root/rpmbuild/BUILD
          在编译的过程中,有些暂存的数据都会放置在这个目录当中;
          /root/rpmbuild/RPMS
          经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当中。包含了 x86_64, noarch.... 等等的次目录。
          /root/rpmbuild/SRPMS
          与 RPMS 内相似的,这里放置的就是SRPM封装的文件!如果想将软件用 SRPM 的方式释出时, SRPM文件就会放置在这个目录中了。
           
          如果只想安装 SRPM 包,而不用修改源代码,那么直接使用 rpmbuild 命令即可:
          可使用如下 2 个选项:
          • rebuild:编译 SRPM 包生成 RPM 二进制包
          • recompile:编译 SRPM 包,同时安装
          注意:SRPM本质上仍属于RPM包,所以安装时仍需考虑包之间的依赖性,要先安装它的依赖包,才能正确安装
      1. 利用 *.spec 文件可实现将 SRPM 包编译成 RPM 包,再使用 RPM 包安装软件
        1. 想利用.spec文件安装软件,需先将SRPM包解开。可以使用rpmbuild命令解开SRPM包,这里使用 rpm -i 命令:
           
          接下来使用 SPECS 目录中的设置文件生成 RPM 包,命令如下:
          命令执行完成,会在 /root/rpmbuild/目录下生成 BUILD、RPMS、SOURCES、SPECS 和 SRPMS 目录,RPM 包放在 RPMS 目录中,SRPM 包生成在 SRPMS 目录中。
      以上两种方式都可实现将 SRPM 包编译为 RPM 二进制包,剩下的工作就是使用 RPM 包安装软件。
       
       

      YUM

      yum是通过分析 RPM 的标头数据后, 根据各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的相依属性问题,以解决软件安装或移除与升级的问题。
      由于 distribution 必须要先释出软件,然后将软件放置于 yum 服务器上面,以提供用户端来要求安装与升级之用的。 因此想要使用 yum 的功能时,必须要先找到适合的 yum server 才行!而每个 yum server 可能都会提供许多不同的软件功能!因此,必须要前往 yum server 查询到相关的软件库网址后,再继续处理后续的设置事宜。
      事实上CentOS在释出软件时已经制作出多部映射站台 (mirror site) 提供全世界的软件更新之用。 所以理论上不需要处理任何设置值,只要能够连上 Internet ,就可以使用yum
      • yum repolist all 列出所有仓库
      • yum list all 列出仓库中所有软件包
      • yum info 软件包名称 查看软件包信息
      • yum install 软件包名称 安装软件包
      • yum reinstall 软件包名称 重新安装软件包
      • yum update 软件包名称 升级软件包
      • yum remove 软件包名称 移除软件包
      • yum clean all 清除所有仓库缓存
      • yum check-update 检查可更新的软件包
      • yum grouplist 查看系统中已经安装的软件包组
      • yum groupinstall 软件包组 安装指定的软件包组
      • yum groupremove 软件包组 移除指定的软件包组
      • yum groupinfo 软件包组 查询指定的软件包组信息
       
    • 计算机基础
    • Linux
    • 磁盘与文件系统管理算法复杂度
      目录