[Linux]Packages

Packages

1 software distribution

在计算机系统中,众多软件包如互联网浏览器、文本编辑器和媒体播放器等通过包管理器进行管理。包管理器负责安装并维护系统上的软件。尽管并非所有软件包都通过包管理器安装,直接从源代码安装也是一种常见方式,但大多数情况下,用户依赖包管理器来完成软件的安装。常用的软件包格式包括Debian(.deb)和Red Hat(.rpm)。Debian风格的软件包广泛应用于诸如Debian、Ubuntu、Linux Mint等发行版中;而Red Hat风格的软件包则用于Red Hat Enterprise Linux、Fedora、CentOS等。

软件包可以理解为我们熟知的应用程序,例如Chrome、Photoshop等。实际上,它们是由大量文件编译而成的一个整体。编写这些软件的人或团队被称为上游提供者,他们不仅编写代码,还会编写安装指南。上游提供者致力于开发新软件及更新现有软件。当准备发布时,他们会将软件包提交给包维护者。包维护者负责审核、管理和以软件包的形式分发这些软件,确保最终用户能够获取并使用这些软件。

2 package repositories

软件包通过网络上传后,是如何安装到我们的计算机上的呢?是否需要访问每个软件包的下载页面并手动点击下载和安装?实际上,这种方法是可行的,但存在一种更高效的方式:使用软件包仓库(repositories)。仓库作为软件包的集中存储位置,其中包含了大量软件包,并且这些仓库均位于互联网上,无需传统的安装光盘。然而,计算机需要明确知道这些仓库的位置才能进行访问。

例如,假设希望在计算机上安装WackyWidgets公司的软件。WackyWidgets管理着自己的仓库用于存放其软件包,在这个仓库中有10个软件包,如CoolWidget、SuperWidget等。WackyWidgets在其服务器上托管了该仓库,对应的源链接为:http://download.widgets/linux/deb/。

通过这种方式,不需要访问WackyWidgets的官方网站直接下载软件包,而是让计算机从指定的源链接获取WackyWidgets的软件。

通常情况下,操作系统已经预设了一些可信的软件源,这使得系统能够安装所有基础软件包。在基于Debian的系统中,这些源信息保存在/etc/apt/sources.list文件中。

3 tar和gzip

archive

archive,比如常见的.rar和.zip文件格式。这些是包含多个文件的单个archive文件,便于存储和传输。

使用gzip进行文件压缩

gzip是Linux中用于压缩文件的程序,生成的压缩文件通常带有.gz扩展名。

  • 压缩文件:

    1
    $ gzip mycoolfile
  • 解压文件:

    1
    $ gunzip mycoolfile.gz

使用tar创建archive文件

尽管gzip无法将多个文件合并到一个归档文件中,但tar命令可以做到这一点。使用tar创建的归档文件通常带有.tar扩展名。

  • 创建归档文件:

    1
    $ tar cvf mytarfile.tar mycoolfile1 mycoolfile2

    参数说明:

    • c:创建归档。
    • v:显示处理过程(可选)。
    • f:指定输出文件名。
  • 解开归档文件:

    1
    $ tar xvf mytarfile.tar

    参数说明:

    • x:解压文件。
    • v:显示处理过程(可选)。
    • f:指定要解压的文件。

结合tar和gzip进行压缩和解压缩

有时会遇到被压缩的tar文件,如mycompressedarchive.tar.gz。这时,可以先用gunzip解除压缩,再用tar解开归档;或者直接使用tar命令的z选项来简化这一过程。

  • 创建压缩的tar文件:

    1
    $ tar czf myfile.tar.gz [files...]
  • 解压缩并解归档:

    1
    $ tar xzf file.tar.gz

记住这个简单的助记符:“eXtract all Zee Files!”

其他工具

在使用Linux的过程中,还会遇到其他一些归档和压缩类型,例如bzip2、compress、zip和unzip等。

4 Package Dependencies

在Linux系统中,软件包很少能够独立工作,它们通常需要依赖其他软件包或共享库来正常运行。以一组餐厅为例,尽管每家餐厅制作不同的菜肴,但它们都从同一个农场获取食材。如果这个农场突然停止供应,那么这些餐厅将会陷入困境。

依赖关系的重要性

