03-ubuntu软件管理

1.软件是什么

软件本质

软件的本质是一系列按照特定顺序组织的计算机数据和指令的集合。它是一种逻辑实体,而非物理实体,具有抽象性。软件通过在计算机硬件平台上运行,实现对数据的处理、存储和传输,从而完成各种特定的任务和功能。与硬件不同,软件可以被轻松地复制、修改和传播,其价值主要体现在所蕴含的知识和算法上。

软件定义

不同的组织和学者对软件有不同的定义,以下是一些常见的定义:

  • IEEE(电气和电子工程师协会)定义:软件是计算机程序、方法、规则、相关的文档资料以及在计算机上运行时所必需的数据。
  • 通俗定义:软件是为了满足用户需求,在计算机系统中执行特定任务而编写的程序及其相关文档的总和。它能够控制计算机硬件的工作,帮助用户完成各种操作,如文字处理、数据计算、游戏娱乐等。

软件组成

一般来说,软件主要由以下两部分组成:

  • 程序
    • 含义:程序是软件的核心部分,它是按照特定的编程语言编写的、能够被计算机理解和执行的指令序列。程序规定了计算机要完成的具体任务和操作步骤。
    • 示例:一个简单的 Python 程序用于计算两个数的和:
      a = 5
      b = 3
      sum = a + b
      print(sum)
      
  • 文档
    • 含义:文档是与软件相关的各种说明性资料,它对于软件的开发、使用、维护和升级都具有重要的作用。
    • 分类及示例
      • 用户文档:包括用户手册、操作指南等,帮助用户了解软件的功能、使用方法和注意事项。例如,办公软件的用户手册会详细介绍如何创建文档、使用各种功能菜单等。
      • 开发文档:如需求规格说明书、设计文档、测试报告等,主要供软件开发人员和维护人员参考。例如,需求规格说明书会明确软件的功能需求、性能要求等,为开发工作提供指导。

软件分类

软件可以从不同的角度进行分类,常见的分类方式有以下几种:

  • 按功能分类
    • 系统软件
      • 定义:系统软件是管理和控制计算机硬件与软件资源的软件,它为计算机用户提供了一个基本的操作环境。
      • 示例:操作系统(如 Windows、Linux、macOS)、语言处理程序(如编译器、解释器)、数据库管理系统(如 MySQL、Oracle)等。
    • 应用软件
      • 定义:应用软件是为了满足用户在特定领域的具体需求而开发的软件。
      • 示例:办公软件(如 Microsoft Office、WPS Office)、图形图像处理软件(如 Adobe Photoshop)、游戏软件(如《王者荣耀》《原神》)等。
    • 支撑软件
      • 定义:支撑软件是辅助其他软件的开发与维护的软件。
      • 示例:软件开发工具(如 Visual Studio、Eclipse)、软件测试工具(如 JUnit、LoadRunner)等。
  • 按授权方式分类
    • 商业软件
      • 定义:商业软件是由软件开发商开发,通过销售许可证的方式获取利润的软件。用户需要支付一定的费用才能获得使用许可。
      • 示例:Microsoft Office、Adobe Creative Suite 等。
    • 开源软件
      • 定义:开源软件的源代码是公开的,任何人都可以查看、修改和分发。开源软件通常遵循开源许可证,允许用户自由使用和传播。
      • 示例:Linux 操作系统、Apache 服务器软件、MySQL 数据库等。
    • 免费软件
      • 定义:免费软件是可以免费使用的软件,但它的源代码可能不公开。用户可以免费下载和使用该软件,但可能存在一些使用限制或附带广告。
      • 示例:360 安全卫士、QQ 音乐等。

程序的定义

程序是为实现特定目标或解决特定问题而用计算机语言编写的一系列有序指令的集合。这些指令精确地描述了计算机执行任务的具体步骤和逻辑,告诉计算机如何对数据进行处理、存储和传输等操作,以达到预期的结果。

程序和计算机硬件的关系

  • 相互依存
    • 硬件是程序运行的物质基础。计算机硬件(如中央处理器 CPU、内存、硬盘等)为程序提供了运行的物理环境。没有硬件,程序就无法执行,因为程序本质上是一系列逻辑指令,需要借助硬件的电路和电子元件来实现指令的执行和数据的处理。
    • 程序是硬件功能的体现和扩展。硬件本身只是具备基本的运算和存储能力,而程序通过合理地组织和调用硬件资源,使计算机能够完成各种复杂的任务,赋予了硬件不同的功能和用途。例如,通过安装不同的图形处理程序,计算机硬件可以实现图像编辑、游戏渲染等多种功能。
      • 协同工作 程序在运行时,会将指令和数据加载到内存中,CPU 从内存中读取指令并执行相应的操作,同时可能会与其他硬件设备(如硬盘、显卡等)进行数据交互。整个过程中,程序和硬件紧密配合,共同完成任务。

程序的表示形式

  • 源代码
    • 源代码是程序员使用某种编程语言(如 Python、Java、C++ 等)编写的程序文本。它以人类可读的形式呈现,包含了程序员所设计的算法、逻辑结构和数据处理方式。例如,以下是一段用 Python 编写的计算两个数之和的源代码:
      a = 5
      b = 3
      sum = a + b
      print(sum)
      
      • 目标代码 源代码需要经过编译或解释等处理后才能被计算机硬件执行。编译型语言(如 C、C++)会将源代码通过编译器转换为目标代码,目标代码通常是二进制形式,能够被计算机直接理解和执行。例如,一个 C 语言程序经过编译后会生成可执行文件,这个文件中的内容就是目标代码。
      • 字节码 对于一些语言(如 Java),源代码会先被编译成字节码。字节码是一种中间形式的代码,它不能直接在计算机硬件上运行,而是需要在特定的虚拟机(如 Java 虚拟机 JVM)中解释执行。字节码的优点是具有平台无关性,同一段字节码可以在不同操作系统的 JVM 上运行。

程序的功能

  • 数据处理 程序可以对各种类型的数据进行采集、存储、计算、分析和转换等操作。例如,财务软件可以对企业的财务数据进行核算和报表生成;数据分析程序可以对大量的实验数据进行统计分析,提取有价值的信息。
    • 控制硬件设备 程序可以控制计算机外部设备的工作,实现人机交互和自动化操作。例如,打印机驱动程序可以控制打印机进行打印任务;机器人控制程序可以控制机器人的运动和动作。
    • 信息管理 程序能够对信息进行组织、存储和检索,方便用户对信息的管理和使用。例如,图书馆管理系统可以对图书的借阅、归还、库存等信息进行管理;企业资源规划(ERP)系统可以对企业的人力、物力、财力等资源信息进行整合和管理。
    • 提供用户界面 程序可以为用户提供友好的操作界面,使用户能够方便地与计算机进行交互。例如,网页浏览器为用户提供了浏览网页的界面;图形化的办公软件为用户提供了直观的文档编辑界面。

