Linux命令行基础——软件包管理

1.软件包管理的发展

  1. 初始阶段

    最早的软件包管理可以追溯到Unix系统的早期版本。在那时,软件通常以源代码的形式分发,并由系统管理员手动编译和安装。这种方式的管理比较原始和繁琐,因为每次安装都需要手动解决依赖关系和编译问题。

  2. 软件包的引入 

    为了简化安装过程,软件包被引入Linux,它将软件及其所有文件和资源打包在一起的集合,通常包括可执行文件、库文件、配置文件、文档和元数据(如软件名称、版本号、依赖关系等)等,方便分发和安装 。但是对于那些开发或者迭代速度较快的软件储存库中,可能并未收集该软件包或者储存库中所收集的相应软件包并不是最新的,此时通常可以直接下载官方提供的二进制软件包进行安装,对于开源软件还可以直接下载源代码进行安装,这三种方式难度也依次增大。

  3. 软件存储库

    软件包存储库是一个集中存放软件包的仓库,可以是本地的也可以是远程的。存储库中包含了大量可供安装的软件包及其元数据。如Debian的APT(Advanced Package Tool)和Red Hat的RPM(Red Hat Package Manager)。这些工具能够自动处理软件包的安装、更新和依赖关系,极大地简化了Linux系统的软件管理。

  4. 2000年代:Python的pip和Node.js的npm

    随着Python和Node.js等语言的流行,新的包管理器也应运而生。Python的pip(Pip Installs Packages)成立于2008年,成为了Python社区的标准包管理工具。Node.js的npm(Node Package Manager)成立于2010年,是JavaScript生态系统中最大的软件注册表,拥有数百万个包。

  5. 2010年代:容器化和虚拟化

    容器化技术如Docker的出现,以及虚拟化技术的发展,进一步改变了软件分发和管理的方式。容器化允许开发者将应用程序及其依赖打包成一个轻量级、可移植的容器,可以在任何支持Docker的环境中运行,无需担心环境配置问题。

  6. 当前:云原生和持续集成/持续部署(CI/CD)

    随着云原生技术的发展,软件包管理也逐渐融入到持续集成和持续部署(CI/CD)的流程中。现代的软件开发流程强调自动化测试和部署,软件包管理器和容器化工具在这一过程中扮演着关键角色。

    软件包管理的历史反映了软件开发和分发方式的演变,从早期的手动安装到现代的自动化工具和云服务,软件包管理一直在简化开发者的日常工作,提高软件开发的效率和可靠性。随着技术的不断进步,软件包管理将继续发展,以适应新的开发趋势和需求。

2.源代码包、二进制包、软件包的区别

1. 源代码包(Source Package)

  • 定义:源代码包包含了软件的所有源代码文件,以及编译软件所需的配置脚本和文档。
  • 用途:开发者和高级用户可以使用源代码包来编译软件,以便在特定的系统或环境中使用。
  • 优点:提供了软件的完全透明度,用户可以查看、修改源代码。
  • 缺点:需要编译过程,可能需要较长时间,并且需要相应的编译器和依赖库。

2. 二进制包(Binary Package)

  • 定义:二进制包是已经编译好的软件,可以直接在特定操作系统或硬件平台上运行。
  • 用途:普通用户和那些不愿意或不需要编译源代码的用户可以使用二进制包快速安装和运行软件。
  • 优点:安装快速简便,无需编译,立即可用。
  • 缺点:可能不如源代码包那样提供完全的透明度和可定制性。

3. 软件包(Software Package)

  • 定义:软件包是一个通用术语,可以指包含软件及其依赖项的任何形式的分发包,包括源代码包和二进制包。
  • 用途:软件包用于简化软件的分发、安装、配置、升级和卸载过程。
  • 元数据:软件包通常包含元数据,如软件名称、版本、描述、依赖关系等。
  • 包管理器:现代操作系统使用包管理器来处理软件包的安装和依赖关系,如APT、DNF、YUM、Pacman等。

区别示例:

  • 源代码包:如gcc-9.3.0.tar.gz,需要用户下载、解压、配置和编译。
  • 二进制包:如gcc-9.3.0-1.x86_64.rpmgcc-9.3.0-1_amd64.deb,根据系统和包管理器的不同,可以直接安装。
  • 软件包:在不同的上下文中,可以指代上述任一种形式的包,具体取决于分发格式和系统环境。

