Linux 软件包管理
Chen Kai CTO

一、软件包的概念与管理

1. 软件包组成

软件包是将程序、库文件、配置文件以及文档等打包在一起的文件,方便安装、升级和卸载。软件包能自动处理依赖关系,简化软件管理。一个标准的软件包通常包括以下内容:

二进制命令(可执行文件)

经过编译的程序源代码,生成的可执行二进制文件。例如,在 Linux 系统中,/usr/bin/ 目录下的可执行文件通常来自安装的软件包,如 vimgcc 等。

配置文件(Configuration Files)

存放应用程序的默认配置,通常位于 /etc/ 目录下。例如:

1
2
/etc/nginx/nginx.conf  # Nginx 的配置文件
/etc/mysql/my.cnf # MySQL 的配置文件

数据文件(Data Files)

应用程序所需的数据,如数据库文件、默认资源等。例如:

1
2
/var/lib/mysql/   # MySQL 数据库存放目录
/var/www/html/ # Web 服务器默认站点目录

依赖库(Shared Libraries)

共享库是可执行文件运行时依赖的动态链接库,通常存放在 /usr/lib//lib/ 目录下。例如:

1
2
/usr/lib/libssl.so
/lib/x86_64-linux-gnu/libc.so.6

(5)文档(Documentation)

软件的说明文档、手册页、版权声明等,通常存放在 /usr/share/doc/ 目录。例如:

1
2
/usr/share/doc/nginx/README
/usr/share/man/man1/nginx.1.gz

2. Linux 软件包

软件包格式对比

Linux 发行版不同,软件包的格式也有所不同。主要分为以下几类:

发行版 软件包格式 包管理工具
Debian、Ubuntu .deb dpkg、apt
Red Hat、CentOS、Fedora .rpm rpm、yum、dnf
Arch Linux .tar.xz pacman
Gentoo 源码包 portage
macOS .pkg brew

常见操作示例

下面主要介绍 RPM 包的常见操作,RPM(Red Hat Package Manager)用于 Red Hat/CentOS 等系统。常见操作包括安装、升级、卸载和查询软件包信息,而 Yum 是基于 RPM 包管理的工具。Ubuntu 默认使用 DEB 包管理(dpkg/apt),但在某些情况下可能会遇到 RPM 包,使用工具如 alien 可将 RPM 包转换为 DEB 包进行安装。一些使用示例如下:

将 RPM 包转换为 DEB 包

1
2
3
sudo apt install alien
sudo alien -d package.rpm
sudo dpkg -i package.deb

RPM 依赖冲突解决:当安装 RPM 包遇到依赖问题时,需要手动安装缺少的依赖或使用工具解决依赖冲突。转换为 DEB 包后,可借助 apt 的自动依赖解析功能。

常用 RPM 命令

1
2
3
4
5
6
rpm -ivh package.rpm    # 安装 RPM 包
rpm -Uvh package.rpm # 升级 RPM 包
rpm -e packagename # 卸载软件包
rpm -qa # 列出所有已安装 RPM 包
rpm -qi packagename # 查询某个包的信息
rpm -qf /path/to/file # 查找某个文件所属的 RPM 包

光盘获取 RPM 包:如果软件包存放在光盘上,需要先挂载光盘,然后使用 RPM 命令进行安装:

1
2
3
sudo mount /dev/cdrom /mnt
cd /mnt
sudo rpm -ivh package.rpm

yum 安装包

1
2
3
4
5
6
7
8
9
10
11
# 安装软件包:
yum install packagename

# 卸载软件包:
yum remove packagename

# 搜索软件包:
yum search keyword

# 查看包信息:
yum info packagename

aptyum 的操作逻辑相似,但底层依赖管理和软件包格式不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 更新软件源:
sudo apt update

# 安装软件包:
sudo apt install packagename

# 卸载软件包:
sudo apt remove packagename

# 搜索软件包:
apt search keyword

# 查看包信息:
apt show packagename