程序的复杂性

  • 算法复杂度 算法是程序的核心,算法复杂度主要包括时间复杂度和空间复杂度。时间复杂度衡量的是算法执行所需要的时间,它通常用大 O 表示法来描述。例如,一个简单的线性搜索算法的时间复杂度为 O(n),其中 n 是数据的规模;而一个高效的二分搜索算法的时间复杂度为 O(log n)。空间复杂度则衡量的是算法执行过程中所需要的存储空间。
    • 逻辑复杂度 随着程序功能的增加,程序中的逻辑关系会变得越来越复杂。例如,一个大型的游戏程序可能包含多个角色的行为逻辑、复杂的游戏规则和交互逻辑等。逻辑复杂度的增加会导致程序的开发、调试和维护难度增大。
    • 规模复杂度 程序的规模可以通过代码行数、模块数量等指标来衡量。大型软件项目通常包含数百万行甚至更多的代码,涉及多个开发团队和大量的文件和模块。规模复杂度的增加会带来项目管理、代码集成和版本控制等方面的挑战。

静态链接

定义

静态链接是在编译阶段将程序所需要的库函数代码和其他目标文件合并成一个完整的可执行文件的过程。在这个过程中,链接器会把所有的库函数和目标文件中的代码复制到最终的可执行文件中,使得可执行文件在运行时不再依赖外部的库文件。

工作原理

  1. 编译阶段:编译器将源代码文件(如 .c 文件)编译成目标文件(如 .o 文件),目标文件包含了机器代码和符号表等信息。
  2. 链接阶段:链接器将所有的目标文件和静态库文件进行合并。静态库通常以 .a 为扩展名(在 Windows 下可能是 .lib),链接器会从静态库中提取出程序所需要的函数代码,并将其复制到可执行文件中。

示例(C 语言)

假设有两个文件 main.cadd.cadd.c 实现了一个加法函数,main.c 调用这个加法函数。

// add.c
int add(int a, int b) {
    return a + b;
}
// main.c
#include <stdio.h>
int add(int a, int b);
int main() {
    int result = add(3, 5);
    printf("Result: %d\n", result);
    return 0;
}

编译和静态链接步骤如下:

# 编译 add.c 生成 add.o
gcc -c add.c
# 编译 main.c 生成 main.o
gcc -c main.c
# 创建静态库 libadd.a
ar rcs libadd.a add.o
# 进行静态链接生成可执行文件
gcc -static -o main main.o libadd.a

优缺点

  • 优点:可执行文件具有独立性,不依赖外部库,方便在不同环境中部署;运行速度可能会稍快,因为不需要在运行时动态加载库。
  • 缺点:可执行文件体积较大,因为包含了所有的库代码;当库文件更新时,需要重新编译整个程序。

动态链接

定义

动态链接是在程序运行时才将所需的库文件加载到内存中,并与程序进行链接的过程。程序在编译时只包含对库函数的引用信息,而不是实际的库代码。在运行时,操作系统会根据这些引用信息加载相应的动态库文件,并将其与程序的代码进行链接。

工作原理

  1. 编译阶段:编译器将源代码文件编译成目标文件,目标文件中包含对动态库函数的引用信息。
  2. 链接阶段:链接器在链接时并不将动态库的代码复制到可执行文件中,而是记录下动态库的名称和引用信息。可执行文件在运行时,操作系统的动态链接器会根据这些信息加载相应的动态库文件(通常以 .so 为扩展名,在 Windows 下是 .dll),并将其映射到程序的地址空间中。

示例(C 语言)

还是使用上面的 main.cadd.c 文件,编译和动态链接步骤如下:

# 编译 add.c 生成 add.o
gcc -c -fPIC add.c
# 创建动态库 libadd.so
gcc -shared -o libadd.so add.o
# 进行动态链接生成可执行文件
gcc -o main main.c -L. -ladd
# 设置动态库搜索路径(仅本次会话有效)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
# 运行程序
./main

优缺点

  • 优点:可执行文件体积较小,因为不包含库代码;多个程序可以共享同一个动态库,节省内存资源;库文件更新时,不需要重新编译整个程序,只需替换动态库文件即可。
  • 缺点:程序的运行依赖于动态库文件的存在,如果动态库文件缺失或版本不兼容,程序可能无法正常运行;动态加载库文件会带来一定的运行时开销。

C 语言源码编译

编译过程

C 语言源码的编译通常可以分为四个阶段:预处理、编译、汇编和链接。

  1. 预处理:预处理器对源代码进行处理,处理以 # 开头的预处理指令,如 #include 指令会将指定的头文件内容插入到源代码中,#define 指令会进行宏替换等。预处理后的文件通常以 .i 为扩展名。
    gcc -E main.c -o main.i
    
  2. 编译:编译器将预处理后的文件编译成汇编代码。汇编代码是一种中间形式,它更接近机器语言,但仍然是人类可读的。编译后的文件通常以 .s 为扩展名。
    gcc -S main.i -o main.s
    
  3. 汇编:汇编器将汇编代码转换为机器代码,生成目标文件。目标文件包含了机器指令和符号表等信息,通常以 .o 为扩展名。
    gcc -c main.s -o main.o
    
  4. 链接:链接器将所有的目标文件和库文件进行链接,生成可执行文件。
    gcc main.o -o main
    

常用编译选项

  • -o:指定输出文件的名称。
  • -g:在编译时生成调试信息,方便使用调试器(如 GDB)进行调试。
  • -Wall:开启所有常见的编译警告信息,帮助程序员发现代码中的潜在问题。
  • -I:指定头文件的搜索路径。
  • -L:指定库文件的搜索路径。
  • -l:指定要链接的库文件名称。

2.ubuntu软件包

软件包的基本概念

在 Linux 系统(如 Ubuntu)中,软件包是一种用于分发和管理软件的文件集合。它包含了软件的可执行文件、配置文件、库文件、文档等所有必要的组件,以及安装、卸载、配置等操作的脚本。软件包的出现极大地简化了软件的安装、升级和管理过程,用户无需手动下载和配置软件的各个组件,只需使用相应的软件包管理工具,就可以方便地完成软件的部署。

软件包的格式

在 Ubuntu 系统中,主要使用的软件包格式是 .deb

  • .deb 格式特点
    • 结构清晰.deb 文件是一个归档文件,它采用了特定的文件结构,包含了控制信息和数据两部分。控制信息部分记录了软件的名称、版本、依赖关系、维护者等元数据;数据部分则包含了软件的实际文件内容。
    • 依赖管理.deb 格式支持软件包的依赖关系描述。当安装一个软件包时,软件包管理工具会自动检查并安装该软件包所依赖的其他软件包,确保软件能够正常运行。
    • 安装方便:通过软件包管理工具可以方便地安装、升级和卸载 .deb 格式的软件包,同时还能处理软件包之间的冲突和依赖问题。