类似地,在Linux中,软件包依赖于其他软件包或共享库。共享库是程序代码库,其它程序可以使用这些代码而无需自行重写。设想一下,如果每家餐厅都需要自己种植食材,那将是非常低效的。

  • 共享库:这些是多个程序可以共同使用的代码库。

缺失依赖导致的问题

如果一个软件包所需的依赖项不存在,该软件包可能无法安装,或者即使安装成功也可能处于损坏状态,无法正常运行。因此,确保所有依赖项的存在对于维护软件环境的稳定至关重要。

5 rpm和dpkg

独立软件包格式

类似于Windows下的.exe文件,Linux系统中有.deb和.rpm格式的单个可执行包文件。通常情况下,通过软件仓库安装软件时不会直接遇到这些文件,但当从网络上直接下载软件包时,最有可能获得的就是这两种格式之一。.deb格式专用于基于Debian的发行版,而.rpm格式则用于基于Red Hat的发行版。

安装与卸载命令

为了安装这些单独的软件包,可以使用dpkgrpm命令:

  • 安装软件包

    • Debian系:$ dpkg -i some_deb_package.deb
    • RPM系:$ rpm -i some_rpm_package.rpm

    这里的i代表install,也可以使用全写--install

  • 移除软件包

    • Debian系:$ dpkg -r some_deb_package.deb
    • RPM系:$ rpm -e some_rpm_package.rpm

    Debian系中的r表示remove,RPM系中的e表示erase。

查询与验证

由于dpkgrpm不会自动处理依赖关系,因此在使用这些工具安装软件包之前,需要手动解决所有依赖项问题。这凸显了完整包管理系统的重要性。

此外,还有查询已安装软件包的命令:

  • Debian系:$ dpkg -l

  • RPM系:$ rpm -qa

    在Debian系中,l表示list;而在RPM系中,q表示query,a表示all。

6 yum和apt

在Linux系统中,包管理系统扮演着至关重要的角色,它们不仅简化了软件的安装、卸载和更新流程,还能够自动处理依赖关系。当前最流行的两大包管理系统分别是适用于Red Hat系列的YUM和专用于Debian系列的APT。

软件包操作命令

使用这些工具进行软件包的操作非常直接:

  • 从仓库安装软件包

    • Debian系:$ apt install package_name
    • RPM系:$ yum install package_name
  • 移除软件包

    • Debian系:$ apt remove package_name
    • RPM系:$ yum erase package_name

更新仓库与软件包

为了确保系统的稳定性和安全性,在安装或更新软件包之前,建议首先更新仓库列表,并升级现有软件包至最新版本:

  • Debian系:$ apt update; apt upgrade
  • RPM系:$ yum update

这种做法可以保证您获取到最新的安全补丁和功能改进。

查询已安装软件包信息

了解已安装软件包的详细信息同样重要,这有助于排查问题或确认软件的功能特性:

  • Debian系:$ apt show package_name
  • RPM系:$ yum info package_name

7 编译源码

在Linux系统中,有时会遇到仅以纯源代码形式提供的软件包。为了将这些源代码包编译并安装到系统中,需要执行一系列命令。以下是详细步骤:

安装编译工具

首先,确保系统已安装必要的编译工具。对于基于Debian的系统,可以使用以下命令进行安装:

1
$ sudo apt install build-essential

解压源代码包

通常,源代码包为.tar.gz格式,使用tar命令解压缩:

1
$ tar -xzvf package.tar.gz

阅读README或INSTALL文件

解压后,查看包内的README或INSTALL文件,因为它们可能包含特定的安装指南。

编译与安装

根据开发者采用的编译方法不同,需要使用的命令也会有所差异,如cmake等。然而,最常见的编译方式是通过make进行基本编译:

  1. 运行配置脚本:检查系统依赖项。

    1
    $ ./configure
  2. 编译源代码:使用Makefile中的规则构建软件。

    1
    $ make
  3. 安装软件包:复制编译后的文件到系统相应位置。

    1
    $ sudo make install
  4. 卸载软件包(如果需要):

    1
    $ sudo make uninstall

使用checkinstall简化管理

直接使用make install可能会导致后续难以完全卸载软件包的问题。为了避免这种情况,推荐使用checkinstall命令,它会在安装过程中生成一个.deb包,便于日后安装和卸载:

1
$ sudo checkinstall

[Linux]Packages
https://erlsrnby04.github.io/2025/03/21/Linux-Packages/
作者
ErlsrnBy04
发布于
2025年3月21日
许可协议