dpkg vs rpm 命令对比表

操作 Debian/Ubuntu (dpkg) RHEL/CentOS/Fedora (rpm)
安装软件包 dpkg -i package.deb rpm -i package.rpm
升级软件包 dpkg -i package.deb rpm -U package.rpm
删除软件包 dpkg -r package rpm -e package
强制删除(含配置) dpkg --purge package rpm -e --noscripts package
查询已安装软件包 dpkg -l rpm -qa
查询特定软件包 `dpkg -l grep package`
查看文件所属软件包 dpkg -S /path/to/file rpm -qf /path/to/file
列出软件包安装的文件 dpkg -L package rpm -ql package
检查软件包信息 dpkg -I package.deb rpm -qip package.rpm
检查软件包依赖 `dpkg -I package.deb grep Depends`
列出某软件包的依赖 dpkg -L package rpm -qR package
检查软件包是否已安装 dpkg -s package rpm -q package
验证已安装的软件包 dpkg --verify package rpm -V package
提取 .deb.rpm 文件 dpkg -x package.deb /target/dir `rpm2cpio package.rpm

![image-20250210215953126](./Linux 软件包管理/image-20250210215953126.png)

3. 替换为阿里云源

📌 备份原始源

在修改软件源之前,建议先备份原来的 sources.list 以防万一:

1
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

这样如果有问题,你可以恢复:

1
sudo mv /etc/apt/sources.list.bak /etc/apt/sources.list

📌 替换 sources.list 为阿里云源

✅ 方法 1:手动编辑

使用 vimnano 编辑 sources.list:

1
sudo vim /etc/apt/sources.list

删除原内容,替换为以下 阿里云镜像源(适用于 Ubuntu 22.04、20.04、18.04):

1
2
3
4
5
6
7
8
9
10
11
# 默认官方源
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

# 源码仓库(可选)
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

要注意 bionic 适用于 Ubuntu 18.04,并且注意结合系统架构。

✅ 方法 2:自动替换

如果你不想手动编辑,可以直接运行:

1
2
sudo sed -i 's|http://.*archive.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo sed -i 's|http://.*security.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list

📌 更新软件仓库

执行:

1
sudo apt update && sudo apt upgrade -y

这将使用新的 阿里云镜像源 下载最新的软件包。

📌 确认修改成功

你可以运行:

1
cat /etc/apt/sources.list

如果输出包含 mirrors.aliyun.com,说明修改成功。

然后尝试安装软件:

1
sudo apt install vim -y

如果安装速度明显变快,就说明 阿里云源生效 了!🚀

二、程序编译与解释

  • 编译型语言

    • 原理:程序在运行前经过编译器转换为机器语言,再由操作系统执行。
    • 优点:执行效率高;代码优化较好;通常适合需要高性能计算的场景。
    • 缺点:编译过程耗时;调试过程较复杂。
    • 实例:使用 gcc 编译 C 程序:
      1
      2
      gcc -o hello hello.c
      ./hello
  • 解释型语言

    • 原理:源代码在运行时由解释器逐行解析执行。
    • 优点:开发周期短,调试方便;跨平台性好。
    • 缺点:运行速度较慢;需要解释器支持。
    • 实例:使用 Python 执行脚本:
      1
      python3 hello.py

不同语言的应用范围不一样:

  • 系统级开发:
    • C/C++:httpd、nginx
    • golang:docker
  • 应用级开发:
    • Java:Hadoop、Hbase
    • Python:openstack
    • Pert
    • Ruby
    • PHP

我们以 Golang 和 Python 为例,比较这两种语言在性能、开发效率和生态系统方面的差异:

  • Golang (Go)

    • 特点:编译型语言,性能高、并发编程原生支持,适用于网络服务和分布式系统开发。

    • 缺点:语法相对严格,生态系统虽然不断发展但相对 Python 略小。

    • 示例:一个简单的 Go 程序:

      1
      2
      3
      4
      5
      6
      7
      8
      cat << 'EOF' > hello.go
      package main
      import "fmt"
      func main() {
      fmt.Println("Hello, Golang!")
      }
      EOF
      go run hello.go

      ![image-20250208153904973](./Linux 软件包管理/image-20250208153904973.png)

      build 之后就将源码以及相关依赖打包进文件 hello 了,一次编译,到处运行(这也是 docker 的理念),如果不编译就一定要机器上有对应的编译器。

  • Python

    • 特点:语法简洁、开发速度快、拥有丰富的第三方库,适用于数据分析、Web 开发和自动化脚本。

    • 缺点:运行速度相对较慢,不适合极端高性能计算。

    • 示例:一个简单的 Python 脚本:

      1
      2
      3
      4
      5
      cat << 'EOF' > hello.py
      #!/usr/bin/env python3
      print("Hello, Python!")
      EOF
      python3 hello.py

三、源码编译与二进制配置

在 Linux 中,软件可以通过源码编译或二进制免安装方式进行部署。

  • 二进制包:已经编译好的可执行文件及其依赖文件(如 Ubuntu 下的 DEB 包)。安装快速、方便,但可定制性较低。
  • 源码包:包含程序的源代码,需要经过编译生成可执行文件。提供更高的定制化和优化空间,但安装过程较复杂。

1. 源码编译(以淘宝 Nginx 为例)

步骤

  1. 下载源码:从淘宝镜像或官方源下载 Nginx 源码包,可以复制链接地址后去虚拟机 wget

    ![image-20250208235532884](./Linux 软件包管理/image-20250208235532884.png)

  2. 解压源码包:

    1
    tar -zxvf nginx-1.xx.tar.gz
  3. 配置编译参数:

    1
    2
    cd nginx-1.xx
    ./configure --prefix=/usr/local/nginx --with-http_ssl_module

    逐步将需要的包都安装完后,将会返回如下结果说明成功了:

    ![image-20250208235125749](./Linux 软件包管理/image-20250208235125749.png)

    查看当前目录会发现多了个 Makefile

    ![image-20250208235736672](./Linux 软件包管理/image-20250208235736672.png)

    只有 make install 成功后,才会生成指定的 nginx 路径。

  4. 编译并安装:

    1
    2
    3
    4
    make
    sudo make install
    ## 或者直接
    make && make install

    经过一长串的编译,结果如下:

    ![image-20250208235927988](./Linux 软件包管理/image-20250208235927988.png)

  5. 查看安装的路径,会发现包含这四个文件:

    1
    2
    # ls
    conf html logs sbin

    分别对应配置文件、前端 HTML 页面、日志文件和可执行的二进制文件。

  6. 启动 Tengine:

    nginx.conf 文件里配置完端口号启动 ./sbin/nginx

    ![image-20250209001323246](./Linux 软件包管理/image-20250209001323246.png)

编译过程允许你自定义安装路径和模块,适用于需要特定功能或优化的场景。

2. 二进制免安装配置(以 Java 为例)

步骤

  1. 下载 Java 二进制包(通常为压缩文件)。

    ![image-20250209004010589](./Linux 软件包管理/image-20250209004010589.png)

  2. 解压文件到指定目录(或者使用SFTP进行主机和虚拟机之间传输):

    1
    tar -zxvf jdk-xx_linux-x64_bin.tar.gz -C /opt
  3. 配置环境变量:
    编辑 ~/.bashrc 添加:

    1
    2
    export JAVA_HOME=/opt/jdk-xx
    export PATH=$JAVA_HOME/bin:$PATH

    ![image-20250209004248120](./Linux 软件包管理/image-20250209004248120.png)

  4. 使配置生效:

    1
    source ~/.bashrc

这种方式无需安装程序,直接解压配置,便于快速部署和版本切换。

  • 本文标题:Linux 软件包管理
  • 本文作者:Chen Kai
  • 创建时间:2025-02-08 00:00:00
  • 本文链接:https://www.chenk.top/Linux 软件包管理/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论