软件包管理工具 apt

apt(Advanced Package Tool)是 Ubuntu 系统中用于管理软件包的强大工具,它基于 .deb 格式的软件包,提供了一系列命令来完成软件包的安装、升级、卸载等操作。

常用命令及功能

  1. 更新软件包列表

     sudo apt update
    

    该命令会从软件源服务器上下载最新的软件包列表信息,让系统知道有哪些软件包可以安装、升级或删除。

  2. 升级已安装的软件包

     sudo apt upgrade
    

    此命令会根据更新后的软件包列表,将系统中已安装的软件包升级到最新版本,但不会安装新的软件包或移除旧的软件包。

  3. 安装软件包

     sudo apt install <package_name>
    

    例如,要安装 vim 编辑器,可以使用以下命令:

     sudo apt install vim
    

    apt 会自动处理软件包的依赖关系,确保所有必要的依赖软件包也会被安装。

  4. 卸载软件包

     sudo apt remove <package_name>
    

    该命令会卸载指定的软件包,但会保留软件包的配置文件。如果要彻底删除软件包及其配置文件,可以使用:

     sudo apt purge <package_name>
    
  5. 搜索软件包

     apt search <keyword>
    

    例如,要搜索包含 python 关键字的软件包,可以使用:

     apt search python
    
  6. 清理不再需要的软件包

     sudo apt autoremove
    

    该命令会自动移除系统中不再需要的依赖软件包,通常是在卸载某个软件包后,其依赖的一些软件包不再被其他软件使用时使用。

配置软件源

软件源是 apt 获取软件包的服务器地址。用户可以根据需要修改软件源配置文件 /etc/apt/sources.list 或在 /etc/apt/sources.list.d/ 目录下添加自定义的软件源文件,以使用不同的软件源服务器。例如,将软件源切换为国内的镜像源可以提高软件包的下载速度。

修改配置文件后,需要运行 sudo apt update 命令使新的软件源配置生效。

软件包命名规范:基本组成部分

1. 软件名称

  • 含义:这是软件包最核心的标识,用于唯一区分不同的软件。通常采用软件的正式名称,一般是简洁且具有代表性的词汇,方便用户识别和记忆。
  • 示例:在 Linux 系统中,nginx 是一款常用的 Web 服务器软件,其软件包名称就以 nginx 开头;在 Windows 系统中,Adobe Photoshop 软件的安装包会包含 “Photoshop” 这个关键名称。

2. 版本号

  • 含义:版本号用于标识软件的不同发行版本,反映软件的更新和改进情况。它有助于用户了解软件的新旧程度、功能特性以及是否存在安全补丁等。
  • 常见格式:常见的版本号格式为 主版本号.次版本号.修订号,例如 1.2.3。主版本号的变化通常表示软件有重大的架构或功能改变;次版本号的更新可能意味着添加了新功能;修订号的变动一般是修复了一些小的 bug 或进行了性能优化。
  • 示例python3.8 表示 Python 编程语言的 3.8 版本,nginx-1.18.0 中的 1.18.0 是 Nginx 服务器软件的版本号。

3. 发行版或构建信息

  • 含义:这部分信息用于区分同一软件在不同操作系统发行版、编译环境或构建方式下的软件包。它可以帮助用户选择适合自己系统的软件包。
  • 示例:在 Linux 系统中,nginx_1.18.0-0ubuntu1.2_amd64.deb 中的 0ubuntu1.2 表示该 Nginx 软件包是为 Ubuntu 系统定制的特定发行版本,amd64 则表示该软件包适用于 64 位的 x86 架构系统。

4. 后缀或文件扩展名

  • 含义:后缀用于标识软件包的文件格式,不同的操作系统和软件包管理系统使用不同的文件扩展名。
  • 示例:在 Linux 系统中,Debian 系列(如 Ubuntu)使用 .deb 作为软件包的扩展名,Red Hat 系列(如 CentOS)使用 .rpm;在 Windows 系统中,常见的安装包扩展名是 .exe.msi

不同操作系统的特点

1. Linux

  • 多样性:Linux 有众多的发行版,每个发行版可能有自己的软件包命名规范和管理方式。例如,Debian 及其衍生版(如 Ubuntu)使用 .deb 格式的软件包,命名通常遵循 “软件名称 - 版本号 - 发行版信息.后缀” 的模式;Red Hat 及其衍生版(如 CentOS)使用 .rpm 格式,命名风格也类似,但具体的发行版标识有所不同。
  • 开源友好:由于 Linux 开源的特性,软件包命名注重清晰地传达软件的来源、版本和兼容性信息,方便开发者和用户在不同的环境中使用和共享软件。

2. Windows

  • 商业软件主导:Windows 系统上的软件包通常由软件开发商自行命名和分发。命名更注重品牌和用户体验,往往会包含软件的完整名称和版本信息,并且使用 .exe.msi 等便于用户安装的格式。例如,AdobePhotoshop_2023.exe
  • 版本号复杂:一些软件的版本号可能采用更复杂的命名方式,除了主版本号、次版本号外,还可能包含内部版本号、构建日期等信息,以满足企业级用户对软件精确管理的需求。

3. macOS

  • 简洁统一:macOS 上的软件包通常以 .app.dmg 格式为主。.app 是应用程序的打包格式,其命名一般直接使用软件的名称,简洁明了;.dmg 是磁盘映像文件,用于分发软件安装包,命名也会包含软件名称和版本号。例如,Google Chrome.appGoogleChrome_109.0.5414.119.dmg
  • 注重用户体验:命名规范强调直观性和易用性,方便普通用户识别和安装软件。

其他规范和注意事项

1. 一致性

  • 软件开发者在命名软件包时应保持一致性,确保同一软件的不同版本和不同平台的软件包命名规则相似,方便用户和管理员进行管理和识别。

2. 避免特殊字符

  • 软件包名称应尽量避免使用特殊字符(如空格、标点符号等),以免在不同的系统和环境中产生兼容性问题。如果必须使用特殊字符,要确保其在目标系统中是合法的。

3. 遵循社区规范

  • 在开源软件社区中,通常有一些约定俗成的命名规范和最佳实践。开发者应遵循这些规范,以便更好地融入社区,提高软件的可维护性和可分享性。

4. 安全性考虑

  • 软件包命名不应包含敏感信息,如用户密码、密钥等,以免造成信息泄露风险。同时,要注意防止软件包名称被恶意利用,如仿冒知名软件的名称进行恶意软件的传播。

nginx软件依赖

https://nginx.org/download/
https://nginx.org/packages/ubuntu/pool/nginx/n/nginx/

Nginx 软件命名规范

官方发布包命名规则