总的来说,源代码包和二进制包是软件分发的两种形式,而软件包是一个更广泛的概念,涵盖了这两种形式以及其他可能的分发方式。用户可以根据需要和偏好选择合适的包类型进行软件的安装和使用。

3.软件包、分发包、软件包管理器、软件包储存库的区别和联系

1. 软件包(Software Package)

  • 定义:软件包是将软件及其所有文件和资源打包在一起的集合,通常包括可执行文件、库文件、配置文件和文档等。
  • 格式:软件包可以是源代码包或二进制包。常见的格式有.deb(Debian及其衍生系统)、.rpm(Red Hat及其衍生系统)和.tar.xz(Arch Linux)。
  • 用途:软件包是软件分发的基本单位,用户可以通过包管理器安装、更新和卸载软件包。

2. 分发包(Distribution Package)

  • 定义:分发包是特定于某个Linux发行版的软件包。它包含了软件的所有文件和元数据,通常经过优化和测试,以确保在特定发行版上运行的兼容性和稳定性。
  • 联系:分发包是软件包的一种,但专为特定发行版设计。例如,一个Debian分发包只能在Debian及其衍生系统上使用。

3. 软件包管理器(Package Manager)

  • 定义:软件包管理器是一个工具或服务,用于自动化软件的安装、更新、配置、卸载和查询等任务。
  • 功能
    • 依赖管理:自动处理软件包的依赖关系,确保安装的软件包所依赖的其他包也得到安装。
    • 软件仓库管理:管理软件包存储库,允许用户从远程或本地存储库中检索和安装软件包。
    • 软件状态跟踪:跟踪已安装软件包的状态,提供软件包的详细信息和历史记录。
  • 常见软件包管理器:APT(Debian、Ubuntu)、DNF/YUM(Fedora、Red Hat)、Pacman(Arch Linux)。

4. 软件包存储库(Software Repository)

  • 定义:软件包存储库是一个集中存放软件包的仓库,可以是本地的也可以是远程的。存储库中包含了大量可供安装的软件包及其元数据。
  • 用途
    • 软件分发:作为软件分发的中心点,用户可以通过软件包管理器从存储库中检索和安装软件包。
    • 版本控制:存储库通常包含软件的不同版本,允许用户选择安装特定版本的软件包。
  • 类型
    • 官方存储库:由Linux发行版官方维护,提供经过测试和认证的软件包。
    • 第三方存储库:由社区或其他组织维护,可能包含额外的软件包或更新。

联系和区别

  • 软件包是软件分发的基本单位,可以是源代码包或二进制分发包。
  • 分发包是特定于某个Linux发行版的软件包,是软件包的一种形式。
  • 软件包管理器是用于管理软件包的工具,它处理软件包的安装、更新、卸载等任务,并管理软件包存储库。
  • 软件包存储库是存放软件包的仓库,软件包管理器从中检索软件包进行安装。

4.市面上普遍的包管理器

在选择使用APT还是DNF时,通常取决于您使用的Linux发行版。例如,基于Debian的系统(如Ubuntu)会使用APT,而基于Red Hat的系统(如Fedora)会使用DNF。两个包管理器在功能上都不相上下,选择使用哪个主要取决于个人偏好或特定发行版的默认配置 。

总的来说,APT、RPM和DNF都是Linux系统中重要的包管理工具,它们各自适应不同的发行版和用户需求,共同促进了Linux软件的分发和管理。