Nginx 官方发布的软件包命名遵循一定的规律,以方便用户识别版本、平台和类型等信息,其基本格式通常为: nginx-<版本号>.<扩展名>

  • 版本号:采用标准的 主版本号.次版本号.修订号 格式,例如 1.22.1。主版本号的变化意味着有重大的架构或功能改变;次版本号更新一般表示添加了新功能;修订号的变动则多是修复了一些小的 bug 或进行了性能优化。
  • 扩展名:根据不同的用途和平台有所不同。
    • 源码包:通常以 .tar.gz 结尾,这是 Linux 系统中常见的压缩文件格式。例如 nginx-1.22.1.tar.gz,用户可以通过下载该源码包,在自己的系统上进行编译和安装。
    • 二进制包:在不同的 Linux 发行版中有不同的扩展名。
      • 在 Debian 和 Ubuntu 等基于 Debian 的系统中,使用 .deb 格式,如 nginx_1.22.1-1~bullseye_amd64.deb,其中 1~bullseye 表示该软件包是为 Debian Bullseye 发行版定制的,amd64 表示适用于 64 位的 x86 架构系统。
      • 在 Red Hat、CentOS 等基于 RPM 的系统中,使用 .rpm 格式,例如 nginx-1.22.1-1.el8.x86_64.rpm1.el8 表示该软件包是为 RHEL 8 或兼容系统构建的,x86_64 同样表示 64 位的 x86 架构。

第三方发行版命名

一些第三方组织或社区可能会对 Nginx 进行定制和打包,其命名会在官方命名基础上添加特定标识,以区分不同的发行版本。例如,OpenResty 是基于 Nginx 的一个强大的 Web 平台,它的软件包命名可能会包含 openresty 相关信息,如 openresty-1.21.4.1.tar.gz

Nginx 软件依赖

编译安装时的依赖

如果要从源码编译安装 Nginx,需要一些必要的依赖库和工具,以下是常见的依赖:

  • 编译工具

    • GCC:GNU Compiler Collection,是一个广泛使用的编译器集合,用于将 Nginx 的源代码编译成可执行文件。例如在 Ubuntu 系统中,可以使用以下命令安装:
      sudo apt-get install build-essential
      
      Make:用于自动化编译过程,根据 Makefile 文件中的规则来组织和执行编译任务。上述 build-essential 包中已经包含了 Make。
  • 依赖库

    • PCRE(Perl Compatible Regular Expressions):Nginx 在处理正则表达式时需要 PCRE 库的支持,例如在配置文件中使用正则表达式进行 URL 匹配等操作。在 Ubuntu 中安装命令如下:
      sudo apt-get install libpcre3 libpcre3-dev
      
  • zlib:用于数据压缩和解压缩,Nginx 在处理 HTTP 压缩功能时会用到 zlib 库。安装命令:
sudo apt-get install zlib1g zlib1g-dev
  • OpenSSL:如果需要使用 Nginx 的 HTTPS 功能,就需要 OpenSSL 库来提供加密和安全传输支持。安装命令:
sudo apt-get install libssl-dev

运行时的依赖

在运行 Nginx 时,虽然上述依赖库在编译时已经被链接到 Nginx 可执行文件中,但系统仍然需要这些库的运行时版本。此外,还可能依赖于系统的一些基本库和服务,如:

  • 系统库:如 libc 等,这些是 Linux 系统的基础库,一般系统已经默认安装。
  • 日志记录服务:Nginx 会将访问日志和错误日志记录到文件中,因此需要系统的文件系统和日志管理服务正常工作。

deb包管理器

deb 包管理器概述

在基于 Debian 及其衍生的 Linux 发行版(如 Ubuntu)中,.deb 是常用的软件包格式。而管理 .deb 软件包的工具主要有 dpkgapt 等。deb 包管理器的核心作用是负责软件包的安装、卸载、更新、查询等操作,确保软件在系统中正确部署和运行。

dpkg 基本操作

1. 安装软件包

使用 -i--install 选项来安装 .deb 软件包。

sudo dpkg -i package_name.deb

例如,若要安装名为 nginx_1.18.0-0ubuntu1.2_amd64.deb 的软件包,可执行:

sudo dpkg -i nginx_1.18.0-0ubuntu1.2_amd64.deb

不过,dpkg 在安装时不会自动处理软件包的依赖关系,如果软件包依赖其他未安装的包,安装可能会失败。

2. 卸载软件包

使用 -r--remove 选项来卸载已安装的软件包,但会保留软件包的配置文件。

sudo dpkg -r package_name

若要彻底删除软件包及其配置文件,可使用 -P--purge 选项:

sudo dpkg -P package_name

例如,卸载 nginx 软件包:

sudo dpkg -P nginx

3. 查看软件包信息

使用 -l--list 选项可以列出系统中已安装的所有软件包,也可以通过指定软件包名称来查看特定软件包的信息。

dpkg -l package_name

例如,查看 nginx 软件包的信息:

dpkg -l nginx

使用 -s--status 选项可以查看软件包的详细状态信息,包括版本、依赖关系等。

dpkg -s package_name

4. 查看软件包文件列表

使用 -L--listfiles 选项可以列出软件包安装到系统中的所有文件和目录。

dpkg -L package_name

例如,查看 nginx 软件包安装的文件列表:

dpkg -L nginx

dpkg 和 apt 关系

1. 功能层面

  • dpkg:是一个底层的软件包管理工具,主要负责 .deb 软件包的基本操作,如安装、卸载、查询等。它直接处理本地的 .deb 文件,不涉及软件包的下载和依赖关系的自动解决。
  • apt:是一个高级的软件包管理工具,它基于 dpkg 构建,在 dpkg 的基础上增加了软件包的下载、依赖关系的自动处理等功能。apt 可以从软件源服务器上下载软件包,并根据软件包之间的依赖关系,自动安装所需的其他软件包。

2. 操作层面

  • dpkg:通常用于处理本地已经下载好的 .deb 软件包,适用于一些特殊情况,如从第三方网站下载了 .deb 包后进行手动安装。
  • apt:是用户日常使用的主要软件包管理工具,通过简单的命令就可以完成软件的安装、升级和卸载等操作,无需手动处理依赖关系,使用起来更加方便。

3. 协同工作

apt 在执行软件包的安装、卸载等操作时,实际上是调用 dpkg 来完成具体的软件包处理工作。例如,当使用 sudo apt install nginx 命令安装 nginx 软件包时,apt 会先从软件源服务器上下载 nginx 及其依赖的软件包,然后调用 dpkg 来完成软件包的安装过程。

综上所述,dpkg 是基础,提供了软件包管理的基本功能;apt 是在 dpkg 之上的高级封装,为用户提供了更便捷、更智能的软件包管理体验。

dpkg管理nginx

dpkg 是 Debian 系列 Linux 系统中用于管理 .deb 格式软件包的底层工具。下面将详细介绍使用 dpkg 对 Nginx 进行增、删、改、查操作的方法。

增加(安装)Nginx

在使用 dpkg 安装 Nginx 之前,你需要先获取 Nginx 的 .deb 软件包。可以从官方网站、第三方软件源或其他可靠渠道下载。假设下载的 Nginx 软件包名为 nginx_1.22.1-1~bullseye_amd64.deb

安装命令

sudo dpkg -i nginx_1.22.1-1~bullseye_amd64.deb
  • sudo:以超级用户权限执行命令,因为安装软件通常需要系统级别的权限。
  • dpkg -i-i--install 的缩写,用于安装指定的 .deb 软件包。

注意事项

dpkg 在安装时不会自动处理软件包的依赖关系。如果 Nginx 依赖的其他软件包未安装,安装过程可能会失败并提示缺少依赖项。此时,你可以使用 apt 来解决依赖问题:

sudo apt-get install -f

-f 选项的作用是尝试修复损坏的依赖关系并完成未完成的安装。

删除 Nginx

删除 Nginx 有两种情况:仅删除软件,保留配置文件;彻底删除软件及其配置文件。

仅删除软件

sudo dpkg -r nginx
  • -r--remove 的缩写,该命令会删除 Nginx 软件,但会保留其配置文件。这些配置文件可能会在后续重新安装时继续使用。

彻底删除软件及其配置文件

sudo dpkg -P nginx
  • -P--purge 的缩写,此命令会删除 Nginx 软件以及与之相关的所有配置文件。

修改(更新)Nginx

dpkg 本身主要用于安装和卸载软件包,对于更新操作,它不像 apt 那样方便。但如果要使用 dpkg 更新 Nginx,需要先下载新版本的 .deb 软件包,然后按照安装新软件包的方式进行操作。

更新步骤

  1. 下载新版本的 Nginx .deb 软件包,例如 nginx_1.24.0-1~bullseye_amd64.deb
  2. 停止当前运行的 Nginx 服务(可选,但建议操作):
    sudo systemctl stop nginx
    
  3. 使用 dpkg 安装新版本的软件包:
    sudo dpkg -i nginx_1.24.0-1~bullseye_amd64.deb
    
  4. 启动更新后的 Nginx 服务:
    sudo systemctl start nginx
    

查询 Nginx 信息

可以使用 dpkg 来查询 Nginx 的安装状态、版本信息、安装的文件列表等。

查询安装状态和版本信息

dpkg -s nginx

该命令会显示 Nginx 软件包的详细状态信息,包括软件名称、版本号、描述、安装状态等。

查询 Nginx 安装的文件列表

dpkg -L nginx

此命令会列出 Nginx 软件包安装到系统中的所有文件和目录,有助于了解 Nginx 在系统中的具体安装位置。

列出所有已安装的包含 “nginx” 的软件包

dpkg -l | grep nginx

dpkg -l 用于列出系统中所有已安装的软件包,grep nginx 用于过滤出包含 “nginx” 的软件包信息。

apt命令

apt(Advanced Package Tool)是 Debian 及其派生的 Linux 发行版(如 Ubuntu)中用于管理软件包的强大工具,它简化了软件的安装、更新、删除等操作。以下是一些常用 apt 命令及其解释:

软件包列表更新

sudo apt update
  • 功能:该命令会从软件源服务器(配置在 /etc/apt/sources.list/etc/apt/sources.list.d/ 目录下的文件中)下载最新的软件包列表信息。这不会安装或升级任何软件包,只是让系统知道当前有哪些软件包可用以及它们的最新版本。
  • 使用场景:在安装或升级软件之前,通常需要先运行此命令,以确保使用的是最新的软件包信息。

软件包升级

升级已安装的软件包

sudo apt upgrade
  • 功能:根据 apt update 下载的最新软件包列表,将系统中已安装的软件包升级到最新版本。此命令只会升级现有的软件包,不会安装新的软件包或移除旧的软件包。
  • 使用场景:当需要将系统中已有的软件更新到最新版本时使用。

智能升级

sudo apt full-upgrade
  • 功能:除了升级已安装的软件包外,full-upgrade 还会处理软件包之间的依赖关系变化。如果升级某个软件包需要安装新的软件包或移除旧的软件包,full-upgrade 会自动完成这些操作。
  • 使用场景:当系统进行大规模软件更新,可能涉及软件包依赖关系调整时使用。

软件包安装

sudo apt install package_name
  • 功能:从软件源服务器下载并安装指定名称的软件包。apt 会自动处理软件包的依赖关系,确保所有必要的依赖软件包也会被安装。
  • 示例:安装 nginx 服务器软件:
    sudo apt install nginx
    

软件包删除

仅删除软件包

sudo apt remove package_name
  • 功能:卸载指定的软件包,但会保留软件包的配置文件。这些配置文件可能会在后续重新安装该软件时继续使用。
  • 示例:卸载 nginx 软件包:
    sudo apt remove nginx
    

彻底删除软件包及其配置文件

sudo apt purge package_name
  • 功能:不仅卸载软件包,还会删除与之相关的所有配置文件。
  • 示例:彻底删除 nginx 及其配置文件:
    sudo apt purge nginx
    

清理不再需要的软件包

sudo apt autoremove
  • 功能:自动移除系统中不再需要的依赖软件包。通常在卸载某个软件包后,其依赖的一些软件包不再被其他软件使用,这些软件包可以通过此命令自动清理。

搜索软件包

apt search keyword
  • 功能:在软件源的软件包列表中搜索包含指定关键字的软件包,并显示相关软件包的名称和简要描述。
  • 示例:搜索包含 python 关键字的软件包:
    apt search python
    

显示软件包信息

apt show package_name
  • 功能:显示指定软件包的详细信息,包括版本号、依赖关系、描述等。
  • 示例:查看 nginx 软件包的详细信息:
    apt show nginx
    

锁定软件包版本

sudo apt-mark hold package_name
  • 功能:将指定的软件包标记为保留状态,即 apt 在进行软件包升级时不会对该软件包进行升级操作,从而锁定其当前版本。
  • 解锁软件包:如果需要解除锁定,可以使用以下命令:
    sudo apt-mark unhold package_name
    

apt源

1. 什么是 apt 源

在基于 Debian 及其衍生的 Linux 发行版(如 Ubuntu)中,apt(Advanced Package Tool)是用于管理软件包的工具。apt 源(也称为软件源)是指存储软件包文件以及相关元数据的服务器或存储库。当使用 apt 命令进行软件的安装、更新等操作时,apt 会从这些指定的源中获取软件包信息和下载软件包。

2. apt 源的作用

  • 软件获取:提供了丰富的软件资源,用户可以通过 apt 方便地从源中下载并安装各种软件,无需手动去各个软件的官方网站查找和下载。
  • 软件更新:确保系统中的软件能够及时更新到最新版本,获取安全补丁和功能改进。
  • 依赖管理:源中记录了软件包之间的依赖关系,apt 可以根据这些信息自动处理软件包的依赖问题,保证软件能够正常安装和运行。