APT和DNF在很多函数中共享相似的语法,如果您已经熟悉其中一个,学习另一个不会有太大困难。APT是许多Linux用户首先遇到的包管理器,尤其是因为Ubuntu的普及。而DNF作为YUM的替代品,提供了改进的用户体验和性能 。

  1. APT (Advanced Packaging Tool)

    • APT是Debian及其衍生版(如Ubuntu)的包管理器,用于处理.deb格式的软件包。
    • 它提供了软件包的安装、升级、卸载等功能,并且可以自动解决依赖关系。
    • APT通过命令行工具aptapt-getapt-cache等提供服务,并且通常有一个图形界面的前端,如软件中心 。
  2. RPM (Red Hat Package Manager)

    • RPM是Red Hat系列Linux发行版的包管理器,用于处理.rpm格式的软件包。
    • 它是一个低级的包管理器,主要用来安装本地的.rpm文件,但不会自动处理依赖关系。
    • RPM的高级包管理器是YUM和DNF,它们可以自动解决依赖问题,并从网络上获取软件包 。
  3. DNF (Dandified Yum)

    • DNF是Fedora和基于Fedora的发行版中的默认包管理器,用于取代旧的YUM。
    • DNF使用RPM包格式,并且提供了更快的依赖分析和更高效的包管理。
    • 它在用户体验、内存占用、依赖分析和运行速度等方面进行了优化,提供了比YUM更现代化的体验 。
  4. Pacman:Arch Linux及其衍生版(如Manjaro)使用的包管理器。它使用简单的命令行工具来管理软件包,具有轻量且高效的特点,它使用.tar.xz格式的压缩包,支持从源代码编译安装,并允许社区通过Arch User Repository (AUR)贡献软件包 。相比较rpm与dnf,它不太直观,建议初学者不要直接上手。

  5. Homebrew:虽然不是Linux发行版,但Homebrew是macOS系统上的包管理器,用于安装、更新和管理各种开源软件包 。

  6. Chocolatey:Windows系统上的包管理器,允许用户通过命令行界面来安装、升级和管理软件包 。

5.Linux 包管理器 - apt

因为本次实验是基于Red Hat,所以apt不过多赘述,感兴趣的可移步链接:Linux 包管理器 - APT | Isaac Kam's Blog (isaaxite.github.io)

6.Linux 包管理器 - rpm

`rpm` 是RPM软件包的管理工具,常用参数如下:

 `-ivh`:安装软件包【`-i` install(安装),`-v` verbose(详细输出),`-h` hash(显示进度条)】
 `-a`:安装所有依赖
 `-f`:忽略文件冲突
 `-p`:查询软件包
 `-q`:查询已安装的软件包
 `-l`:列出软件包安装的文件
 `-e`:卸载软件包
 `-c`:仅删除配置文件
 `-d`:显示软件包说明
 `--info`:显示软件包信息
 `--force`:强制安装或卸载
 `--nodeps`:忽略依赖性
 `--script`:查询软件包在安装或卸载过程中的脚本
 `-Kv`:检测软件MD5校验码
 `-V`:检测已安装软件在系统中的文件是否被修改

**示例**:
- 安装软件包:`rpm -ivh package.rpm`
- 查询已安装的软件包:`rpm -q package_name`
- 卸载软件包:`rpm -e package_name`

7.Linux 包管理器 - dnf

`dnf` 是新一代的软件包管理器,常用命令如下:

`repolist`:列出仓库信息
 `clean all`:清除系统中已经加载的仓库缓存信息
 `list all`:列出所有软件
 `list available`:列出未安装软件
 `list installed`:列出已安装软件
 `install`:安装软件
 `remove`:卸载软件
 `reinstall`:重新安装软件
 `search`:搜索软件
 `whatprovides`:搜索包含文件的软件包
 `history`:dnf执行历史
 `group list`:列出软件组
 `group install`:安装软件组

**示例**:
- 列出所有仓库:`dnf repolist`
- 安装软件:`dnf install package_name`
- 卸载软件:`dnf remove package_name`
- 搜索软件:`dnf search search_term`

4. 本地软件仓库的搭建

本地软件仓库可以方便地管理和分发软件包。搭建方法如下:

1. **加载安装镜像**:


   ```bash
   mount /path/to/rhel8.2-xxxx.iso /mnt
   ```

2. **编写软件仓库文件**:


   在 `/etc/yum.repos.d/` 目录下创建 `.repo` 文件,如 `westos.repo`:
   ```ini
   [AppStream]
   name=westos AppStream
   baseurl=file:///westos/AppStream
   gpgcheck=0
   gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-REDHAT-release
   enabled=1

   [BaseOS]
   name=westos BaseOS
   baseurl=file:///westos/BaseOS/
   gpgcheck=0
   ```


 

你可能感兴趣的:(linux,运维,服务器)