3. apt 源的配置文件

  • 主配置文件:通常是 /etc/apt/sources.list,该文件中列出了系统默认使用的软件源地址。
  • 自定义配置文件:在 /etc/apt/sources.list.d/ 目录下可以创建自定义的 .list 文件,用于添加额外的软件源。这些自定义源会与主配置文件中的源一起被 apt 使用。

4. apt 源的格式

sources.list 或自定义的 .list 文件中,每一行代表一个软件源,其基本格式如下:

deb [选项] 源地址 发行版代号 组件
deb-src [选项] 源地址 发行版代号 组件
  • debdeb-src
    • deb:表示二进制软件包源,用于下载预编译好的可执行软件包。
    • deb-src:表示源代码软件包源,用于下载软件的源代码,通常用于自行编译软件。
  • [选项]:可选参数,常见的有 [arch=架构] 用于指定软件包的架构(如 amd64i386 等),还有 [signed-by=密钥文件路径] 用于指定验证软件包签名的密钥文件。
  • 源地址:软件源服务器的 URL,例如 http://archive.ubuntu.com/ubuntu
  • 发行版代号:对应 Linux 发行版的版本代号,如 Ubuntu 20.04 的代号是 focal,22.04 的代号是 jammy
  • 组件:软件源中的软件分类,常见的组件有:
    • main:官方支持的自由软件。
    • restricted:官方支持的非自由软件。
    • universe:社区维护的自由软件。
    • multiverse:社区维护的非自由软件。

5. 常见的 apt 源

  • 官方源:由 Linux 发行版官方提供的软件源,如 Ubuntu 的官方源 http://archive.ubuntu.com/ubuntu。官方源的软件经过严格测试和审核,稳定性和安全性较高,但由于服务器可能位于国外,下载速度可能较慢。
  • 国内镜像源:国内的一些机构或公司提供的软件源镜像,如阿里云、清华大学、中科大等。这些镜像源同步了官方源的内容,由于服务器在国内,下载速度通常较快。例如,阿里云的 Ubuntu 镜像源地址是 http://mirrors.aliyun.com/ubuntu

6. 修改 apt 源的步骤

以下以将 Ubuntu 的官方源替换为阿里云镜像源为例:

  1. 备份原配置文件
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
    
  2. 编辑配置文件
    sudo vim /etc/apt/sources.list
    
    将原文件内容替换为阿里云镜像源的配置(以 Ubuntu 22.04 为例): ```plaintext deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

3. **更新软件包列表**
```bash
sudo apt update

7. 注意事项

  • 版本匹配:修改 apt 源时,要确保发行版代号与系统实际版本一致,否则可能会导致软件包无法正常安装或更新。
  • 安全性:尽量使用官方或知名机构提供的镜像源,避免使用不可信的源,以防止下载到恶意软件包。
  • 更新问题:修改源后,首次运行 apt update 可能会提示一些密钥验证问题,按照提示导入相应的密钥即可解决。

各家apt源

阿里云

https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3e221b11zIawpU

清华源

https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

apt命令表格大全

以下是一份较为全面的 apt 命令表格,涵盖了常见的 apt 操作及其用途、示例:

命令 用途 示例
sudo apt update 从软件源服务器下载最新的软件包列表信息,不会安装或升级软件包,为后续操作提供最新的软件信息。 sudo apt update
sudo apt upgrade 根据更新后的软件包列表,将系统中已安装的软件包升级到最新版本,不安装新软件包或移除旧软件包。 sudo apt upgrade
sudo apt full-upgrade 不仅升级已安装的软件包,还会处理软件包之间的依赖关系变化,必要时安装新软件包或移除旧软件包。 sudo apt full-upgrade
sudo apt install <package_name> 从软件源下载并安装指定名称的软件包,自动处理软件包的依赖关系。 sudo apt install nginx
sudo apt remove <package_name> 卸载指定的软件包,但保留软件包的配置文件。 sudo apt remove firefox
sudo apt purge <package_name> 彻底卸载指定的软件包,同时删除与之相关的所有配置文件。 sudo apt purge thunderbird
sudo apt autoremove 自动移除系统中不再需要的依赖软件包,通常在卸载软件后使用。 sudo apt autoremove
apt search <keyword> 在软件源的软件包列表中搜索包含指定关键字的软件包,并显示相关软件包的名称和简要描述。 apt search python
apt show <package_name> 显示指定软件包的详细信息,如版本号、依赖关系、描述等。 apt show vlc
sudo apt list --installed 列出系统中已安装的所有软件包。 sudo apt list --installed
sudo apt list --upgradable 列出系统中可升级的软件包。 sudo apt list --upgradable
sudo apt-mark hold <package_name> 将指定的软件包标记为保留状态,apt 升级时不会对其进行升级,锁定当前版本。 sudo apt-mark hold mysql-server
sudo apt-mark unhold <package_name> 解除对指定软件包的保留标记,使其可以正常参与升级。 sudo apt-mark unhold mysql-server
sudo apt autoclean 清理本地软件包缓存中已经过期(无法再从源获取)的软件包文件。 sudo apt autoclean
sudo apt clean 清理本地软件包缓存中的所有软件包文件,释放磁盘空间。 sudo apt clean
sudo apt build-dep <package_name> 安装指定软件包编译所需的所有依赖项,通常用于从源代码编译软件。 sudo apt build-dep gimp

apt软件依赖

在使用 apt 管理软件包时,了解软件的依赖关系十分重要,以下为你介绍几种查询 apt 软件依赖的方法:

方法一:使用 apt show 命令

原理

apt show 命令可显示指定软件包的详细信息,其中包含了该软件包的依赖关系。

示例

如果你想查询 nginx 软件包的依赖信息,可在终端执行以下命令:

apt show nginx

输出示例及解释

Package: nginx
Version: 1.18.0-0ubuntu1.2
Priority: optional
Section: httpd
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Nginx Maintainers <pkg-nginx-maintainers@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 1,044 kB
Depends: libc6 (>= 2.29), libpcre2-8-0 (>= 10.32), libssl1.1 (>= 1.1.1), libzstd1 (>= 1.3.2), zlib1g (>= 1:1.2.11.dfsg-2)
...

在输出结果里,Depends 字段后面列出的就是 nginx 正常运行所依赖的其他软件包及其版本要求。

方法二:使用 apt-cache depends 命令

原理

apt-cache depends 命令会显示指定软件包的所有依赖关系,不仅包含直接依赖,还会列出间接依赖。

示例

查询 nginx 的依赖关系:

apt-cache depends nginx

输出示例及解释

nginx
  Depends: libc6
  Depends: libpcre2-8-0
  Depends: libssl1.1
  Depends: libzstd1
  Depends: zlib1g
  Recommends: nginx-core
 |Recommends: nginx-full
  ...
  • Depends:表示该软件包正常运行必须依赖的其他软件包。
  • Recommends:表示推荐安装的软件包,虽然不是必需的,但安装后可让软件功能更完善。

方法三:使用 apt-rdepends 命令

原理

apt-rdepends 命令可以反向查询哪些软件包依赖于指定的软件包,也就是找出依赖指定软件包的其他软件。

示例

查询哪些软件依赖于 libc6

apt-rdepends --reverse libc6

输出示例及解释

libc6
  Reverse Depends:
    nginx
    openssh-server
    ...

输出结果显示了依赖 libc6 的软件包,如 nginxopenssh-server 等。

注意事项

  • 在执行这些命令时,建议先运行 sudo apt update 更新软件包列表,以确保获取到的依赖信息是最新的。
  • 部分系统可能没有预装 apt-rdepends 命令,你可以使用 sudo apt install apt-rdepends 进行安装。

apt缓存

在基于 Debian 及其衍生的 Linux 发行版中,apt 缓存扮演着重要的角色,下面从定义、作用、位置、管理等方面详细介绍 apt 缓存。

1. 定义

apt 缓存是指 apt 在操作过程中,将从软件源下载的软件包文件以及软件包的元数据(如软件包的描述、版本信息、依赖关系等)临时存储在本地系统的特定目录中,这些存储的数据就构成了 apt 缓存。

2. 作用

  • 提高下载速度:当需要再次安装相同版本的软件包时,apt 可以直接从本地缓存中获取软件包文件,而无需重新从软件源服务器下载,从而节省时间和网络带宽。
  • 支持离线安装:在没有网络连接的情况下,如果软件包已经存在于本地缓存中,就可以使用 dpkg 命令直接从缓存中安装软件包。

3. 缓存位置

  • 软件包文件缓存:软件包文件(.deb 文件)通常存储在 /var/cache/apt/archives/ 目录下。例如,当使用 apt install 命令安装软件包时,下载的 .deb 文件会被保存到这个目录。
  • 软件包元数据缓存:软件包的元数据存储在 /var/lib/apt/lists/ 目录下。当执行 apt update 命令时,apt 会从软件源服务器下载最新的软件包元数据,并将其保存到这个目录。

4. 缓存管理

清理过期缓存

sudo apt autoclean
  • 功能:该命令会清理 /var/cache/apt/archives/ 目录中已经过期(即无法再从当前配置的软件源获取到)的软件包文件。过期的软件包可能是因为软件源更新,旧版本的软件包不再提供下载。
  • 适用场景:当你想要释放磁盘空间,但又希望保留可能还会使用的软件包时,可以使用此命令。

清理全部缓存

sudo apt clean
  • 功能:此命令会删除 /var/cache/apt/archives/ 目录下的所有软件包文件,以及 /var/lib/apt/lists/ 目录下的软件包元数据。执行该命令后,再次使用 apt 安装软件时,需要重新下载软件包和元数据。
  • 适用场景:当磁盘空间非常紧张,且确定不再需要本地缓存的软件包时,可以使用该命令来释放大量磁盘空间。

更新缓存

sudo apt update
  • 功能apt update 命令会从软件源服务器下载最新的软件包元数据,并更新 /var/lib/apt/lists/ 目录下的文件。这样,apt 就可以知道哪些软件包有可用的更新,以及当前软件源中有哪些新的软件包。
  • 适用场景:在安装或升级软件之前,通常需要先运行此命令,以确保使用的是最新的软件包信息。

5. 注意事项

  • 缓存占用磁盘空间:随着时间的推移,apt 缓存可能会占用大量的磁盘空间,特别是在频繁安装和更新软件的情况下。因此,定期清理缓存是很有必要的。
  • 离线安装依赖缓存:如果需要进行离线安装,确保在有网络连接时保留相关软件包的缓存,或者手动备份所需的 .deb 文件。

源码编译流程

源码编译是将软件的源代码转换为可在特定操作系统上运行的可执行文件的过程。以下是一般的源码编译流程,以在 Linux 系统上编译 C/C++ 语言编写的软件为例进行详细介绍。

1. 准备工作

安装编译工具

在开始编译之前,需要确保系统中安装了必要的编译工具,如 GCC(GNU Compiler Collection)、Make 等。在基于 Debian 或 Ubuntu 的系统中,可以使用以下命令进行安装:

sudo apt-get install build-essential

在基于 Red Hat 或 CentOS 的系统中,使用以下命令:

sudo yum groupinstall "Development Tools"

安装依赖库

许多软件在编译过程中会依赖一些外部库文件,因此需要安装这些依赖库。可以通过查看软件的文档或 README 文件来确定所需的依赖库,并使用相应的包管理工具进行安装。例如,如果软件依赖 OpenSSL 库,在 Ubuntu 系统中可以使用以下命令安装:

sudo apt-get install libssl-dev

2. 下载源代码

从软件的官方网站、开源代码托管平台(如 GitHub)或其他可靠渠道下载软件的源代码。源代码通常以压缩包的形式提供,常见的压缩格式有 .tar.gz.tar.bz2 等。例如,使用 wget 命令下载一个名为 example-1.0.tar.gz 的源代码压缩包:

wget https://example.com/downloads/example-1.0.tar.gz

3. 解压源代码

使用 tar 命令解压下载的源代码压缩包:

tar -zxvf example-1.0.tar.gz

如果是 .tar.bz2 格式的压缩包,使用以下命令解压:

tar -jxvf example-1.0.tar.bz2

解压后会得到一个包含源代码文件的目录,进入该目录:

cd example-1.0

4. 配置编译选项

大多数开源软件使用 configure 脚本或 CMake 来配置编译选项。

使用 configure 脚本

许多传统的开源软件会提供一个 configure 脚本,用于检查系统环境、确定编译参数等。运行该脚本并指定一些必要的选项:

./configure --prefix=/usr/local/example
  • --prefix 选项用于指定软件的安装路径,这里将软件安装到 /usr/local/example 目录下。
  • 还可以根据需要添加其他选项,如 --enable-feature 启用某个特性,--disable-feature 禁用某个特性等。

使用 CMake

对于使用 CMake 构建的项目,需要创建一个构建目录,然后在该目录中运行 CMake 命令:

mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/example
  • .. 表示上级目录,即源代码所在的目录。
  • -DCMAKE_INSTALL_PREFIX 用于指定软件的安装路径。

5. 编译源代码

在完成配置后,使用 make 命令开始编译源代码:

make

make 命令会根据 MakefileCMakeLists.txt 中定义的规则,将源代码编译成可执行文件或库文件。这个过程可能需要一些时间,具体取决于软件的规模和系统性能。

6. 测试编译结果(可选)

有些软件提供了测试套件,可以在编译完成后运行测试来验证编译结果是否正确:

make test

如果测试通过,说明软件编译正常;如果测试失败,需要检查错误信息并进行相应的修复。

7. 安装软件

编译完成后,使用 make install 命令将编译好的软件安装到指定的目录:

sudo make install

由于安装过程可能需要修改系统文件,因此通常需要使用 sudo 以管理员权限执行该命令。

8. 清理工作

安装完成后,可以选择清理编译过程中产生的临时文件:

make clean

该命令会删除编译过程中生成的中间文件,释放磁盘空间。

注意事项

  • 阅读文档:在编译之前,仔细阅读软件的 README、INSTALL 等文档,了解软件的编译要求和注意事项。
  • 版本兼容性:确保下载的源代码版本与系统环境和依赖库版本兼容,避免出现编译错误。
  • 错误处理:在编译过程中如果出现错误,根据错误信息进行排查和修复。常见的错误可能是缺少依赖库、配置选项不正确等。

编译安装代码雨屏保

[root@www.yuchaoit.cn ~]$apt install gcc make autoconf libncurses-dev

wget https://github.com/abishekvashok/cmatrix/releases/download/v2.0/cmatrix-v2.0-Butterscotch.tar

 tar -xf cmatrix-v2.0-Butterscotch.tar
cd cmatrix
./configure --prefix=/opt/cmatrix
make
make install

dpkg命令表格大全

dpkg 是 Debian 及其派生的 Linux 发行版中用于管理 .deb 软件包的基础工具。以下是一份较为全面的 dpkg 命令表格,包含命令、作用、示例及相关说明:

命令 作用 示例 说明
dpkg -i <package.deb>dpkg --install <package.deb> 安装指定的 .deb 软件包 sudo dpkg -i nginx_1.22.1-1~bullseye_amd64.deb 此命令不会自动处理软件包的依赖关系,若依赖缺失,安装可能失败。安装时通常需 sudo 权限。
dpkg -r <package_name>dpkg --remove <package_name> 卸载指定的软件包,但保留其配置文件 sudo dpkg -r nginx 适用于想卸载软件但后续可能重新安装并复用配置的情况。
dpkg -P <package_name>dpkg --purge <package_name> 彻底卸载指定的软件包,同时删除其配置文件 sudo dpkg -P nginx 若确定不再使用该软件,且不想保留配置文件,可使用此命令。
dpkg -l [<package_name>]dpkg --list [<package_name>] 列出系统中已安装的软件包。若指定软件包名,则仅显示该软件包信息 dpkg -l nginx 输出结果中包含软件包的状态、名称、版本和描述等信息。
dpkg -s <package_name>dpkg --status <package_name> 显示指定软件包的详细状态信息,如版本、依赖关系、安装日期等 dpkg -s nginx 能获取比 dpkg -l 更详细的软件包信息。
dpkg -L <package_name>dpkg --listfiles <package_name> 列出指定软件包安装到系统中的所有文件和目录 dpkg -L nginx 有助于了解软件在系统中的具体安装位置。
dpkg -S <file_path>dpkg --search <file_path> 查找包含指定文件的软件包 dpkg -S /usr/bin/nginx 当你想知道某个文件是由哪个软件包安装时可使用。
dpkg -Cdpkg --audit 检查系统中已安装的软件包是否有损坏或不完整的情况 sudo dpkg -C 可用于发现系统中可能存在问题的软件包。
dpkg --configure <package_name> 配置指定的软件包,通常用于完成未完成的安装或修复配置问题 sudo dpkg --configure nginx 若软件包安装过程中中断,可尝试使用此命令继续配置。
dpkg --get-selections [<pattern>] 列出系统中所有软件包的选择状态(安装、卸载等),可通过模式进行过滤 dpkg --get-selections nginx* 能帮助你了解软件包的整体管理状态。
dpkg --set-selections 根据标准输入设置软件包的选择状态 先创建包含软件包选择状态的文件,如 echo "nginx install" > selections.txt,然后 sudo dpkg --set-selections < selections.txt 可批量管理软件包的安装或卸载。

编译淘宝nginx

在Ubuntu上编译淘宝的Tengine(基于Nginx的定制版本)需要按照以下步骤操作。过程中需确保系统已安装必要的依赖库和工具。


步骤 1:安装编译依赖

sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev git

# 或者
sudo apt install -y gcc make autoconf g++ libc6 libc6-dev libpcre3 libpcre3-dev \
libssl-dev libsystemd-dev zlib1g-dev vim lrzsz tree tmux lsof tcpdump wget \
net-tools iotop bc bzip2 zip unzip nfs-common manpages

步骤 2:下载Tengine源码

从官方仓库克隆代码(推荐使用稳定版本):

git clone https://github.com/alibaba/tengine.git
cd tengine

或直接下载源码包:

wget https://tengine.taobao.org/download/tengine-3.1.0.tar.gz
tar -zxvf tengine-3.1.0.tar.gz
cd tengine-3.1.0

步骤 3:配置编译选项

运行 configure 脚本,按需启用/禁用模块。以下是常用配置示例:

./configure \
    --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_stub_status_module \
    --with-pcre \
    --with-stream

关键选项: • --prefix:指定安装路径(默认为 /usr/local/nginx)。 • --with-http_ssl_module:启用HTTPS支持。 • --with-http_v2_module:启用HTTP/2支持。 • --with-http_stub_status_module:启用状态监控模块。 • 更多模块参考官方文档:Tengine文档


步骤 4:编译并安装

make -j$(nproc)   # 使用多核编译加速
sudo make install

步骤 5:验证安装

  1. 启动Tengine

     sudo /usr/local/nginx/sbin/nginx
    
  2. 检查运行状态

     curl -I http://localhost
    

    若看到类似 Server: Tengine 的响应头,表示成功。

  3. 查看版本

     /usr/local/nginx/sbin/nginx -V
    

步骤 6:配置系统服务(可选)

创建Systemd服务文件:

sudo nano /etc/systemd/system/nginx.service

内容如下:

[Unit]
Description=The Tengine HTTP Server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl enable nginx
sudo systemctl start nginx

常见问题解决

  1. 依赖缺失错误: • 若提示 configure: error: ... not found,安装对应开发包(如 libssl-dev)。

  2. 端口冲突: • 若已有Nginx/Tengine运行,先停止服务:sudo systemctl stop nginx

  3. 权限问题: • 使用 sudo 执行安装命令,或确保用户对安装目录有写入权限。

  4. 防火墙设置

    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    

通过以上步骤,你可以在Ubuntu上成功编译并运行淘宝的Tengine。如需启用更多功能(如动态模块),请参考官方文档调整编译配置。

Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 wechat: laoyuer1993 2025-04-01 21:26:38

results matching ""

    No results matching ""